Zápisník experimentátora
K napsání tohoto článku mě inspirovala otázka na Google+
fóru. Jak dostat jméno a heslo (například k WiFi) do Arduina tak, aby to nebylo nutné zapsat přímo do programu. Tak totiž hrozí nebezpečí, že z neopatrnosti zašlete své heslo například na GitHub.
Ukážu to na praktickém příkladu. Skoro každý příklad pro WiFi začíná řádky.
#include <WiFi101.h>
char ssid[] = "yourNetwork"; // your network SSID (name)
char pass[] = "secretPassword"; // your network password (use for WPA, or use as key for WEP)
Takže vezmete příklad, změníte v něm své údaje, vyzkoušíte program a protože chcete mít ve všem pořádek a děláte si dokumentaci, nechtěně pošlete svůj výtvor na GitHub, nebo jej zveřejníte na svém blogu, nebo uděláte printscreen obrazovky a obrázek kdesi zveřejníte. A o pár minut si uvědomíte, že jste své privátní údaje právě zveřejnili na Internetu. A máte problém a je jen na vás, jak ho vyřešíte. Ale není to jednoduché a nikdo tento pocit nechce zažít. Takže jak na to, aby se to v budoucnu nestalo?
V každém kompilátoru je možné přidat definice parametrů, které se do programu přenesou jako makra. Problém je jen v tom, jak tyto parametry dostat do kompilátoru z Arduino IDE. Není to sice možné naklikat přímo v IDE, ale cesta tady je. Tvůrci Arduina umožnili doplnit si extra parametry do překladu a tyto extra parametry nám velmi dobře poslouží k vyřešení popsaného problému.
Postup je stejný pro libovolné Arduino. Vždy musíte vytvořit soubor platform.local.txt
a do něj zapsat požadované parametry v syntaxi překladače. Naštěstí to mají všechny C++ kompilátory stejné.
Já mám například Arduino nainstalované v adresáři d:/arduino/arduino-1.8.2/
. Proto se soubor platform.txt
nachází na cestě d:/arduino/arduino-1.8.2/hardware/arduino/avr/platform.txt
. Vytvořím soubor d:/arduino/arduino-1.8.2/hardware/arduino/avr/platform.local.txt
s tímto obsahem.
compiler.cpp.extra_flags=-DEXTRA_PARAMETER="abc123"
Po kompilaci programu arduino_extra_parameter.ino
se na sériový port vypíší dvě hodnoty. Pokud soubor neexistuje, nebo jsem nedodržel předepsaný postup, zobrazí se chybové hlášení EXTRA_PARAMETER not found!
.
#if defined(EXTRA_PARAMETER)
#define DEPENDENT_PARAMETER "xyz"
#else
#error EXTRA_PARAMETER not found!
#endif
void setup() {
Serial.begin(9600);
Serial.println(EXTRA_PARAMETER);
Serial.println(DEPENDENT_PARAMETER);
}
void loop() {
// nothing
}
Arduino MKR1000 se umí připojit k Internetu a tak pro něj můžeme napsat příklad se jménem a heslem. Předchozí program v drobné úpravě mkr1000_extra_parameter.ino
bude fungovat také, pokud najdete ten správný adresář. V mém případě to je adresář c:\Users\Robo\AppData\Local\Arduino15\packages\arduino\hardware\samd\1.6.15\
, kam můžete překopírovat stejný soubor.
Zaměříme se ale na přenesení jména a hesla k WiFi. K tomu budeme potřebovat nastavit obsah souboru platform.local.txt
na
compiler.cpp.extra_flags=-D_SSID="xxx" -D_PWD="xxx"
#include <WiFi101.h>
#if defined(_SSID)
char ssid[] = _SSID; // your network SSID (name)
char pass[] = _PWD; // your network password (use for WPA, or use as key for WEP)
#else
char ssid[] = "xxx"; // your network SSID (name)
char pass[] = "xxx"; // your network password (use for WPA, or use as key for WEP)
#endif
ESP8266 se umí připojit k Internetu a tak pro něj můžeme napsat příklad se jménem a heslem. Předchozí program v drobné úpravě esp8266_extra_parameter.ino
bude fungovat také, pokud najdete ten správný adresář. V mém případě to je adresář c:\Users\Robo\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\
, kam můžete překopírovat stejný soubor.
Zaměříme se ale na přenesení jména a hesla k WiFi. K tomu budeme potřebovat nastavit obsah souboru platform.local.txt
na
compiler.cpp.extra_flags=-D_SSID="xxx" -D_PWD="xxx"
A v programu si nastavíte jméno a heslo k WiFi takto. Ukázka je zkrácena, celý program esp8266_web_client.ino
najdete na serveru GitHub.
#include <ESP8266WiFi.h>
#if defined(_SSID)
const char* ssid = _SSID;
const char* password = _PWD;
#else
const char* ssid = "your-ssid";
const char* password = "your-password";
#endif
Všechny příklady najdete na serveru GitHub.
15.06.2017