Vložení definice makra do programu v Arduinu

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?

Extra parametry

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é.

Arduino

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

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"
A v programu si nastavíte jméno a heslo k WiFi takto. Ukázka je zkrácena, celý program mkr1000_web_client.ino najdete na serveru GitHub.
#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

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

Zdrojový kód

Všechny příklady najdete na serveru GitHub.


15.06.2017


Menu