Operații de bază pe un modul wifi ESP8266 de la Arduino

Operații de bază pe un modul wifi ESP8266 de la Arduino

Operații de bază pe un modul wifi ESP8266 de la Arduino

Când Espresiv a lansat primele module pe piață Wifi cu cel integrat ESP8266 și firmware cu care să-l manevrem folosind comenzi AT, ceea ce ne-a interesat pe noi, utilizatorii, era să îl integrăm în ansambluri microcontrolere iar problemele s-au redus la cunoașterea (fosta) întunericului Tabelul de comandă ESP8266 AT, nevoile de hrănire sau Actualizare firmware ESP8266.

Cuprins

    Apoi au sosit rapid alternative pentru a programa ESP8266 și implementări de module Wifi de formate foarte diferite care au ridicat alte preocupări: ce modul WiFi ESP8266 să alegeți în funcție de raza de acțiune a diferitelor antene (inclusiv cele externe) sau de integrarea fizică a acestor noi module în ansamblurile noastre.

    Cu siguranță, din cauza tuturor acestor schimbări, s-ar putea să nu se fi pus accent pe aspectele cele mai elementare, pe cel mai elementar management al Modul WiFi ESP8266. Cu toate că polaritate.es Puteți găsi informații despre utilizarea ESP8266 și există unele aplicații menite să explice într-un mod generic funcționarea Modul WiFi ESP8266 folosind comenzi AT, în special în articolul despre bibliotecă pentru a face interogări HTTP din Arduino cu modulul WiFi ESP8266, impresiile cititorilor sugerează că ar fi util să adăugați mai multe informații de bază pentru a ajuta utilizatorii ESP8266 pentru a realiza propriile implementări.

    Discutați operațiunile de bază pentru a lucra cu ESP8266 și propunerea de soluții generice este un obiectiv din mai multe părți foarte diferite; Pentru a ajuta la urmărirea conținutului articolului, următorul index poate servi drept ghid:

    Controlați modulul wifi ESP8266 de la computer prin portul serial

    Din farfurie Arduino și folosind dvs IDE este posibil să se monitorizeze funcționarea unui Modul WiFi ESP8266, trimite comenzi ESP8266 AT si vezi raspunsul dar este mult mai comod sa o faci de pe un calculator cu o aplicatie de tip terminal.

    Folosind CuteCom pentru a testa modulul wifi ESP8266 prin portul serial

    Depinde de ce placa Arduino utilizat, este posibil să fie disponibil un singur port serial hardware, ceea ce adaugă un mic inconvenient la trimitere și primire. Schimbarea vitezei de comunicație este mult mai confortabilă într-o aplicație de comunicații seriale de la un computer și unele plăci de bază. Arduino (și în unele circumstanțe) nu acceptă bine vitezele mai mari ale comunicațiilor seriale, în special 115200 baud, care este viteza implicită a celor mai recente versiuni ale firmware.

    Despre Ce program să utilizați pentru a monitoriza ESP8266 folosind portul serial, sunt multe din care sa alegi in functie de nevoi si preferinte; in ultimul timp folosesc mai mult clasicul CuteCom (cel din captura de ecran de mai sus) pentru că îmi este foarte confortabil să repet anumite Modul wifi ESP8266 AT comenzi în testarea proiectelor.

    Unele recomandări au fost deja date aici cu privire la programele care funcționează ca o consolă serială; De exemplu, când vorbim despre PuTTY pentru controlul dispozitivelor seriale UART de pe computer. PuTTYPe lângă faptul că este o aplicație excelentă, este disponibilă pentru majoritatea sistemelor de operare desktop. Mai mult, ca PuTTY poate fi folosit pentru a acționa ca o consolă atât cu portul serial, cât și cu portul Familia de protocoale de internet (TCP/IP), inclusiv cele care operează pe TLS, devine un instrument obișnuit care mai mult decât să răsplătească timpul (puțin) petrecut configurându-l și obișnuindu-se cu utilizarea lui.

    Folosind PuTTY pentru a testa modulul wifi ESP8266 prin portul serial

    Pe lângă software-ul de comunicații seriale, pentru conectarea Modul WiFi ESP8266 spre port USB Un computer necesită și un convertor USB o serie TTL. Ca și în cazul software-ului, există mai multe versiuni, din care sunt folosite doar pentru a converti portul USB pe un port serial TTL (care pot fi obținute de la un euro) până la cele care pot emula diferite protocoale (cum ar fi SPI o I2C).

    La fel ca un program care funcționează ca o consolă serială, hardware-ul prin care să comunice computerul USB cu un circuit logic (nu doar ESP8266) va fi un instrument comun în munca unui dezvoltator de aplicații microcontrolate, merită să îl aveți în cutia de instrumente cât mai curând posibil și să lucrați cu el Modul WiFi ESP8266 Este o oportunitate excelentă de a obține unul.

    Hardware pentru comunicații seriale USB UART pentru a monitoriza modulul wifi ESP8266

    Convertorul USB a UART TTL Poate fi folosit și pentru a monitoriza comportamentul unui circuit care utilizează ESP8266, pentru a face acest lucru, ieșirile pe care doriți să le monitorizați sunt conectate în serie la intrarea de date (RX) a convertorului cu o diodă rapidă ( 1N4148, de exemplu) și un rezistor (2K2, de exemplu) în paralel unul cu celălalt. O astfel de configurare funcționează ca un sniffer serial hardware.

    Exemplu de sniffer pentru ESP8266 conectat la Arduino folosind un convertor USB UART TTL

    Deși snifferul din imaginea de mai sus este cu siguranță rudimentar (printre altele nu are tampon) este suficient pentru a monitoriza funcționarea unui ansamblu cu Arduino și ESP8266.

    Eliminarea sniffer-ului din schema anterioară, the schematică care arată cum se conectează a Modul WiFi ESP8266 la o farfurie Arduino. Pe lângă alimentarea acestuia la 3V3, pinul de resetare și pinul de activare al integratului trebuie să fie conectate la un nivel înalt (activare). Desigur, pinul RX al unuia trebuie să se conecteze la TX-ul celuilalt.

    Pentru a simplifica diagrama anterioară, a fost reprezentată o placă Arduino alimentat la 3V3 și pentru care se presupune că o tensiune pe portul serial este de asemenea 3V3. Dacă utilizați un microcontroler cu un nivel diferit de semnal pe portul serial (de obicei 5 V) va fi necesar, pentru a nu deteriora ESP8266, folosește o convertor de nivel ca cele din diagramele de mai jos. Acest circuit se găsește frecvent în multe implementări comerciale de module disponibile.

    Convertor de nivel de semnal 5V la 3V3 pentru modulul WiFi ESP8266 și Arduino

    Actualizați firmware-ul ESP8266

    Las comenzi ESP8266 AT, terminarea acestuia, viteza implicită a modulului... depind de versiunea firmware ESP8266. Cel mai bine este să vă asigurați că aveți aceeași versiune în toate modulele și, dacă este posibil, că este cea mai recentă versiune.

    Din păcate, majoritatea Modele de module wifi ESP8266 Au doar 4Mbit, deci cea mai recentă versiune nu poate fi instalată pe ele. Cea mai recentă versiune (oficială) de firmware pe care poate fi instalată Module wifi ESP8266 cu 4 Mbit (majoritatea) este 0.9.4 care include versiunea 0.2 a comenzi ESP8266 AT.

    Pe scurt, pentru a actualiza firmware-ul aveți nevoie de:

    1. Descărcați versiunea de firmware corespunzătoare. cea mai recentă versiune (oficială) pentru un modul cu 4Mbit de memorie, găsită în folderul Espressif de pe github. În Site-ul Espressif Puteți descărca cea mai recentă versiune a firmware-ului, dar este foarte important să verificați dacă modulul pe care este instalat are suficientă memorie.

    2. Descărcați cea mai recentă versiune a instrumentului de instalare a firmware-ului. Preferatul meu este esptool care este scris în Piton, deci funcționează pe orice platformă. Pe lângă faptul că este descărcat, poate fi instalat și cu pip install esptool (o pip2 o python -m pip…). Desigur, Espresiv De asemenea, oferă propriul instrument, dar în prezent este disponibil numai pentru Windows.

    3. Pregătiți fișierele descărcate; dezarhivați-le într-un folder accesibil și, dacă este necesar, faceți instrumentul executabil esptool, în cazul meu, din moment ce GNU / Linux, Cu chmod +x esptool

    4. Conectați modulul la computer folosind un convertor USB UART TTL care funcționează la 3V3 sau folosiți un convertor de nivel dacă funcționează la 5 V. Pe lângă putere, va trebui să conectați TX la RX al convertorului USB UART TTL, RX la TX, GPIO0 la nivel scăzut (GND) și poate GPIO2 la nivel înalt (în testele mele a funcționat atât conectându-l la nivel scăzut, cât și deconectandu-l). Dacă modulul are conexiunea GPIO15 liberă (cum se întâmplă în ESP-12), acesta trebuie conectat la un nivel scăzut. RESET, care ar fi în mod normal la un nivel ridicat în timpul funcționării, poate fi lăsat neconectat sau conectat la un nivel înalt prin intermediul unui rezistor (10K, de exemplu), deoarece înainte de a începe înregistrarea poate fi necesară resetarea dispozitivului conectându-l. la un nivel scăzut.
      Prin pornirea modulului, acesta va fi disponibil pentru actualizare, dar, Dacă se afișează o eroare de conexiune, va fi necesar să o resetați conectarea RESET la un nivel scăzut pentru o clipă și apoi lăsarea ei (fără conectare) pentru procesul de actualizare.
      Modulul are vârfuri de consum de jumătate de amperi (până la 600 mA, după unii utilizatori) deci este important să folosiți o sursă de alimentare capabilă să suporte acest consum, mai ales pentru actualizarea firmware-ului.

      Conexiune modulul wifi ESP8266 ESP-01 la USB UART TTL actualizare firmware

    5. Rulați instrumentul pentru a actualiza firmware-ul. În cazul meu, am salvat instrumentul și documentele firmware la pasul 3 în același folder, așa că rulez din consolă:
      cd ~/Datos/firmwareESP8266 (schimbați în folderul care conține instrumentul și firmware-ul)
      ./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 setează viteza ESP8266 (115200 baud în cazul meu) și --port portul serial la care se conectează (în cazul meu, emulat, primul USB). Diferitele documente care alcătuiesc firmware-ul merg în urmă write_flash precedat de adresă, cu documentul user1.bin care conține încărcătura utilă de actualizare.

      WiFi ESP8266 actualizare firmware esptool captură console

    Trimiteți comenzi către modulul WiFi ESP8266

    Pentru a controla ESP8266 de la un computer cu care va trebui să începem configurați aplicația pentru care va fi suficient să ① alegeți portul la care este conectat convertorul USB UART TTL, ceva asemănător cu /dev/USB0 în GNU/Linux și similar sau ceva de genul COM6 în Windows, ② alegeți viteza la care ESP8266, probabil 115200 baud, ③ setați 8 biți de date plus un bit de oprire, fără paritate sau strângere de mână și ④ setați sfârșitul liniei, în funcție de firmware, aproape întotdeauna CR+LF.

    Configurați CuteCom să monitorizeze modulul WiFi ESP8266 utilizând un convertor USB UART TTL

    Configurați PuTTY pentru a monitoriza modulul WiFi ESP8266 cu un convertor USB UART TTL

    Odată ce aplicația este configurată (sau, după caz, stocată și selectată), aceasta este deschide conexiunea („dispozitiv deschis” și, respectiv, „deschidere”, în capturile de ecran din exemplele de mai sus cu CuteCom y PuTTY) și puteți începe să trimiteți comenzi către ESP8266.

    După cum se poate vedea în Tabelul de comandă ESP8266 AT, formatul de activare, dezactivare, setare a unei valori și referire la ea este destul de previzibil, dar în general nu este ușor să le reții pe toate și probabil că va trebui să o ai la îndemână pentru a te referi la el.

    Modul de enviar comenzi AT al Modul WiFi ESP8266 de la Arduino este foarte simplu: ① configurează comunicațiile cu Serial.begin(115200); (sau Serial1, Serial2... pe plăci cu mai multe porturi seriale hardware) și ② trimite comenzile folosind formatul Serial.print(orden+"\r\n");

    Exemplul de mai sus arată cum se trimite Modul wifi ESP8266 AT comenzi de la Arduino. În acest caz este ilustrat AT+CWJAP, care este utilizat pentru a vă conecta la un punct de acces. Această comandă folosește ca argumente identificatorul punctului de acces (SSID) și cheia, ambele între ghilimele, deci devin obiect Srtring și includeți-le între ghilimele folosind codul de escape (\"). Pentru a finaliza comanda, utilizați \r\n care corespunde CR y LF.

    De reținut că portul serial nu este întotdeauna identificat cu Serial (pe anumite farfurii poate fi Serial1, Serial2…) obiectul port utilizat a fost definit prin alocarea acestuia macro-ului PUERTO_SERIE. Detectarea tipului de placă utilizată ar putea adăuga un pic de inteligență selecției portului serial; Mai târziu vom analiza cum puteți afla tipul de Arduino. Restul definițiilor sunt cele obișnuite care vă permit să „denumiți” valorile constante pentru a evita repetarea lor (și greșelile) și pentru a le schimba mai ușor.

    Exemplul de mai sus ar trebui să conecteze Modul WiFi ESP8266 la punctul de acces indicat, dar era deja conectat înainte? A funcționat conexiunea? Pentru a ști asta, trebuie să „ascultăm” ceea ce ESP8266

    Primiți date de la modulul wifi ESP8266

    Conectând sniffer-ul de date explicat mai sus la computer, puteți vedea ce Arduino a trimis către ESP8266 și răspunsul lui. De citit din Arduino și procesează informațiile din el va fi necesar să se detecteze cu Serial.available() dacă au sosit date și dacă da încărcați-le cu Serial.read(). Următorul exemplu arată cum să citiți răspunsul de la AT+CWJAP?, care va raporta dacă există o conexiune la orice punct de acces.

    Ca pe o farfurie Arduino Uno (și în altele) deschiderea monitorului serial resetează programul, acesta poate fi folosit pentru a vedea în consola serial Arduino informațiile către care trimiteți ESP8266 așa cum arată captura de ecran din imaginea de mai jos.

    Primiți date de la modulul wifi ESP8266 de la Arduino. Exemplu de bază

    Analizați răspunsul trimis de modulul wifi ESP8266

    Am văzut deja cum să citim informațiile care ajung Arduino din ESP8266. Problema cu care trebuie să te confrunți este că nu știi când va începe să sosească, cât va dura să ajungă, ce lungime va avea... și nu este foarte eficient să aștepți răspunsul de la ESP8266 este primit fără a lăsa microcontroler îndeplini alte sarcini între timp.

    O modalitate simplă de a gestiona această circumstanță este iterează asupra datelor primite căutând răspunsuri concrete cu care, de exemplu, se activează indicatori (steaguri sau variabile booleene) care vor determina dacă se continuă căutarea în textul primit și ce acțiuni ar trebui efectuate pe baza informațiilor care sosesc din ESP8266. În timp ce răspunsul vine microcontroler se poate dedica altor sarcini, de exemplu, primirea datelor de la senzori și procesarea acestora.

    Căutați un text în informațiile primite de la ESP8266

    Pentru a căuta textul care provine din ESP8266 poți compara fiecare scrisoare primita cu cea care corespunde mesajului pe care il cauti. Va fi necesar să folosiți un numărător (sau un indicator) care indică litera care trebuie comparată; Dacă personajul care vine din ESP8266 este la fel cu cel examinat in mesaj, contorul avanseaza, daca este diferit se initializeaza.

    Pentru a ști că s-a ajuns la final, se consultă următorul caracter al mesajului căutat, care va fi zero (\0) sau se stochează lungimea mesajului pentru a, comparându-l cu contorul, să știe dacă comparația s-a încheiat și, prin urmare, Modul WiFi ESP8266 a trimis mesajul dorit.

    Următorul exemplu utilizează comanda AT+CWLAP care va returna o lista de puncte de acces si in cadrul acestora se cauta unul numit "wifi polaridad.es". Deși am ales să verificăm că ultimul caracter este zero, deoarece tampon Stochează doar textul căutat și se cunoaște lungimea acestuia, se poate verifica și dacă s-a primit un astfel de număr de litere corecte. Cu LED-uri conectat la pinul 2 se raportează că a fost găsit textul așteptat.

    În codul exemplului anterior puteți vedea și o modalitate de a alegeți portul serial în funcție de tipul plăcii Arduino folosit. Acest exemplu presupune că aveți trei tipuri de plăci pentru proiect: unul Arduino Uno, One Arduino Mega 2560 și o arduino leonardo. Dacă lucrați cu un Arduino Uno va fi folosit Serial si altfel Serial1.

    Dacă lucrezi cu o farfurie arduino leonardo Puteți folosi aceeași metodă pentru a opri programul și a aștepta consola (portul serial asociat cu Serial) este disponibil.

    Căutați diverse texte în răspunsul ESP8266

    Codul din exemplul anterior este folosit pentru a căuta text în informațiile trimise de ESP8266 dar răspunsul poate include informații diferite în funcție de operație. Să presupunem, pentru a începe cu un caz simplu din exemplul următor, că textul trimis de către MCU ESP8266 es OK când operaţia este efectuată corect şi ERROR In rest, ca la comanda AT+CWJAP?, care servește la verificarea dacă Modul WiFi ESP8266 este deja conectat la un punct de acces.

    Această nouă implementare a aceleiași metode, care caută o potrivire cu mai multe mesaje posibile, vă permite să alegeți între diferite acțiuni în funcție de răspunsul primit de la ESP8266, pur și simplu porniți LED-uri care corespunde.

    Limitați timpul necesar pentru a primi un răspuns

    Până acum nu s-a făcut referire la o problemă relevantă: the timpul maxim de așteptare (timeout) înainte de a considera o operațiune eșuată. Dacă din orice motiv legătura cu Modul WiFi ESP8266, modulul cu punctul de acces, punctul de acces cu Internet sau, de exemplu, un server ipotetic nu este disponibil, programul poate fi blocat la un moment dat așteptând pe termen nelimitat, așa că va trebui articulat un răspuns la astfel de circumstanțe. Timpul maxim de așteptare poate fi configurat pentru întreaga aplicație, de obicei va fi mai „generoasă” în acest caz, sau timpii de așteptare individuali pot fi programați pentru fiecare operațiune.

    Pentru a verifica dacă (cel puțin) a trecut un anumit interval de timp „Timpul” momentului în care se începe contul se scade de obicei din „ora” curentă și se verifică că diferența este mai mare decât limita dorită. Acest „timp” nu trebuie să fie în timp real, de obicei corespunde intervalului care a trecut de la MCU începeți să numărați timpul; Acest lucru nu afectează programul, deoarece ceea ce este interesant este timpul scurs și nu timpul absolut.

    De obicei, pentru a verifica dacă a trecut un anumit interval, se folosește o expresie de tipul:

    variabil milisegundos_al_empezar conţine valoarea de millis() a unui anumit moment al execuției de la care este cronometrat, așa că nu este neobișnuit ca numele său să se refere la cuvântul „cronometru”. Variabila intervalo_de_tiempo conține numărul maxim de milisecunde care face ca expresia anterioară să fie adevărată, adică reprezintă timeout-ul; Este de obicei o constantă (sau o macro) și, ca și în cazul precedent, cuvântul „TIMEOUT” apare adesea în numele său. Dacă lucrați cu intervale foarte scurte, puteți utiliza micros() în loc de millis() (microsecunde în loc de milisecunde) deși este mult mai puțin comun și mult mai puțin precis.

    Un întreg lung în Arduino (unsigned long) ocupă 4 octeți (32 de biți), deci cea mai mare valoare pe care o poate reprezenta este 4294967295 (2 la puterea de 32 minus unu, deoarece începe de la zero). pe o farfurie Arduino În timp ce rulează continuu, contorul de milisecunde se va reseta (reveni la zero) aproximativ la fiecare 50 de zile. La scăderea cu tipuri de date nesemnate este reprodus același comportament (întoarcerea contorului), astfel încât este posibil să se controleze timpul de expirare pe termen nelimitat.

    Codul de mai sus arată a implementare foarte simplă a limitării timeout încorporând liniile marcate în raport cu exemplul care îl precede. Deoarece verificarea timeout-ului se efectuează după procesarea datelor care sosesc de la Modul WiFi ESP8266, operațiunea poate fi considerată reușită chiar dacă recepția durează mai mult decât timpul de așteptare impus.

    Executați o operație complexă definită de mai multe comenzi AT

    Pentru a avea un exemplu de referință cu scopul aplicației care exploatează Modul WiFi ESP8266, să presupunem că este stocarea informațiilor într-o bază de date accesată printr-un serviciu web pentru a ține evidența temperaturii. Următorul cod citește un senzor conectat la o intrare analogică la fiecare anumit interval de timp, calculează valoarea medie și, după un interval de timp mai lung, o trimite către serverul web (stil IoT) prin a petiție HTTP (POSTAȚI, PRIȚI…).

    În acest exemplu de înregistrare a temperaturii, un server web este accesat la fiecare cinci minute. Deși disponibilitatea nu este deosebit de mare, este de așteptat ca propunerea să funcționeze, dar dacă ar fi necesară o frecvență mai mare de înregistrare, ar trebui implementate alte resurse, de exemplu, un tampon de date așteaptă să fie trimis, pentru a trimite mai multe când serverul poate participa și pentru a le stoca atunci când nu este disponibil. Dacă frecvența cu care datele trebuie înregistrate ar fi și mai mare, ar trebui propuse alte tipuri de protocoale ca alternativă la HTTP sau chiar înlocuiți TCP de UDP pentru a putea trimite majoritatea datelor la viteza necesară chiar și cu prețul pierderii unora.

    Operatiile care alcatuiesc sarcina de efectuat pentru transmiterea temperaturii ar fi:

    • Resetați modulul wifi
    • Deconectați-vă de la punctul de acces curent (în cazul în care există o conexiune implicită)
    • Setați setările. Pentru exemplu, se presupune că modul de conectare (simplu) și rolul în comunicațiile Wi-Fi (stație) trebuie configurate.
    • Conectați-vă la punctul de acces
    • Verificați dacă conexiunea este corectă (de fapt, acesta este punctul de intrare) Dacă nu există conexiune, începeți procesul de la început
    • Conectați-vă la server
    • Trimite cererea HTTP cu datele de stocat

    Ordinea operațiilor nu trebuie să fie exact așa (deși operația este) și fiecare pas poate necesita mai multe comenzi ESP8266 ATDe exemplu, configurația enumerată mai sus ar avea nevoie de două: AT+CIPMUX=0 y AT+CWMODE=1.

    O structură de date pentru a reprezenta operațiunile pe ESP8266

    În exemplele anterioare, deși într-un mod foarte simplu, o soluție generică a problemei este deja sugerată: utilizați o structură de date care stochează răspunsurile posibile și acțiunile care trebuie întreprinse în fiecare caz; trimiteți o acțiune, așteptați un răspuns și continuați în funcție de ceea ce înseamnă răspunsul. Deoarece fiecare operațiune complexă va necesita mai multe comenzi ESP8266 AT, structura de date trebuie să lege o operațiune cu altele, următoare sau anterioare, care trebuie efectuată în fiecare caz în funcție de răspunsul ESP8266.

    În exemplele anterioare, un mesaj a fost căutat în răspunsul lui ESP8266 și a fost interpretat ca succes sau eroare. Pe lângă o recepție (și o analiză) a întregului text primit, Pentru a avea un minim generic, este indicat să vă ocupați și de completarea mesajului sau, cu alte cuvinte, la disponibilitatea Modul WiFi ESP8266 pentru a primi comenzi noi. În acest fel, schimbarea într-o stare pe care am putea-o numi, de exemplu, „wifi disponibil”, ar putea fi primirea numelui punctului de acces și primirea textului ERROR sau textul OK ar însemna că ESP8266 ați terminat răspunsul și acum îl puteți trimite pe următorul Comanda AT către ESP8266.

    Codul de mai sus folosește un vector (operacion) pentru a stoca textul operațiunilor succesive care formează sarcina completă. Se folosește o matrice bidimensională (mensaje) cu cele trei răspunsuri care sunt analizate. După cum s-a explicat mai sus, este necesar să căutați mesajele care reprezintă sfârșitul răspunsului pe lângă mesajul care reprezintă un răspuns corect sau incorect. Nu toate operațiunile vor avea același număr de răspunsuri posibile; Când sunt mai puține răspunsuri, se poate folosi un mesaj gol care consumă cel mai mic număr posibil de cicluri în analiza sa (chiar și așa, nu este cel mai optim mod). În mod logic, va fi necesar ca numărul minim de răspunsuri căutate (trei în exemplu) să cuprindă toate posibilitățile de operare, chiar dacă nu sunt toate posibile.

    Când vorbim despre posibilele răspunsuri, se poate observa deja că acest exemplu nu este foarte util pentru primirea de date cu format arbitrar de la un Modul WiFi ESP8266, dar chestia este că, în contextul utilizării cu microcontrolere nu este obișnuit; Cel mai obișnuit este să trimiți datele culese de senzorii pe care i-au conectat și/sau să primești informații despre ce să faci cu actuatoarele pe care le controlează. Informații foarte valoroase, care pot fi prezise foarte bine.

    În structura anterioară de date, la fel cum se face pentru a exprima răspunsurile posibile care sunt analizate, se folosește și o matrice bidimensională pentru a determina operația care trebuie efectuată în fiecare caz (siguiente_operacion). Mai exact, am ales să răspundem la trei tipuri de mesaje: ① un text arbitrar (LITERAL) pentru a verifica dacă există o conexiune la punctul de acces Wi-Fi și la server, ② un text pentru a detecta erorile în proces (FALLO) și ③ un text care indică faptul că operațiunea a fost finalizată cu succes (ACIERTO).

    În cele din urmă, mai există doi vectori pentru a seta timpul maxim de așteptare înainte de a renunța (timeout) și specificați (configuracion) dacă operațiunea se încheie fără a aștepta un răspuns (ESPERAR_RESPUESTA) și mesaje care indică încheierea comunicării. Acest ultim vector, pentru a ilustra un exemplu despre cum ar putea fi salvată memoria, funcționează cu biții unui octet de configurare pentru a indica diferitele stări.

    Primul comenzi ESP8266 AT al structurii de date se așteaptă întotdeauna un răspuns, care poate fi mesajul de succes sau de eroare. Când apare o eroare, modulul este repornit și pornește din nou și dacă mesajul indică că operația este corectă, se trece la următoarea.

    Când v-ați conectat la server, modelul se schimbă. În acest caz, este necesar să ① trimiteți lungimea pachetului de date care urmează să fie transmis și ② să compuneți cererea HTTP cu un text fix plus valoarea (temperaturii) care este trimisă pentru a fi stocată pe server. Pregătirea acestor date se efectuează în fiecare expediere și este necesară împărțirea acesteia în două (se anunță lungimea) sau trei (trimite cererea HTTP) la Comanda ESP8266 AT. Numai ultima dintre părțile în care este împărțită operația va aștepta un răspuns.

    În acest caz, va funcționa fără probleme (poate avertizând că modulul este ocupat), dar atunci când lungimea datelor este mai mare va fi necesară împărțirea blocurilor de date în bucăți mai mici și poate fi chiar necesară implementarea unei așteptări, ca se face cu citirea temperaturii, pentru a da timp modulului să trimită datele fără a le completa tampon.

    Împreună cu alte macrocomenzi care au fost deja explicate anterior, exemplul de cod de mai sus arată cum sunt definite diferitele stări cu care se specifică dacă să aștepte un răspuns și, dacă este cazul, ce mesaj indică faptul că acesta s-a terminat.

    Ca și în diferite puncte ale codului, se va trimite o operațiune (când este timpul să trimiteți temperatura medie, dacă timpul de așteptare al unei operații este depășit, când operațiunea curentă este finalizată cu succes...) dar cum se face este stabilit la nivel global, a fost definită o macro ENVIAR_OPERACION care grupează etapele implicate în transport.

    Următorul este codul programului principal al exemplului. Cea mai externă sarcină este cea însărcinată cu eșantionarea temperaturii pentru a calcula media și, la fiecare anumită perioadă de timp, este trimisă la server folosind Modul WiFi ESP8266. Odată ce fiecare operație este trimisă, răspunsul este analizat pentru a determina care urmează sau dacă sarcina de trimitere a informațiilor a fost finalizată.

    În mod logic, mai multe acțiuni de optimizare pot fi efectuate pe codul anterior, dar, deoarece acesta este un exemplu pentru a înțelege cum ESP8266 Într-un mod generic, merită să ne concentrăm doar asupra unor aspecte, primul fiind structura datelor. Se pare că lucrul logic este utilizați o structură de date în limbaj de programare (struct) pentru a reprezenta informațiile în curs de prelucrare: comenzi ESP8266 AT și mesajele care sunt analizate.

    Utilizați o structură (struct) pentru a stoca datele în locul matricelor de exemplu (pe baza acestora) este banal și, deși poate duce la un cod mai elegant, nu implică nicio îmbunătățire a rezultatului. Adevărata alternativă prezentată de utilizarea lui struct este de a implementa, după cum se explică mai jos, lungimi variabile în structurile care conțin date „interioare”. la care se referă ei. În acest fel, de exemplu, nu ar fi necesar ca o operațiune să aibă un număr fix de răspunsuri de analizat.

    Această abordare sugerează că este cea mai bună modalitate de a implementa soluția, dar dezavantajul este că ar fi necesară utilizați alocarea dinamică a memoriei, o practică riscantă de lucru cu a microcontroler ceea ce necesită măsurarea atentă a câtă memorie va fi utilizată în timpul execuției, deoarece compilatorul cu greu ne va putea avertiza despre acest lucru și există o anumită posibilitate de a epuiza memoria (sau stiva) cu consecințe fatale pentru execuția programului.

    În linia de optimizare a codului, este interesant de reținut că, într-un program de acest tip, care utilizează o cantitate mare de text, poate economisi spațiu de memorie SRAM stocarea șirurilor de text în memoria programului (bliţ) cu macro-ul F(). În următoarele capturi de ecran puteți vedea diferitele distribuții ale programului și ale memoriei dinamice cu utilizarea normală a textului și utilizarea macrocomenzii F().

    Exemplu de cod Arduino folosind text stocat în memoria programului (flash)
    Exemplu de cod Arduino folosind text în SRAM

    În ceea ce privește acțiunile care se execută conform informațiilor care sosesc de la Modul WiFi ESP8266, ca alternativă la verificarea mesajului din cod și efectuarea unuia sau altul în funcție de ceea ce este primit, poate fi stocat în această structură de date indicii către funcții care îndeplinesc fiecare sarcină în locul indicatorilor de stare (steaguri) care avertizează asupra unei anumite stări pe care aplicația este responsabilă pentru gestionarea, de exemplu, în cadrul buclei principale.

    Următorul este un exemplu de structuri pentru stocarea datelor cererilor către ESP8266 (tipul de date operacion_esp8266) și răspunsurile acestora (tipul de date respuesta_esp8266).

    Ca structură care reprezintă operația (datele care sunt trimise către Modul WiFi ESP8266) se referă la structura cu care sunt definite răspunsurile și structura răspunsurilor la structura operațiunilor, este necesar să le declarăm pe ambele mai întâi, prin definirea noului tip de date și apoi definirea conținutului acestuia.

    Exemplul anterior consideră că programul care îl include a ales să folosească a indicator de stare, care trebuie să corespundă unei variabile accesibile din cod care este responsabilă pentru efectuarea uneia sau a altor operații, așa cum este indicat de respectiva valoare. Dacă în răspunsul lui ESP8266 Atunci când un anumit text este analizat, starea ia valoarea care indică structura răspunsului corespunzător.

    După cum sa spus anterior, o altă alternativă, fie pentru a înlocui, fie pentru a completa un indicator de stare, ar fi stocați o funcție în structura de referință (un indicator) care ar fi apelat la întâlnirea unui anumit text în răspunsul de la Modul WiFi ESP8266.

    În exemplul anterior, a fost adăugat la structura de date care este utilizată pentru a procesa răspunsul de la Modul WiFi ESP8266 un pointer către o funcție (presupusă) care returnează date de tip float (ar putea fi valoarea ponderată a unei citiri analogice) și căreia îi sunt furnizați doi octeți ca argumente (doi unsigned char care ar putea fi pinul din care se citește intrarea analogică și cel care activează ENABLE-ul unui ipotetic integrat).

    În dezvoltare pentru MCU, spre deosebire de ceea ce se întâmplă în stilul de dezvoltare pentru sisteme mai mari, nu este atât de neobișnuit să folosiți variabile globale atunci când definiți comportamentul (global) al aplicației care controlează un ansamblu, așa că nu va fi deosebit de rar să găsiți acest tip de definiții ca functii fara parametri si care nu returneaza valori, ceva de genul void (*accion)();

    Dacă lucrați cu acest mod de reprezentare a datelor, folosind struct de date de lungime variabilă, va fi necesară alocarea dinamică a memoriei cu malloc() (o new(), dacă sunt folosite obiecte), care va folosi cantitatea de memorie alocată ca parametru și va returna un pointer la începutul zonei de memorie care este rezervată. Cu sizeof() Pe tipul care sunt stocate, înmulțit cu numărul de elemente utilizate, puteți obține cantitatea de memorie necesară. Un exemplu cu și fără utilizarea acestuia poate fi văzut în capturile de ecran de mai jos. malloc(); Aveți grijă la memoria folosită de program în primul caz, trebuie să încărcați biblioteca care conține această funcție.

    Exemplu de alocare a memoriei cu malloc pe Arduino

    Exemplu de atribuire a textului fără malloc în Arduino

    Dacă operațiunile pe Modul WiFi ESP8266 va varia pe parcursul execuției programului, va fi necesară eliberarea memoriei cu care nu este utilizată free() (o delete(), în cazul a fi obiecte). Deși este rezonabil să ne așteptăm ca compilatorul (CGC) va optimiza programul pentru a evita partiţionarea memoriei, cu siguranţă performanţa nu va fi la fel de optimă precum lucrul cu memoria alocată static.

    Deși în acest exemplu (în ambele implementări) nu are prea mult sens, pentru a generaliza operația pentru a o putea aplica și în alte cazuri, trebuie menționat că trimiterea datelor repetă întotdeauna același protocol: notificați numărul de octeți care vor fi trimiși, așteptați indicatorul (>) și trimiteți datele.

    Întrucât în ​​acest exemplu se folosește o singură dată (întreaga cerere se face într-un singur pachet), nu pare foarte utilă dar, în general, poate fi necesară efectuarea mai multor trimiteri în aceeași operațiune, inclusiv cazurile în care trebuie să fie transmise cantități semnificative de date care trebuie fragmentate pentru a evita debordarea memoriei ESP8266.

    Pentru implementarea acestui comportament, ultimele două elemente ale conexiunii pot fi folosite astfel încât de fiecare dată când datele sunt trimise, datele să fie completate cu valorile corespunzătoare: în primul caz, numărul de octeți trimiși și în al doilea, ( parte din) cerere.să fie transmis.

    Pentru a repeta atribuirea și trimiterea diferitelor elemente care trebuie transmise pot fi stocate într-un vector. Acest nou vector va fi cel care determină sfârșitul operației complexe și nu ultima operație ca până acum.

    1 comentariu

    comentarii utilizator
    ดูบอลสด

    Cu siguranță sunt multe de aflat despre acest subiect. Îmi plac toate punctele pe care le-ai făcut

    Posteaza un comentariu

    S-ar putea să fi ratat