Základné operácie na wifi module ESP8266 od Arduina

Základné operácie na wifi module ESP8266 od Arduina

Základné operácie na wifi module ESP8266 od Arduina

Kedy Espressif uviedla na trh prvé moduly wifi s integrovanou ESP8266 a firmware pomocou AT príkazov, nás používateľov zaujímala integrácia do zostáv s mikrokontroléry a problémy sa zredukovali na poznanie (predtým) tmy Tabuľka príkazov ESP8266 AT, potreby kŕmenia resp Aktualizácia firmvéru ESP8266.

Obsah

    Potom rýchlo prišli alternatívy na programovanie ESP8266 a implementácie modulov wifi veľmi odlišných formátov, ktoré vyvolali ďalšie obavy: ktorý wifi modul ESP8266 si vybrať v závislosti od dosahu rôznych antén (vrátane externých) alebo fyzickej integrácie týchto nových modulov do našich zostáv.

    V dôsledku všetkých týchto zmien sa určite nekládol dôraz na najzákladnejšie aspekty, najzákladnejšie riadenie Wifi modul ESP8266. Hoci polarita.es Môžete nájsť informácie o použití ESP8266 a existujú niektoré aplikácie určené na všeobecné vysvetlenie fungovania Wifi modul ESP8266 pomocou AT príkazov, najmä v článku o knižnica na vytváranie HTTP dotazov z Arduina pomocou wifi modulu ESP8266, dojmy čitateľov naznačujú, že by bolo užitočné pridať niekoľko základných informácií, ktoré by pomohli používateľom stránky ESP8266 vykonávať vlastné implementácie.

    Diskutujte o základných operáciách pri práci s ESP8266 a navrhovanie všeobecných riešení je cieľom niekoľkých veľmi odlišných častí; Ako pomôcka vám môže poslúžiť nasledujúci index, ktorý vám pomôže sledovať obsah článku:

    Ovládajte wifi modul ESP8266 z počítača cez sériový port

    Z taniera Arduino a pomocou vášho IDE je možné sledovať chod a Wifi modul ESP8266, pošlite ESP8266 AT príkazy a pozrite si odpoveď, ale oveľa pohodlnejšie je to urobiť z počítača s aplikáciou typu terminálu.

    Použitie CuteCom na testovanie wifi modulu ESP8266 cez sériový port

    Podľa toho na akej doske Arduino Ak sa používa, môže byť dostupný iba jeden hardvérový sériový port, čo spôsobuje trochu nepohodlia pri odosielaní a prijímaní. Zmena rýchlosti komunikácie je oveľa pohodlnejšia v sériovej komunikačnej aplikácii z počítača a niektorých základných dosiek. Arduino (a za určitých okolností) nepodporujú najvyššie rýchlosti sériovej komunikácie dobre, najmä 115200 baud, čo je predvolená rýchlosť najnovších verzií firmware.

    O Aký program použiť na sledovanie ESP8266 pomocou sériového portu, existuje veľa na výber podľa potrieb a preferencií; v poslednej dobe viac pouzivam klasiku CuteCom (ten na obrázku vyššie), pretože je pre mňa veľmi pohodlné opakovať isté ESP8266 wifi modul AT objednávky pri testovaní projektu.

    Niektoré odporúčania tu už boli uvedené pre programy, ktoré fungujú ako sériová konzola; Napríklad, keď sa hovorí o PuTTY na ovládanie sériových zariadení UART z počítača. PuTTYOkrem toho, že je to vynikajúca aplikácia, je dostupná pre väčšinu desktopových operačných systémov. Ďalej, ako PuTTY môže byť použitý ako konzola so sériovým portom aj s rodina internetových protokolov (TCP/IP)vrátane tých, ktoré fungujú na TLS, sa stáva bežným nástrojom, ktorý viac ako spláca (málo) času stráveného jeho konfiguráciou a zvykaním si na jeho používanie.

    Použitie PuTTY na testovanie wifi modulu ESP8266 cez sériový port

    Okrem softvéru na sériovú komunikáciu, na pripojenie Wifi modul ESP8266 do prístavu USB Počítač tiež vyžaduje prevodník USB do série TTL. Podobne ako v prípade softvéru existuje viacero verzií, z ktorých slúžia len na konverziu portu USB na sériovom porte TTL (ktoré sa dajú získať od jedného eura) až po tie, ktoré dokážu emulovať rôzne protokoly (ako napr SPI o I2C).

    Rovnako ako program, ktorý funguje ako sériová konzola, hardvér na komunikáciu s počítačom USB s logickým obvodom (nielen s ESP8266) bude bežným nástrojom v práci vývojára mikroriadených aplikácií, oplatí sa mať ho čo najskôr v paneli nástrojov a pracovať s ním Wifi modul ESP8266 Je to skvelá príležitosť získať ho.

    Hardvér pre sériovú komunikáciu USB UART na monitorovanie wifi modulu ESP8266

    Prevodník USB a UART TTL Môže sa tiež použiť na monitorovanie správania obvodu, ktorý používa ESP8266, za týmto účelom sú výstupy, ktoré chcete monitorovať, zapojené do série s dátovým vstupom (RX) prevodníka s rýchlou diódou (tzv. 1N4148, napríklad) a odpor (napríklad 2K2) paralelne navzájom. Takéto nastavenie funguje ako hardvérový sériový sniffer.

    Príklad sniffer pre ESP8266 pripojený k Arduinu pomocou USB UART TTL prevodníka

    Hoci sniffer na obrázku vyššie je určite základný (okrem iného nemá nárazník) postačuje na monitorovanie činnosti zostavy s Arduino a ESP8266.

    Odstránenie sniffer z predchádzajúcej schémy, schéma znázorňujúca spôsob pripojenia a Wifi modul ESP8266 na tanier Arduino. Okrem napájania na 3V3 musí byť resetovací kolík a aktivačný kolík integrovaného pripojené k vysokej úrovni (povoliť). Samozrejme, RX pin jedného sa musí spojiť s TX druhého.

    Pre zjednodušenie predchádzajúceho diagramu bola znázornená doska Arduino napájané 3V3 a pre ktoré sa predpokladá, že napätie na sériovom porte je tiež 3V3. Ak používate a mikrokontrolér s inou úrovňou signálu na sériovom porte (zvyčajne 5 V), aby nedošlo k poškodeniu ESP8266, použite a prevodník úrovní ako tie na diagramoch nižšie. Tento obvod sa často nachádza v mnohých komerčných implementáciách štandardných modulov.

    Prevodník úrovne signálu 5V na 3V3 pre WiFi modul ESP8266 a Arduino

    Aktualizujte firmvér ESP8266

    L ESP8266 AT príkazy, jeho ukončenie, predvolená rýchlosť modulu... závisí od verzie Firmvér ESP8266. Najlepšie je zabezpečiť, aby ste mali rovnakú verziu vo všetkých moduloch, a ak je to možné, aby to bola najnovšia verzia.

    Bohužiaľ, väčšina Modely wifi modulu ESP8266 Majú len 4 Mbit, takže najnovšia verzia sa na ne nedá nainštalovať. Najnovšia (oficiálna) verzia firmvéru, na ktorú je možné nainštalovať WiFi moduly ESP8266 so 4 Mbit (väčšina) je 0.9.4, čo zahŕňa verziu 0.2 ESP8266 AT príkazy.

    Stručne povedané, na aktualizáciu firmvéru potrebujete:

    1. Stiahnite si príslušnú verziu firmvéru. najnovšia (oficiálna) verzia modulu, ktorý má 4 Mbit pamäte, sa nachádza v priečinku Espressif na githube, V Webová stránka Espressif Môžete si stiahnuť najnovšiu verziu firmvéru, ale je veľmi dôležité overiť, či modul, na ktorom je nainštalovaný, má dostatok pamäte.

    2. Stiahnite si najnovšiu verziu nástroja na inštaláciu firmvéru. Môj obľúbený je esptool ktorý je napísaný v Pytón, takže funguje na akejkoľvek platforme. Okrem stiahnutia sa dá aj nainštalovať s pip install esptool (o pip2 o python -m pip…). Samozrejme, Espressif Ponúka aj vlastný nástroj, no momentálne je dostupný len pre Windows.

    3. Pripravte stiahnuté súbory; rozbaľte ich do prístupného priečinka a v prípade potreby urobte nástroj spustiteľným esptool, v mojom prípade od r GNU / Linux, S chmod +x esptool

    4. Pripojte modul k počítaču pomocou prevodníka USB UART TTL ktorý funguje na 3V3 alebo použite menič úrovne, ak pracuje na 5 V. Okrem napájania budete musieť pripojiť TX na RX meniča USB UART TTL, RX na TX, GPIO0 na nízkej úrovni (GND) a možno GPIO2 na vysokej úrovni (v mojich testoch fungovalo pripojenie na nízkej úrovni aj odpojenie). Ak má modul voľné pripojenie GPIO15 (ako sa vyskytuje v ESP-12), musí byť pripojený k nízkej úrovni. RESET, ktorý by bol normálne počas prevádzky na vysokej úrovni, môže byť ponechaný nezapojený alebo pripojený k vysokej úrovni pomocou odporu (napríklad 10K), pretože pred spustením nahrávania môže byť potrebné resetovať zariadenie jeho pripojením. na nízku úroveň.
      Po zapnutí modulu bude k dispozícii na aktualizáciu, ale Ak sa zobrazí chyba pripojenia, bude potrebné ju resetovať pripojenie RESET na nízkej úrovni na okamih a potom ponechanie na vzduchu (bez pripojenia) pre proces aktualizácie.
      Modul má polampérová spotreba vrcholí (podľa niektorých používateľov až 600 mA), preto je dôležité používať napájací zdroj schopný túto spotrebu podporovať, najmä pri aktualizácii firmvéru.

      Pripojenie wifi modulu ESP8266 ESP-01 k USB UART TTL prevodníku aktualizácia firmvéru

    5. Spustite nástroj na aktualizáciu firmvéru. V mojom prípade som uložil nástroje a dokumenty firmvéru v kroku 3 do rovnakého priečinka, takže spustím z konzoly:
      cd ~/Datos/firmwareESP8266 (prejdite do priečinka obsahujúceho nástroj a firmvér)
      ./esptool.py --baud 115200 --port /dev/ttyUSB0 write_flash \
      0x00000 ./boot_v1.1.bin \
      0x01000 ./user1.bin \
      0x7C000 ./esp_init_data_default.bin \
      0x7E000 ./blank.bin

      --baud nastavuje rýchlosť ESP8266 (115200 baud v mojom prípade) a --port sériový port, ku ktorému sa pripája (v mojom prípade emulovaný, prvý USB). Rôzne dokumenty, ktoré tvoria firmvér, idú pozadu write_flash predchádza adresa, pričom dokument user1.bin obsahuje užitočné zaťaženie aktualizácie.

      wifi ESP8266 aktualizácia firmvéru snímanie konzoly esptool

    Odošlite príkazy do wifi modulu ESP8266

    Na ovládanie ESP8266 z počítača, s ktorým budeme musieť začať nakonfigurujte aplikáciu pre ktorý bude stačiť ① zvoliť port, ku ktorému je prevodník pripojený USB UART TTL, niečo ako /dev/USB0 v GNU/Linux a podobne alebo podobne COM6 v systéme Windows ② vyberte rýchlosť, akou sa ESP8266, pravdepodobne 115200 baud, ③ nastavte 8 dátových bitov plus jeden stop bit, bez parity alebo handshake, a ④ nastavte koniec riadku v závislosti od firmware, takmer vždy CR+LF.

    Nakonfigurujte CuteCom na monitorovanie wifi modulu ESP8266 pomocou USB UART TTL prevodníka

    Nakonfigurujte PuTTY na monitorovanie wifi modulu ESP8266 s USB UART TTL prevodníkom

    Keď je aplikácia nakonfigurovaná (alebo tam, kde je to vhodné, uložená a vybraná), je otvorte spojenie („otvorené zariadenie“ a „otvorené“ na snímkach obrazovky vyššie uvedených príkladov s CuteCom y PuTTY) a môžete začať odosielať objednávky na ESP8266.

    Ako je možné vidieť v Tabuľka príkazov ESP8266 AT, formát na aktiváciu, deaktiváciu, nastavenie hodnoty a odkazovanie na ňu je celkom predvídateľný, ale vo všeobecnosti nie je ľahké si ich všetky zapamätať a pravdepodobne ho budete musieť mať po ruke, aby ste sa naň mohli odkazovať.

    Spôsob odoslať AT objednávky al Wifi modul ESP8266 z Arduino Je to veľmi jednoduché: ① nakonfigurujte komunikáciu s Serial.begin(115200); (alebo Serial1, Serial2… na doskách s viacerými hardvérovými sériovými portami) a ② odošlite príkazy vo formáte Serial.print(orden+"\r\n");

    Vyššie uvedený príklad ukazuje, ako odoslať ESP8266 wifi modul AT objednávky z Arduino. V tomto prípade je to znázornené AT+CWJAP, ktorý sa používa na pripojenie k prístupovému bodu. Tento príkaz používa ako argumenty identifikátor prístupového bodu (SSID) a kľúč, oba v úvodzovkách, takže sa stanú objektom Srtring a uzavrite ich do úvodzoviek pomocou únikového kódu (\"). Na dokončenie objednávky použite \r\n čo zodpovedá CR y LF.

    Nezabudnite, že sériový port nie je vždy identifikovaný Serial (na určitých tanieroch to môže byť Serial1, Serial2…) použitý objekt portu bol definovaný jeho priradením k makru PUERTO_SERIE. Detekcia typu použitej dosky by mohla pridať trochu inteligencie do výberu sériového portu; Neskôr si prejdeme, ako môžete zistiť typ Arduino. Ostatné definície sú obvyklé, ktoré vám umožňujú „pomenovať“ konštantné hodnoty, aby ste sa vyhli ich opakovaniu (a chybám) a uľahčili ich zmenu.

    Vyššie uvedený príklad má spájať Wifi modul ESP8266 k uvedenému prístupovému bodu, ale bol už predtým pripojený? Fungovalo spojenie? Aby sme to vedeli, musíme "počúvať" čo ESP8266

    Prijímajte dáta z wifi modulu ESP8266

    Po pripojení vyššie opísaného sledovača údajov k počítaču uvidíte, čo Arduino poslal do ESP8266 a jeho odpoveď. Na čítanie z Arduino a spracovávať informácie v ňom, ktoré bude potrebné zisťovať Serial.available() či prišli nejaké dáta a ak áno, načítaj ich Serial.read(). Nasledujúci príklad ukazuje, ako čítať odpoveď z AT+CWJAP?, ktorý bude hlásiť, či existuje pripojenie k akémukoľvek prístupovému bodu.

    Ako na tanieri Arduino Uno (av iných) otvorenie sériového monitora resetuje program, možno ho použiť na zobrazenie v sériovej konzole Arduino informácie, na ktoré posielate ESP8266 ako ukazuje snímka obrazovky nižšie.

    Prijímajte dáta z wifi modulu ESP8266 od Arduina. Základný príklad

    Analyzujte odpoveď odoslanú modulom wifi ESP8266

    Už sme videli, ako čítať informácie, ktoré sa dostanú Arduino z ESP8266. Problém, s ktorým sa musíte vysporiadať, je, že neviete, kedy to začne prichádzať, ako dlho to bude trvať, aká bude dĺžka... a nie je veľmi efektívne čakať na odpoveď od ESP8266 sa prijíma bez toho, aby sa nechal mikrokontrolér medzitým vykonávať iné úlohy.

    Jednoduchý spôsob, ako zvládnuť túto okolnosť, je iterujte získané údaje a hľadajte konkrétne odpovede pomocou ktorých sa napríklad aktivujú indikátory (príznaky alebo booleovské premenné), ktoré určia, či pokračovať v hľadaní v prijatom texte a aké akcie by sa mali vykonať na základe informácií, ktoré prichádzajú z ESP8266. Kým príde odpoveď mikrokontrolér môže venovať iným úlohámnapríklad prijímanie údajov zo senzorov a ich spracovanie.

    Vyhľadajte text v informáciách prijatých z ESP8266

    Ak chcete vyhľadať text, ktorý pochádza z ESP8266 môžete porovnajte každý prijatý list s tým, ktorý zodpovedá správe, ktorú hľadáte. Bude potrebné použiť počítadlo (alebo ukazovateľ), ktoré ukazuje na porovnávané písmeno; Ak postava, ktorá prichádza z ESP8266 je rovnaký ako ten, ktorý sa skúma v správe, počítadlo sa posunie dopredu, ak je iné, inicializuje sa.

    Aby sme vedeli, že koniec bol dosiahnutý, konzultuje sa ďalší znak hľadanej správy, ktorým bude nula (\0) alebo sa dĺžka správy uloží, aby sa jej porovnaním s počítadlom zistilo, či sa porovnanie skončilo, a teda Wifi modul ESP8266 odoslal požadovanú správu.

    Nasledujúci príklad používa príkaz AT+CWLAP ktorý vráti zoznam prístupových bodov a v rámci nich sa hľadá jeden s názvom „wifi polaridad.es“. Hoci sme sa rozhodli overiť, že posledný znak je nula, pretože nárazník Ukladá len hľadaný text a je známa jeho dĺžka, dalo by sa skontrolovať aj to, či bol prijatý taký počet správnych písmen. S LED pripojený na kolík 2 je hlásené, že očakávaný text bol nájdený.

    V kóde predchádzajúceho príkladu môžete vidieť aj spôsob vyberte sériový port v závislosti od typu dosky Arduino použité. Tento príklad predpokladá, že máte pre projekt tri typy dosiek: jednu Arduino Uno, One Arduino Mega 2560 a arduino leonardo. Ak pracujete s a Arduino Uno bude sa používať Serial a inak Serial1.

    Ak pracujete s tanierom arduino leonardo Rovnakú metódu môžete použiť na zastavenie programu a počkať na konzolu (sériový port spojený s Serial) je k dispozícii.

    Vyhľadajte rôzne texty v odpovedi ESP8266

    Kód v predchádzajúcom príklade sa používa na vyhľadávanie textu v informáciách odoslaných serverom ESP8266 ale odpoveď môže obsahovať rôzne informácie v závislosti od operácie. Predpokladajme, že v nasledujúcom príklade začneme jednoduchým prípadom, že text odoslaný MCU ESP8266 es OK keď je operácia vykonaná správne a ERROR Inak ako pri objednávke AT+CWJAP?, ktorá slúži na overenie, či je Wifi modul ESP8266 je už pripojený k prístupovému bodu.

    Táto nová implementácia rovnakej metódy, ktorá hľadá zhodu s niekoľkými možnými správami, vám umožňuje vybrať si medzi rôznymi akciami v závislosti od odpovede prijatej od ESP8266, jednoducho zapnite LED zodpovedajúce.

    Obmedzte čas potrebný na prijatie odpovede

    Doposiaľ nebola uvedená žiadna zmienka o relevantnej otázke: maximálny čas čakania (časový limit) pred zvážením zlyhania operácie. Ak z akéhokoľvek dôvodu spojenie s Wifi modul ESP8266, modul s prístupovým bodom, prístupový bod s internetom alebo napríklad hypotetický server nie je k dispozícii, program môže byť v jednom bode zablokovaný a čaká na neurčito, takže na takéto okolnosti bude potrebné reagovať. Maximálnu dobu čakania je možné nakonfigurovať pre celú aplikáciu, zvyčajne bude v takom prípade „štedrejšia“, alebo je možné pre každú operáciu naprogramovať individuálne doby čakania.

    Skontrolovať, či uplynul (aspoň) určitý časový interval „Čas“ okamihu, v ktorom je účet spustený, sa zvyčajne odpočíta od aktuálneho „času“ a overí sa, že rozdiel je väčší ako požadovaný limit. Tento „čas“ nemusí byť skutočný čas, zvyčajne zodpovedá intervalu, ktorý uplynul od MCU začať počítať čas; Toto neovplyvní program, pretože zaujímavý je uplynutý čas a nie absolútny čas.

    Zvyčajne sa na kontrolu, či uplynul určitý interval, používa výraz typu:

    premenlivý milisegundos_al_empezar obsahuje hodnotu millis() určitého momentu v prevedení, od ktorého sa meria, takže nie je nezvyčajné, že jeho názov odkazuje na slovo „chronometer“. Premenná intervalo_de_tiempo obsahuje maximálny počet milisekúnd, v ktorom je predchádzajúci výraz pravdivý, to znamená, že predstavuje časový limit; Väčšinou ide o konštantu (alebo makro) a ako v predchádzajúcom prípade sa v jej názve často vyskytuje slovo „TIMEOUT“. Ak pracujete s veľmi krátkymi intervalmi, môžete použiť micros() namiesto millis() (mikrosekundy namiesto milisekúnd), hoci je to oveľa menej bežné a oveľa menej presné.

    Dlhé celé číslo v Arduino (unsigned long) zaberá 4 bajty (32 bitov), ​​takže najväčšia hodnota, ktorú môže predstavovať, je 4294967295 (2 na mocninu 32 mínus jedna, pretože začína na nule). na tanieri Arduino Počas nepretržitého chodu sa počítadlo milisekúnd vynuluje (vráti sa na nulu) približne každých 50 dní. Pri odčítaní s nepodpísanými typmi údajov sa reprodukuje rovnaké správanie (preklápanie počítadla), takže je možné ovládať časový limit na neurčito.

    Vyššie uvedený kód ukazuje a veľmi základná implementácia obmedzenia časového limitu začlenenie riadkov označených vzhľadom na príklad, ktorý mu predchádza. Keďže overenie časového limitu sa vykonáva po spracovaní údajov prichádzajúcich z Wifi modul ESP8266, operáciu možno považovať za úspešnú aj vtedy, ak príjem trvá dlhšie, ako je stanovená čakacia doba.

    Vykonajte komplexnú operáciu definovanú viacerými AT príkazmi

    Ak chcete mať príklad odkazu na účel aplikácie, ktorá využíva Wifi modul ESP8266, predpokladajme, že áno uchovávať informácie v databáze prístupnej prostredníctvom webovej služby na sledovanie teploty. Nasledujúci kód načíta v určitom časovom intervale snímač pripojený k analógovému vstupu, vypočíta priemernú hodnotu a po dlhšom časovom intervale ju odošle na web server (v štýle IoT) prostredníctvom a petície HTTP (POSLAŤ, ZÍSKAŤ...).

    V tomto príklade zaznamenávania teploty sa na webový server pristupuje každých päť minút. Hoci dostupnosť nie je príliš vysoká, dá sa očakávať, že návrh bude fungovať, ale ak by bola potrebná vyššia frekvencia záznamu, museli by sa implementovať iné zdroje, napr. dátová vyrovnávacia pamäť čaká na odoslanie, poslať niekoľko, keď sa server môže zúčastniť, a uložiť ich na dobu, keď nebude k dispozícii. Ak by frekvencia, s akou je potrebné zaznamenávať údaje, bola ešte väčšia, museli by sa navrhnúť iné typy protokolov ako alternatíva k HTTP alebo dokonca nahradiť TCP podľa UDP aby bolo možné odosielať väčšinu dát požadovanou rýchlosťou aj za cenu straty niektorých.

    Operácie, ktoré tvoria úlohu, ktorá sa má vykonať na odoslanie teploty, by boli:

    • Resetujte modul wifi
    • Odpojiť sa od aktuálneho prístupového bodu (v prípade, že existuje predvolené pripojenie)
    • Nastavte nastavenia. Napríklad sa predpokladá, že musí byť nakonfigurovaný režim pripojenia (jednoduchý) a úloha v komunikácii Wi-Fi (stanica).
    • Pripojte sa k prístupovému bodu
    • Overte, či je pripojenie správne (v skutočnosti je to vstupný bod) Ak nie je pripojenie, začnite proces od začiatku
    • Pripojiť k serveru
    • Pošlite žiadosť HTTP s údajmi, ktoré sa majú uložiť

    Poradie operácií nemusí byť presne toto (hoci operácia áno) a každý krok môže vyžadovať niekoľko ESP8266 AT príkazyNapríklad konfigurácia uvedená vyššie by potrebovala dve: AT+CIPMUX=0 y AT+CWMODE=1.

    Dátová štruktúra reprezentujúca operácie na ESP8266

    V predchádzajúcich príkladoch, aj keď veľmi jednoduchým spôsobom, je už navrhnuté všeobecné riešenie problému: použiť dátovú štruktúru, ktorá ukladá možné odpovede a akcie, ktoré sa musia v každom prípade vykonať; odošlite akciu, počkajte na odpoveď a pokračujte podľa toho, čo odpoveď znamená. Pretože každá zložitá operácia bude vyžadovať niekoľko ESP8266 AT príkazy, dátová štruktúra musí spájať operáciu s ďalšími, nasledujúcimi alebo predchádzajúcimi, ktoré sa musia v každom prípade vykonať v závislosti od odozvy ESP8266.

    V predchádzajúcich príkladoch sa správa hľadala v rámci odpovede ESP8266 a bolo to interpretované ako úspech alebo chyba. Okrem príjmu (a analýzy) všetkých prijatých textov, Ak chcete mať všeobecné minimum, je vhodné venovať sa aj vyplneniu správy alebo, inými slovami, na dostupnosť Wifi modul ESP8266 prijímať nové objednávky. Týmto spôsobom by zmena do stavu, ktorý by sme mohli nazvať napríklad „wifi k dispozícii“, mohla byť prijímaním názvu prístupového bodu a prijímaním textu ERROR alebo text OK by znamenalo, že ESP8266 dokončili ste odpoveď a teraz môžete odoslať ďalšiu AT príkaz na ESP8266.

    Vyššie uvedený kód používa vektor (operacion) na uloženie textu po sebe nasledujúcich operácií, ktoré tvoria kompletnú úlohu. Používa sa dvojrozmerné pole (mensaje) s tromi analyzovanými odpoveďami. Ako je vysvetlené vyššie, okrem správy, ktorá predstavuje správnu alebo nesprávnu odpoveď, je potrebné hľadať správy, ktoré predstavujú koniec odpovede. Nie všetky operácie budú mať rovnaký počet možných odpovedí; Pri menšom počte odpovedí je možné použiť prázdnu správu, ktorá pri analýze spotrebuje čo najmenší počet cyklov (aj tak to nie je najoptimálnejší spôsob). Logicky bude potrebné, aby minimálny počet hľadaných odpovedí (v príklade tri) zahŕňal všetky prevádzkové možnosti, aj keď nie všetky možné.

    Keď hovoríme o možných odpovediach, už je vidieť, že tento príklad nie je veľmi užitočný na prijímanie údajov v ľubovoľnom formáte z Wifi modul ESP8266, ale ide o to, že v kontexte použitia s mikrokontroléry nie je to obvyklé; Najbežnejšou vecou je odosielanie údajov zozbieraných senzormi, ktoré majú pripojené, a/alebo prijímanie informácií o tom, čo robiť s ovládačmi, ktoré ovláda. Veľmi cenné informácie, ktoré sa dajú veľmi dobre predvídať.

    V predchádzajúcej dátovej štruktúre, rovnako ako sa to robí na vyjadrenie možných odpovedí, ktoré sa analyzujú, sa tiež používa dvojrozmerná matica na určenie operácie, ktorá sa musí v každom prípade vykonať (siguiente_operacion). Konkrétne sme sa rozhodli odpovedať na tri typy správ: ① ľubovoľný text (LITERAL) na overenie, či existuje pripojenie k prístupovému bodu Wi-Fi a serveru, ② text na zistenie chýb v procese (FALLO) a ③ text označujúci, že operácia bola úspešne dokončená (ACIERTO).

    Nakoniec existujú dva ďalšie vektory na nastavenie maximálnej doby čakania, kým sa vzdáte (timeout) a špecifikujte (configuracion) ak operácia skončí bez čakania na odpoveď (ESPERAR_RESPUESTA) a správy označujúce koniec komunikácie. Tento posledný vektor na ilustráciu príkladu toho, ako by sa dala šetriť pamäť, pracuje s bitmi konfiguračného bajtu na označenie rôznych stavov.

    Prvý ESP8266 AT príkazy dátovej štruktúry vždy očakávať odpoveď, ktorou môže byť úspešná alebo chybová správa. Keď sa vyskytne chyba, modul sa reštartuje a spustí sa odznova a ak správa indikuje, že operácia je správna, prejde na ďalšiu.

    Po pripojení k serveru sa vzor zmení. V tomto prípade je potrebné ① odoslať dĺžku dátového paketu, ktorý sa má preniesť a ② zostaviť požiadavku HTTP s pevným textom plus hodnotou (teploty), ktorá sa odošle na uloženie na server. Príprava týchto údajov sa vykonáva v každej zásielke a je potrebné ich rozdeliť na dve (oznámiť dĺžku) alebo tri (zaslať požiadavku HTTP) Ak chcete ESP8266 AT objednávka. Na odozvu bude čakať len posledná z častí, na ktoré je operácia rozdelená.

    V tomto prípade to bude fungovať bez problémov (možno upozornenie, že modul je zaneprázdnený), ale pri väčšej dĺžke dát bude potrebné rozdeliť dátové bloky na menšie časti a možno bude potrebné implementovať aj čakanie, napr. sa vykonáva s odčítaním teploty, aby mal modul čas na odoslanie údajov bez ich vypĺňania nárazník.

    Spoločne s ďalšími makrami, ktoré už boli vysvetlené vyššie, vyššie uvedený príklad kódu ukazuje, ako sú definované rôzne stavy, pomocou ktorých je možné určiť, či sa má čakať na odpoveď, a ak je to vhodné, aká správa označuje, že sa skončila.

    Rovnako ako v rôznych bodoch kódu bude odoslaná operácia (keď je čas odoslať priemernú teplotu, ak je prekročená čakacia doba operácie, keď je aktuálna operácia úspešne dokončená...), ale ako to urobiť globálne, bolo definované ako makro ENVIAR_OPERACION ktorý zoskupuje kroky súvisiace s prepravou.

    Nasleduje kód hlavného programu príkladu. Najexternejšia úloha je tá, ktorá má na starosti odber vzoriek teploty na výpočet priemernej hodnoty, ktorá sa vždy po určitom čase odošle na server pomocou Wifi modul ESP8266. Po odoslaní každej operácie sa analyzuje odpoveď, aby sa určilo, ktorá je ďalšia, alebo či bola úloha odoslania informácií dokončená.

    Logicky je možné vykonať niekoľko optimalizačných akcií na predchádzajúcom kóde, ale keďže toto je príklad, aby ste pochopili, ako ESP8266 Vo všeobecnosti sa oplatí zamerať sa len na niektoré aspekty, pričom prvým je štruktúra údajov. Zdá sa, že je to logické použiť dátovú štruktúru programovacieho jazyka (struct), ktoré predstavujú spracovávané informácie: ESP8266 AT príkazy a správy, ktoré sa analyzujú.

    Použite štruktúru (struct) ukladať údaje namiesto vzorových polí (na nich založených) je triviálne a hoci to môže viesť k elegantnejšiemu kódu, neznamená to žiadne zlepšenie výsledku. Skutočnou alternatívou je použitie struct je implementovať, ako je vysvetlené nižšie, variabilné dĺžky v štruktúrach, ktoré obsahujú „vnútorné“ dáta na ktoré sa odvolávajú. Týmto spôsobom by napríklad nebolo potrebné, aby operácia mala pevný počet odpovedí na analýzu.

    Tento prístup naznačuje, že je to najlepší spôsob implementácie riešenia, ale nevýhodou je, že by to bolo potrebné používať dynamickú alokáciu pamäte, riskantnú prax pri práci s a mikrokontrolér čo si vyžaduje starostlivé meranie toho, koľko pamäte sa bude používať za behu, keďže nás na to kompilátor sotva bude vedieť upozorniť a je tu istá možnosť vyčerpania pamäte (alebo zásobníka) s fatálnymi následkami pre vykonávanie programu.

    V riadku optimalizácie kódu je zaujímavé pripomenúť, že v programe tohto typu, ktorý používa veľké množstvo textu, môže ušetriť miesto v pamäti SRAM ukladanie textových reťazcov do pamäte programu (blesk) s makrom F(). Na nasledujúcich snímkach obrazovky môžete vidieť rozdielne rozdelenie programu a dynamickej pamäte pri bežnom používaní textu a makra F().

    Príklad kódu Arduino s použitím textu uloženého v pamäti programu (flash)
    Príklad kódu Arduino s použitím textu v SRAM

    S ohľadom na akcie, ktoré sa vykonávajú podľa informácií, ktoré prichádzajú z Wifi modul ESP8266, ako alternatíva ku kontrole správy z kódu a vykonaniu jednej alebo druhej podľa toho, čo bolo prijaté, môže byť uložená v tejto dátovej štruktúre ukazovatele na funkcie, ktoré vykonávajú jednotlivé úlohy, namiesto indikátorov stavu (príznaky), ktoré upozorňujú na určitý stav, za ktorý je aplikácia zodpovedná, napríklad v rámci hlavnej slučky.

    Nasleduje príklad štruktúr na ukladanie údajov požiadaviek na server ESP8266 (typ údajov operacion_esp8266) a ich odpovede (údajový typ respuesta_esp8266).

    Ako štruktúra, ktorá predstavuje operáciu (údaje odoslané do Wifi modul ESP8266) odkazuje na štruktúru, s ktorou sú odpovede definované, a štruktúru odpovedí na štruktúru operácií, je potrebné najprv deklarovať obojedefinovaním nového dátového typu a následným definovaním jeho obsahu.

    Predchádzajúci príklad predpokladá, že program, ktorý ho obsahuje, sa rozhodol použiť a indikátor stavu, ktorá musí zodpovedať premennej prístupnej z kódu, ktorý je zodpovedný za vykonanie jednej alebo iných operácií, ako je označené uvedenou hodnotou. Ak v odpovedi na ESP8266 Keď sa analyzuje určitý text, stav nadobudne hodnotu, ktorá označuje štruktúru zodpovedajúcej odpovede.

    Ako už bolo povedané, ďalšou alternatívou by bola náhrada alebo doplnenie indikátora stavu uložiť funkciu do referenčnej štruktúry (ukazovateľ), ktorý by sa vyvolal pri stretnutí s určitým textom v odpovedi z Wifi modul ESP8266.

    V predchádzajúcom príklade bol pridaný do dátovej štruktúry, ktorá sa používa na spracovanie odpovede z Wifi modul ESP8266 ukazovateľ na (údajnú) funkciu, ktorá vracia údaje typu float (môže to byť vážená hodnota analógového odčítania) a ku ktorému sú poskytnuté dva bajty ako argumenty (dva unsigned char čo by mohol byť pin, z ktorého sa číta analógový vstup, a ten, ktorý aktivuje ENABLE hypotetickej integrácie).

    Vo vývoji pre MCUNa rozdiel od toho, čo sa vyskytuje vo vývojovom štýle pre väčšie systémy, nie je také nezvyčajné používať globálne premenné pri definovaní (globálneho) správania aplikácie, ktorá riadi zostavu, takže nebude obzvlášť zriedkavé nájsť tento typ definícií ako funkcie bez parametrov a ktoré nevracajú hodnoty, niečo ako void (*accion)();

    Ak pracujete s týmto spôsobom reprezentácie údajov, použite struct dát s premenlivou dĺžkou, bude potrebné dynamicky alokovať pamäť s malloc() (o new(), ak sa používajú objekty), ktorý použije množstvo pridelenej pamäte ako parameter a vráti ukazovateľ na začiatok oblasti pamäte, ktorá je rezervovaná. s sizeof() Na type, ktorý je uložený, vynásobený počtom použitých prvkov, môžete získať množstvo pamäte, ktoré je potrebné. Príklad s a bez použitia je možné vidieť na snímkach obrazovky nižšie. malloc(); Buďte opatrní s pamäťou, ktorú program používa v prvom prípade, musíte načítať knižnicu, ktorá obsahuje túto funkciu.

    Príklad alokácie pamäte pomocou malloc na Arduine

    Príklad priradenia textu bez malloc v Arduine

    Ak operácie na Wifi modul ESP8266 sa bude počas vykonávania programu líšiť, bude potrebné uvoľniť pamäť, ktorá sa nepoužíva free() (o delete(), v prípade, že ide o predmety). Hoci je rozumné očakávať, že kompilátor (GCC) zoptimalizuje program, aby sa predišlo deleniu pamäte, výkon určite nebude taký optimálny ako pri práci so staticky pridelenou pamäťou.

    Aj keď v tomto príklade (v oboch implementáciách) to nedáva veľký zmysel, aby sa operácia zovšeobecnila, aby ju bolo možné aplikovať na iné prípady, je potrebné poznamenať, že Pri odosielaní údajov sa vždy opakuje rovnaký protokol: oznámte počet bajtov, ktoré budú odoslané, počkajte na indikátor (>) a odošlite údaje.

    Keďže v tomto príklade sa používa iba raz (celá požiadavka je vykonaná v jednom pakete), nezdá sa to byť veľmi užitočné, ale vo všeobecnosti môže byť potrebné vykonať niekoľko odoslaní v tej istej operácii, vrátane prípadov, keď musia prenášať značné množstvo údajov, ktoré musia byť fragmentované, aby nedošlo k preplneniu pamäte ESP8266.

    Na implementáciu tohto správania je možné použiť posledné dva prvky spojenia, takže pri každom odoslaní údajov sa údaje naplnia zodpovedajúcimi hodnotami: v prvom prípade počet odoslaných bajtov a v druhom prípade ( časť žiadosti, ktorá sa má odoslať.

    Na zopakovanie priradenia a odoslania rôznych prvkov, ktoré sa musia preniesť, je možné uložiť do vektora. Tento nový vektor bude ten, ktorý určí koniec zložitej operácie a nie poslednú operáciu ako doteraz.

    1 komentár

    používateľ komentárov
    ดูบอลสด

    O tejto téme sa určite dá veľa dozvedieť. Páčia sa mi všetky body, ktoré si uviedol

    Pridať komentár

    Možno ste zmeškali