IoT-WiFi-Board (NanoESP) Základním prvkem této sady je právě modul IoT-WiFi-Board (NanoESP), který se skládá ze dvou hlavních částí. V levé části je Arduino kompatibilní mikro-kontrolér, který je téměř identický jako Arduino Nano. V pravé části je WLAN modul s označením ESP8266. Obě tyto části spolu vzájemně komunikují prostřednictvím softwarového, sériového rozhraní.
Výuková sada Franzis 10215
Obj. č. 142 13 80
Modul zahrnuje velké množství komponentů, pinů a LED, které informují o určitém provozním stavu nebo právě probíhajícím procesu. Osazení pinů modulu NanoESP Vážený zákazníku, děkujeme Vám za Vaši důvěru a za nákup výukové sady s programovatelným modulem. Tento návod k obsluze je nedílnou součástí tohoto výrobku. Obsahuje důležité pokyny k uvedení výrobku do provozu a k jeho obsluze. Jestliže výrobek předáte jiným osobám, dbejte na to, abyste jim odevzdali i tento návod k obsluze. Ponechejte si tento návod, abyste si jej mohli znovu kdykoliv přečíst.
Pro uvedení tohoto modulu IoT-WiFi-Board (dále jen modul / NanoESP) do provozu, bude zapotřebí použití ovladačů pro USB-to-Serial-Converter. Potřebné ovladače si můžete stáhnout na webu www.iot.fkainka.de/driver. Software Arduino umožňuje konfiguraci portu a stejně tak i modulu Arduino Nano (procesor: Atmega328). Budete-li pracovat s rozhraním sériového monitoru, musíte provést i určitá další nastavení. V takovém případě se používá přenosová rychlost 19200. Pro odesílání příkazů musíte zvolit Option CR a NL v menu výběru přenosové rychlosti Bitrate.
WLAN modul je řízen tzv. AT příkazy. Část modulu s kontrolérem Arduino je spojena s WLAN modulem na pinech 11 a 12. Deska zahrnuje obvod, který konvertuje úroveň 5 V do kompatibilní úrovně 3,3 V. Piny 11 a 12 proto nemůžete využívat pro své vlastní projekty.
Výstup v sériovém rozhraní / Serial Monitor
Základní technické údaje Mikro-kontrolér Flash memory SRAM EEPROM Cycle rate I/O piny
ATmega328 32 kB (včetně 0,5 kB pro zavádění dat) 2 kB 1 kB 16 MHz 20 (včetně 2 pro komunikaci s WLAN modulem) PWM: 6 Analogové vstupy: 6
USB-to-Serial chip Provozní (napájecí) napětí Doporučované vstupní napětí Max. proud I/O-pin Flexibilita 3,3 V výstupu
CH340G 5V 7 – 12 V 40 mA 50 mA
WLAN modul SPI-Flash Provozní napětí WLAN standardy WLAN režimy Firmware Další vlastnosti
ESP8266 4 Mbit 3,3 V 802.11 b/g/n Wi-Fi Direct (P2P), Soft-AP AT-Firmware Version 0.22 integrovaný TCP/IP-stack +19,5 dBm output power v režimu 802.11b Integrovaný Low-Power-32-bit-CPU komunikace přes UART
Obsah výukové sady 1 IoT-WiFi-board (NanoESP) 1 nepájivé pole (deska spojů) 1 m vodiče 2 tlačítka 1 klip baterie 1 LED (červená) 1 RGB-LED (4 vývody) 1 rezistor 10 kΩ (barvy proužků: hnědá, černá, oranžová) 1 rezistor 1 kΩ (barvy proužků: hnědá, černá, červená) 1 fototranzistor (2 konektory) 1 NTC 10 kΩ (termistor) 1 piezo reproduktor 1 potenciometr 10 kΩ s červeným přepínacím kolečkem V další části návodu se dozvíte o používání AT příkazů. Samotné experimentování pak přináší nejlepší možnost jako se dokonale seznámit s těmito jednoduchými příkazy pro ovládání modulu. Spusťte program P01_SoftwareSerial v Arduino-IDE. Jedná se o velmi jednoduchý program, který přenáší všechna data přes sériové hardwarové rozhraní mikro-kontrolérů a vlastní softwarové rozhraní do ESP-kontroléru. Celý přenos však funguje i opačně. Ze zdrojového kódu jsou patrné oba připojovací piny softwarového rozhraní (piny 11 a 12). Tyto piny však ve svých projektech nikdy nepoužívejte coby piny GPIO (General-Purpose Input/Output). Pro provoz modulu je nezbytné použití SofwareSerial-Library, která je již u většiny verzí Arduino předinstalována. V opačném případě použijte funkci Manager a knihovnu si stáhněte. Po úspěšné instalaci programu můžete na sériovém monitoru spustit rozhraní Arduino. Předtím však ještě musíte provést dvě důležitá nastavení sériového monitoru. V pravém dolním rohu aplikace se musí zobrazit přenosová rychlost 19200 a dále v levém okně provést konfiguraci volby CR a NL. V té chvíli již spatříte určité informace - AT a OK. Příkaz AT byl odeslán mikro-kontrolérem do ESP-modulu a OK je odpověď modulu. Tímto procesem je dostatečně ověřeno, že WLAN modul funguje zcela správně a je tak připraven k dalšímu použití.
Základní příkazy Nyní můžete začít zadávat základní příkazy modulu a vyzkoušet tak jeho funkci. Příkaz jednoduše zadejte a odešlete jej pomocí klávesy „Enter“. Psaní velkých písmen v příkazech je velmi důležité. Zadejte svůj první příkaz AT a odešlete jej. Program poté příkaz předloží ESP modulu, který odpoví „OK“. Jako další můžete vyzkoušet příkaz AT+GMR. Tímto příkazem se zobrazí aktuální firmware a číslo jeho verze. Příkazem AT+RST provedete reset modulu. Modul poté vyšle informaci ready, což znamená, že je znovu připraven k dalšímu provozu a příjmu nových příkazů. Vyzkoušejte i například následující příkazy: ATE0 – deaktivace odezvy (tzv. „echo“) modulu, což představuje komunikaci na úrovni odeslání příkazu, kde odpověď je znovu stejná jako je původní příkaz. Pokud například odešlete příkaz AT, odezva nebude AT a poté OK, ale pouze OK. Na úvod však doporučujeme tuto funkci aktivovat příkazem ATE1.
WLAN příkazy
AT+CWMODE=1 – modul v režimu stanice (Station mode)
Pomocí následujících WLAN příkazů můžete provést změny v nastavení modulu a jeho WLAN části. Některé příkazy umožňují nejen upřesnění podmínky, ale vyžadují i určitý aktuální stav. Takové zadání se provádí pomocí otazníku například:
Příkaz AT+CWMODE=1 uvede modul do režimu stanice. Tento režim umožňuje připojení k bezdrátovému WLAN-routeru. Modul se zároveň připojí k internetu a umožňuje i další konfiguraci. Příkaz AT+CWLAP poskytne seznam všech dostupných sítí. Pro připojení k routeru musíte zadat příkaz AT+CWJAP. Tento příkaz je obdobný jako příkaz CWSAP, avšak má významné parametry jako například název WLAN sítě (SSID) a heslo. Tyto parametry se vždy zadávají do uvozovek a oddělují se čárkou. Připojení k dalšímu modulu, který je obdobně konfigurován může vypadat následovně:
AT+CWMODE? Následná hodnota bude zpravidla +CWMODE=2 Následovat bude OK. Pakliže zadáte AT+CWMODE=?
AT+CWJAP="MyNanoESP", "MyPassword"
Modul odešle odpověď s možnými parametry příkazu, v tomto případě 1 – 3. CWMODE je příkaz, který můžete použít pro specifikaci režimu WLAN. Na výběr jsou celkem 3 operační režimy:
Samotné připojení k modulu pak může trvat několik sekund. Systém následně vyšle status OK. Pomocí následujícího příkazu můžete zobrazit IP adresu modulu, která mu je přiřazena routerem:
AT+CWMODE=2 – modul coby Access Point (AP Mode)
AT+CIFSR
Ve výchozím stavu je modul Access Point, což znamená, že k němu můžete přímo připojit WLAN kompatibilní a bezdrátové zařízení, jako je například smartphone nebo PC. Spusťte vyhledávání WLAN sítí a připojte se k modulu NanoESP. Modul v tomto stavu nemá přiřazené žádné heslo a umožňuje tak automatické připojení. Připojení k modulu však neposkytuje přístup k internetu, vzhledem k tomu, že modul není router s vyhrazeným připojením k telefonní síti. WLAN režim je optimální volbou pro zřízení uzavřené a zabezpečené sítě. K tomu je zapotřebí použití síťového hesla pomocí příkazu: AT+CWSAP. Zadání příslušných parametrů proto musíte provést v následujícím pořadí a oddělit je vždy čárkou. • • •
Název sítě v uvozovkách, Heslo v uvozovkách, ID kanálu (libovolná hodnota v rozmezí 1 – 13) a režim šifrování (hodnota 0 – 4).
Příklad: AT+CWSAP="MyNanoESP", "MyPassword", 5,3 Po chvilce se na výstupu zobrazí potvrzení OK. Zobrazí-li se chybová indikace ERROR, zkontrolujte znovu zadání a zejména parametry uvedené v uvozovkách. Pokud se i přesto znovu zobrazí chybová indikace, ověřte nastavení režimu CWMODE (parametr 2). V případě, že vše správně funguje, můžete k modulu připojit kompatibilní bezdrátové zařízení. Všechna zařízení připojená k modulu zobrazí svou IP a MAC adresu po zadání příkazu: AT+CWLIF. Konfigurace modulu v režimu stanice. IP připojeného kompatibilní zařízení je zvýrazněna: OK OK AT OK AT+CWMODE? +CWMODE:1
Tento příkaz má význam pro pozdější připojení k TCP-serveru modulu. AT+CWQAP Zadáním tohoto příkazu dojde k rozvázání spojení s routerem. Konfigurace pro připojení dalšího modulu NanoESP AT+CWMODE=1 OK AT+CWLAP +CWLAP:(3, +CWLAP:(4, +CWLAP:(4, +CWLAP:(4, +CWLAP:(4, +CWLAP:(3,“MyNanoESP“,-20,“1a:fe:34:a5:ac:78“,5) +CWLAP:(3, +CWLAP:(3, +CWLAP:(3, +CWLAP:(3, +CWLAP:(4, +CWLAP:(3, +CWLAP:(3, +CWLAP:(3, OK AT+CIFSR +CIFSR:STAIP,“192.168.4.2“ +CIFSR:STAMAC,“18:fe:34:a4:67:87“ OK
OK AT+CWMODE=2 OK AT+CWSAP ERROR AT+CWSAP=“MyNanoESP“, „MyPassword“, 5, 3 OK AT+CWLIF 192.168.4.2,48:5d:60:4e:b4:65 OK
AT+CWMODE=3 – Dual mode Třetí možnost poskytuje možnost nastavení WLAN v duálním režimu. Jak již ze samotného názvu plynu, operační režim modulu je v režimu stanice a AP-mode. Tato funkce přináší možnost navázání přímého připojení k síti WLAN modulu nebo připojení k modulu prostřednictvím routeru, který slouží jako spojovací článek. Jedná se o velmi praktický operační režim například při použití několika modulů v interní síti. Modul tak funguje jako server, který poskytuje všechna data do sítě. Všechny hlavní příkazy naleznete také v příloze tohoto návodu a nebo na webu: www.iot.fkainka.de. Nenaleznete zde i například příkazy pro konfiguraci přenosové rychlosti. Nesprávné použití těchto příkazů a následná konfigurace mohou způsobit nestabilitu a disfunkci modulu.
Automatická konfigurace Následující základní příkazy můžete manuálně otestovat. Dozvíte se zároveň jakým způsobem mohou být příkazy automaticky používány samotným kontrolérem. Naučíte se i jiné příkazy, které můžete použít pro testování dosažitelnosti počítače nebo serveru v síti. V následujícím experimentu bude odeslán diagnostický příkaz (ping) na internetový server Google. Použít proto můžete program P02_GooglePing, který automatizuje celou řadu různých procesů, které jinak musíte zadávat ručně. Kontrolér odešle příkaz do ESP modulu v takovém pořadí, v jakém dochází k připojení do WLAN. Různé časové limity tak dávají modulu dostatek času na odeslání odpovědi. Proto, aby mohl program správně pracovat, musíte zadat pro vaší WLAN data #define SSID a #define PASSWORD přímo na začátek zdrojového kódu programu. Modul však vyžaduje přístup k internetu, aby mohl spustit svůj poslední příkaz. Příkaz AT+PING se odešle na všechna zařízení v síti. Příkaz „ping“ odešle dotaz ke zjištění, zda je počítač v síti dosažitelný. V tomto případě je server Google dotazován příkazem AT+PING=“www.google.com“. Po obdržení odpovědi se zobrazí korespondující indikace na sériovém monitoru a LED „D3“, která je připojena k pinu D13 se aktivuje. Tím došlo k prvnímu úspěšnému navázání komunikace s internetem. Program V této části ověříme funkce programu krok po kroku. Jako první se budeme zabývat komunikací s modulem. 1) Serial communication (sériový přenos) Tato komunikace pracuje prostřednictvím sériového softwarového rozhraní a Software-Serial-Library. Při samotné inicializaci je nezbytné provést indikaci pinů, v tomto případě pinů 11 a 12. #include <SoftwareSerial.h> SoftwareSerial esp8266(11, 12);
Stejně jako u běžného sériového rozhraní můžete přenést bajty nebo celé řádky pomocí příkazů esp8266.print nebo esp8266.println. Příkazy esp8266.find a esp8266.findUntil, díky kterým dochází k přenosu, mohou být rovněž využity. Zároveň je díky tomu možné velmi jednoduše zachytit odezvu modulu. Pokud se však nezobrazí očekávaný řetězec znaků, může trvat nějakou dobu, než bude program pokračovat v dalším procesu. Doba (time-out) je definována esp8266.setTimeout. Příkaz findUntil() je možné použít pro určení druhého řetězce znaků, u kterých dojde k zastavení vyhledávání a návratu hodnot false coby hodnoty pro návrat. Tohoto procesu použijeme díky funkci sendCom(): //-------Controll ESP-------boolean sendCom(String command, char respond[]) { esp8266.println(command); if (esp8266.findUntil(respond, "ERROR")) { return true; } else { debug("ESP SEND ERROR: " + command); return false; } }
Při použití této funkce je nezbytné potvrdit příkaz a očekávanou hodnotu pro návrat funkce, například AT a očekávanou hodnotu návratu OK. Zadání println() vyšle příkaz a vyčkává přijetí očekávaného hodnoty pro návrat nebo obdržení chybového stavu ERROR. Pakliže dojde k obdržení očekávané hodnoty, funkce vrátí hodnotu true. V opačném případě bude modul používat funkci debug() pro návrat ESP SEND ERROR a odešle příkaz. Tím je pak velmi snadné zjistit, který příkaz způsobil chybový stav. Ne však všechny AT příkazy mají unikátní nebo one-line hodnotu pro návrat. Jestliže například byl odeslán dotaz na IP adresu, není většinou předem známa hodnota. Proto druhá funkce sendCom() bude platná pouze při zadání parametru příkazu a vrácení celého přijatého řetězce. Řetězec by však neměl být příliš dlouhý, aby nedocházelo k přetížení bufru SofwareSerial.
2) Řešení problémů Během samotného programového vývoje dojde k mnoha potížím a různým konfliktům. Pro maximální a efektivní odstraňování programových chyb jsou na výběr 2 možnosti, které můžete aktivovat nebo deaktivovat prostřednictvím parametrů zadávaných na začátku programu. #define DEBUG true Tato první možnost neprovádí žádný proces. Poskytuje pouze zjednodušený textový výstup prostřednictvím sériového rozhraní, které je definováno jako výchozí. V případě, že konstanta DEBUG je true, obsah řetězce Msg bude odeslán. void debug(String Msg) { if (DEBUG) { Seriál.println(Msg); } }
Druhou funkci je pak možné velmi jednoduše vysvětlit. Po volání (call) funkce serialDebug, se program přepne do trvalé smyčky (permanent loop) a od té chvíle se bude chovat jako první testovaný SoftwareSerial program. Všechna data odeslána do kontroléru přes sériový monitor budou předány do modulu a stejně tak i obráceně. V případě chybového stavu můžete volat funkci a manuálně odeslat příkazy pro zjištění chybové oblasti. //---Debug Functions--void serialDebug(){ while (true) { If (esp8266.available()) Serial.write(esp8266.read()) if (Serial.available()) esp8266.write(Serial.read()); } }
3) Konfigurace Pro maximální vylepšení a celkovou programovou přehlednost došlo k odstranění většiny nastavení u jednotlivých funkcí. V první řadě tomu tak je u funkce espConfig, ve které jsou nejdůležitější parametry příslušného programu již nastaveny. //---Config ESP8266--boolean espConfig() { boolean success=true; esp8266.setTimeout(5000); success&=sendCom(„AT+RST,“ready“); esp8266.setTimeout(1000); if (configStation(SSID,PASSWORD)) } else { success&=false; } success&=sendCom(“AT+CIPMODE=0“,“OK“); success&=sendCom(“AT+CIPMUX=0“,“OK“); return success; }
Na začátku funkce je proměnná success nastavena jako první na true, vzhledem k tomu, že tato proměnná je přidělena i různým funkcím. To znamená, že i když pouze jedna funkce má hodnotu pro návrat false, bude success okamžitě považován za výstup false a celá konfigurace tím selže. První AT-příkaz, který má být posuzován z pohledu success je reset-command, který se provádí prakticky na každém začátku programu a zajišťuje, aby modul nebyl využíván předchozí testovací částí programu. To však může trvat až 5 sekund. Modul poté odešle informaci o svém statusu (ready). Z tohoto důvodu se time-out pro esp8266.findUtil zvýší před samotným provedením funkce thesendCom(). Po resetu se time-out vrátí do výchozí hodnoty 1 s. Následuje volání automaticky definované funkce configStation(), která slouží pro připojení modulu do místní (domácí) sítě. Parametry SSID a síťové heslo zadané na začátku programu se přitom budou přenášet. V případě úspěšného navázání připojení se zobrazí korespondující informace a poté se přenese IP adresa modulu do sériového výstupu. Na závěr funkce dojde k nastavení parametrů (více v dalších částech v návodu). Nakonec proměnná success bude vrácena a tím bude udržována hodnota true. boolean configStation(String vSSID, String vPASSWORD) { boolean success=true; success&=(sendCom(“AT+CWMODE=1“, “OK“)); esp8266.setTimeout(20000); succes&=(sendCom(“AT+CWJAP=\““+String(vSSID)+ “\ “,\ “ “ +String(vPASSWORD)+ “\ “ “, “OK“)); Esp8266.setTimeout(1000); return success; }
Funkce configStation() byla volána funkcí espConfig(). Modul je konfigurován z WLAN režimu do režimu stanice pomocí příkazu CWMODE a připojení do sítě probíhá pomocí příkazu CWJAP. Navázání připojení pak může trvat o něco delší dobu. Time-out se přitom krátce navýší o 20 sekund. Pakliže preferujete WLAN režim zadejte CWMODE a parametr 3. boolean configAP() { boolean success=true; success&=(sendCOm(“AT+CWMODE=2“,“OK“)); succes&=(sendCOm(“AT+CWSAP=\“NanoESP\“,\“,\“,5,0“, “OK“)); return success; }
Funkce configAP() není volána (call). Jedná se o přesný opak funkce configStation(), vzhledem k tomu, že je použita pro konfiguraci modulu do režimu Access Point. Delší nastavení time-out v tomto případě není zapotřebí, vzhledem k tomu, že modul provádí proces příkazu CWSAP mnohem rychleji. V dalších experimentech bude použito espConfig() namísto configStation() pro volání funkce configAP().
void setup() { //Open serial communications and watt for port to open; Serial.begin(19200); //set the data rate for the SoftwareSerial port esp8266.begin(19200); if (!espConfig())serialDebug(); else debug(“Config OK“); if (Seneci(“AT+PING=“\www.google.com\““,“OK“)) { Serial.printl(“Ping OK“); digitalWrite(13,HIGH); } Else { Serial.println(“Ping Error“); } } void loop()//run over and over { //Start serial Debug Mode – Type commands over serial Monitor serialDebug(); }
Většina nejdůležitějších funkcí, které jsou součástí téměř většiny programů, bude v dalších částech návodu podrobněji popsána. Tyto funkce se používají v Arduino funkcích setup() a loop(). Jako první dojde k inicializaci dvou sériových rozhraní s přenosovou rychlostí 19200. Teprve poté je možné volat funkci espConfig(). V případě chybového stavu se spustí funkce serialDebug(). V opačném případě se zobrazí korespondující informace (success). V dalších programech pak navíc dojde v případě úspěšného procesu a konfigurace k rozsvícení LED na pinu 13 coby korespondující indikace. Tímto způsobem zároveň obdržíte zpětnou vazbu, v případě, že modul není připojen k PC prostřednictvím sériového monitoru. V tomto experimentu se bude LED indikace používat pro zpětnou vazbu procesu ping. Dotaz se provádí přímo v dalším řádku konfigurace. Příkaz AT+PING se odesílá s adresou Google coby parametrem. Dotaz na IP adresu je možné odesílat z místní sítě namísto aktuální adresy. V případě úspěšného procesu se zobrazí korespondující informace a zároveň přitom se aktivuje LED na pinu D3. Nakonec program přeskočí do funkce loop a tím vyvolá funkci serialDebug().Tím máte možnost otestovat i jiné programové příkazy a zároveň i jiné internetové adresy. Rozpoznání sítě V této části naleznete popis jednoduché hardwarové konfigurace. Hlavním úkolem tohoto projektu bude vytvoření indikačního systému (alarmu), který zaznamená vstup a aktivaci specifické sítě do oblasti bezdrátového dosahu modulu. K tomu bude zapotřebí pouze 2 hlavních komponentů a několika málo vodičů. Přesné sestavení naleznete na následujícím obrázku. K sestavení tak bude zapotřebí deska (nepájivé, kontaktní pole), modul NanoESP, vodiče a 1 piezo reproduktor.
Zdrojový text tohoto projektu se výrazně liší od předchozích experimentů v následujících funkcích: void findSSID() { Esp8266.println(“AT+CWLAP“); If (esp8266.findUntil(ToFindSSID, “OK“)) alarm(); } void alarm() { debug(“alarm!“); digitalWrite(LED_ALARM,HIGH); for (int i; i <=30;++) { tone(PIEZO,400,500); delay(500); tone(PIEZO,800,500); delay(500) ; } digitalWrite(LED_ALARM,LOW); }
Funkce findSSID() je aktivována každých 30 sekund v nepřetržité smyčce (loop-routine) a bude provádět skenování všech dostupných sítí ve vašem okolí. Po vyhledání sítě se aktivuje funkce alarm a současně přitom zazní zvuková signalizace a vizuální indikace prostřednictvím LED na pinu D3. V tomto příkladu budeme vyhledávat síť s SSID NanoESP, popřípadě jiného modulu NanoESP v okolí. Pro vyhledávání navíc můžete definovat i jinou SSID a to pomocí příkazu #define ToFindSSID, umístěného na začátek programu. Tímto programem můžete například zjišťovat konkrétní bezdrátový dosah vaší WLAN sítě.
Globální IP adresy jsou obvykle přidělovány poskytovatelem internetového připojení - Internet Server Provider (ISP). Tuto globální adresu zprostředkovává bezdrátový router a přijatá data dále předává počítačům (clients). Jedním ze způsobů jak zjistit globální IP adresu je možnost přejít například na web: http://www.meine-aktuelle-ip.de/, kde naleznete velmi přehledný souhrn všech identifikačních údajů o vašem počítači a navíc i informace o používaném operačním systému, ISP, údaje o použitém rozlišení monitoru a internetovém prohlížeči. Díky IP adrese v síti internetu tak nejsou veškeré aktivity zdaleka anonymní. Port Obdobně jako je například jedinečná poštovní schránka u každého domu, slouží port něco jako hlavní vchodové dveře do domu. Počítač s jedinečnou IP adresou může prostřednictvím různých portů poskytovat různé služby. Přístup k určitému serveru můžete získat díky IP, ale v rámci určitého portu je pak nezbytné vybrat konkrétní službu. Port 20 může například sloužit pro přenos FTP dat a port 23 může zajišťovat připojení do telefonní sítě. Výběr portů je většinou velmi flexibilní, avšak jejich standardizace přináší daleko jednodušší aplikaci. Seznam standardních portů můžete nalézt například na portále: http://de.wikipedia.org/wiki/Liste_der_standardisierten_Ports. UDP UDP je zkratka z anglického User Datagram Protocol. UDP je zjednodušený internetový a přenosový protokol, který neposkytuje záruky na přenos dat mezi jednotlivými počítači. UDP protokol má však následující speciální vlastnosti: • • • • • • •
UDP je schopen vysílání. Neposkytuje žádný přehled o přesnosti nebo opravu chyb. Nedává žádné záruky na úspěšný přenos dat. Neposkytuje záruku na nepoškození dat nebo toho, že nedošlo k předání dat třetím stranám. K jeho provozu není zapotřebí připojení. Zajišťuje rychlou výměnu dat. Zajišťuje jen velmi malé prodlevy během samotného přenosu. Poskytuje korespondující formát, například VoIP (Voice over IP – například telefonické hovory).
UDP a IP V této části se budeme zabývat pojmy jako je IP adresa, porty a protokol UDP.
Výměna dat mezi modulem a PC prostřednictvím UDP
IP adresa
V tomto projektu bude probíhat výměna dat mezi modulem a PC v síti WLAN. Základním předpokladem proto je počítač vybavený WLAN adaptérem a vhodná aplikace pro příjem informací. Pro tento experiment přitom nebude zapotřebí žádného zvláštního hardwarového vybavení.
IP adresa funguje prakticky stejně jako e-mailová adresa. Prostřednictvím IP adresy dochází k identifikaci a adresaci počítačů v síti. IP adresa společného IPv4 standardu může vypadat třeba následovně: IP 192.168.4.1 IP adresa má k dispozici celkem 4 čísla nebo přesněji 4 bajty. Hodnota jednotlivého čísla může být nejvýše 255. Existují místní IP adresy, tedy adresy, které jsou přidělovány síťovým počítačům a různým zařízením v domácí síti a globální IP. Místní IP adresy jsou obvykle přidělovány routerem a zpravidla začínají čísly 192.168. Další čísla jsou pak specifická pro daný router. V případě, že bude modul NanoESP konfigurován jako přístupový bod (Access Point) a připojíte k němu svůj počítač, získá IP adresu 192.168.4. Zároveň se tím vytvoří i vlastní podsíť (subnet). Router Fritz!Box přiděluje místní IP adresy podle schéma 192.168.178.X. IP adresu svého počítače můžete zjistit po zadání příkazu ipconfig do příkazového řádku v nabídce Start – Příslušenství – Příkazový řádek.
Do aktivního řádku zadejte příkaz ipconfig a odešlete jej stiskem klávesy Enter. Operační systém následně poskytne podrobný seznam, který obsahuje bod s IPv4 adresou a vaší místní IP adresou v síti.
Program Po načtení programu P04_UDPBasics.ino do kontroléru, který je konfigurován jako AP, se vytvoří otevřená síť s názvem NanoESP. Před připojením do sítě si stáhněte tento program na internetu. V tomto experimentu je použito programu Packet Sender (vývojářem je Dan Nagle) a stáhnout jej můžete na portále: https://packetsender.com/.
Po stažení a úspěšné instalaci programu můžete svůj PC připojit do otevřené sítě s názvem NanoESP. Ujistěte se však o tom, že ochranná funkce firewall zaznamená síť coby místní síť. V opačném případě bude tato funkce data blokovat. Počítač by měl mít IP adresu 192.168.4.2. Ověřit IP adresu můžete po zadání příkazu AT+CWLIF. Tento příkaz zobrazí všechny počítače připojené k AP s jejich IP a MAC adresou. Spusťte program Packet Sender a nastavte UDP server port na 90. Přejděte proto do nabídky nastavení a síťové konfigurace. Aktivujte možnost použití UDP serveru (Enable UDP Server).
V programu Arduino má funkce configUDP() zvláštní význam pro komunikaci a nastavují se zde proto velmi důležité parametry. Jako první použijte CIPMODE k nastavení režimu data transparency mode na 0. Na závěr pak použijte CIPMUX=0 pro zřízení pouze jednoho připojení. Hlavní příkaz je CIPSTART, kterým dojde k vytvoření komunikace s IP adresou 192.168.4.2 například vašeho počítače a portu 90 použitého pro program Packet Sender s UDP serverem. Pro zajištění první komunikace je nezbytné provést několik dalších kroků. Odesílání a příjem dat s UDP V předchozím projektu došlo k testování UDP komunikace v jednom směru (z modulu do PC). V tomto programu je modul konfigurován pro komunikaci i v opačném směru, obdobně jako je tomu u chatu. Program Tento program obsahuje jen několik málo změn, které však představují obrovskou změnu v další komunikaci s použitím UDP protokolu. Při aplikaci programu dojde k vytvoření dalšího AP pro připojení s PC. K tomu bude zapotřebí program Packet Sender nebo jiný, kompatibilní program. Spusťte program a proveďte stejná nastavení jako v předchozím projektu (Enable UDP Server, Port 90). Jako další musíte zadat adresu modulu (IP 192.168.4.1), nastavte port na 91 a vyberte příslušnou UDP položku. Po provedení těchto úprav a otevření sériového monitoru, můžete odeslat první zprávu (například „Hi“) do modulu. Program v počítači vytvoří UDP server, zatímco kontrolér je konfigurován jako klient. Rozdíl mezi klientem a serverem se neprojeví v UDP protokolu, ale je tak poskytována možnost odeslání dat z kontroléru do počítače.
+IPD,2:Hi OK
RESET OK AP ready UDP ready AT+CWLIF 192.168.4.2,48:5d:60:4e:b4:65 OK AT+CIPSEND=? OK >Hello SEND OK
Pro odeslání dat použijte příkaz: AT+CIPSEND=7. Parametr 7 představuje počet odeslaných znaků. Symbol > je hodnota pro návrat a znamená to, že v té chvíli můžete odeslat svou zprávu. Zadejte „Hello“ a potvrďte klávesou Enter. Modul podá informaci SEND OK, přestože jste zadali pouze 5 znaků. Po zadání Carriage Return a New Line dojde k odeslání. V případě 2 znaků navíc pak je do zadání zapotřebí zahrnout funkci výpočtu délky zprávy (message lenght calculation). Poté, co přejdete zpět do aplikace Packet Sender a logu Traffic, získáte informaci o obdržení zprávy. V zobrazení ASCII budou navíc k dispozici 2 přidružené znaky zastoupené \ r a \ n. boolean configUDP() { boolean success = true; success &= (sendCom("AT+CIPMODE=0", "OK")); success &= (sendCom("AT+CIPMUX=0", "OK")); success &= sendCom("AT+CIPSTART=\"UDP\",\"192.168.4.2\",90", "OK"); //UDP-Server return success; }
Zpráva byla modulem úspěšně obdržena. Pro odpověď použijte příkaz CIPSEND. AT+CIPSEND=7 >Hello
Rozdíl od předchozího programu spočívá pouze v jednom řádku: success &= sendCom("AT+CIPSTART=\"UDP\",\"192.168.4.2 \",90,91", "OK"); Patrný rozdíl je i v použití druhého portu. Tento port (91) je určený pro příjem příchozích dat. Po přidání tohoto jednoduchého řádku pak můžete odesílat data do modulu. Stejný port pak můžete používat i pro odesílání. Pro oba porty můžete zadat hodnotu 90. Teoreticky tato změna modulu umožňuje i příjem svých vlastních dat.
Aktivace LED / UDP Program P06_UDPLED.ino zajišťuje ovládání hardware prostřednictvím UDP. Pomocí jednoduchých příkazů je tak možné LED aktivovat nebo deaktivovat. K tomu je zapotřebí provést zapojení podle následujícího obrázku. Do obvodu proto musíte navíc zapojit 1 rezistor 1 kΩ (barvy proužků hnědá, černá, červená).
Příchozí příkazy jsou analyzovány v loop-routine. Poté, co jsou modulem data přijata (esp8266.available()), jsou analyzována pro přítomnost znaků »+IPD«. Po zaznamenání příkazu led, příkaz parselnt() automaticky ukládá další číslo v proměnné setLed. V rámci definice příkazů to může být buď 1 nebo 0, což jsou hodnoty, které LED spínají (high) nebo deaktivují (low). Další funkce debug a příkaz CIPSEND přenáší potvrzení do počítače. Pakliže příkaz led není součástí přijatých dat modulem, dojde k chybovému stavu (ERROR) a indikaci chybného příkazu. Network switch U předchozího programu docházelo k vyhodnocování prvních příkazů kontrolérem a korespondujícímu spínání LED. Tento program zajišťuje stejnou funkci avšak navíc i nezávisle odesílá příkazy do sítě. K tomuto programu bude coby další hardwarová výbava použito 1 běžného tlačítka. Program
Tlačítko připojené k D8
Zatímco většina programů vyžaduje velké množství vstupních parametrů, tento program pracuje naprosto samostatně. Na výstupu pak zaznamenáte informace, důležité pro odstraňování případných potíží (debugging). Kontrolér vyčká na přijetí dat z WLAN modulu, která jsou ve zprávě udávána +IPD. Další příkazy, které můžete odeslat prostřednictvím aplikace Packet Sender jsou led1 a led0. Kontrolér příkazy interpretuje a odpovídajícím způsobem LED aktivuje nebo deaktivuje. Zpětná vazba pro vyslání příkazů je jejich samotné vyslání. Při odeslání jiného příkazu se na sériovém rozhraní zobrazí „Wrong UDP Command“ a stejná informace je také odeslána do sítě. Ve zdrojovém kódu se zaměříme na řádek s funkcí configUDP(): success &= sendCom("AT+CIPSTART=\"UDP\",\"192.168.4,255 \",90,91", "OK"); Tím dojde ke změně IP. Tato IP adresa se může jevit velmi zvláštně, vzhledem k tomu,že se nejedná o IP adresu počítače. Jedná se o zvláštní typ IP tzv. „Broadcast-IP“. Samotné slovo broadcast se používá například v radiotechnice. Stejně tak jako radiové kanály, tyto vysílaná data mohou být přijata každým zařízením připojeným do stejné podsítě (subnet). Adresa 255 na konci IP adresy představuje broadcast adresu. Spusťte program Packet Sender na jiném počítači a můžete přijímat všechny odeslané příkazy a stejně tak můžete z tohoto počítače sami příkazy odesílat. Další komunikace tak již není omezena pouze na 2 účastníky. void loop() { if (esp8266.available()) { if (esp8266.find("+IPD,")) { if (esp8266.find("led")) { int setLed = esp8266.parseInt(); digitalWrite(LED, setLed);
Program Tento program i nadále vyhodnocuje příchozí příkazy. Stiskem tlačítka navíc dochází k odesílání textu: BUTTON=1 do sítě. Všechna zařízení připojená k modulu s UDP serverem na portu 90 pak mohou tyto příkazy přijímat. Funkci můžete znovu ověřit použitím aplikace Packet Sender. V případě 2 kontrolérů, můžete konfigurovat stejný obvod i pro druhý kontrolér a program načíst do obou kontrolérů s nepatrnými obměnami. Po záměně příkazu Buton=1 za led=1, bude docházet k řízení LED příslušným kontrolérem a tlačítkem. Programové modifikace jsou zpravidla v loop-routine. Jednoduchý „if“-dotaz detekuje stisk tlačítka. Po stisknutí tlačítka kontrolér přenese zprávu Buton=1 do sítě. Navíc se může zobrazit i informace debug. Konfigurace zároveň brání zahlcení systému příkazy po každém stisku tlačítka. Aby mohl program dále pokračovat, je nezbytné tlačítko po stisku uvolnit.
Tento projekt najde využití v moderní, domácí automatizaci. Poté co server přijme status, například z pohybového senzoru, odešle následně příkaz k aktivaci osvětlení do dalšího kontroléru. Tímto způsobem pak může dojít k vytvoření sítě senzorů a speciální konfigurace pro spínání relé. Analogický senzor V posledním projektu tohoto druhu se tlačítko používá k ovládání nejjednoduššího typu senzoru. Při aplikaci této konfigurace se navíc použije potenciometr coby analogový senzor pro nepřetržité odesílání naměřených hodnot do sítě. Do obvodu proto navíc vložte dodávaný potenciometr 10 kΩ.
Potenciometr připojený k pinu A6
TCP Client V této části bude popsán UDP protokol s daty odeslanými a přijatými velmi jednoduchou cestou. Pomocí protokolu je pak možné realizovat celou řadu aplikací. Hlavní pozornost však bude věnována funkci TCP (Transmission Control Protocol). Modul bude konfigurován jako TCP klient, což je stejná úloha jakou zaujímá vaše PC ve vztahu k webovému serveru. Rozdíl mezi TCP a UDP je následující: • • • •
Připojení se provádí pouze mezi 2 zařízeními. Odeslané datové pakety jsou ověřovány a probíhá u nich opravy chyb. TCP se používá především v síti internetu. Tento protokol je o něco pomalejší, než UDP, zato je ale mnohem bezpečnější.
Protokol je používán vaším PC a webovým serverem, který hodláte navštívit a zároveň se tím vytváří vzájemné propojení obou stran. Vlastní webové stránky a jejich obsah je pak přenesen prostřednictvím http (Hypertext Transfer Protokol). Program
Browser / Prohlížeč
V závislosti na typu analogového senzoru, je zapotřebí provést i příslušné úpravy v programu. V této konfiguraci modul není provozován coby AP, ale je připojen do místní sítě. Zadejte proto příslušná data jednoduše na úplný začátek programu. Po načtení programu může samotné připojení do sítě chvíli trvat. Po úspěšném připojení se rozsvítí LED na pinu D3. Tento stav navíc indikuje připravenost modulu k dalšímu provozu. Modul s touto konfigurací však nebude možné použít pro další experimenty. Sériové rozhraní navíc podá informaci o IP adrese, přidělené routerem. Tato IP adrese je velmi důležitá, pokud budete později požadovat adresování modulu. Komunikace modulu probíhá obdobně jako u předchozích experimentů. Pouze IP adresa modulu a PC se změní, protože obě zařízení v tu chvíli mají IP přidělenou routerem. Aplikace Packet Sender v úvodu nepřijímá žádná měření. Odešlete příkaz, například led=1 do modulu. Zadejte proto novou IP adresu modulu do aplikace Packet Sender. Po obdržení příkazu bude docházet k provádění měření cca 1x za sekundu. Další programovou změnu přináší příkaz CIPSTART. Došlo tím k rozšíření broadcast adresy, protože předem není možné předjímat, kterou podsíť router zpřístupní. Další úprava se týká druhého parametru. Nový parametr zajišťuje změnu cílové adresy příkazem CIPSEND. Modul se spouští s IP 192.168 a po přijetí příkazu dojde ke změně IP adresy. success &= sendCom("AT+CIPSTART=\"UDP\",\" 192.168.255.255\",90,91,2", "OK"); Pro tento parametr existují následující možnosti: 1 – mode 0: IP a port zůstanou beze změn. Jedná se o výchozí nastavení. 2 – mode 1: Nastavení se změní jednou a to tehdy, pokud se modul spustí s aktuálně použitou broadcast adresou a poté obdrží informaci z PC, modul se přepne do nové adresy PC. Tato IP adresa zůstane platná i poté, co modul obdrží data z jiného PC. 3 – mode 2: Nastavení se mění s každými přijatými daty dalšího, nového zařízení. IP adresa se může změnit a použít v novém PC i přesto, že již předtím došlo k její změně. Tento proces proto vyžaduje nejprve odeslání příkazu do modulu, aby bylo možné další data přijmout (data z korespondujícího PC). Ke změně IP však nedochází po odeslání dat z PC do modulu. boolean sendUDP(String Msg) { boolean success = true; success &= sendCom("AT+CIPSEND=" + String(Msg.length() + 2), if (success) { success &= sendCom(Msg, "OK"); } return success; }
Analogová hodnota je odeslána do loop-routine. Z tohoto důvodu se používá nová funkce dUDP(), která zajistí daleko snadnější přístup ke známým funkcím. Velká prodleva mezi odesíláním příkazů není v tomto případě žádoucí, vzhledem k tomu, že samotný přenos již zabírá určitou dobu.
V tomto experimentu bude použita stávající hardwarová sestava, která poslouží k optimální demonstraci struktury TCP komunikace se sériovým monitorem. Program Celý program je funkčně shodný s SofwareSerial-Programme. Poskytuje však mimo jiné automatické připojení k bezdrátové síti. Před samotným experimentem si však pečlivě poznamenejte všechna data o vaší domácí síti. Do sériového rozhraní poté zadejte následující příkaz: AT+CIPSTART="TCP","www.example.com",80 Pomocí tohoto příkazu dojde k navázání spojení TCP serveru s webem www.example.com. Port 80 je standardním portem pro HTTP. Po potvrzení připojení můžete zadávat i další příkazy, například: AT+CIPSEND=40 Nyní můžete odeslat zprávu pomocí nově vytvořeného připojení. V případě, že se zobrazí výzva se symbolem > zadejte text a následně vyberte: GET / HTTP/1.1 a potvrďte „Enter“. „Enter“ se v sériovém rozhraní nezobrazuje, přesto ale modul příkaz přijme. Host:www.example.com potvrďte dvojnásobným stiskem „Enter“. Zadání je však nezbytné velmi rychle odesílat. Nejlepší je proto mít připravený textový soubor, ze kterého můžete rychle kopírovat celé řádky. Jako odpověď pak bude přijat delší text. V první části je odpověď serveru a obsahuje některé informace důležité pro prohlížeč. Textová část po je website, kterou si prohlížíte po vstupu na hlavní stranu www.example.com avšak ve formátu prostého textu. Tento příklad ukazuje základ HTTP formátu. Klient se připojuje k webovému serveru. Funkce DNS (Domain Name System) umožňuje zadání názvu domény v textové podobě namísto číselného formátu IP adresy. Textová podoba IP adresy je navíc daleko snazší pro zapamatování. Poté, co proběhne připojení klienta, prohlížeč odešle Get-Request query. Query musí v každém případě obsahovat požadovanou stránku nebo zdroj (v tomto případě hlavní stranu), použitý protokol (http 1.1) a requested host (www.example.com). Zadání host (hostitelský web) je velmi důležité, vzhledem k tomu, že různé webové adresy mohou být umístěny na stejném serveru a s obdobnou IP. Pakliže požadujete odeslat request na jinou stránku, než je home page (domovská stránka), zaměňte / například /example.html. Tato další stránka (sub-page) představuje daleko větší množství informací odesílaných prohlížečem, operačním systémem a jiných parametrů. Samotný obsah webové stránky se poté zobrazí až jako poslední.
Internetový čas / Internet clock V tomto projektu bude využito všech předchozích znalostí a modul NanoESP bude navíc schopen samostatně shromažďovat informace z webu. Tento program načítá aktuální čas z internetové stránky a použije jej coby interní čas pro vlastní kontrolér. Čas bude implementován do interní knihovny a bude interpretován ve výstupu na sériovém rozhraní. K tomuto experimentu bude potřeba pouze samotný modul. Program Zatímco předchozí program vyžadoval spoustu manuálních operací a zadání, tento program pracuje převážně automaticky. Modul se připojí k website: http://chonic.herokuapp.com/. URL může být použita v různých systémech a časových pásmech. Aktuální a platný čas například pro Německo je získán prostřednictvím URL: http://chronic.herokuapp.com/utc/in-one-hour. Příkaz getTime() aplikuje druhý parametr utec/in-one-hour. Na základě UTC (Universal Time Coordinated) bude však zapotřebí provést určité úpravy pro zohlednění změny letního času (utec/in-two-hours). Aktuální čas je od té chvíle v modulu používán prostřednictvím knihovny TimeLibrary (od vývojáře M. Margolise, zdroj: http://www.pjrc.com/teensy/td_libs_Time.html). Pro praktické využití je kopie této knihovny přiložena v příslušném adresáři. Překopírujte tuto knihovnu do vlastního adresáře s knihovnami. Čas od té chvíle bude neustále běžet na pozadí a poskytovat přesný výstup (včetně sekund). Díky internímu času pak můžete jednoduše programovat alarm clock pro různé, časově nastavitelné aplikace. Pro spuštění aktuálního času je nezbytné použití nové funkce:
Parametry pro host address a subaddress jsou této funkci předloženy. Get-Request query je vytvořen a potvrzen TCP serverem webu po navázání připojení. Následně je zapotřebí provést analýzu odezvy serveru (response). Proto je část záhlaví požadavku vynecháno vyhledáváním znaků \r\n\r\n, což představuje pokračování programu po Carriage Return a New Line. Další číslice korespondují s požadovaným datem a časem, který se ukládá do proměnných s počtem volání parselnt(). Datum má specifickou podobu, vzhledem k tomu, že jsou jeho jednotlivé hodnoty od sebe odděleny pomlčkou. Funkce parselnt() tyto hodnoty interpretuje jako záporná čísla. Z tohoto důvodu jsou tyto hodnoty jednoduše vynásobeny –1. Čas je nakonec nastaven funkcí setTime() a poskytuje i výstup se zobrazením sekund. Tím došlo k úspěšné aplikaci aktuálního času převzatého z internetu. Zobrazení teploty / Temperature display Tento projekt má za účel zobrazení aktuální teploty a informací o počasí. Výstupní hodnoty se budou znovu zobrazovat v použitém sériovém rozhraní. Současně přitom bude výstup provázen RGB-LED indikací. Získáte tak přesné informace o aktuálním počasí přímo z internetu. Pro tento experiment bude znovu zapotřebí nepájivého pole, modul NanoESP, 1 RGB–LED, 3 rezistory 1 kΩ a vodiče. Velmi důležité je v tomto případě správné připojení vývodů RGB–LED. RGB je zkratka (Red, Green, Blue) a tato LED je konstruována s použitím několika takových diod a se společnou katodou. Kombinace těchto barev za různého jasu pak může prezentovat celou barevnou paletu. LED by měla být připojena do PWM výstupů pinů D3, D5 a D6 modulu společně s předřadnými rezistory.
Program Jako první je zapotřebí přejít na website, který poskytuje informace o počasí: http://www.openweathermap.com/ Zadejte svou lokalitu (město). V tomto případu je použito město Essen: www.temp.fkainka.de/?city=Essen
Program shromáždí informace o počasí z uvedeného webu a zobrazí tyto informace. Výsledek se bude interpretovat prostřednictvím RGB–LED a současně i pomocí sériového rozhraní. Rozsah pro zobrazení teploty je v tomto programu nastaven od -20 do +40 ºC. Tento program funguje prakticky obdobně jako v předchozím případě. Přesto však nabízí určitá specifika. Funkce getTemp() získává data a následně poskytuje jejich výstup. void rgbTemp(int val) { int green, blue, red ; if (val <= 10 & val >= -20) blue = map(val, -20, 10, 255, 0); else blue = 0; if (val >= 10 & val <= 40) green = map(val, 10, 40, 255, 0); else if (val >= -20 & val < 10) green = map(val, -20, 10, 0, 255); else green = 0; if (val > 10 & val <= 40) red = map(val, 10, 40, 0, 255); else red = 0; analogWrite(RED, red); analogWrite(GREEN, green); analogWrite(BLUE, blue); } Ovládání jasu LED se provádí prostřednictvím funkce rgbTemp(). Příkaz map převádí hodnoty do bajtových hodnot (0 – 255) a do LED. Nižší teploty jsou v rozsahu -20 do +10 ºC. Zelená barva se promítá v celém teplotním rozsahu, přesto je nejvýraznější při teplotě +10 ºC. Červená se přidává při teplotách nad +10 ºC a nejvýraznější je pak při max. teplotě +40 ºC. Barevná škála je pak vysoce intuitivní a velmi jasně koresponduje s aktuální venkovní teplotou. Datový výstup hodnot teploty se navíc zobrazuje i na sériovém rozhraní.
TCP Server V předchozí části došlo k použití modulu coby TCP klienta. V této části bude modul sloužit jako TCP server. Pomocí velmi jednoduchých AT-příkazů pak bude možné provádět komplexní serverové aplikace. Modul NanoESP se tak bude chovat jako internetový TCP server, který bude provádět vlastní programovací procesy. TCP-Webserver Pro funkci webového TCP serveru nebude zapotřebí provádět žádné hardwarové změny. Jako první však na sériovém rozhraní vyzkoušejte několik základních příkazů. Program Do modulu načtěte program a spusťte sériové rozhraní. Tento proces však může trvat i několik sekund. Po zobrazení indikace o úspěšném provedení operace, můžete do sériového rozhraní zadat první příkaz: AT+CIPMUX=1 Tento příkaz umožňuje několikanásobné připojení k modulu, což znamená, že k modulu se může připojit několik počítačů najednou. Dalším příkazem spustíte samotný webserver: AT+CIPSERVER=1,80 Parametr 1 představuje aktivaci serveru. Pomocí parametru 0 pak dojde k ukončení režimu serveru. Hodnota 80 zastupuje číslo použitého portu, pod kterým je server dostupný. Další HTTP komunikace pak obvykle probíhá prostřednictvím portu 80. V té chvíli můžete otevřít vlastní webový prohlížeč a do adresního řádku zadejte IP modulu a potvrďte výběrem „Enter“.
Během připojování k modulu se zobrazuje informace o průběhu načítání webového obsahu. Sériové rozhraní však během toho zobrazuje request podobný tomu, který jste zadávali manuálně. AT+CIPSERVER=1,80 OK 0, CONNECT +IPD,0,363:GET / HTTP/1.1 Host: 192.168.178.58 Connection: keep-alive Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 User-Agent: Mozzila/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Accept-Encoding: gzip, deflace, sdch Accept-Language: de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4
Prohlížeč očekává odpověď a zobrazuje se po celou dobu, dokud nedojde k vypršení časového limitu (time-out). Můžete proto pomocí prohlížeče odeslat variantu známého příkazu: AT+CIPSEND=0,7 Parametr 0 udává klienta, jemuž má být zpráva odeslána. Tento parametr má význam z důvodů možnosti připojení více počítačů (klientů). Druhý parametr 7 dává možnost odeslání znaků. Můžete proto zkusit zadat například „Hallo“ a potvrďte výběrem „Enter“. Ve vašem prohlížeči prozatím nebude patrná žádná změna, dokud neukončíte samotné spojení. Použijte proto příkaz: AT+CIPCLOSE=0 V té chvíli můžete v prohlížeči spatřit pozdrav „Hallo“. Na tomto principu pak probíhá veškerá webová komunikace. Tento experiment tak poskytuje podrobnější náhled do procesů a přenosu dat na internetu. Autonomní webový server Poznatky z předchozího experimentu budou využity i v následující aplikaci autonomního programu. Nový program neodesílá jen jednoduchý website do prohlížeče, ale současně přitom paralelně ovládá LED. K modulu bude navíc nezbytné připojení externího napájecího zdroje. Jako zdroj můžete použít například power bank (externí akumulátor, který slouží pro nabíjení smarthopne). K připojení zdroje k modulu slouží mikro-USB konektor. Vyjma nepájivého pole a modulu bude zapotřebí zdroj napájení (power bank nebo baterie 9 V) a rezistor 1 o hodnotě kΩ.
Program Tento program odesílá o něco složitější webpage, než která byla použita v předchozím projektu. Připojit můžete zároveň LED do pinu D9 modulu. LED pak bude indikovat aktuální změny stavu. Zadejte WLAN data a načtěte program do modulu. IP modulu se zobrazuje v sériovém rozhraní. Otevřete prohlížeč a zadejte IP modulu. V textu zobrazeném v záhlaví bude popsáno jakým způsobem bude řízena LED indikace. Tento program pak aplikuje plně automatizovaný webový server. void loop() { if (esp8266.available()) // check if the esp is sending a message { if (esp8266.find("+IPD,")) { debug("Incoming Request"); int connectionId = esp8266.parseInt(); if (esp8266.findUntil("LED","\n")) digitalWrite(LED, !digitalRead(LED)); String webpage = "
Hello World!
Open [IP]/LED to Toggle LED on D9"; if (sendCom("AT+CIPSEND=" + String(connectionId) + "," + String(webpage.length()), ">")) { sendCom(webpage,"SEND OK"); sendCom("AT+CIPCLOSE=" + String(connectionId),"OK"); debug("Send and Close"); } } } } Ke spuštění funkce serveru znovu použijte velmi jednoduchý příkaz configTCPServer(), který jste již manuálně zadali. Loop-routine pak očekává další příchozí data. Pakliže tato data obsahují „LED“, dojde k přepnutí na LED indikaci, bez ohledu na to v jaké části programu je text „LED“ umístěn. V tomto experimentu proto program obsahuje text:
Hello World!
002 Open [IP]/LED to Toggle LED on D9
je instrukce pro prohlížeč k zobrazení textu
coby záhlaví zápisu 1. V tomto případě se však doposud nejedná o správný HTML kód, ale pouze o jednoduchou formu textového formátování. Délka website se provádí pomocí funkce webpage.lenght() (string class function) a příkazu CIPSEND, kterým dojde ke přenosu webpage. Website s tlačítky V tomto experimentu je samotný website daleko sofistikovanější. Na webu bude použito ovládacích prvků, které zajišťují mnohem pohodlnější ovládání LED. Přesto se hlavní konfigurace příliš neliší od předchozí aplikace. LED je připojena k pinu D9 a je ovládána modulem. Zdrojový text pak obsahuje jen velmi nepatrné změny. Program Po načtení programu přejděte na website modulu. Jednoduše zadejte IP modulu do sériového rozhraní. Uložení website probíhá oproti předchozímu projektu jen s velmi nepatrnými změnami. Zatímco tento jednoduchý web je obsažen v obdobném zdrojovém textu, webpage se nyní ukládá do Progmem (Program Memory). Tato technologie ukládání využívá SRAM modulu a disponuje zároveň možností ukládat i proměnné hodnoty. SRAM disponuje pouze 2 kB paměti a je využívána použitými řetězci. Funkce programu tím dokáže udržovat obsah website v programové paměti, která dosahuje již 32 kB. Přístup k datům je však proto o něco komplexnější.
V tomto případě se jedná o delší HTML dokument ve formátu C-compatible. Tento formát je charakterizován uvozovkami v podobě \" a nový řádek \n. Tato forma je však dobře známa z jiných projektů, které používají programové řetězce. String createWebsite() { String xBuffer; for (int i = 0; i <= sizeof(site); i++) { char myChar = pgm_read_byte_near(site + i); xBuffer += myChar; } return xBuffer; }
Funkce příkazu createWebsite() zajišťuje načtení obsahu Progmem a vrácení v podobě řetězce. boolean sendWebsite(int connectionId, String webpage) { boolean success = true; if (sendCom("AT+CIPSEND=" + String(connectionId) + "," + String(webpage.length()), ">")) { esp8266.print(webpage); esp8266.find("SEND OK"); success &= sendCom("AT+CIPCLOSE=" + String(connectionId), "OK"); } else { success = false; } return success; }
Programový loop-routine v té chvíli očekává request query. Poté, co jej obdrží, dojde k aplikaci funkce sendWebsite() s výstupem funkce createWebsite() a zadaného parametru. Délka textu se v tomto případě definuje pomocí funkce lengh(). Po přenosu website se komunikace ukončuje příkazem AT+CIPCLOSE. Aktivace LED je součástí programového procesu. Rychlokurz HTML / HTML Crash course V této části se budeme krátce zabývat tvorbou HTML a konkrétně vytvořením website pro ovládání modulu NanoESP. Dozvíte se více o základní struktuře HTML dokumentu, vytváření vstupních a výstupních prvků a na závěr také dojde k integraci vašeho vlastního webu do programu Arduino. Soubor HTML je vždy definován na začátku dokumentu. Konec dokumentu pak musí obsahovat . Záhlaví dokumentu obsahuje důležité informace jako je název samotné website pro zobrazení v prohlížeči. V následujícím příkladu však záhlaví bude obsahovat část přídavných informací, které například umožňují komfortní prezentaci na mobilním zařízení (smartphone) (<meta name ="viewport" …). Tyto řádky můžete použít kdykoliv na vaší HTML website. <meta name="viewport" content="width=device-width, initial-scale=2.0, userscalable= yes"> Switch LED
Za parametrem HEAD je nezbytná definice parametru BODY, který zahrnuje obsah website. Na úvod parametru BODY se pak udávají další parametry jako je pozadí webu a barva fontu. Tyto parametry pak můžete upravovat podle vlastních požadavků i později. Typ písma a jeho velikost určuje parametr FONT. Switch LED
Ovládání RGB–LED prostřednictvím TCP Tento projekt se zabývá ovládáním RGB–LED z website na webovém serveru. Správná struktura rozhraní pak může být použita pro změny barev LED. Website bude snadno přizpůsobitelná pro zobrazení i na smartphone. Z hardwarové výbavy bude zapotřebí jen deska spojů (nepájivé pole), modul NanoESP, 1 RGB–LED, 3 rezistory 1 kΩ a vodiče.
Další část dokumentu obsahuje parametr , kterým se definuje horizontální řádek webových stránek. Parametr pak zajišťuje přechod (jump) na další řádek. Switch the LED on D9 ON and OFF
Všechny dosud prezentované parametry jsou používány při návrhu webových stránek. Dalším důležitým prvkem celého projektu bude ovládání LED.
Form-elements, neboli prvky formuláře tvoří podstatu on-line formuláře. Díky nim je možné na webové stránce používat například registrační formuláře. Data vložená uživatelem (návštěvníkem webu) pak mohou být různým způsobem transformována. Pro tyto účely se používá metoda GET, která zajišťuje převod vložených dat na webový server za použití URL. Tato metoda používá celkem 2 tlačítek a převod dat po stisku (výběru) jednoho z tlačítek. Obě tlačítka jsou pojmenovány led, avšak mají naprosto rozdílné hodnoty. Po stisku prvního tlačítka LED ON dojde k znovunačtení aktuální URL s tím, že za URL (v tomto případě za IP modulu) se zapíše /?led=1. Tento text je programem Arduino vyhledáván a přečten číslicový parametr příkazem parselnt() a přenesen do LED. Tímto jednoduchým způsobem pak můžete aktivaci LED ovládat.
Poslední řádek HTML zdrojového kódu pak nepřináší nic nového. Přechod na další řádek a konfigurace horizontálního řádku má za úkol dokončit vzhled webu předtím, než je dokument ukončen pomocí parametru . Vyberte následně jiný website v přiloženém adresáři (sketch folder). Vyzkoušejte si sami změnit například barvu pozadí a na web přidat svůj vlastní text. Vyhněte se však tomu, aby došlo k přeplnění website, vzhledem k tomu, že paměť SRAM dosáhne svou maximální kapacitu velmi rychle. Po dokončení úprav webu, dokument přeneste do programu Arduino. Zkopírujte proto text do schránky a přejděte na web Weiss Converter Tool: http://www.percederberg.net/tools/text_converter.html Vložte text ze schránky do části 2. Select Output: set C/C++/PHP – StringText a UTF-8 – Unix (LF). Po načtení upraveného programu s novými hodnotami můžete spatřit nový web po zadání IP modulu do svého prohlížeče.
Program Nově přenášený web je znovu načten do programové paměti. Naleznete jej také v adresáři s HTML weby (Sketch folder). Po konfiguraci WLAN dat a načtení programu bude webový server dosažitelný prostřednictvím IP modulu. Hlavní strana webu má obdobný design jako v předchozím experimentu. Na tomto webu však bude použito zcela nového prvku a to HTML5 Color Picker, kterým se bude ovládat barevná paleta LED. Zobrazení aplikace Color Picker se může výrazně lišit v závislosti na použitém prohlížeči. Rozdílnost této aplikace od předchozí spočívá v několika málo detailech. Jako první zásadní změna je v záhlaví HTML dokumentu a řádku: Tento řádek a jeho příkazy zajišťují pozastavení snahy prohlížeče načíst „Favicon“ (Favorite icon) po načtení website. Většina webů má svou vlastní Favicon, kterou je web snadno identifikován. Pro načtení této identifikace prohlížečem dochází k odesílání druhého dotazu po aktualizaci samotné stránky. Tento druhý request proto můžete eliminovat a nezatěžovat jím modul. K tomu slouží výše uvedený příkazový řádek. Doporučuje se tento řádek u vašich vlastních HTML stránek použít. Druhá speciální vlastnost v tomto dokumentu je u použití prvku Color Picker, který nahrazuje tlačítka z předchozího projektu. Jedná se o relativně nový element HTML5. V předchozím případě bylo použito tlačítek pro odeslání zápisu hodnot a jejich dalšímu přenosu. Pro okamžitý přenos dat z formuláře je navíc možné použitý velmi jednoduchý a krátký JavaScrip kód (onchange=“this.form“submi()“ Při tomto zápisu nebude zapotřebí použití zvláštního tlačítka:
Vybrané barvy jsou nyní aplikovány pomocí zápisu /?rgb=%23, po němž následuje 6 znaků. Výraz %23 představuje hexadecimální číslo. Pro bílou barvu je URL následující: [IP]/?rgb=%23ffffff
Pro kontrolér bude následně zapotřebí určit konkrétní barevné hodnoty LED z tohoto hexadecimálního čísla, které získá z následující části funkce loop: if (esp8266.findUntil("?rgb=", "\n")) { String hexstring = esp8266.readStringUntil(‚ ‚); long number = (long) strtol( &hexstring[3], NULL, 16); int r = number >> 16; int g = number >> 8 & 0xFF; int b = number & 0xFF; analogWrite(RED, r); analogWrite(GREEN, g); analogWrite(BLUE, b); }
Tento řádek zajišťuje automatické obnovování website každé 3 sekundy. Není tak zapotřebí stisku tlačítka F5 na klávesnici, pro zobrazení nových, aktuálních hodnot. Druhá změna spočívá v místě zápisu, kde zpravidla bývá umístěno formulářové pole.
Pro funkci této aplikace a výstup bude zapotřebí pouze samotný website. Dva hlavní prvky label a range jsou použity coby výstupní prvky. Label, který se zpravidla používá pro označení, obsahuje položku „bright“ v textu. Posuvný prvek pro určení rozsahu má přiřazenou hodnotu „bright“, která není legitimní hodnotou, ale bude později zaměňována. Maximální hodnota rozsahu je 1024 a tato byla přizpůsobena do 10-bitového rozsahu ADC kontroléru. Proto je zapotřebí zajistit záměnu placeholderu hodnoty „bright“ skutečnou (legitimní) hodnotou. String createWebsite() { String xBuffer;
Funkce strtol() konvertuje text, který je uveden za zápisem %23 do dlouhé číslice a poté do 3 bajtových hodnot, které jsou poté přeneseny do LED za použití funkce analogWrite().
for (int i = 0; i <= sizeof(site); i++) { char myChar = pgm_read_byte_near(site + i); xBuffer += myChar; }
Světelný senzor / Light Sensor V tomto projektu website webového serveru neslouží pro ovládání rozhraní, ale jako výstupní prvek. Světlo měřené prostřednictvím světelného senzoru se zobrazuje jako relativní hodnota s novým HTML elementem. Tato konfigurace vyžaduje fototranzistor, který zde funguje jako světelný senzor.
xBuffer.replace("*bright*", String(analogRead(SENSOR))); return xBuffer; } Placeholder je zaměněn ve funkci createWebsite(). Jako první dochází k načtení obsahu Progmem z paměti a uložení do řetězce. Předtím, než funkce vrátí tento řetězec, všechny „bright“ řetězce jsou zaměněny hodnotou aktuálně naměřenou fotosenzorem. Funkce replace() tuto funkci provádí zcela automaticky. Na závěr pozměněný řetězec může být vrácen a přenesen do prohlížeče. GPIO-Control
Fototranzistor je snadno rozpoznatelný, přestože na první pohled může vypadat jako běžná LED. Uvnitř pouzdra má však velmi dobře patrný tmavý bod. Kolektor fototranzistoru má kratší elektrodu, která se připojuje k signálu +5 V. Do série s fototranzistorem se poté připojí rezistor 10 o hodnotě kΩ. Fototranzistor je připojen k pinu A6 v sérii s rezistorem 10 kΩ. Program Doposud byl website vždy vytvořen z neměnné stránky, která odesílá data do kontroléru. V tomto případě však dochází ke změně website před samotným odesláním dat do prohlížeče a zobrazením odpovídající hodnoty světelných podmínek prostřednictvím fototranzistoru. Zdrojový kód website bere v patrnost atribut placeholder, kterou program nahradí hodnotou „bright“ po načtení dat z programové paměti, aktuálními hodnotami. Další řádek v HTML dokumentu zajišťuje automatické obnovení v intervalu několika sekund. Aktuální hodnota světelných podmínek se zároveň zobrazuje v prohlížeči. První změna v záhlavní části dokumentu: <meta http-equiv="refresh" content="3">
Tento nový experiment provádí jednoduché ovládání digitálních pinů D2 – D7 prostřednictvím website. Stav příslušných pinů je přitom prezentován v prohlížeči a díky tomu tak máte neustálý přehled o právě probíhající aplikaci. V projektu je použito 1 RGB–LED a 1 LED. Katody obou LED jsou připojeny k GND mimo desku. Po uvedení těchto pinů do nízké rozhodovací úrovně (low) dojde k současnému rozsvícení obou LED.
Poznámka: LED musí být připojeny bez předřadného rezistoru. Vzhledem k tomu, že jsou LED umístěny mezi 2 porty, jsou již připojené do obvodu s předřadným rezistorem o hodnotě 60 Ω. V závislosti na typu a barvě LED se jejich povolený proud pohybuje v rozsahu 15 – 30 mA. Program Website tohoto programu používá zaškrtávací políčka coby HTML prvek. Po načtení programu a volání stránky modulu, bude k dispozici větší množství políček, které je možné zaškrtnout. Symbol zaškrtnutí v políčku představuje vysokou rozhodovací úroveň pinu (high). Nezaškrtnuté políčko znamená pin na nízké úrovni (low). Vyzkoušejte proto následně, která políčka je nutné zaškrtnout proto, aby se rozsvítili obě LED.
if (esp8266.find("+IPD,")) { debug("Incoming Request"); int connectionId = esp8266.parseInt(); if (esp8266.find("/?")) PORTD = B00000000; while (esp8266.findUntil("ld", "\n")) { int ld = esp8266.parseInt(); PORTD |= (1 << ld); } }
Zaškrtávací pole pak funguje následovně: Placeholder z HTML dokumentu je zaměněn díky funkci createWebsite(). For-loop prochází všemi porty zapojenými v sérii. Pakliže má pin aktuální úroveň high (znovu určenou bajtem, který byl vytvořen přesunutím high bitových číslic v indexu), placeholder s indexem je zaměněn označeným textem. Pakliže má pin low úroveň, placeholder bude smazán. Tím je zajištěno odpovídající zobrazení aktivních portů. String createWebsite() { String xBuffer;
HTML kód používá website coby vstupní formulář a výstupní prvek zároveň. Zaškrtávací políčka mají svoje názvy, které jsou odvozeny z názvů pinů. Placeholder v textu je text „checkedX“ ve všech případech. Pakliže je určitý pin uveden do nízké rozhodovací úrovně low, placeholder je jednoduše vymazán. V opačném případě (úroveň high) program zamění „checkedX“ zápisem CHECKED, což zajistí zobrazení zaškrtávacího pole s příslušným symbolem během načítání. V tom okamžiku musí dojít ke stisku tlačítka po výběru správných polí pro přenos dat z formuláře.
Programovaný proces pak funguje následovně: Předpokládejme, že pole 3, 5 a 7 jsou zaškrtnutá. URL se pak změní na: [IP]/?ld3=on&ld5=on&ld7=on To znamená, že pouze vybraná pole a jejich hodnoty budou převzaty a identifikovány v rámci základního indexu, což se provádí díky funkci loop-routine. Port D, na kterém dochází k vyhodnocování stavu, je přepnutý do úrovně low. Díky funkci while-loop dojde k prohledávání všech „ld“ ve zdrojovém řádku. V indexu je nalezeno ld, na ld3 může být například hodnota 3, která generuje 1 bajtový posun uvedeného indexu, batju 0b0001000. Jedná se tak o funkci or-linked aktuální hodnoty bajtu. Tento proces se provádí pro všechny potvrzené indexy, dokud výchozí registr D nedosáhne správné hodnoty. Tento druh výstupu (namísto digitalWrite()) je pro uživatele Arduino možná poněkud zvláštní, avšak v tomto případě vychází z praktického hlediska.
for (int i = 0; i <= sizeof(site); i++) { char myChar = pgm_read_byte_near(site + i); xBuffer += myChar; } for (int x = 2; x <= 7; x++) { if (PORTD & (1 << x)) { xBuffer.replace("*checked" + String(x) + "*", "checked"); } else { xBuffer.replace("*checked" + String(x) + "*", ""); } } return xBuffer; }
Při vývoji tohoto programu však došlo k zaznamenání určitých problémů a jejich příčina nebyla ihned patrná. Chybový stav nastal při načítání website a po zaškrtávání určitých polí. Jednoduché řešení však poskytuje aplikace Arduino-MemoryFree-Master-Library na webu: http://playground.arduino.cc/Code/AvailableMemory Po dosažení maximální kapacity SRAM docházelo k zvláštním a náhodným chybovým procesům. Díky aplikaci se však podařilo všechny tyto procesy odstranit. Funkce string.replace() je velmi praktická, přesto však zabírá velké množství paměti. Pakliže zaznamenáte různé chyby v určité části programu, doporučuje se výrazná redukce zdrojového kódu HTML souboru a optimalizace některých řetězcových operací. Shora uvedená knihovna vám přitom může výrazně pomoci. Insert: Přístup k modulu z internetu Většina experimentů, kterými jsme se doposud zabývali mají praktické využití v ovládání modulu prostřednictvím domácí sítě. Speciální funkce modulu však umožňují jeho ovládání i na větší vzdálenost. Moderní technologie a inteligentní systémy současných domácností však vyžadují velmi náročné aplikace, jakými jsou například ovládání domácích spotřebičů a osvětlení na dálku třeba během dovolené. Spínaní osvětlení má využití zejména z bezpečnostních důvodů, kdy je zapotřebí navodit přítomnost osob v objektu. Použití světelných senzorů zase umožňuje spínání osvětlení na určitých místech a nebo osvětlení za snížených světelných podmínek a pohybu osob (například na zahradě). Pro to, aby bylo možné využít všech těchto funkcí, je nezbytné provést několik málo úprav u používaného routeru. Každý router vyžaduje svůj specifický software. V následující části bude prezentován obecný postup pro konfiguraci Fritz!Box routeru. Konfigurace jiného routeru však bude prakticky obdobná.
Většina routerů používá jednoduché webové rozhraní, podobné tomu, které jsme vytvářeli v předchozích projektech. Pro připojení k rozhraní je zapotřebí zadaní správného uživatelského jména a přístupového hesla. Routery Fritz!Box používají zpravidla stejnou IP adresu 192.168.178.1. Obdobně ale můžete přejít na web routeru (http://fritz.box). V případě použití jiného routeru musíte získat jeho správnou IP adresu. Router většinou používá IP s adresou 1 v podsíti. Pakliže je IP vašeho počítače například 192.168.4.2., potom IP routeru je zpravidla obdobná. Přístupové heslo a jméno naleznete na zadní straně routeru nebo v příslušném návodu k routeru. Po přihlášení do uživatelského rozhraní bude zapotřebí nalézt položku s přenosovým portem. U routeru Fritz!Box se tato položka nachází v menu Internet – Release, kde vytvoříte nové pravidlo pro port. Konfigurujte externí queries pro port 80 a odesílání dat do IP modulu a jeho portu 80. Konfigurace každého routeru je však velmi jednoduchá a intuitivní. U tohoto routeru stačí vybrat HTTP server a zvolit existují IP v rozbalovacím menu. Po úspěšné konfiguraci routeru můžete přejít k prvnímu experimentu. Použijte proto svou vlastní IP, kterou zjistíte po přechodu například na http://www.meine-aktuelle-ip.de/. Po zadání IP adresy, kterou naleznete na této stránce, můžete spatřit website vašeho modulu. Pro ověření, zda je modul dostupný on-line, použijte například svůj smartphone s připojením k mobilní síti a přejděte na stránku modulu. Současná konfigurace je vhodná i pro další experimenty. Přesto se zde nacházejí 2 problémy, které ztěžují praktické využití routeru. Jeho IP je složitá pro zapamatování a navíc se jeho IP často mění. Routery provádějí reconnect zpravidla jednou denně a tím dochází ke změně globální IP routeru. Řešení těchto problému je následující: Domain Name System (DNS). Tento systém umožňuje přechod například na web www.google.com aniž by bylo nutné zadávání IP adresy. Tato technologie převádí složité IP adresy na jednoduše zapamatovatelné názvy. Všechny současné weby používají DNS, která je pak volně dostupná. Některé weby navíc používají funkci DDNS (Dynamic Domain Name System), která zajišťuje správné přiřazení IP určité doméně. Pro další projekt bude použito webu http://www.anydns.info/. Můžete ale použít jakýkoli jiný web podle vlastního výběru. Jako první se musíte na webu přihlásit a zadat název domény. V tomto případě je použito jména nanoesp a host dynpc.net. Po přihlášení je k dispozici portál: http://nanoesp.dynpc.net/. Služba pak musí načíst vaší IP. Proto je zapotřebí službu předat routeru, tak aby nová IP adresa byla odeslána přímo do služby DDNS. V routeru potom vyberte volbu View: Advanced pro zobrazení všech možností konfigurace. Zadání služby DDNS je pak možné provést v nabídce Release. Upozornění pro všechny uživatele internetu! Dynamická DNS je velmi praktická funkce, přesto však buďte velmi opatrní s tím, komu předáte název své domény. Vystavujete se tím riziku možného napadení! Jediné co hackeři potřebují znát proto, aby pronikli do vašeho počítače, je vaše doména, nikoli IP adresa. Z těchto důvodů je bezpečné shora uvedenou stránku používat pouze testovací účely a po nezbytně nutnou dobu.
ThingSpeak Poslední část tohoto návodu bude věnována platformě ThingSpeak. Tento web je věnován tématu Internet of Things a zahrnuje praktické poznatky ze světa programování. Tyto stránky můžete využít pro ovládání a sledování elektronických modulů prostřednictvím sítě internet. Vlastní projekty a hodnoty přitom můžete ukládat na externí úložné médium. Přejděte proto na webový portál: www.ThingSpeak.com a vytvořte si svůj vlastní uživatelský účet. Po přihlášení se zobrazí náhled dostupných kanálů. Vzhledem k tomu, že jste doposud žádné kanály nekonfigurovali, bude tato stránka prozatím prázdná. Nový kanál vytvoříte výběrem New Channel. Zadejte jeho název, například „Light“, protože následující projekt bude zaměřen na analýzu a měření okolního osvětlení. Pod bodem 1 můžete přiřadit ještě jeden název pro pole, například „Brightness“. Všechna ostatní pole pak mohou prozatím zůstat prázdná.
Další konfigurace tohoto experimentu je založena na použití senzoru připojeného k analogovému vstupu pinu A6. Napěťový dělič s rezistorem 10 kΩ a fototranzistor potom zajišťují měření aktuálních světelných podmínek. Použít můžete navíc i teplotní senzor. Při použití termistoru (NTC) bude obvod praktický stejný, jen s tím rozdílem, že fototranzistor je zaměněn za NTC. Termistor je bipolární a tak na jeho zapojení (polaritě) do obvodu nijak nezáleží.
Program
Twitch Display
Tento program je určen pro měření okolního světla. V tomto případě však nedojde k výstupu dat na web, ale přímo na webovou stránku ThingSpeak. Na stránce přitom nedochází k uložení dat, ale k jejich zobrazení v přehledném grafickém režimu. Tento způsob zobrazení je velmi praktický pro měřící stanice s dlouhodobým monitoringem. Aby byl program schopen odeslat data na website, bude zapotřebí zadní klíče API, který je v programu uveden pod položkou ThingSpeakKEY společně s WLAN daty. Po načtení programu budou k dispozici naměřené hodnoty zobrazené na sériovém rozhraní. Data nashromážděná po dobu 15. sekund jsou následně zprůměrována a poté odeslána na stránku ThingSpeak. Interval 15. sekund hraje velmi významnou roli. Nemůže tak docházet k odesílání dat každou sekundu. Výsledné hodnoty (průměr) jsou pak zobrazeny na stránce s kanály v grafu.
Website ThingSpeak disponuje daleko větším množstvím funkcí, než je jen monitoring senzorů. Následující projekt bude velmi podobný projektům s TCP klientem. Informace se přitom shromažďují z website na internetu. V tomto případě je specifický datový stream on-line nebo není k dispozici. Jednou z výhod je, že ThingSpeak může volat website prostřednictvím HTTPS (HyperText Transfer Protokol Secure), zatímco modul podporuje pouze HTTP protokol, který je daleko méně bezpečný. Druhou výhodou je to, že website umí předem filtrovat důležité informace a poté i snížit objem dat, která mají být zpracovány kontrolérem modulu. V tomto experimentu dojde k realizaci zobrazení Twitch streaming, coby příklad různých možností. Twitch (www.twitch.tv) je website, na kterém jsou streamovány live games (a jiný obdobný obsah související s hrami pro PC). Jeden z nejznámějších streaming kanálů je RocketBeansTV (dříve GameOne). Tento kanál vysílá po celý den a je tak velmi vhodný pro první experiment. V dalších projektech však můžete sami zvolit i jiný web. Pro tento experiment bude mimo jiné zapotřebí 1 LED (červená) a 1 rezistor 1 kΩ.
Zdrojový text se výrazně liší od předchozích programů. Přesto obsahuje všechny doposud známe prvky. Progmem zahrnuje HTTP request, který musí být odeslán na ThingSpeak page a stejně tak i některé placeholdery, které budou v případě potřeby zaměněny. Program POST *URL* HTTP/1.1 Host: api.thingspeak.com Connection: close Content-Type: application/x-www-form-urlencoded Content-Length: *LEN* *APPEND*
Znovu bude zapotřebí zadání „URL“. Stejně tak musí být zaměněna „LEN“ délkou zápisu, který zadáte namísto „APPEND“. Jedná se o universální, platný formát website, kterým dochází k odesílání dat na stránky s POST-request. V případě, že budete chtít zadat naměřená data do vytvořeného kanálu, musíte použít následující strukturu: „URL“ je /update, což je sub-page, na kterou se musí odeslat data. Zápis je tak vytvořen díky API key, obsahu pole a hodnotě. POST /update HTTP/1.1 Host: api.thingspeak.com Connection: close Content-Type: application/x-www-form-urlencoded Content-Length: 35 api_key=GXE93O4WF03Q3X8I&field1=954
Website umožňuje identifikaci uživatele a kanálu pomocí klíče API a automaticky vkládá hodnoty. Pro odeslání nové hodnoty musí dojít k volání (call) funkce sendThingPost(), která vyžaduje parametr KEY a data senzoru. Ostatní procesy pak budou probíhat na pozadí zcela automaticky.
Nabídka Apps poskytuje různé možnosti pro následující aplikaci. V tomto experimentu se budeme zabývat aplikací ThingHTTP. Po výběru korespondujícího tlačítka se zobrazí téměř prázdné rozhraní. Vyberte NewHTTP. Do aktivního formuláře zadejte následující parametry: Name: Twitch URL: https://api.twitch.tv/kraken/streams?channel= rocketbeanstv Method: GET HTTP Version: 1.1 Parse String: _total Pakliže dáváte přednost jinému streamovacímu kanálu, zadejte jiný kanál do URL za kanálem. Vyberte Save ThingHTTP a zkopírujte API key, který se zobrazí, do dočasné paměťové schránky (clipboard). Následně klíč překopírujte do programu za #define ThingHTTP. Nezapomeňte na WLAN data. V této chvíli můžete načíst program. Program bude 1x za minutu vyhledávat streamovací obsah a po jeho nalezení se rozsvítí LED. Tento programu funguje díky přenosu informací Twitch page ve známém JSON formátu. Na stránce https://api.twitch.tv/kraken/streams?channel=rocketbeanstv můžete zaznamenat výstup ve formátu JSON. Naleznete zde velké množství textu. Zajímat se ale budeme jen o attribute_total, který umožňuje zobrazení aktivního streamu. Pakliže je jeho hodnota větší než 0, znamená to, že je aktivní nejméně 1 stream. Tento atribut je automaticky analyzován funkcí ThingSpeak-page a výstup je poskytován ve strukturované hodnotě. Tato hodnota může být volána a hodnocena programovou funkcí getThingSpeakHttp(). Twitter alarm system Tímto projektem můžete vytvořit vlastní bezpečnostní systém, který zaznamená například otevření dveří nebo boxu bez příslušného oprávnění. V tomto případě dochází k nepřetržitému vyhodnocování stavu světelného senzoru, který je vystaven specifickým světelným podmínkám. Pakliže dojde
k aktivaci alarmu, systém odešle informace, které spustí akustický výstup prostřednictvím připojeného reproduktoru. Alternativně je možné namísto senzoru použít teplotní senzor, který bude sledovat výkyvy teplotních změn. K modulu proto připojte 1 fototranzistor, 1 rezistor 10 kΩ a piezo reproduktor.
Program Jako první je nezbytné vytvoření nového TalkBack kanálu (Apps / TalkBack). Kanál můžete nazvat například „Doors“. Do kanálu je zároveň možné zadávat různé příkazy. Použít můžete „Light“ kanál z prvního experimentu a stejně tak i jiný kanál. Všechny příkazy jsou aplikací protokolovány. Zejména API key, který zadejte do #define TalkBackKEY. Vyjma API-KEY bude zapotřebí ID, který naleznete v menu TalkBack ID, poté co jste vybrali Save TalkBack. Zadejte toto ID za #define TalkBackID v programu. V případě, že načtete program a použijete sériové rozhraní, jako první uvidíte informaci „No Command“. Stiskněte některé z tlačítek. Po chvilce se zobrazí zpráva OpenDoor nebo CloseDoor, v závislosti na tom, které tlačítko stisknete. Během příkazu OpenDoor se zároveň rozsvítí LED. Aplikace poskytuje možnost, díky které můžete zadávat příkazy přímo přes internet. Pokud zvolíte „Doors“ kanál na stránce TalkBack, zobrazí se možnost vytvoření nového příkazu Add a new command. Příkazy OpenDoor nebo CloseDoor můžete manuálně zadávat a tím ovládat i modul. Modul pak navíc můžete ovládat i z různých zdrojů prostřednictvím příkazů TalkBack. Ve zdrojovém textu bude funkce getTalBackCom() vyžadovat nové příkazy. Po jejich nalezení dojde k navrácení příkazu. K tomu navíc musíte zadat parametry key a id. Cheerlights
Světelný senzor je připojen k pinu A0, piezo reproduktor k pinu D8. Na webu ThingSpeak a v nabídce App vyberte ThingTweet. Po výběru linku TwitterAccount a zadání přístupových dat dojde k připojení ke dvěma službám. Pakliže prozatím nemáte registraci na webu Twitter, doporučujeme se zaregistrovat a vytvořit zkušební účet k provádění dalších experimentů s touto experimentální sadou. Po úspěšném linku do ThingSpeak zadejte API key pod Apps/ThingTweet za zápisem #define TwitterKEY v tomto programu. Program bude sledovat naměřené světelné hodnoty a zejména překročení hodnot nad 500. Po překročení této hodnoty dojde k odeslání informací do reproduktoru. Pakliže hodnoty znovu klesnou pod předdefinovanou hranici, zvukový výstup se deaktivuje. Aktuálně naměřené hodnoty se zároveň zobrazují na sériovém rozhraní. Během konfigurace a prvních pokusů je však vhodné senzor zakrýt. V opačném případě může dojít k předčasnému spuštění alarmu. Projekt zahrnuje novou funkci sendTwitterPost(). Povinné parametry, které je nezbytné zadat jsou TwitterKEY a message. Informace je stejně tak možné odesílat prostřednictvím stisku tlačítka nebo kalkulaci naměřených hodnot. Tyto funkce jsou založeny na jednoduchém parametru ThingSpeak-API. TalkBack V tomto projektu je používána aplikace TalkBack, která umožňuje vytváření příkazů, které jsou přečteny a spuštěny pomocí modulu. Funkce, které jsou neproveditelné jedním kontrolérem, jsou realizovatelné dvěma nebo více kontroléry. Některé moduly pak mohou aktivovat senzory, například detektory pohybu a odeslat příkaz TalkBack. Další modul přitom může přečíst příkaz z webu ThingSpeak-page a pak provést další operaci, například otevřít dveře nebo spustit alarm. Pro experiment je zapotřebí 2 tlačítek. Aktuální stav a proces pak indikuje připojená LED (červená) s předřadným rezistorem.
Tlačítka jsou připojena k pinu D5 a D10, LED k pinu D9.
Tento experiment je podporován projektem od vývojáře Hanse Scharlera. Cílem je ovládání osvětlení pomocí příkazů Twitter. Experiment je ideální pro získávání dalších zkušeností a znalostí ze světa internetu. Do hardwarové výbavy bude znovu použita 1 RGB-LED a poté 3 rezistory 1 kΩ. RGB-LED je připojena k desce a k pinům D3, D5 a D6.
Program
Twitter požární hlásič s funkcí TalkBack
Pro funkci tohoto programu nebude zapotřebí provádět žádné zvláštní úpravy v aplikaci ThingSpeak. Tento projekt má k dispozici veřejný kanál, který naleznete pod http://thingspeak.com/channels/1417. Na této stránce navíc naleznete aktuálně používané barvy a další informace k celému projektu.
V tomto projektu jsou kombinovány 2 prvky, se kterými jste se již během předchozích experimentů seznámili. Modul je znovu použit pro monitorování teploty. Po dosažení specifických hodnot (například při požáru) pak dojde ke generování akustické signalizace. Monitoring dosažení mezních hodnot (treshold) má však v tomto případě za úkol ThingSpeak-App React. Celý systém využívá termistoru NTC (Negative Temperature Coefficient), který byl dříve použit coby alternativa světelného senzoru. V obvodu je navíc znovu použit potenciometr, který zajišťuje přizpůsobení citlivosti měření.
Program Při aplikaci tohoto programu dojde ke kombinaci několika rozhodovacích úrovní. Velmi významnou roli bude navíc v tomto projektu hrát ThingSpeak page. Monitoring a přenos hodnot naměřených termistorem zajišťuje aplikace ThingSpeak, odkud probíhá spuštění alarmu po odeslání Twitter message a vložení příkazu TalkBack k jeho spuštění. Jako první bude nezbytné vytvořit nový kanál na stránce ThingSpeak. Pojmenovat jej můžete například „Alarm“. Pole 1 je určeno pro nastavení hodnot teploty. Pod položkou API Key naleznete první klíč, který musíte zadat do pole ThingSpeakKEY. Tím bude zajištěn přenos dat aktuální teploty. Pro správnou funkci programu bude nezbytné použití Crossfade-Library (vývojáře R. Wierzbicki, zdroj: http://github.com/radekw/Arduino/tree/5f24ce7c8db9dfbb525b59824c3217d851b3a3c). Zkopírujte si Library, která je součástí adresáře Sketch a překopírujte ji do souboru knihoven Sketchbook. Tato knihovna zajišťuje rychlou a snadnou definici barev a pomalý, plynulých přechod (fade) barev LED. Načtete program a chvíli vyčkejte, než dojde k zobrazení aktuální barvy LED. Nyní můžete zapisovat Twitter message, kterým dojde k aplikaci barevných změn u všech aktuálně připojených Cheerlights uživatelů. Zápis musí obsahovat #Cheerlights, @Cheerlights nebo pouze klíčové slovo Cheerlights a zároveň musí za klíčovým slovem zahrnovat předdefinované barvy. Předdefinované barvy jsou: červená, zelená, modrá, tyrkysová, bílá, teplá bílá, purpurová, agenta, žlutá, oranžová a růžová. Tweet pak může mít například následující podobu: Testing my #cheerlights project on my #NanoESP with the color blue #ThingSpeak #IoT Jedná se o možnost jak „zbarvit“ celý svět. Query pro aktuální barvy je implementován ve funkci getCheerlightColor(). Potřebné parametry jsou host, například api.thingsspeak.com, a URL v tomto případě /channels/1417/field/1/last.txt. Odezva serveru je znovu zkrácena na příslušný text a vrácena. Porovnávání klíčových slov zajišťuje změnu barev, které jsou zobrazeny v Crossfade Library. Jedná se v podstatě o velmi jednoduchý projekt s fantastickým efektem.
V dalším kroku vygenerujte nový TalkBack prvek (pojmenujte jej například „Alarms“). Použít však můžete i příkazy zaznamenané v kanále FireAlarm. Zadejte API key za TalkBackKEY a ID za TalkBackID. V té chvíli můžete odesílat příkazy do modulu. Příkazy můžete zadávat i ručně po výběru Add a new Command příslušného kanálu a poté je zadejte do Command String Alarm. V tomto případě nebudete muset zadávat pozici, protože příkaz je automaticky uložen na první pozici. Načtěte program a otestujte jej. Během testování zaznamenáte přenos hodnot aktuálních teplot teploty a to jak modul aplikuje přijaté příkazy. Při tomto experimentu bude vhodné provést kalibraci NTC prostřednictvím potenciometru a podle hodnot pokojového (prostorového) termostatu. Tento projekt však navíc doposud neodhalil všechny své speciální funkce. V samotné ThingSpeak aplikaci vyberte React. Jedná se o funkci, která umožňuje zvláštní nastavení a reakci modulu při specifických událostech. Vytvořte novou React funkci a zadejte následující hodnoty: Name: FireDetect1 Condition Type: Numeric Test Frequency: On Data Insertion Condition: If Channel FireAlarm field 1 (Temp) is greater than 40 Action: ThingTweet then tweet: Fire Alarm on the #NanoESP! Temp: %%trigger%%C #ThingSpeak #IoT
Using Twitter Account [Twitter Account] Run action only the first time the condition is met
Options:
Konfiguraci uložte (Save React). Tím došlo k vytvoření prvního kroku pro monitoring hodnot. Dojde-li k překročení nastavených hodnot, ThingSpeak odešle Twitter message prostřednictvím uživatelského účtu. V dalším kroku dojde k vložení příkazu alarm command. Hodnoty treshold musí být na úrovni, při které je sami můžete pocitově zaznamenat (tvorba kouře při požáru). Nejedná se o funkci, která je systémem automaticky podporována. Podporu však naleznete ve funkci ThingHTTP. Přejděte proto do aplikace a vyberte ThingHTTP. Vytvořte nový prvek a zadejte následující parametry: Name: Alarm URL: https://api.thingspeak.com/talkbacks/[YOUR TALKBACK ID]/commands Method: POST HTTP Version: 1.1 Host: api.thingspeak.com Headers: Body: api_key=[YOUR TALKBACK ID]Key command_ string=Alarm&position=1 Zajistěte záměnu [YOUR TALKBACK ID] a [YOUR TALKBACK KEY] v URL a v hlavní části za vlastní TalkBack ID a KEY. Nyní můžete vytvořit další React prvek, který bude obsahovat stejné parametry jako v prvním kroku, avšak se malou změnou v tom, že vyberte ThingHTTP pod menu Action a položku Alarm. Tím definujete spuštění alarmu (akustického výstupu) po dosažení kritických hodnot (treshold). Výstup alarmu pak může být navíc definován pouze pro určitý časový úsek. V aplikaci proto vyberte TimeControl a vytvořte nový prvek, pojmenovaný například AlarmClock a použijte následující zápis: Name: Presents Frequency: One Time Time Zone: Berlin Run At: 2015-24-12 7:00 am Fuzzy Time: ± 0 minutes TalkBack: Alarms, add command: Alarm
Příloha Programovací AT příkazy Základní příkazy Test command AT Reset AT+RST Firmware info AT+GMR Echo on/off ATE<1/0> WLAN příkazy WLAN-mode (1 = Client, 2 = AP, 3 = Dual) Vyhledávání WLAN sítí Connecting WLAN Disconnecting WLAN WLAN-Access-Point settings Output IP-address Activate/deactivate DHCP Automatically connect to WLAN Changing MAC-address of the station Setting IP-address (station) Start SmartConfig Stop SmartConfig Komunikace Function ping Permit several connections Data mode (0=Transparent, 1=Data mode) Structure of data received Establishing connection Send data Disconnect Server-commands Start server End server Server status & connected clients Specify server time-out Display connected clients
Pokud si nebudete vědět rady, tuto experimentální sadu používat a v tomto návodu k obsluze nenaleznete potřebné informace, obraťte se na naši technickou podporu, nebo požádejte o radu zkušenějšího odborníka.
Recyklace Elektronické a elektrické produkty nesmějí být vhazovány do domovních odpadů. Likvidujte odpad na konci doby životnosti výrobku přiměřeně podle platných zákonných předpisů. Šetřete životní prostředí! Přispějte tak k jeho ochraně!