Põhitoimingud Arduino ESP8266 wifi-mooduliga

Põhitoimingud Arduino ESP8266 wifi-mooduliga

Põhitoimingud Arduino ESP8266 wifi-mooduliga

Millal Espressif tõi turule esimesed moodulid wifi integreeritud ESP8266 ja püsivara millega seda AT-käskude abil käsitleda, huvitasime meid, kasutajaid, selle integreerimist kooslustesse mikrokontrollerid ja probleemid taandusid (endise) pimeduse tundmisele ESP8266 AT käsutabel, toitumisvajadused või ESP8266 püsivara värskendus.

Sisukord

    Seejärel saabusid programmeerimiseks kiiresti alternatiivid ESP8266 ja moodulite teostused wifi väga erinevatest vormingutest, mis tekitasid muid probleeme: millist ESP8266 wifi-moodulit valida olenevalt erinevate antennide (ka väliste) levialast või nende uute moodulite füüsilisest integreerimisest meie sõlmedesse.

    Kindlasti ei pruugi kõigi nende muudatuste tõttu rõhku pandud kõige elementaarsematele aspektidele, kõige elementaarsemale juhtimisele. ESP8266 wifi moodul. Kuigi polaarsus.es Teavet selle kasutamise kohta leiate ESP8266 ja on mõned rakendused, mille eesmärk on üldisel viisil selgitada rakenduse toimimist ESP8266 wifi moodul kasutades AT-käske, eriti artiklis teek, et teha Arduinost HTTP-päringuid ESP8266 wifi-mooduliga, näitavad lugejate muljed, et kasulik oleks lisada põhiteavet, et aidata kasutajaid ESP8266 oma teostusi ellu viima.

    Arutage põhitoiminguid seadmega töötamiseks ESP8266 ja üldiste lahenduste väljapakkumine on mitme väga erineva osa eesmärk; Artikli sisu jälgimiseks võib abiks olla järgmine register:

    Juhtige ESP8266 wifi moodulit arvutist läbi jadapordi

    Taldrikult Arduino ja kasutades oma IDE on võimalik jälgida a tööd ESP8266 wifi moodul, saatke ESP8266 AT käsud ja vaata vastust aga palju mugavam on seda teha terminali tüüpi rakendusega arvutist.

    CuteComi kasutamine ESP8266 wifi-mooduli testimiseks jadapordi kaudu

    Olenevalt millisest plaadist Arduino kasutatud, võib saadaval olla ainult üks riistvaraline jadaport, mis lisab saatmisele ja vastuvõtmisele veidi ebamugavusi. Sidekiiruse muutmine on arvuti ja mõne emaplaadi jadasiderakenduses palju mugavam. Arduino (ja mõnel juhul) ei toeta hästi jadaside suuremat kiirust, eriti 115200 XNUMX boodi, mis on seadme uusimate versioonide vaikekiirus. püsivara.

    Umbes Millist programmi kasutada jälgimiseks ESP8266 kasutades jadaporti, on palju valida vastavalt vajadustele ja eelistustele; viimasel ajal kasutan rohkem klassikat CuteCom (see, mis on ülaloleval ekraanipildil), sest mul on väga mugav teatud asju korrata ESP8266 wifi moodul AT tellimused projekti testimisel.

    Mõned soovitused on siin juba antud programmide kohta, mis toimivad jadakonsoolina; Näiteks kui rääkida PuTTY UART-jadaseadmete juhtimiseks arvutist. PuTTYLisaks suurepärasele rakendusele on see saadaval enamiku töölaua operatsioonisüsteemide jaoks. Lisaks nagu PuTTY saab kasutada konsoolina nii jadapordi kui ka Interneti-protokolli perekond (TCP/IP), sealhulgas need, mis töötavad TLS, muutub tavaliseks tööriistaks, mis maksab enam kui tagasi selle seadistamisele ja kasutamisega harjumisele kulunud (väikese) aja.

    PuTTY kasutamine ESP8266 wifi-mooduli testimiseks jadapordi kaudu

    Lisaks jadakommunikatsiooni tarkvarale ühendada ESP8266 wifi moodul sadamasse USB Arvuti vajab ka konverterit USB seeriasse TTL. Nagu tarkvara puhul, on ka mitmeid versioone, millest neid kasutatakse ainult pordi teisendamiseks USB jadapordis TTL (mida saab ühest eurost) nendeni, mis suudavad emuleerida erinevaid protokolle (nt SPI o I2C).

    Just nagu programm, mis toimib jadakonsoolina, riistvara arvutiga suhtlemiseks USB loogikaahelaga (mitte ainult ESP8266) saab olema tavaline tööriist mikrokontrollitud rakenduste arendaja töös, see tasub esimesel võimalusel tööriistakastis olla ja sellega tööd teha ESP8266 wifi moodul See on suurepärane võimalus seda hankida.

    Riistvara USB UART jadaside jaoks ESP8266 wifi-mooduli jälgimiseks

    Muundur USB a UART TTL Seda saab kasutada ka vooluahela käitumise jälgimiseks, mis kasutab ESP8266, selleks ühendatakse jälgitavad väljundid jadamisi muunduri andmesisendiga (RX) kiirdioodiga ( 1N4148nt) ja takisti (näiteks 2K2) paralleelselt. Selline seadistus töötab nagu riistvaraline jadanuusutaja.

    Nuusutamisnäide ESP8266 jaoks, mis on ühendatud Arduinoga USB UART TTL-muunduri abil

    Kuigi ülaloleval pildil olev nuusutaja on kindlasti algeline (muuhulgas pole tal puhver) on piisav, et jälgida koostu tööd Arduino ja ESP8266.

    Nuusutaja eemaldamine eelmisest skeemist, skeem, mis näitab, kuidas ühendada a ESP8266 wifi moodul taldrikule Arduino. Lisaks 3V3 toitmisele peavad integreeritud lähtestamise tihvt ja aktiveerimisviik olema ühendatud kõrge tasemega (lubatud). Loomulikult peab ühe RX-i viik ühenduma teise TX-ga.

    Eelmise diagrammi lihtsustamiseks on kujutatud plaat Arduino toiteallikaks on 3V3 ja mille puhul eeldatakse, et jadapordi pinge on samuti 3V3. Kui kasutate a mikrokontroller jadapordi signaalitase (tavaliselt 5 V) on vajalik, et mitte kahjustada ESP8266, kasuta taseme muundur nagu allolevatel diagrammidel. Seda vooluringi leidub sageli paljudes kaubanduslikes valmismoodulite rakendustes.

    5V kuni 3V3 signaalitaseme muundur ESP8266 WiFi mooduli ja Arduino jaoks

    Värskendage ESP8266 püsivara

    The ESP8266 AT käsud, selle lõpetamine, mooduli vaikekiirus... sõltuvad versioonist ESP8266 püsivara. Parim on veenduda, et teil on kõigis moodulites sama versioon ja võimaluse korral uusim versioon.

    Kahjuks enamik ESP8266 wifi mooduli mudelid Neil on ainult 4 Mbit, nii et uusimat versiooni ei saa neile installida. Püsivara uusim (ametlik) versioon, millele saab installida ESP8266 wifi moodulid 4 Mbit (enamik) on 0.9.4, mis sisaldab versiooni 0.2 ESP8266 AT käsud.

    Kokkuvõttes vajate püsivara värskendamiseks järgmist.

    1. Laadige alla vastav püsivara versioon. uusim (ametlik) versioon 4 Mbit mäluga moodulile, mis on leitud githubi kaustast Espressif. Aastal Espressifi veebisait Saate alla laadida püsivara uusima versiooni, kuid on väga oluline kontrollida, kas moodulil, millele see on installitud, on piisavalt mälu.

    2. Laadige alla püsivara installitööriista uusim versioon. Minu lemmik on esptool mis on sisse kirjutatud Python, nii et see töötab igal platvormil. Lisaks allalaadimisele saab seda ka installida pip install esptool (o pip2 o python -m pip…). Muidugi, Espressif See pakub ka oma tööriista, kuid on praegu saadaval ainult Windowsi jaoks.

    3. Valmistage ette allalaaditud failid; pakkige need lahti juurdepääsetavasse kausta ja vajadusel muutke tööriist käivitatavaks esptool, minu puhul alates GNU / Linux, Mis chmod +x esptool

    4. Ühendage moodul konverteri abil arvutiga USB UART TTL mis töötab 3V3 juures või kasutage nivoomuundurit, kui see töötab 5 V juures. Lisaks võimsusele peate ühendama muunduri TX ja RX USB UART TTL, RX kuni TX, GPIO0 madalal tasemel (GND) ja võib-olla GPIO2 kõrgel tasemel (minu testides on see töötanud nii madalal tasemel ühendamisel kui ka lahtiühendamisel). Kui moodulil on GPIO15 ühendus vaba (nagu ESP-12 puhul), tuleb see ühendada madala tasemega. RESET-i, mis on töö ajal tavaliselt kõrgel tasemel, võib jätta ühendamata või ühendada kõrgele tasemele takisti abil (näiteks 10K), kuna enne salvestamise alustamist võib olla vajalik seade selle ühendamise teel lähtestada. madalale tasemele.
      Mooduli sisselülitamisel on see värskendamiseks saadaval, kuid Kui kuvatakse ühenduse tõrge, tuleb see lähtestada ühendades RESET-i hetkeks madalal tasemel ja seejärel jättes selle värskendusprotsessi jaoks eetrisse (ilma ühendamata).
      Moodulil on poole amprise tarbimise tipud (mõne kasutaja arvates kuni 600 mA), seega on oluline kasutada seda tarbimist toetavat toiteallikat, eriti püsivara värskendamiseks.

      Ühendus wifi moodul ESP8266 ESP-01 USB UART TTL muunduriga värskenduse püsivara

    5. Käivitage tööriist püsivara värskendamiseks. Minu puhul olen salvestanud tööriista ja püsivara dokumendid sammus 3 samasse kausta, nii et käivitan konsoolist:
      cd ~/Datos/firmwareESP8266 (muutke tööriista ja püsivara sisaldavasse kausta)
      ./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 määrab kiiruse ESP8266 (minu puhul 115200 baudi) ja --port jadaport, millega see ühendub (minu puhul emuleeritud esimene USB). Püsivara moodustavad erinevad dokumendid jäävad maha write_flash millele eelneb aadress koos värskenduse kasulikku koormust sisaldava dokumendiga user1.bin.

      wifi ESP8266 püsivara värskenduse esptool konsooli jäädvustamine

    Saada käsklused ESP8266 wifi-moodulile

    Et kontrollida ESP8266 arvutist, millest peame alustama konfigureerige rakendus mille jaoks piisab, kui ① valida port, millega muundur on ühendatud USB UART TTL, Midagi sellist /dev/USB0 GNU/Linuxis jms või midagi sarnast COM6 Windowsis ② valige kiirus, millega ESP8266, tõenäoliselt 115200 8 boodi, ③ määrake XNUMX andmebitti pluss üks stoppbitt ilma paarsuse või käepigistuseta ja ④ määrake rea lõpp, olenevalt püsivara, peaaegu alati CR+LF.

    Seadistage CuteCom jälgima ESP8266 wifi-moodulit, kasutades USB UART TTL-muundurit

    Konfigureerige PuTTY, et jälgida ESP8266 wifi-moodulit USB UART TTL-muunduriga

    Kui rakendus on konfigureeritud (või, kui see on asjakohane, salvestatud ja valitud), siis see on avage ühendus (ülaltoodud näidete ekraanipiltidel vastavalt "ava seade" ja "avatud" koos CuteCom y PuTTY) ja võite hakata tellimusi saatma aadressile ESP8266.

    Nagu võib näha ESP8266 AT käsutabel, on aktiveerimise, deaktiveerimise, väärtuse määramise ja sellele viitamise vorming üsna etteaimatav, kuid üldiselt ei ole neid kõiki lihtne meeles pidada ja tõenäoliselt peab see viitamiseks käepärast olema.

    Viis enviar AT käsud al ESP8266 wifi moodul pärit Arduino on väga lihtne: ① konfigureerige suhtlust Serial.begin(115200); (või Serial1, Serial2… mitme riistvaralise jadapordiga plaatidel) ja ② saadavad käsud vormingus Serial.print(orden+"\r\n");

    Ülaltoodud näide näitab, kuidas saata ESP8266 wifi moodul AT tellimused pärit Arduino. Sel juhul on see illustreeritud AT+CWJAP, mida kasutatakse pääsupunktiga ühenduse loomiseks. See käsk kasutab argumentidena pääsupunkti identifikaatorit (SSID) ja võti, mõlemad jutumärkides, nii et neist saab objekt Srtring ja lisage need jutumärkidesse, kasutades paokoodi (\"). Tellimuse täitmiseks kasutage \r\n mis vastab CR y LF.

    Pidage meeles, et jadaporti ei tuvastata alati Serial (teatud plaatidel võib see olla Serial1, Serial2…) kasutatav pordiobjekt on määratletud, määrates selle makrole PUERTO_SERIE. Kasutatava plaadi tüübi tuvastamine võib anda jadapordi valikule pisut intelligentsust; Hiljem räägime sellest, kuidas saate selle tüübi teada saada Arduino. Ülejäänud definitsioonid on tavalised, mis võimaldavad teil konstantseid väärtusi "nimetada", et vältida nende kordamist (ja vigade tegemist) ja hõlbustada nende muutmist.

    Ülaltoodud näide peaks ühendama ESP8266 wifi moodul märgitud pääsupunktiga, kuid kas see oli juba varem ühendatud? Kas ühendus on toiminud? Selle teadmiseks peame "kuulama", mida ESP8266

    Saate andmeid ESP8266 wifi-moodulist

    Ühendades ülaltoodud andmete nuusutaja arvutiga, näete, mida Arduino on saatnud aadressile ESP8266 ja tema vastus. Et lugeda Arduino ja töödelda selles sisalduvat teavet, mida on vaja tuvastada Serial.available() kui andmeid on saabunud ja kui jah, laadige need sisse Serial.read(). Järgmine näide näitab, kuidas vastust lugeda AT+CWJAP?, mis annab teada, kas pääsupunktiga on ühendus olemas.

    Nagu taldrikul Arduino uno (ja teistes) jadamonitori avamine lähtestab programmi, seda saab kasutada jadakonsoolis Arduino teave, millele saadate ESP8266 nagu alloleva pildi ekraanipilt näitab.

    Saate andmeid ESP8266 wifi-moodulist Arduinost. Põhiline näide

    Analüüsige ESP8266 wifi-mooduli saadetud vastust

    Oleme juba näinud, kuidas lugeda infot, mis jõuab Arduino alates ESP8266. Probleem, millega peate tegelema, on see, et te ei tea, millal see saabuma hakkab, kui kaua jõuab, kui kaua see on ... ja pole eriti tõhus oodata vastust ESP8266 võetakse vastu ilma laskmata mikrokontroller täitke vahepeal muid ülesandeid.

    Lihtne viis selle olukorra lahendamiseks on kordama saadud andmeid, otsides konkreetseid vastuseid mille abil aktiveeritakse näiteks indikaatorid (lipud või Boole'i ​​muutujad), mis määravad, kas vastuvõetud tekstis otsingut jätkata ja milliseid toiminguid tuleks teha, lähtudes sellest saabunud teabest. ESP8266. Kuigi vastus saabub mikrokontroller saab pühenduda muudele ülesannetele, näiteks anduritelt andmete vastuvõtmine ja nende töötlemine.

    Otsige ESP8266-lt saadud teabest teksti

    Teksti otsimiseks, mis pärineb ESP8266 saate võrrelge iga saadud kirja kirjaga, mis vastab otsitavale sõnumile. Tuleb kasutada loendurit (või osutit), mis osutab võrreldavale tähele; Kui tegelane, mis saabub ESP8266 on sama mis sõnumis uuritav, liigub loendur edasi, kui see erineb, siis lähtestatakse.

    Et teada saada, et lõpp on käes, uuritakse otsitava kirja järgmist tähemärki, mis on null (\0) või salvestatakse sõnumi pikkus, et loenduriga võrdlemisel saaks teada, kas võrdlus on lõppenud ja seega ESP8266 wifi moodul saatis soovitud sõnumi.

    Järgmine näide kasutab käsku AT+CWLAP mis tagastab pääsupunktide loendi ja nende seest otsitakse ühte nimega "wifi polaridad.es". Kuigi oleme otsustanud kontrollida, et viimane märk on null, nagu puhver See salvestab ainult otsitud teksti ja selle pikkus on teada, saaks ka kontrollida, kas nii palju õigeid tähti on laekunud. Koos LED ühendatud viiguga 2 teatatakse, et oodatud tekst on leitud.

    Eelmise näite koodis näete ka võimalust vali jadaport sõltuvalt plaadi tüübist Arduino kasutatud. See näide eeldab, et teil on projekti jaoks kolme tüüpi tahvleid: üks Arduino uno, Üks Arduino Mega 2560 ja arduino leonardo. Kui töötate koos a Arduino uno seda kasutatakse Serial ja muidu Serial1.

    Kui töötate taldrikuga arduino leonardo Saate kasutada sama meetodit programmi peatamiseks ja konsooli ootamiseks (jadaport, mis on seotud Serial) on olemas.

    Otsige ESP8266 vastusest erinevaid tekste

    Eelmise näite koodi kasutatakse teksti otsimiseks saadetud teabest ESP8266 kuid vastus võib sõltuvalt toimingust sisaldada erinevat teavet. Oletame, et järgmises näites alustades lihtsa juhtumiga, et tekst, mille saatis MCU ESP8266 es OK kui operatsioon on õigesti tehtud ja ERROR Muidu nagu tellimusega AT+CWJAP?, mille eesmärk on kontrollida, kas ESP8266 wifi moodul olete juba pääsupunktiga ühendatud.

    See sama meetodi uus rakendus, mis otsib vastet mitme võimaliku sõnumiga, võimaldab teil valida erinevate toimingute vahel olenevalt ESP8266, lihtsalt lülitage sisse LED vastav.

    Piirake vastuse saamiseks kuluvat aega

    Siiani ei ole viidatud asjakohasele probleemile: maksimaalne ooteaeg (ajalõpp), enne kui loetakse toimingu ebaõnnestunuks. Kui mingil põhjusel seostub ESP8266 wifi moodul, pääsupunktiga moodul, Internetiga pöörduspunkt või näiteks hüpoteetiline server pole saadaval, programm võib olla blokeeritud ühes punktis, mis ootab määramata ajaks, mistõttu tuleb sellistele asjaoludele reageerida. Maksimaalset ooteaega saab seadistada kogu rakenduse jaoks, tavaliselt on see sel juhul "helde" või saab iga toimingu jaoks programmeerida individuaalsed ooteajad.

    Kontrollimaks, et (vähemalt) teatud ajavahemik on möödas Tavaliselt lahutatakse praegusest "ajast" konto käivitamise hetke "aeg" ja kontrollitakse, et vahe on suurem kui soovitud piir. See "aeg" ei pea olema reaalajas, tavaliselt vastab see intervallile, mis on möödunud ajast MCU hakata aega lugema; See ei mõjuta programmi, sest huvitav on kulunud aeg, mitte absoluutne aeg.

    Tavaliselt kasutatakse selleks, et kontrollida, kas teatud intervall on möödas, järgmist tüüpi avaldist:

    Muutuv milisegundos_al_empezar sisaldab väärtust millis() teatud täitmise hetk, millest alates see ajastatud, seega pole ebatavaline, et selle nimi viitab sõnale "kronomeeter". Muutuja intervalo_de_tiempo sisaldab maksimaalset millisekundite arvu, mis muudab eelmise avaldise tõeseks, see tähendab, et see tähistab ajalõpu; Tavaliselt on tegemist konstandiga (või makroga) ja nagu ka eelmisel juhul, esineb selle nimes sageli sõna "TIMEOUT". Kui töötate väga lühikeste intervallidega, võite kasutada micros() asemel millis() (millisekundite asemel mikrosekundid), kuigi see on palju vähem levinud ja palju vähem täpne.

    Pikk täisarv sisse Arduino (unsigned long) võtab enda alla 4 baiti (32 bitti), seega on suurim väärtus, mida see esindada saab, 4294967295 (2 astmeni 32 miinus üks, sest see algab nullist). taldrikul Arduino Pidevalt töötades lähtestub millisekundite loendur (naaseb nulli) ligikaudu iga 50 päeva järel. Märgistamata andmetüüpidega lahutamisel reprodutseeritakse sama käitumine (loenduri pööramine), nii et ajalõpu on võimalik piiramatult juhtida.

    Ülaltoodud kood näitab a ajalõpu piirangu väga elementaarne rakendamine sisaldab sellele eelnevale näitele vastavaid jooni. Kuna ajalõpu kontrollimine toimub pärast kohast saabunud andmete töötlemist ESP8266 wifi moodul, võib operatsiooni lugeda õnnestunuks ka siis, kui vastuvõtt võtab kauem aega kui kehtestatud ooteaeg.

    Käivitage mitme AT-käsuga määratletud keerukas toiming

    Et saada näidet kasutava rakenduse eesmärgi kohta ESP8266 wifi moodul, oletame, et on salvestada teavet veebiteenuse kaudu juurdepääsetavasse andmebaasi temperatuuri jälgimiseks. Järgnev kood loeb iga teatud ajaintervalli tagant analoogsisendiga ühendatud anduri, arvutab keskmise väärtuse ja saadab pikema aja möödudes selle veebiserverisse (stiil IoT) läbi a petitsiooni HTTP (POSTITA, HANGI…).

    Selles temperatuurisalvestuse näites pöördutakse veebiserveri poole iga viie minuti järel. Kuigi kättesaadavus ei ole eriti kõrge, on ootuspärane, et ettepanek toimiks, kuid suurema salvestussageduse vajaduse korral tuleks rakendada muid ressursse, näiteks andmepuhver ootab saatmist, et saata mitu, kui server saab osaleda, ja salvestada need selleks ajaks, kui see pole saadaval. Kui andmete salvestamise sagedus oleks veelgi suurem, tuleks alternatiivina pakkuda muud tüüpi protokolle. HTTP või isegi asendada TCP poolt UDP et oleks võimalik saata enamik andmeid vajaliku kiirusega isegi osade kaotamise hinnaga.

    Toimingud, mis moodustavad temperatuuri saatmise ülesande, oleksid järgmised:

    • Lähtestage wifi-moodul
    • Katkesta ühendus praeguse pääsupunktiga (juhul, kui vaikeühendus on olemas)
    • Määra seaded. Näite puhul eeldatakse, et ühendusrežiim (lihtne) ja roll Wi-Fi sides (jaam) peavad olema konfigureeritud.
    • Ühendage pääsupunktiga
    • Veenduge, et ühendus on õige (tegelikult on see sisenemispunkt) Kui ühendust pole, alustage protsessi algusest
    • Ühendage serveriga
    • Saada taotlus HTTP koos salvestatavate andmetega

    Toimingute järjekord ei pea olema täpselt selline (kuigi toiming on) ja iga samm võib nõuda mitut ESP8266 AT käsudNäiteks ülaltoodud konfiguratsiooni jaoks on vaja kahte: AT+CIPMUX=0 y AT+CWMODE=1.

    Andmestruktuur ESP8266 toimingute esitamiseks

    Eelmistes näidetes, kuigi väga lihtsal viisil, on probleemile juba pakutud üldine lahendus: kasutada andmestruktuuri, mis salvestab võimalikud vastused ja toimingud, mida igal konkreetsel juhul teha tuleb; saatke toiming, oodake vastust ja jätkake vastavalt sellele, mida vastus tähendab. Kuna iga keeruline toiming nõuab mitut ESP8266 AT käsud, peab andmestruktuur siduma toimingu teiste, järgnevate või eelmiste toimingutega, mis tuleb igal juhul läbi viia sõltuvalt ESP8266.

    Eelmistes näidetes otsiti sõnumit vastusest ESP8266 ja seda tõlgendati edu või veana. Lisaks kogu saadud teksti vastuvõtmisele (ja analüüsile) Üldise miinimumi saavutamiseks on soovitatav jälgida ka sõnumi valmimist või, teisisõnu, kättesaadavus ESP8266 wifi moodul uute tellimuste saamiseks. Sel viisil võib muutumine olekusse, mida võiksime nimetada näiteks "wifi saadaval", olla pöörduspunkti nime vastuvõtmine ja teksti vastuvõtmine ERROR või teksti OK tähendaks, et ESP8266 olete vastuse lõpetanud ja saate nüüd saata järgmise AT käsk ESP8266-le.

    Ülaltoodud kood kasutab vektorit (operacion), et salvestada kogu ülesande moodustavate järjestikuste toimingute tekst. Kasutatakse kahemõõtmelist massiivi (mensaje) koos kolme analüüsitava vastusega. Nagu eespool selgitatud, tuleb lisaks õiget või valet vastust tähistavale sõnumile otsida ka vastuse lõppu tähistavad teated. Kõik toimingud ei sisalda sama arvu võimalikke vastuseid; Kui vastuseid on vähem, saab kasutada tühja sõnumit, mis kulutab analüüsimisel võimalikult väikese arvu tsükleid (isegi pole see kõige optimaalsem viis). Loogiliselt on vajalik, et minimaalne otsitavate vastuste arv (näites kolm) hõlmaks kõiki toimimisvõimalusi, isegi kui need pole kõik võimalikud.

    Võimalikest vastustest rääkides on juba praegu näha, et suvalise vorminguga andmete vastuvõtmisel ei ole sellest näitest kuigi palju kasu. ESP8266 wifi moodul, kuid asi on selles, et koos kasutamise kontekstis mikrokontrollerid see pole tavaline; Kõige tavalisem on saata nende ühendatud andurite kogutud andmeid ja/või saada teavet selle kohta, mida selle juhitavate täiturmehhanismidega teha. Väga väärtuslik teave, mida saab väga hästi ennustada.

    Eelmises andmestruktuuris, nii nagu seda tehakse võimalike analüüsitavate vastuste väljendamiseks, kasutatakse ka kahemõõtmelist maatriksit, et määrata igal juhul sooritatav toiming (siguiente_operacion). Täpsemalt oleme otsustanud vastata kolme tüüpi sõnumitele: ① suvaline tekst (LITERAL) kontrollimaks, kas Wi-Fi pääsupunkti ja serveriga on ühendus olemas, ② tekst protsessi vigade tuvastamiseks (FALLO) ja ③ tekst, mis näitab, et toiming on edukalt lõpule viidud (ACIERTO).

    Lõpuks on veel kaks vektorit, et määrata maksimaalne ooteaeg enne loobumist (timeout) ja täpsustage (configuracion) kui toiming lõpeb vastust ootamata (ESPERAR_RESPUESTA) ja sõnumid, mis näitavad suhtluse lõppu. See viimane vektor, illustreerimaks näidet, kuidas mälu saab salvestada, töötab konfiguratsioonibaidi bittidega, et näidata erinevaid olekuid.

    Esimene ESP8266 AT käsud andmestruktuurist ootavad alati vastust, milleks võib olla edu- või veateade. Vea ilmnemisel moodul taaskäivitatakse ja see käivitub uuesti ning kui teade näitab, et toiming on õige, liigub see järgmise juurde.

    Kui olete serveriga ühenduse loonud, muutub muster. Sel juhul on vaja ① saata edastatava andmepaketi pikkus ja ② koostada päring HTTP fikseeritud tekstiga pluss (temperatuuri) väärtus, mis saadetakse serverisse salvestamiseks. Nende andmete ettevalmistamine toimub iga saadetise puhul ja see tuleb jagada kaheks (teatada pikkus) või kolmeks (saada päring HTTPJärgi) ESP8266 AT tellimus. Ainult viimane osadest, milleks operatsioon on jagatud, ootab vastust.

    Sel juhul töötab see probleemideta (võib-olla hoiatab, et moodul on hõivatud), kuid kui andmete pikkus on suurem, tuleb andmeplokid jagada väiksemateks tükkideks ja võib tekkida vajadus isegi oodata, kuna tehakse temperatuuri näiduga, et anda moodulile aega andmete saatmiseks ilma neid täitmata puhver.

    Koos teiste juba varem selgitatud makrodega näitab ülaltoodud näitekood, kuidas on määratletud erinevad olekud, mille abil saab määrata, kas vastust oodata, ja kui võimalik, milline teade näitab, et see on lõppenud.

    Kuna koodi erinevates punktides saadetakse toiming (kui on aeg saata keskmine temperatuur, kui toimingu ooteaeg on ületatud, kui praegune toiming on edukalt lõpetatud...), aga kuidas seda teha globaalselt loodud, on see määratletud makrona ENVIAR_OPERACION mis rühmitab saatmisega seotud etapid.

    Järgnevalt on toodud näite põhiprogrammi kood. Kõige välisem ülesanne on see, kes vastutab temperatuuri proovide võtmise eest, et arvutada keskmine ja iga teatud aja tagant saadetakse see serverisse, kasutades ESP8266 wifi moodul. Kui iga toiming on saadetud, analüüsitakse vastust, et teha kindlaks, milline on järgmine või kas teabe saatmise ülesanne on lõpetatud.

    Loogiliselt saab eelmisel koodil läbi viia mitmeid optimeerimistoiminguid, kuid kuna see on näide, et mõista, kuidas ESP8266 Üldisemalt tasub keskenduda vaid mõnele aspektile, millest esimene on andmestruktuur. Tundub, et asi on loogiline kasutage programmeerimiskeele andmestruktuuri (struct), et esindada töödeldavat teavet: ESP8266 AT käsud ja analüüsitavad sõnumid.

    Kasutage struktuuri (struct) andmete salvestamine näidismassiivide asemel (nende põhjal) on triviaalne ja kuigi see võib anda elegantsema koodi, ei tähenda see tulemuse paranemist. Tõeline alternatiiv, mida pakub kasutamine struct on rakendada, nagu allpool selgitatud, muutuva pikkusega struktuurides, mis sisaldavad "sisemisi" andmeid millele nad viitavad. Nii ei oleks näiteks vaja, et toimingul oleks analüüsimiseks kindel arv vastuseid.

    See lähenemisviis viitab sellele, et see on parim viis lahenduse rakendamiseks, kuid puuduseks on see, et see oleks vajalik kasutada dünaamilist mälujaotust, riskantne praktika koos a mikrokontroller mis nõuab käitusajal kasutatava mälu hoolikat mõõtmist, kuna kompilaator vaevalt suudab meid selle eest hoiatada ja on teatud võimalus mälu (või pinu) ammendada, millel on programmi täitmisele saatuslikud tagajärjed.

    Koodi optimeerimise reas on huvitav meeles pidada, et seda tüüpi programmis, mis kasutab suurt hulka teksti, võib säästa mäluruumi SRAM tekstistringide salvestamine programmi mällu (välklamp) koos makroga F(). Järgmistel ekraanipiltidel näete erinevaid programme ja dünaamilist mälujaotust tavalise tekstikasutuse ja makro kasutamisega F().

    Arduino koodi näide, kasutades programmi mällu salvestatud teksti (flash)
    Arduino koodi näide, kasutades teksti SRAM-is

    Seoses toimingutega, mida tehakse vastavalt teabele, mis saabub ESP8266 wifi moodul, alternatiivina koodist sõnumi kontrollimisele ja ühe või teise sooritamisele vastavalt sellele, mis vastu võetakse, saab sellesse andmestruktuuri salvestada olekuindikaatorite asemel osutavad funktsioonidele, mis täidavad iga ülesannet (lipud), mis hoiatavad teatud oleku eest, et rakendus vastutab näiteks põhiahelas haldamise eest.

    Järgmine on näide päringute andmete salvestamiseks struktuuridest ESP8266 (andmetüüp operacion_esp8266) ja nende vastused (andmetüüp respuesta_esp8266).

    Toimingut esindava struktuurina (andmed, mis saadetakse ESP8266 wifi moodul) viitab struktuurile, millega vastused on määratletud, ja vastuste struktuurile operatsioonide struktuurile, esmalt on vaja deklareerida mõlemad, määratledes uue andmetüübi ja seejärel määratledes selle sisu.

    Eelmises näites arvatakse, et seda sisaldav programm on valinud a oleku indikaator, mis peab vastama koodist ligipääsetavale muutujale, mis vastutab ühe või muu nimetatud väärtusega näidatud toimingu tegemise eest. Kui vastuseks ESP8266 Teatud teksti analüüsimisel võtab olek väärtuse, mis näitab vastava vastuse struktuuri.

    Nagu varem öeldud, oleks veel üks alternatiiv, kas staatuse indikaator asendada või täiendada salvestada funktsiooni võrdlusstruktuuri (osuti), mida kutsutakse välja vastuses teatud tekstiga kohtumisel ESP8266 wifi moodul.

    Eelmises näites on see lisatud andmestruktuuri, mida kasutatakse vastuse töötlemiseks ESP8266 wifi moodul osuti (oletatavale) funktsioonile, mis tagastab tüüpi andmeid float (võib olla analoognäidu kaalutud väärtus) ja millele antakse argumentidena kaks baiti (kaks unsigned char mis võib olla viik, millelt analoogsisendit loetakse, ja see, mis aktiveerib hüpoteetilise integraadi ENABLE).

    Arenduses jaoks MCU, vastupidiselt suuremate süsteemide arendusstiilile, pole globaalsete muutujate kasutamine komplekti juhtiva rakenduse (globaalse) käitumise määratlemisel nii haruldane, nii et seda tüüpi definitsioonide leidmine pole eriti haruldane. funktsioonidena ilma parameetriteta ja mis ei tagasta väärtusi, midagi taolist void (*accion)();

    Kui töötate sellise andmete esitamise viisiga, kasutage struct muutuva pikkusega andmete puhul on vaja mälu dünaamiliselt eraldada malloc() (o new(), kui kasutatakse objekte), mis kasutab parameetrina eraldatud mälumahtu ja tagastab kursori reserveeritud mäluala algusesse. Koos sizeof() Salvestatud tüübi järgi, korrutatuna kasutatud elementide arvuga, saate vajaliku mälumahu. Näide selle kasutamisega ja ilma selleta on näha allolevatel ekraanipiltidel. malloc(); Esimesel juhul olge programmi kasutatava mäluga ettevaatlik, peate laadima seda funktsiooni sisaldava raamatukogu.

    Näide mälu eraldamisest mallociga Arduinos

    Näide teksti määramisest ilma mallocita Arduinos

    Kui toimingud ESP8266 wifi moodul varieerub kogu programmi täitmise ajal, tuleb vabastada mälu, mida ei kasutata free() (o delete(), kui tegemist on objektidega). Kuigi on mõistlik eeldada, et koostaja (GCC) optimeerib programmi, et vältida mälu jaotamist, kindlasti ei ole jõudlus nii optimaalne kui staatiliselt eraldatud mäluga töötamine.

    Kuigi selles näites (mõlemas teostuses) pole sellel erilist mõtet, tuleb operatsiooni üldistamiseks, et seda ka muudel juhtudel rakendada, märkida, et andmete saatmine kordab alati sama protokolli: teatage saadetavate baitide arv, oodake indikaatorit (>) ja saatke andmed.

    Kuna selles näites kasutatakse seda ainult üks kord (kogu päring tehakse ühes paketis), ei tundu see kuigi kasulik, kuid üldiselt võib olla vaja teha sama toiminguga mitu saatmist, sealhulgas juhtudel, kui need peavad olema edastada märkimisväärses koguses andmeid, mis peavad olema killustatud, et vältida mälu ületäitumist ESP8266.

    Selle käitumise rakendamiseks saab kasutada ühenduse kahte viimast elementi nii, et iga kord, kui andmed saadetakse, täidetakse andmed vastavate väärtustega: esimesel juhul saadetud baitide arv ja teisel juhul ( osa) taotlusest. edastada.

    Määramise ja saatmise kordamiseks saab erinevaid edastatavaid elemente salvestada vektorisse. See uus vektor määrab keerulise toimingu lõpu ja mitte viimase toimingu nagu seni.

    1 kommentaar

    kommentaaride kasutaja
    ดูบอลสด

    Selle teema kohta on kindlasti palju teada saada. Mulle meeldivad kõik teie punktid

    Postita kommentaar

    Võib-olla jäite vahele