Vloženie definície makra do programu v Arduine

Zápisník experimentátora

Ku napísaniu tohoto článku ma inšpirovala otázka na Google+ fóre. Ako dostať meno a heslo (napríklad ku WiFi) do Arduina tak, aby to nebolo nutné zapísať priamo do programu. Tak totiž hrozí nebezpečenstvo, že z neopatrnosti pošlete svoje heslo napríklad na GitHub.

Ukážem to na praktickom príklade. Skoro každý príklad pre WiFi sa začína riadkami.

#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 zoberiete príklad, zmeníte v ňom svoje údaje, vyskúšate program a pretože chcete mať vo všetkom poriadok a robíte si dokumentáciu, nechtiac pošlete svoj výtvor na GitHub, alebo ho uverejníte na svojom blogu, alebo urobíte printscreen obrazovky a obrázok kdesi zverejníte. A o pár minút si uvedomíte, že ste svoje privátne údaje práve zverejnili na Internete. A máte problém a je len na vás, ako ho vyriešite. Ale nie je to jednoduché a nikto tento pocit nechce zažiť. Takže ako na to, aby sa to v budúcnosti nestalo?

Extra parametre

V každom kompilátore je možné pridať definície parametrov, ktoré sa do programu prenesú ako makrá. Problém je len v tom, ako tieto parametre dostať do kompilátora z Arduino IDE. Nie je to síce možné naklikať priamo v IDE, ale cesta tu je. Tvorcovia Arduina umožnili doplniť si extra parametre do prekladu a tieto extra parametre nám veľmi dobre poslúžia na vyriešenie popísaného problému.

Postup je rovnaký pre ľubovoľné Arduino. Vždy musíte vytvoriť súbor platform.local.txt a do neho zapísať požadované parametre v syntaxi prekladača. Našťastie to majú všetky C++ kompilátory rovnaké.

Arduino

Ja mám napríklad Arduino nainštalované v adresári d:/arduino/arduino-1.8.2/. Preto sa súbor platform.txt nachádza na ceste d:/arduino/arduino-1.8.2/hardware/arduino/avr/platform.txt. Vytvorím súbor d:/arduino/arduino-1.8.2/hardware/arduino/avr/platform.local.txt s týmto obsahom.

compiler.cpp.extra_flags=-DEXTRA_PARAMETER="abc123"

Po kompilácii programu arduino_extra_parameter.ino sa na sériový port vypíšu dve hodnoty. Ak súbor neexistuje, alebo som nedodržal predpísaný postup, zobrazí sa chybové hlásenie 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 sa vie pripojiť na Internet a tak preň môžeme napísať príklad s menom a heslom. Predchádzajúci program v drobnej úprave mkr1000_extra_parameter.ino bude fungovať tiež, pokiaľ nájdete ten správny adresár. V mojom prípade to je adresár c:\Users\Robo\AppData\Local\Arduino15\packages\arduino\hardware\samd\1.6.15\, kam môžete prekopírovať ten istý súbor.

Zameriame sa ale na prenesenie mena a hesla k WiFi. Na to budeme potrebovať nastaviť obsah súboru platform.local.txt na

compiler.cpp.extra_flags=-D_SSID="xxx" -D_PWD="xxx"

A v programe si nastavíte meno a heslo k WiFi takto. Ukážka je skrátená, celý program mkr1000_web_client.ino nájdete na serveri 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 sa vie pripojiť na Internet a tak preň môžeme napísať príklad s menom a heslom. Predchádzajúci program v drobnej úprave esp8266_extra_parameter.ino bude fungovať tiež, pokiaľ nájdete ten správny adresár. V mojom prípade to je adresár c:\Users\Robo\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\, kam môžete prekopírovať ten istý súbor.

Zameriame sa ale na prenesenie mena a hesla k WiFi. Na to budeme potrebovať nastaviť obsah súboru platform.local.txt na

compiler.cpp.extra_flags=-D_SSID="xxx" -D_PWD="xxx"

A v programe si nastavíte meno a heslo k WiFi takto. Ukážka je skrátená, celý program esp8266_web_client.ino nájdete na serveri 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šetky príklady nájdete na serveri GitHub.


13.06.2017


Menu