Pagrindinės operacijos su ESP8266 wifi moduliu iš Arduino

Pagrindinės operacijos su ESP8266 wifi moduliu iš Arduino

Pagrindinės operacijos su ESP8266 wifi moduliu iš Arduino

Kai Espresas rinkoje pasirodė pirmieji moduliai wiFi su integruotu ESP8266 ir mikroprograma su kuriuo jį tvarkyti naudojant AT komandas, o mes, vartotojus, domėjomės jos integravimu į rinkinius mikrovaldikliai ir problemos buvo sumažintos iki (buvusios) tamsos pažinimo ESP8266 AT komandų lentelė, maitinimo poreikius arba ESP8266 programinės įrangos atnaujinimas.

Turinys

    Tada greitai atsirado alternatyvų programuoti ESP8266 ir modulių diegimai wiFi labai skirtingų formatų, kurie kėlė kitų rūpesčių: kurį ESP8266 wifi modulį pasirinkti priklausomai nuo skirtingų antenų (įskaitant išorines) diapazono arba fizinio šių naujų modulių integravimo į mūsų mazgus.

    Be abejo, dėl visų šių pokyčių nebuvo akcentuojami patys pagrindiniai aspektai, elementariausias ESP8266 wifi modulis. Nors poliškumas.es Galite rasti informacijos apie naudojimą ESP8266 ir yra keletas programų, skirtų bendrai paaiškinti, kaip veikia ESP8266 wifi modulis naudojant AT komandas, ypač straipsnyje apie biblioteką, kad pateiktumėte HTTP užklausas iš Arduino su ESP8266 wifi moduliu, skaitytojų įspūdžiai rodo, kad būtų naudinga pridėti šiek tiek daugiau pagrindinės informacijos, kuri padėtų naudotojams ESP8266 įgyvendinti savo įgyvendinimus.

    Aptarkite pagrindines darbo su ESP8266 bendrų sprendimų siūlymas yra kelių labai skirtingų dalių tikslas; Kad būtų lengviau sekti straipsnio turinį, ši rodyklė gali būti kaip vadovas:

    Valdykite ESP8266 wifi modulį iš kompiuterio per nuoseklųjį prievadą

    Iš lėkštės Arduino ir naudojant savo IDE galima stebėti, kaip veikia a ESP8266 wifi modulis, atsiųskite ESP8266 AT komandos ir pamatyk atsakymą, bet daug patogiau tai padaryti iš kompiuterio su terminalo tipo programa.

    Naudodami CuteCom, kad patikrintumėte ESP8266 wifi modulį per nuoseklųjį prievadą

    Priklausomai nuo to, kokia lenta Arduino naudojamas, gali būti prieinamas tik vienas aparatinės įrangos nuoseklusis prievadas, o tai šiek tiek apsunkina siuntimą ir gavimą. Ryšio spartos keitimas yra daug patogesnis nuosekliojo ryšio programoje iš kompiuterio ir kai kurių pagrindinių plokščių. Arduino (ir tam tikromis aplinkybėmis) nepalaiko didesnio nuosekliojo ryšio greičio, ypač 115200 XNUMX bodų, kuris yra numatytasis naujausių versijų greitis. mikroprograma.

    Apie Kokią programą naudoti norint stebėti ESP8266 naudojant nuoseklųjį prievadą, galima rinktis iš daugybės pagal poreikius ir pageidavimus; Pastaruoju metu daugiau naudoju klasiką CuteCom (tas, kuris pateiktas aukščiau esančioje ekrano kopijoje), nes man labai patogu pakartoti tam tikrus ESP8266 wifi modulio AT užsakymai projekto testavimo metu.

    Kai kurios rekomendacijos čia jau pateiktos programoms, kurios veikia kaip serijinė konsolė; Pavyzdžiui, kai kalbame apie PuTTY, skirtas valdyti UART serijinius įrenginius iš kompiuterio. PuTTYBe to, kad ji yra puiki programa, ji yra prieinama daugeliui stalinių kompiuterių operacinių sistemų. Be to, kaip PuTTY gali būti naudojamas kaip konsolė su nuosekliuoju prievadu ir interneto protokolų šeima (TCP/IP), įskaitant tuos, kurie veikia TLS, tampa įprastu įrankiu, kuris daugiau nei atperka už (mažą) laiką, sugaištą jo konfigūravimui ir pripratimui prie jo naudojimo.

    Naudojant PuTTY ESP8266 wifi moduliui išbandyti per nuoseklųjį prievadą

    Be serijinio ryšio programinės įrangos, prijungti ESP8266 wifi modulis iki uosto USB Kompiuteriui taip pat reikalingas keitiklis USB į serialus TTL. Kaip ir programinės įrangos atveju, yra keletas versijų, iš kurių jos naudojamos tik prievadui konvertuoti USB nuosekliajame prievade TTL (kuriuos galima gauti nuo vieno euro) į tuos, kurie gali emuliuoti skirtingus protokolus (pvz., SPI o I2C).

    Kaip ir programa, kuri veikia kaip nuoseklioji konsolė, aparatinė įranga, per kurią galima susisiekti su kompiuteriu USB su logine grandine (ne tik ESP8266) bus įprastas įrankis mikrovaldomų programų kūrėjo darbe, verta kuo greičiau turėti įrankių dėžėje ir dirbti su juo ESP8266 wifi modulis Tai puiki galimybė jį gauti.

    USB UART serijinio ryšio aparatinė įranga, skirta ESP8266 wifi moduliui stebėti

    Keitiklis USB a UART TTL Jis taip pat gali būti naudojamas stebėti grandinės, kuri naudoja ESP8266Norėdami tai padaryti, išėjimai, kuriuos norite stebėti, nuosekliai prijungiami prie keitiklio duomenų įvesties (RX) su greituoju diodu ( 1N4148, pavyzdžiui) ir rezistorius (pavyzdžiui, 2K2) lygiagrečiai vienas kitam. Tokia sąranka veikia kaip aparatinės įrangos serijinis snifferis.

    Sniffer pavyzdys ESP8266, prijungtas prie Arduino naudojant USB UART TTL keitiklį

    Nors aukščiau esančiame paveikslėlyje esantis uostiklis tikrai yra elementarus (be kita ko, jis neturi buferis) pakanka, kad būtų galima stebėti agregato veikimą Arduino ir ESP8266.

    Pašalinus uostiklį iš ankstesnės schemos, schema, rodanti, kaip prijungti a ESP8266 wifi modulis į lėkštę Arduino. Be maitinimo 3V3, atstatymo kaištis ir integruoto įjungimo kaištis turi būti prijungti prie aukšto lygio (įjungti). Žinoma, vieno RX kaištis turi jungtis prie kito TX.

    Siekiant supaprastinti ankstesnę diagramą, buvo pavaizduota plokštė Arduino maitinamas iš 3V3 ir kurių nuosekliojo prievado įtampa taip pat laikoma 3V3. Jei naudojate a mikrovaldiklis bus reikalingas kitoks signalo lygis nuosekliajame prievade (paprastai 5 V), kad nepažeistumėte ESP8266, naudoti lygio keitiklis kaip ir toliau pateiktose diagramose. Ši grandinė dažnai randama daugelyje komercinių, paruoštų modulių.

    5V į 3V3 signalo lygio keitiklis ESP8266 WiFi moduliui ir Arduino

    Atnaujinkite ESP8266 programinę įrangą

    The ESP8266 AT komandos, jo nutraukimas, numatytasis modulio greitis... priklauso nuo versijos ESP8266 programinė įranga. Geriausia užtikrinti, kad visuose moduliuose būtų ta pati versija ir, jei įmanoma, naujausia versija.

    Deja, dauguma ESP8266 wifi modulių modeliai Jie turi tik 4 Mbit, todėl naujausios versijos juose įdiegti negalima. Naujausia (oficiali) programinės įrangos versija, kurią galima įdiegti ESP8266 wifi moduliai su 4 Mbit (dauguma) yra 0.9.4, įskaitant 0.2 versiją ESP8266 AT komandos.

    Apibendrinant, norint atnaujinti programinę-aparatinę įrangą, jums reikia:

    1. Atsisiųskite atitinkamą programinės įrangos versiją. naujausia (oficiali) versija moduliui su 4 Mbit atmintimi, rasta espressif aplanke github. Viduje konors Espressif svetainė Galite atsisiųsti naujausią programinės aparatinės įrangos versiją, tačiau labai svarbu patikrinti, ar modulyje, kuriame ji įdiegta, yra pakankamai atminties.

    2. Atsisiųskite naujausią programinės įrangos diegimo įrankio versiją. Mano mėgstamiausia yra esptool kuriame parašyta Pitonas, todėl jis veikia bet kurioje platformoje. Be atsisiuntimo, jį taip pat galima įdiegti su pip install esptool (o pip2 o python -m pip…). Žinoma, Espresas Ji taip pat siūlo savo įrankį, bet šiuo metu galima tik „Windows“.

    3. Paruoškite atsisiųstus failus; išpakuokite juos į prieinamą aplanką ir, jei reikia, padarykite įrankį vykdomą esptool, mano atveju, nuo GNU / Linux, Su chmod +x esptool

    4. Prijunkite modulį prie kompiuterio naudodami keitiklį USB UART TTL kuris veikia 3V3 arba naudokite lygio keitiklį, jei jis veikia esant 5 V. Be maitinimo, turėsite prijungti TX prie keitiklio RX USB UART TTL, RX į TX, GPIO0 žemu lygiu (GND) ir galbūt GPIO2 aukštu lygiu (mano testuose veikė tiek prijungus žemu lygiu, tiek atjungus). Jei modulis turi laisvą GPIO15 jungtį (kaip yra ESP-12), jis turi būti prijungtas prie žemo lygio. RESET, kuris veikimo metu paprastai būtų aukštas, gali būti neprijungtas arba prijungtas prie aukšto lygio naudojant rezistorių (pavyzdžiui, 10K), nes prieš pradedant įrašymą gali tekti iš naujo nustatyti įrenginį jį prijungus. iki žemo lygio.
      Įjungus modulį, jį bus galima atnaujinti, bet Jei rodoma ryšio klaida, ją reikės nustatyti iš naujo akimirksniu prijunkite RESET žemu lygiu ir palikite jį įjungti (neprisijungus) atnaujinimo procesui.
      Modulis turi pusės amperų suvartojimo piko (kai kurių vartotojų teigimu, iki 600 mA), todėl svarbu naudoti maitinimo šaltinį, galintį palaikyti šį suvartojimą, ypač atnaujinant programinę-aparatinę įrangą.

      Wi-Fi modulio ESP8266 ESP-01 prijungimas prie USB UART TTL keitiklio programinės įrangos atnaujinimo

    5. Paleiskite įrankį, kad atnaujintumėte programinę-aparatinę įrangą. Mano atveju įrankį ir programinės įrangos dokumentus išsaugojau 3 veiksme tame pačiame aplanke, todėl paleidžiu iš konsolės:
      cd ~/Datos/firmwareESP8266 (pakeiskite į aplanką, kuriame yra įrankis ir programinė įranga)
      ./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 nustato greitį ESP8266 (mano atveju 115200 XNUMX bodų) ir --port nuoseklusis prievadas, prie kurio jis jungiasi (mano atveju, emuliuotas, pirmasis USB). Įvairūs dokumentai, sudarantys programinę-aparatinę įrangą, atsilieka write_flash prieš tai nurodomas adresas su user1.bin dokumentu, kuriame yra naujinimo naudingoji apkrova.

      wifi ESP8266 programinės aparatinės įrangos naujinimas esptool konsolės fiksavimas

    Siųsti komandas į ESP8266 wifi modulį

    Norėdami kontroliuoti ESP8266 nuo kompiuterio turėsime pradėti sukonfigūruoti programą kuriam pakaks ① pasirinkti prievadą, prie kurio prijungtas keitiklis USB UART TTL, Kažkas kaip /dev/USB0 GNU/Linux ir panašiai ar panašiai COM6 sistemoje Windows ② pasirinkite greitį, kuriuo ESP8266, tikriausiai 115200 8 bodų, ③ nustatykite XNUMX duomenų bitus ir vieną sustojimo bitą be pariteto ar rankos paspaudimo ir ④ nustatykite eilutės pabaigą, priklausomai nuo mikroprograma, beveik visada CR+LF.

    Sukonfigūruokite CuteCom, kad galėtumėte stebėti ESP8266 wifi modulį naudodami USB UART TTL keitiklį

    Sukonfigūruokite PuTTY, kad galėtumėte stebėti ESP8266 wifi modulį su USB UART TTL keitikliu

    Kai programa sukonfigūruojama (arba, jei reikia, išsaugoma ir pasirinkta), ji yra atidarykite ryšį (atitinkamai „atidaryti įrenginį“ ir „atidaryti“, aukščiau pateiktų pavyzdžių ekrano kopijose su CuteCom y PuTTY) ir galite pradėti siųsti užsakymus ESP8266.

    Kaip matyti iš ESP8266 AT komandų lentelė, suaktyvinimo, išjungimo, reikšmės nustatymo ir nuorodų į ją formatas yra gana nuspėjamas, tačiau apskritai nėra lengva juos visus prisiminti ir tikriausiai turėsite jį turėti po ranka, kad galėtumėte į jį kreiptis.

    Būdas siųsti AT užsakymus al ESP8266 wifi modulis nuo Arduino yra labai paprasta: ① konfigūruokite ryšius su Serial.begin(115200); (arba Serial1, Serial2… plokštėse su keliais aparatūros nuosekliaisiais prievadais) ir ② siųskite komandas naudodami formatą Serial.print(orden+"\r\n");

    Aukščiau pateiktame pavyzdyje parodyta, kaip išsiųsti ESP8266 wifi modulio AT užsakymai nuo Arduino. Šiuo atveju tai iliustruojama AT+CWJAP, kuris naudojamas prisijungti prie prieigos taško. Ši komanda kaip argumentus naudoja prieigos taško identifikatorių (SSID) ir raktą, abu kabutėse, todėl jie tampa objektu Srtring ir įdėkite juos į kabutes naudodami pabėgimo kodą (\"). Norėdami užbaigti užsakymą, naudokite \r\n kuris atitinka CR y LF.

    Atsiminti, kad nuoseklusis prievadas ne visada identifikuojamas Serial (tam tikrose plokštelėse tai gali būti Serial1, Serial2…) naudojamas prievado objektas buvo apibrėžtas priskiriant jį makrokomandai PUERTO_SERIE. Naudojamos plokštės tipo aptikimas gali suteikti šiek tiek intelektualumo renkantis nuoseklųjį prievadą; Vėliau aptarsime, kaip galite sužinoti tipą Arduino. Likę apibrėžimai yra įprasti, leidžiantys „įvardyti“ pastovias reikšmes, kad jos nesikartotų (ir nepadarytų klaidų) ir būtų lengviau jas pakeisti.

    Aukščiau pateiktas pavyzdys turėtų sujungti ESP8266 wifi modulis prie nurodyto prieigos taško, bet ar jis jau buvo prijungtas anksčiau? Ar ryšys suveikė? Kad žinotume, turime „klausytis“ to, kas ESP8266

    Gaukite duomenis iš ESP8266 wifi modulio

    Prijungę aukščiau paaiškintą duomenų sniferį prie kompiuterio, galite pamatyti, ką Arduino išsiuntė į ESP8266 ir jo atsakymas. Skaityti iš Arduino ir apdoroti joje esančią informaciją, kurią reikės aptikti Serial.available() jei gauta kokių nors duomenų ir jei taip, įkelkite juos Serial.read(). Toliau pateiktame pavyzdyje parodyta, kaip perskaityti atsakymą iš AT+CWJAP?, kuri praneš, ar yra ryšys su kuriuo nors prieigos tašku.

    Kaip lėkštėje Arduino One (ir kituose) atidarius nuoseklųjį monitorių programa iš naujo nustatoma, ją galima pamatyti serijos pulte Arduino informaciją, kurią siunčiate ESP8266 kaip rodo toliau esančio vaizdo ekrano kopija.

    Gaukite duomenis iš ESP8266 wifi modulio iš Arduino. Pagrindinis pavyzdys

    Išanalizuokite ESP8266 wifi modulio atsiųstą atsakymą

    Jau matėme, kaip skaityti informaciją, kuri pasiekia ArduinoESP8266. Problema, su kuria tenka susidurti, yra ta, kad nežinai, kada jis pradės atvykti, kiek laiko užtruks, kokio ilgio... ir nėra labai efektyvu laukti atsakymo iš ESP8266 gaunamas neleisdamas mikrovaldiklis tuo tarpu atlikti kitas užduotis.

    Paprastas būdas valdyti šią aplinkybę yra kartoti gautus duomenis ieškodami konkrečių atsakymų su kuriais, pavyzdžiui, suaktyvinami indikatoriai (vėliavos arba Būlio kintamieji), kurie nustatys, ar tęsti paiešką gautame tekste ir kokius veiksmus reikia atlikti remiantis informacija, gaunama iš ESP8266. Kol atsakymas ateina mikrovaldiklis gali atsiduoti kitoms užduotims, pavyzdžiui, gauti duomenis iš jutiklių ir juos apdoroti.

    Ieškokite teksto iš ESP8266 gautoje informacijoje

    Norėdami ieškoti teksto, gauto iš ESP8266 tu gali kiekvieną gautą laišką palyginkite su tuo, kuris atitinka jūsų ieškomą žinutę. Reikės naudoti skaitiklį (arba rodyklę), nurodantį lyginamą raidę; Jei simbolis, kuris ateina iš ESP8266 yra toks pat kaip ir tiriamasis pranešime, skaitiklis juda į priekį, jei skiriasi, inicijuojamas.

    Norint žinoti, kad pabaiga pasiekta, ieškomas kitas ieškomo pranešimo simbolis, kuris bus lygus nuliui (\0) arba pranešimo ilgis išsaugomas, kad palyginus jį su skaitikliu sužinotumėte, ar palyginimas baigtas ir todėl ESP8266 wifi modulis išsiuntė norimą žinutę.

    Toliau pateiktame pavyzdyje naudojama komanda AT+CWLAP kuris grąžins prieigos taškų sąrašą ir juose bus ieškoma vieno, vadinamo „wifi polaridad.es“. Nors pasirinkome patikrinti, ar paskutinis simbolis yra nulis, kaip buferis Jame saugomas tik ieškomas tekstas ir žinomas jo ilgis, taip pat būtų galima patikrinti, ar gautas toks skaičius teisingų raidžių. Su LED prijungtas prie 2 kaiščio, pranešama, kad buvo rastas laukiamas tekstas.

    Ankstesnio pavyzdžio kode taip pat galite pamatyti būdą, kaip pasirinkite nuoseklųjį prievadą, atsižvelgdami į plokštės tipą Arduino naudojamas. Šiame pavyzdyje daroma prielaida, kad projektui turite trijų tipų lentas: vieną Arduino One, Vienas „Arduino Mega 2560“ ir arduino leonardo. Jei dirbate su a Arduino One jis bus naudojamas Serial ir kitaip Serial1.

    Jei dirbate su lėkšte arduino leonardo Tą patį metodą galite naudoti norėdami sustabdyti programą ir laukti konsolės (nuosekliojo prievado, susieto su Serial) yra.

    Ieškokite įvairių tekstų ESP8266 atsakyme

    Ankstesniame pavyzdyje pateiktas kodas naudojamas ieškant teksto informacijoje, kurią siunčia ESP8266 bet atsakymas gali apimti skirtingą informaciją, priklausomai nuo operacijos. Tarkime, pradedant nuo paprasto atvejo kitame pavyzdyje, kad tekstas atsiųstas MCU ESP8266 es OK kai operacija atliekama teisingai ir ERROR Kitu atveju, kaip su užsakymu AT+CWJAP?, kuris skirtas patikrinti, ar ESP8266 wifi modulis jau prijungtas prie prieigos taško.

    Šis naujas to paties metodo įgyvendinimas, ieškant atitikmenų su keliais galimais pranešimais, leidžia pasirinkti skirtingus veiksmus, atsižvelgiant į atsakymą, gautą iš ESP8266, tiesiog įjunkite LED atitinkamas.

    Apribokite laiką, kurio reikia atsakymui gauti

    Iki šiol nebuvo daroma nuoroda į atitinkamą problemą: maksimalus laukimo laikas (skirtasis laikas), kol bus laikoma, kad operacija nepavyko. Jei dėl kokių nors priežasčių ryšys su ESP8266 wifi modulis, modulis su prieigos tašku, prieigos taškas su internetu ar, pavyzdžiui, hipotetinis serveris nepasiekiamas, programa gali būti užblokuota viename taške laukiant neribotam laikui, todėl į tokias aplinkybes teks reaguoti. Maksimalus laukimo laikas gali būti sukonfigūruotas visai programai, dažniausiai jis tokiu atveju bus „došnesnis“ arba kiekvienai operacijai galima užprogramuoti individualius laukimo laikus.

    Norėdami patikrinti, ar praėjo (bent) tam tikras laiko intervalas Sąskaitos paleidimo momento "laikas" paprastai atimamas iš esamo "laiko" ir patikrinama, ar skirtumas yra didesnis nei norima riba. Šis „laikas“ nebūtinai turi būti realus laikas, paprastai jis atitinka intervalą, kuris praėjo nuo MCU pradėti skaičiuoti laiką; Tai neturi įtakos programai, nes įdomu yra praėjęs laikas, o ne absoliutus laikas.

    Paprastai norint patikrinti, ar praėjo tam tikras intervalas, naudojama tokio tipo išraiška:

    Kintamas milisegundos_al_empezar yra vertė millis() tam tikras vykdymo momentas, nuo kurio nustatomas laikas, todėl nėra neįprasta, kad jo pavadinimas reiškia žodį „chronometras“. Kintamasis intervalo_de_tiempo yra didžiausias milisekundžių skaičius, dėl kurio ankstesnė išraiška yra teisinga, tai yra, jis reiškia skirtąjį laiką; Paprastai tai yra konstanta (arba makrokomanda) ir, kaip ir ankstesniu atveju, jos pavadinime dažnai pasirodo žodis „TIMEOUT“. Jei dirbate labai trumpais intervalais, galite naudoti micros() vietoj millis() (mikrosekundės, o ne milisekundės), nors ji yra daug rečiau paplitusi ir daug ne tokia tiksli.

    Ilgas sveikasis skaičius Arduino (unsigned long). lėkštėje Arduino Nepertraukiamai veikiant milisekundžių skaitiklis bus nustatytas iš naujo (grįš į nulį) maždaug kas 50 dienų. Atimant iš nepasirašytų duomenų tipų, atkuriama ta pati elgsena (skaitiklio apvertimas), todėl galima valdyti skirtąjį laiką neribotą laiką.

    Aukščiau pateiktas kodas rodo a labai paprastas laiko apribojimo įgyvendinimas įtraukiant eilutes, pažymėtas atsižvelgiant į pavyzdį, esantį prieš jį. Kadangi skirtasis laikas patikrinimas atliekamas apdorojus duomenis, gautus iš ESP8266 wifi modulis, operacija gali būti laikoma sėkminga, net jei priėmimas užtrunka ilgiau nei nustatytas laukimo laikas.

    Vykdykite sudėtingą operaciją, apibrėžtą keliomis AT komandomis

    Kad būtų pavyzdinė nuoroda į programos, kuri išnaudoja ESP8266 wifi modulis, tarkime, kad taip saugoti informaciją duomenų bazėje, pasiekiamoje per žiniatinklio paslaugą stebėti temperatūrą. Šis kodas nuskaito jutiklį, prijungtą prie analoginės įvesties kas tam tikrą laiko intervalą, apskaičiuoja vidutinę reikšmę ir po ilgesnio laiko siunčia ją į žiniatinklio serverį (stilius DI) per a peticija HTTP (PASKELBTI, GAUTI…).

    Šiame temperatūros įrašymo pavyzdyje žiniatinklio serveris pasiekiamas kas penkias minutes. Nors prieinamumas nėra itin didelis, tikimasi, kad pasiūlymas pasiteisins, tačiau jei reikėtų didesnio įrašymo dažnio, reikėtų panaudoti kitus išteklius, pvz. duomenų buferis laukia siuntimo, išsiųsti kelis, kai serveris gali dalyvauti, ir saugoti juos, kai jis nepasiekiamas. Jei duomenų registravimo dažnumas būtų dar didesnis, reikėtų pasiūlyti kitų tipų protokolus kaip alternatyvą HTTP ar net pakeisti TCP iki UDP kad būtų galima siųsti daugumą duomenų reikiamu greičiu net kai kurių praradimo kaina.

    Operacijos, sudarančios užduotį, kurią reikia atlikti norint siųsti temperatūrą, būtų šios:

    • Iš naujo nustatykite wifi modulį
    • Atsijungti nuo dabartinio prieigos taško (jei yra numatytasis ryšys)
    • Nustatykite nustatymus. Pavyzdžiui, daroma prielaida, kad turi būti sukonfigūruotas ryšio režimas (paprastas) ir vaidmuo „Wi-Fi“ ryšiuose (stotis).
    • Prisijunkite prie prieigos taško
    • Patikrinkite, ar ryšys yra teisingas (iš tikrųjų tai yra įėjimo taškas) Jei ryšio nėra, pradėkite procesą nuo pradžių
    • Prisijunkite prie serverio
    • Siųsti prašymą HTTP su saugotinais duomenimis

    Veiksmų tvarka nebūtinai turi būti tokia (nors operacija yra) ir kiekvienam žingsniui gali prireikti kelių ESP8266 AT komandosPavyzdžiui, aukščiau nurodytai konfigūracijai reikės dviejų: AT+CIPMUX=0 y AT+CWMODE=1.

    Duomenų struktūra, vaizduojanti ESP8266 operacijas

    Ankstesniuose pavyzdžiuose, nors ir labai paprastai, jau siūlomas bendras problemos sprendimas: naudoti duomenų struktūrą, kurioje saugomi galimi atsakymai ir veiksmai, kurių reikia imtis kiekvienu atveju; išsiųskite veiksmą, palaukite atsakymo ir tęskite pagal tai, ką reiškia atsakymas. Kadangi kiekvienai sudėtingai operacijai reikės kelių ESP8266 AT komandos, duomenų struktūra turi susieti operaciją su kitomis, vėlesnėmis ar ankstesnėmis, kurios turi būti atliekamos kiekvienu atveju, atsižvelgiant į ESP8266.

    Ankstesniuose pavyzdžiuose pranešimo buvo ieškoma atsakyme ESP8266 ir tai buvo interpretuojama kaip sėkmė arba klaida. Be viso gauto teksto priėmimo (ir analizės), Norint turėti bendrą minimumą, patartina atkreipti dėmesį ir į pranešimo užbaigimą arba, kitaip tariant, į prieinamumą ESP8266 wifi modulis gauti naujų užsakymų. Tokiu būdu pakeitimas į būseną, kurią galėtume vadinti, pavyzdžiui, „wifi pasiekiamas“, galėtų gauti prieigos taško pavadinimą ir gauti tekstą. ERROR arba tekstą OK reikštų, kad ESP8266 Jūs baigėte atsakymą ir dabar galite siųsti kitą AT komanda į ESP8266.

    Aukščiau pateiktame kode naudojamas vektorius (operacion) išsaugoti nuoseklių operacijų, sudarančių užbaigtą užduotį, tekstą. Naudojamas dvimatis masyvas (mensaje) su trimis analizuojamais atsakymais. Kaip paaiškinta aukščiau, reikia ieškoti pranešimų, kurie reiškia atsakymo pabaigą, be pranešimo, kuris reiškia teisingą ar neteisingą atsakymą. Ne visos operacijos turės tiek pat galimų atsakymų; Kai atsakymų yra mažiau, galima naudoti tuščią pranešimą, kurio analizėje sunaudojama kuo mažiau ciklų (netgi tai nėra pats optimaliausias būdas). Logiškai mąstant, minimalus ieškomų atsakymų skaičius (pavyzdyje trys) turės apimti visas veikimo galimybes, net jei jos nėra įmanomos.

    Kalbant apie galimus atsakymus, jau dabar matyti, kad šis pavyzdys nėra labai naudingas norint gauti savavališko formato duomenis iš ESP8266 wifi modulis, bet reikalas tas, kad naudojant su mikrovaldikliai tai nėra įprasta; Dažniausiai yra siunčiami jų prijungtų jutiklių surinkti duomenys ir (arba) gaunama informacija, ką daryti su jo valdomomis pavaromis. Labai vertinga informacija, kurią galima labai gerai nuspėti.

    Ankstesnėje duomenų struktūroje, kaip tai daroma norint išreikšti galimus analizuojamus atsakymus, dvimatė matrica taip pat naudojama norint nustatyti operaciją, kurią reikia atlikti kiekvienu atveju (siguiente_operacion). Tiksliau, pasirinkome atsakyti į trijų tipų pranešimus: ① savavališką tekstą (LITERAL), kad patikrintumėte, ar yra ryšys su „Wi-Fi“ prieigos tašku ir serveriu, ② tekstą, kad aptiktų proceso klaidas (FALLO) ir ③ tekstas, nurodantis, kad operacija buvo sėkmingai baigta (ACIERTO).

    Galiausiai yra dar du vektoriai, skirti nustatyti maksimalų laukimo laiką prieš pasiduodant (timeout) ir nurodykite (configuracion) jei operacija baigiama nelaukiant atsakymo (ESPERAR_RESPUESTA) ir pranešimai, nurodantys ryšio pabaigą. Šis paskutinis vektorius, iliustruojantis, kaip galima išsaugoti atmintį, veikia su konfigūracijos baito bitais, kad parodytų skirtingas būsenas.

    Pirmas ESP8266 AT komandos duomenų struktūros visada laukite atsakymo, kuris gali būti sėkmės arba klaidos pranešimas. Įvykus klaidai, modulis paleidžiamas iš naujo ir paleidžiamas iš naujo, o jei pranešimas rodo, kad operacija yra teisinga, pereinama prie kitos.

    Kai prisijungiate prie serverio, modelis pasikeičia. Tokiu atveju reikia ① išsiųsti perduodamo duomenų paketo ilgį ir ② sudaryti užklausą HTTP su fiksuotu tekstu ir verte (temperatūros), kuri siunčiama saugoti serveryje. Šių duomenų parengimas atliekamas kiekvienoje siuntoje ir juos reikia padalyti į dvi (pranešti ilgį) arba tris (atsiųsti užklausą HTTP) Remdamasi ESP8266 AT užsakymas. Tik paskutinė dalis, į kurią padalinta operacija, lauks atsakymo.

    Tokiu atveju jis veiks be problemų (gal perspėja, kad modulis užimtas), tačiau kai duomenų ilgis yra didesnis, teks dalyti duomenų blokus į mažesnes dalis ir netgi gali tekti palaukti, nes atliekama su temperatūros rodmenimis, kad modulis turėtų laiko siųsti duomenis jų neužpildydamas buferis.

    Kartu su kitomis makrokomandomis, kurios jau buvo paaiškintos anksčiau, aukščiau pateiktas pavyzdinis kodas parodo, kaip apibrėžiamos skirtingos būsenos, kuriomis nurodoma, ar laukti atsakymo ir, jei taikoma, koks pranešimas rodo, kad jis baigtas.

    Kadangi skirtinguose kodo taškuose bus siunčiama operacija (kai ateina laikas siųsti vidutinę temperatūrą, jei viršijamas operacijos laukimo laikas, kai sėkmingai baigta esama operacija...), bet kaip tai padaryti sukurtas visame pasaulyje, jis buvo apibrėžtas kaip makrokomandas ENVIAR_OPERACION kuri sugrupuoja siuntimo veiksmus.

    Toliau pateikiamas pagrindinės pavyzdžio programos kodas. Labiausiai išorinė užduotis yra ta, kuri yra atsakinga už temperatūros mėginių ėmimą, kad būtų galima apskaičiuoti vidurkį ir kas tam tikrą laikotarpį ji siunčiama į serverį naudojant ESP8266 wifi modulis. Išsiuntus kiekvieną operaciją, atsakymas analizuojamas, siekiant nustatyti, kuri yra kita, ar informacijos siuntimo užduotis buvo atlikta.

    Logiška, kad ankstesniame kode gali būti atlikti keli optimizavimo veiksmai, tačiau tai yra pavyzdys, kaip suprasti, kaip ESP8266 Apskritai verta sutelkti dėmesį tik į kai kuriuos aspektus, iš kurių pirmasis yra duomenų struktūra. Atrodo, kad tai logiška naudoti programavimo kalbos duomenų struktūrą (struct) atstovauti tvarkomai informacijai: ESP8266 AT komandos ir analizuojamus pranešimus.

    Naudokite struktūrą (struct) saugoti duomenis vietoj pavyzdinių masyvų (pagrįstų jais) yra nereikšminga ir, nors tai gali lemti elegantiškesnį kodą, tai nereiškia, kad rezultatas pagerės. Tikra alternatyva, kurią suteikia naudojimas struct yra įgyvendinti, kaip paaiškinta toliau, kintamo ilgio struktūrose, kuriose yra „vidinių“ duomenų kuriuos jie nurodo. Tokiu būdu, pavyzdžiui, operacijai nebūtina turėti fiksuoto skaičiaus atsakymų, kuriuos reikia analizuoti.

    Šis metodas rodo, kad tai yra geriausias būdas įgyvendinti sprendimą, tačiau trūkumas yra tas, kad jis būtų būtinas naudoti dinaminį atminties paskirstymą, rizikinga praktika dirbant su a mikrovaldiklis todėl reikia atidžiai įvertinti, kiek atminties bus naudojama vykdymo metu, nes kompiliatorius vargu ar sugebės mus apie tai įspėti ir yra tam tikra galimybė išeikvoti atmintį (ar steką) su lemtingomis pasekmėmis programos vykdymui.

    Kodo optimizavimo eilutėje įdomu prisiminti, kad tokio tipo programoje, kuri naudoja daug teksto, gali sutaupyti vietos atmintyje SRAM teksto eilučių saugojimas programos atmintyje (blykstė) su makrokomandu F(). Toliau pateiktose ekrano kopijose galite pamatyti skirtingą programą ir dinaminės atminties paskirstymą, kai įprastai naudojamas tekstas ir naudojant makrokomandą F().

    Arduino kodo pavyzdys naudojant programos atmintyje saugomą tekstą (flash)
    Arduino kodo pavyzdys naudojant tekstą SRAM

    Kalbant apie veiksmus, kurie atliekami pagal informaciją, gaunamą iš ESP8266 wifi modulis, kaip alternatyva žinutės tikrinimui iš kodo ir vieno ar kito atlikimui pagal tai, kas gauta, gali būti saugomi šioje duomenų struktūroje nuorodas į funkcijas, kurios atlieka kiekvieną užduotį, o ne būsenos indikatorius (vėliavos), kurios įspėja apie tam tikrą būseną, kad programa yra atsakinga už valdymą, pavyzdžiui, pagrindinėje kilpoje.

    Toliau pateikiamas struktūrų pavyzdys, skirtas saugoti užklausų duomenis ESP8266 (duomenų tipas operacion_esp8266) ir jų atsakymai (duomenų tipas respuesta_esp8266).

    Kaip struktūrą, vaizduojančią operaciją (duomenis, kurie siunčiami į ESP8266 wifi modulis) nurodo struktūrą, kuria apibrėžiami atsakymai, ir atsakymų į operacijų struktūrą struktūrą, pirmiausia reikia deklaruoti abu, apibrėždami naują duomenų tipą ir tada apibrėždami jo turinį.

    Ankstesniame pavyzdyje manoma, kad programa, kurioje ji yra, pasirinko naudoti a būsenos indikatorius, kuris turi atitikti kintamąjį, pasiekiamą iš kodo, kuris yra atsakingas už vienos ar kitos operacijos atlikimą, kaip nurodo minėta reikšmė. Jei atsakyme į ESP8266 Kai analizuojamas tam tikras tekstas, būsena įgauna reikšmę, kuri nurodo atitinkamo atsakymo struktūrą.

    Kaip minėta anksčiau, būtų kita alternatyva pakeisti arba papildyti būsenos indikatorių išsaugoti funkciją atskaitos struktūroje (rodyklė), kuris būtų iškviestas atsakyme iš tam tikro teksto ESP8266 wifi modulis.

    Ankstesniame pavyzdyje jis buvo įtrauktas į duomenų struktūrą, kuri naudojama apdoroti atsakymą iš ESP8266 wifi modulis žymeklis į (tariamą) funkciją, kuri grąžina tipo duomenis float (gali būti svertinė analoginio skaitymo reikšmė) ir kuriai kaip argumentai pateikiami du baitai (du unsigned char kuris gali būti kaištis, iš kurio skaitoma analoginė įvestis, ir tas, kuris aktyvuoja hipotetinio integruoto ĮJUNGTI).

    Kuriamas skirtas MCU, priešingai nei vyksta didesnių sistemų kūrimo stiliuje, nėra taip neįprasta naudoti visuotinius kintamuosius, kai apibrėžiamos (visuotinės) programos, valdančios agregatą, elgseną, todėl tokio tipo apibrėžimų nebus ypač retai. kaip funkcijos be parametrų ir kurios negrąžina reikšmių, panašiai void (*accion)();

    Jei dirbate šiuo duomenų vaizdavimo būdu, naudokite struct kintamo ilgio duomenų, reikės dinamiškai paskirstyti atmintį malloc() (o new(), jei naudojami objektai), kuris kaip parametrą naudos skirtą atminties kiekį ir grąžins žymeklį į rezervuotos atminties srities pradžią. Su sizeof() Išsaugomo tipo, padauginus iš naudojamų elementų skaičiaus, galite gauti reikiamą atminties kiekį. Pavyzdys su jo naudojimu ir be jo galima pamatyti toliau pateiktose ekrano kopijose. malloc(); Pirmuoju atveju būkite atsargūs su programos naudojama atmintimi, turite įkelti biblioteką, kurioje yra ši funkcija.

    Atminties paskirstymo su malloc „Arduino“ pavyzdys

    Teksto priskyrimo pavyzdys be malloc „Arduino“.

    Jei operacijos su ESP8266 wifi modulis programos vykdymo metu skirsis, reikės atlaisvinti nenaudojamą atmintį free() (o delete(), jei jie yra objektai). Nors pagrįstai galima tikėtis, kad kompiliatorius (GCC) optimizuos programą, kad būtų išvengta atminties skaidymo, našumas tikrai nebus toks optimalus, kaip dirbant su statiškai paskirstyta atmintimi.

    Nors šiame pavyzdyje (abiejuose įgyvendinimuose) tai nėra labai prasminga, tačiau norint apibendrinti operaciją, kad būtų galima ją pritaikyti kitiems atvejams, reikia pažymėti, kad Duomenų siuntimas visada kartoja tą patį protokolą: praneškite baitų skaičių, kuris bus išsiųstas, palaukite indikatoriaus (>) ir išsiųskite duomenis.

    Kadangi šiame pavyzdyje jis naudojamas tik vieną kartą (visa užklausa pateikiama viename pakete), tai neatrodo labai naudinga, tačiau apskritai gali prireikti atlikti kelis siuntimus per tą pačią operaciją, įskaitant atvejus, kai jie turi būti turi būti perduodami dideli duomenų kiekiai, kurie turi būti suskaidyti, kad būtų išvengta atminties perpildymo ESP8266.

    Norint įgyvendinti šį elgesį, galima naudoti du paskutinius ryšio elementus, kad kiekvieną kartą siunčiant duomenis, duomenys būtų užpildyti atitinkamomis reikšmėmis: pirmuoju atveju – išsiųstų baitų skaičius, o antruoju – ( prašymo dalis. būti perduota.

    Norėdami pakartoti priskyrimą ir siuntimą, skirtingi elementai, kuriuos reikia perduoti, gali būti saugomi vektoriuje. Šis naujas vektorius bus tas, kuris nulems sudėtingos operacijos pabaigą, o ne paskutinę operaciją, kaip iki šiol.

    1 komentaras

    komentarų vartotojas
    ดูบอลสด

    Neabejotinai yra daug ką sužinoti šia tema. Man patinka visi tavo išsakyti taškai

    Rašyti komentarą

    Galbūt praleidote