Grunnleggende operasjoner på en ESP8266 wifi-modul fra Arduino

Grunnleggende operasjoner på en ESP8266 wifi-modul fra Arduino

Grunnleggende operasjoner på en ESP8266 wifi-modul fra Arduino

Når Espressif lanserte de første modulene på markedet wifi med det integrerte ESP8266 og firmware for å håndtere det ved hjelp av AT-kommandoer, det vi brukere var interessert i var å integrere det i sammenstillinger med mikrokontrollere og problemene ble redusert til å kjenne det (tidligere) mørket ESP8266 AT kommandotabell, fôringsbehov eller ESP8266 fastvareoppdatering.

Innholdsfortegnelse

    Da kom det raskt alternativer for å programmere ESP8266 og modulimplementeringer wifi av svært forskjellige formater som vakte andre bekymringer: hvilken ESP8266 wifi-modul å velge avhengig av rekkevidden til de forskjellige antennene (inkludert eksterne) eller den fysiske integreringen av disse nye modulene i våre forsamlinger.

    På grunn av alle disse endringene har det sikkert ikke blitt lagt vekt på de mest grunnleggende aspektene, den mest grunnleggende styringen av ESP8266 wifi-modul. Selv om polaritet.es Du kan finne informasjon om bruken av ESP8266 og det er noen applikasjoner ment å forklare på en generisk måte driften av ESP8266 wifi-modul ved hjelp av AT-kommandoer, spesielt i artikkelen om bibliotek for å lage HTTP-spørringer fra Arduino med ESP8266 wifi-modulen, antyder lesernes inntrykk at det ville være nyttig å legge til litt mer grunnleggende informasjon for å hjelpe brukere av ESP8266 å gjennomføre sine egne implementeringer.

    Diskuter de grunnleggende operasjonene for å jobbe med ESP8266 og å foreslå generiske løsninger er et mål for flere vidt forskjellige deler; For å hjelpe deg med å følge innholdet i artikkelen kan følgende indeks tjene som en guide:

    Kontroller ESP8266 wifi-modulen fra datamaskinen gjennom den serielle porten

    Fra en tallerken Arduino og bruke din IDE det er mulig å overvåke driften av en ESP8266 wifi-modul, Send ESP8266 AT-kommandoer og se svaret, men det er mye mer praktisk å gjøre det fra en datamaskin med en terminaltypeapplikasjon.

    Bruker CuteCom til å teste ESP8266 wifi-modulen gjennom den serielle porten

    Avhengig av hvilket brett Arduino brukt, kan det hende at bare én maskinvareserieport er tilgjengelig, noe som gir litt ulempe for sending og mottak. Å endre kommunikasjonshastigheten er mye mer behagelig i en seriell kommunikasjonsapplikasjon fra en datamaskin og noen hovedkort. Arduino (og under noen omstendigheter) ikke støtter de høyeste hastighetene for seriell kommunikasjon godt, spesielt 115200 baud, som er standardhastigheten til de nyeste versjonene av firmware.

    Hvilket program du skal bruke for å overvåke ESP8266 bruker seriell port, det er mange å velge mellom i henhold til behov og preferanser; i det siste har jeg brukt klassikeren mer CuteCom (den i skjermbildet ovenfor) fordi det er veldig behagelig for meg å gjenta visse ESP8266 wifi-modul AT-bestillinger i prosjekttesting.

    Noen anbefalinger er allerede gitt her om programmer som fungerer som en seriell konsoll; For eksempel når man snakker om PuTTY for å kontrollere UART serielle enheter fra datamaskinen. PuTTYI tillegg til å være et utmerket program, er det tilgjengelig for de fleste stasjonære operativsystemer. Videre, som PuTTY kan brukes til å fungere som en konsoll med både serieporten og Internett-protokollfamilie (TCP/IP), inkludert de som opererer TLS, blir et vanlig verktøy som mer enn tilbakebetaler den (litte) tiden som brukes på å konfigurere den og venne seg til bruken.

    Bruke PuTTY til å teste ESP8266 wifi-modulen gjennom den serielle porten

    I tillegg til seriell kommunikasjonsprogramvare, å koble til ESP8266 wifi-modul til havnen USB En datamaskin krever også en omformer USB til serier TTL. Som i tilfellet med programvare, er det flere versjoner, hvorfra de kun brukes til å konvertere porten USB på en seriell port TTL (som kan fås fra én euro) til de som kan emulere forskjellige protokoller (som f.eks SPI o I2C).

    Akkurat som et program som fungerer som en seriell konsoll, maskinvaren for å kommunisere datamaskinen via USB med en logisk krets (ikke bare ESP8266) vil være et vanlig verktøy i arbeidet til en mikrokontrollert applikasjonsutvikler, det er verdt å ha det i verktøykassen så snart som mulig og jobbe med det ESP8266 wifi-modul Det er en utmerket mulighet til å få en.

    Maskinvare for USB UART seriell kommunikasjon for å overvåke ESP8266 wifi-modulen

    Omformeren USB a UART TTL Den kan også brukes til å overvåke oppførselen til en krets som bruker ESP8266, for å gjøre dette, kobles utgangene du vil overvåke i serie til datainngangen (RX) til omformeren med en hurtigdiode (den 1N4148, for eksempel) og en motstand (2K2, for eksempel) parallelt med hverandre. Et slikt oppsett fungerer som en maskinvareseriesniffer.

    Sniffereksempel for ESP8266 koblet til Arduino ved hjelp av en USB UART TTL-konverter

    Selv om snifferen i bildet ovenfor absolutt er rudimentær (blant annet har den ikke buffer) er tilstrekkelig til å overvåke driften av en sammenstilling med Arduino og ESP8266.

    Fjerne snifferen fra den forrige ordningen, den skjematisk som viser hvordan du kobler til en ESP8266 wifi-modul til en tallerken Arduino. I tillegg til å mate den på 3V3, må tilbakestillingspinnen og aktiveringspinnen til den integrerte være koblet til et høyt nivå (aktiver). Selvfølgelig må RX-pinnen til den ene kobles til TX-en til den andre.

    For å forenkle det forrige diagrammet er en plate representert Arduino drevet på 3V3 og for hvilken en spenning på serieporten også antas å være 3V3. Hvis du bruker en mikrokontroller med et annet signalnivå på serieporten (normalt 5 V) vil være nødvendig, for ikke å skade ESP8266, bruk en nivåomformer som i diagrammene nedenfor. Denne kretsen finnes ofte i mange kommersielle modulimplementeringer.

    5V til 3V3 signalnivåomformer for ESP8266 WiFi-modul og Arduino

    Oppdater ESP8266 firmware

    Las ESP8266 AT-kommandoer, dens avslutning, standardhastigheten til modulen... avhenger av versjonen av ESP8266 firmware. Det er best å sørge for at du har samme versjon i alle moduler, og om mulig at det er den nyeste versjonen.

    Dessverre er det meste av ESP8266 wifi-modulmodeller De har bare 4 Mbit, så den nyeste versjonen kan ikke installeres på dem. Den siste (offisielle) versjonen av fastvaren som kan installeres på ESP8266 wifi-moduler med 4 Mbit (mest) er 0.9.4 som inkluderer versjon 0.2 av ESP8266 AT-kommandoer.

    Oppsummert, for å oppdatere fastvaren trenger du:

    1. Last ned den tilsvarende fastvareversjonen. Den siste (offisielle) versjon for en modul som har 4 Mbit minne, ligger i Espressif-mappen på github. I Espressifs nettsted Du kan laste ned den nyeste versjonen av fastvaren, men det er veldig viktig å kontrollere at modulen den er installert på har nok minne.

    2. Last ned den nyeste versjonen av fastvareinstallasjonsverktøyet. Min favoritt er esptool som er skrevet inn Python, så det fungerer på alle plattformer. I tillegg til å lastes ned, kan den også installeres med pip install esptool (o pip2 o python -m pip…). Selvfølgelig, Espressif Den tilbyr også sitt eget verktøy, men er foreløpig bare tilgjengelig for Windows.

    3. Forbered nedlastede filer; pakk dem ut i en tilgjengelig mappe og gjør verktøyet kjørbart om nødvendig esptool, i mitt tilfelle, siden GNU / Linux, Med chmod +x esptool

    4. Koble modulen til datamaskinen ved hjelp av en omformer USB UART TTL som fungerer på 3V3 eller bruk en nivåomformer hvis den fungerer på 5 V. I tillegg til strømmen må du koble TX til RX på omformeren USB UART TTL, RX til TX, GPIO0 på lavt nivå (GND) og kanskje GPIO2 på høyt nivå (i mine tester har det fungert både å koble den på lavt nivå og koble den fra). Hvis modulen har GPIO15-tilkoblingen fri (som skjer i ESP-12), må den kobles til et lavt nivå. RESET, som normalt vil være på et høyt nivå under drift, kan stå ukoblet eller koblet til et høyt nivå ved hjelp av en motstand (10K, for eksempel), siden før du starter opptaket kan det være nødvendig å tilbakestille enheten ved å koble den til til et lavt nivå.
      Ved å slå på modulen vil den være tilgjengelig for oppdatering, men Hvis en tilkoblingsfeil vises, vil det være nødvendig å tilbakestille den koble til RESET på et lavt nivå et øyeblikk og deretter la den være i luften (uten å koble til) for oppdateringsprosessen.
      Modulen har halv ampere forbruket topper (opptil 600 mA, ifølge noen brukere) så det er viktig å bruke en strømforsyning som er i stand til å støtte dette forbruket, spesielt for oppdatering av fastvare.

      Tilkobling wifi-modul ESP8266 ESP-01 til USB UART TTL-konverteringsoppdateringsfastvare

    5. Kjør verktøyet for å oppdatere fastvaren. I mitt tilfelle har jeg lagret verktøyet og fastvaredokumentene i trinn 3 i samme mappe, så jeg kjører fra konsollen:
      cd ~/Datos/firmwareESP8266 (bytt til mappen som inneholder verktøyet og fastvaren)
      ./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 angir hastigheten på ESP8266 (115200 baud i mitt tilfelle) og --port serieporten den kobles til (i mitt tilfelle, emulert, den første USB). De forskjellige dokumentene som utgjør fastvaren går bak write_flash foran med adressen, med user1.bin-dokumentet som inneholder oppdateringsnyttelasten.

      wifi ESP8266 fastvareoppdatering esptool konsollfangst

    Send kommandoer til ESP8266 wifi-modul

    For å kontrollere ESP8266 fra en datamaskin vi må begynne med konfigurer appen som det vil være nok å ① velge porten som omformeren er koblet til USB UART TTL, noe som /dev/USB0 i GNU/Linux og lignende eller noe sånt COM6 i Windows, ② velg hastigheten som ESP8266, sannsynligvis 115200 baud, ③ sette 8 databiter pluss en stoppbit, uten paritet eller håndtrykk, og ④ angi slutten av linjen, avhengig av firmware, nesten alltid CR+LF.

    Konfigurer CuteCom til å overvåke ESP8266 wifi-modul ved hjelp av en USB UART TTL-konverter

    Konfigurer PuTTY for å overvåke ESP8266 wifi-modulen med en USB UART TTL-omformer

    Når applikasjonen er konfigurert (eller, der det er relevant, lagret og valgt), er den det åpne tilkoblingen ("åpen enhet" og "åpen", henholdsvis i skjermbildene av eksemplene ovenfor med CuteCom y PuTTY) og du kan begynne å sende bestillinger til ESP8266.

    Som kan sees i ESP8266 AT kommandotabell, formatet for å aktivere, deaktivere, angi en verdi og henvise til den er ganske forutsigbar, men generelt er det ikke lett å huske dem alle, og du må sannsynligvis ha den for hånden for å referere til den.

    Måten å send AT-ordrer al ESP8266 wifi-modul fra Arduino Det er veldig enkelt: ① konfigurere kommunikasjon med Serial.begin(115200); (eller Serial1, Serial2... på kort med flere seriell maskinvareporter) og ② send kommandoene ved å bruke formatet Serial.print(orden+"\r\n");

    Eksemplet ovenfor viser hvordan du sender ESP8266 wifi-modul AT-bestillinger fra Arduino. I dette tilfellet er det illustrert AT+CWJAP, som brukes til å koble til et tilgangspunkt. Denne kommandoen bruker tilgangspunktidentifikatoren som argumenter (SSID) og nøkkelen, begge i anførselstegn, slik at de blir et objekt Srtring og omslutt dem i anførselstegn ved å bruke escape-koden (\"). For å fullføre bestillingen, bruk \r\n som tilsvarer CR y LF.

    For å huske at den serielle porten ikke alltid identifiseres med Serial (på enkelte plater kan det være Serial1, Serial2…) portobjektet som brukes er definert ved å tilordne det til makroen PUERTO_SERIE. Å oppdage hvilken type brett som brukes kan legge til litt intelligens til valg av serieport; Senere skal vi gå gjennom hvordan du kan finne ut hvilken type Arduino. Resten av definisjonene er de vanlige som lar deg "navngi" konstantverdiene for å unngå å gjenta dem (og gjøre feil) og gjøre det lettere å endre dem.

    Eksempelet ovenfor er ment å koble til ESP8266 wifi-modul til det angitte tilgangspunktet, men var det allerede koblet til før? Har forbindelsen fungert? For å vite dette, må vi "lytte" til hva ESP8266

    Motta data fra ESP8266 wifi-modul

    Ved å koble datasnifferen forklart ovenfor til datamaskinen kan du se hva Arduino har sendt til ESP8266 og hans svar. Å lese fra Arduino og behandle informasjonen i den det vil være nødvendig å oppdage med Serial.available() hvis noen data har kommet, og i så fall last den med Serial.read(). Følgende eksempel viser hvordan du leser svaret fra AT+CWJAP?, som vil rapportere om det er en tilkobling til et tilgangspunkt.

    Som på en tallerken Arduino Uno (og i andre) åpning av den serielle skjermen tilbakestiller programmet, den kan brukes til å se i den serielle konsollen Arduino informasjonen du sender til ESP8266 som skjermbildet av bildet nedenfor viser.

    Motta data fra ESP8266 wifi-modulen fra Arduino. Grunnleggende eksempel

    Analyser svaret sendt av ESP8266 wifi-modulen

    Vi har allerede sett hvordan man leser informasjonen som når Arduino fra ESP8266. Problemet du må forholde deg til er at du ikke vet når det begynner å komme, hvor lang tid det vil ta før det kommer, hvor lenge det vil være... og det er lite effektivt å vente på svar fra ESP8266 mottas uten å la mikrokontroller utføre andre oppgaver i mellomtiden.

    En enkel måte å håndtere denne omstendigheten på er iterere på dataene som er mottatt på jakt etter konkrete svar som for eksempel aktiverer indikatorer (flagg eller boolske variabler) som vil avgjøre om det skal fortsette å søke i den mottatte teksten og hvilke handlinger som skal utføres basert på informasjonen som kommer fra ESP8266. Mens svaret kommer mikrokontroller kan dedikere til andre oppgaver, for eksempel å motta data fra sensorer og behandle dem.

    Søk etter en tekst i informasjonen mottatt fra ESP8266

    For å søke i teksten som kommer fra ESP8266 kan sammenligne hvert mottatt brev med det som tilsvarer meldingen du leter etter. Det vil være nødvendig å bruke en teller (eller en peker) som peker på bokstaven som skal sammenlignes; Hvis tegnet som kommer fra ESP8266 er den samme som den som undersøkes i meldingen, går telleren frem, hvis den er annerledes initialiseres den.

    For å vite at slutten er nådd, konsulteres neste tegn i den søkte meldingen, som vil være null (\0) eller lengden på meldingen er lagret for å, ved å sammenligne den med telleren, vite om sammenligningen er fullført og derfor ESP8266 wifi-modul har sendt ønsket melding.

    Følgende eksempel bruker kommandoen AT+CWLAP som vil returnere en liste over tilgangspunkter og innenfor dem søkes det etter et som heter "wifi polaridad.es". Selv om vi har valgt å bekrefte at det siste tegnet er null, da buffer Den lagrer kun den søkte teksten og lengden er kjent, det kan også sjekkes om et slikt antall korrekte bokstaver er mottatt. Med en LED koblet til pinne 2 rapporteres det at forventet tekst er funnet.

    I koden til forrige eksempel kan du også se en måte å velg serieport avhengig av type brett Arduino brukt. Dette eksemplet forutsetter at du har tre typer brett for prosjektet: en Arduino Uno, One Arduino Mega 2560 og en arduino leonardo. Hvis du jobber med en Arduino Uno den vil bli brukt Serial og ellers Serial1.

    Hvis du jobber med en tallerken arduino leonardo Du kan bruke samme metode for å stoppe programmet og vente på konsollen (den serielle porten knyttet til Serial) er tilgjengelig.

    Søk i ulike tekster i ESP8266-svaret

    Koden i forrige eksempel brukes til å søke etter tekst i informasjonen som sendes av ESP8266 men svaret kan inneholde forskjellig informasjon avhengig av operasjonen. Anta, for å starte med et enkelt tilfelle i neste eksempel, at teksten sendt av MCU ESP8266 es OK når operasjonen er utført riktig og ERROR Ellers som med bestillingen AT+CWJAP?, som tjener til å verifisere om ESP8266 wifi-modul er allerede koblet til et tilgangspunkt.

    Denne nye implementeringen av samme metode, som søker etter et samsvar med flere mulige meldinger, lar deg velge mellom ulike handlinger avhengig av svaret mottatt fra ESP8266, bare slå på LED tilsvarende.

    Begrens tiden det tar å motta et svar

    Til nå har det ikke blitt henvist til en relevant problemstilling: maksimal ventetid (timeout) før vurdering av en operasjon mislyktes. Hvis av en eller annen grunn forbindelsen med ESP8266 wifi-modul, modulen med tilgangspunktet, tilgangspunktet med Internett eller, for eksempel, en hypotetisk server er ikke tilgjengelig, programmet kan blokkeres på et tidspunkt og venter på ubestemt tid, så et svar må artikuleres til slike omstendigheter. Maksimal ventetid kan konfigureres for hele applikasjonen, vanligvis vil den i så fall være mer "generøs", eller individuelle ventetider kan programmeres for hver operasjon.

    For å sjekke at (minst) et visst tidsintervall har gått "Tidspunktet" for øyeblikket kontoen startes trekkes vanligvis fra gjeldende "tidspunkt", og det bekreftes at forskjellen er større enn ønsket grense. Denne "tiden" trenger ikke å være sanntid, den tilsvarer vanligvis intervallet som har gått siden MCU begynn å telle tid; Dette påvirker ikke programmet siden det som er interessant er medgått tid og ikke den absolutte tiden.

    Vanligvis, for å sjekke om et visst intervall har gått, brukes et uttrykk av typen:

    variabel milisegundos_al_empezar inneholder verdien av millis() av et bestemt øyeblikk i utførelsen som den er tidsbestemt fra, så det er ikke uvanlig at navnet refererer til ordet "kronometer." Variabelen intervalo_de_tiempo inneholder det maksimale antallet millisekunder som gjør det forrige uttrykket sant, det vil si at det representerer tidsavbruddet; Det er vanligvis en konstant (eller en makro), og som i forrige tilfelle, vises ordet "TIMEOUT" ofte i navnet. Hvis du jobber med veldig korte intervaller kan du bruke micros() i stedet for millis() (mikrosekunder i stedet for millisekunder) selv om det er mye mindre vanlig og mye mindre presist.

    Et langt heltall i Arduino (unsigned long) opptar 4 byte (32 biter), så den største verdien den kan representere er 4294967295 (2 i potensen 32 minus én, fordi den starter på null). på en tallerken Arduino Mens den kjører kontinuerlig vil millisekundtelleren tilbakestilles (tilbake til null) omtrent hver 50. dag. Når du trekker fra med usignerte datatyper, reproduseres den samme oppførselen (snu telleren) slik at det er mulig å kontrollere tidsavbruddet på ubestemt tid.

    Koden ovenfor viser en helt grunnleggende implementering av tidsavbruddsbegrensning inkorporerer linjene merket med hensyn til eksemplet som går foran det. Siden tidsavbruddsbekreftelsen utføres etter behandling av dataene som kommer fra ESP8266 wifi-modul, kan operasjonen anses som vellykket selv om mottak tar lengre tid enn den pålagte ventetiden.

    Utfør en kompleks operasjon definert av flere AT-kommandoer

    For å ha et eksempel på formålet med applikasjonen som utnytter ESP8266 wifi-modul, antar at det er det lagre informasjon i en database som du får tilgang til via en nettjeneste for å holde styr på temperaturen. Følgende kode leser en sensor koblet til en analog inngang hvert bestemt tidsintervall, beregner gjennomsnittsverdien og sender den til webserveren etter et lengre tidsintervall (stil IOT) gjennom en underskriftskampanje HTTP (POST, FÅ...).

    I dette temperaturregistreringseksemplet åpnes en webserver hvert femte minutt. Selv om tilgjengeligheten ikke er spesielt høy, er det å forvente at forslaget vil fungere, men dersom en høyere opptaksfrekvens var nødvendig, måtte andre ressurser settes i verk, f.eks. databuffer venter på å bli sendt, for å sende flere når serveren kan delta og lagre dem når den ikke er tilgjengelig. Hvis frekvensen som data må registreres med var enda større, ville andre typer protokoller måtte foreslås som et alternativ til HTTP eller til og med erstatte TCP av UDP for å kunne sende mesteparten av dataene med nødvendig hastighet selv på bekostning av å miste noen.

    Operasjonene som utgjør oppgaven som skal utføres for å sende temperaturen vil være:

    • Tilbakestill wifi-modulen
    • Koble fra det gjeldende tilgangspunktet (i tilfelle en standardtilkobling eksisterer)
    • Angi innstillingene. For eksempelet antas det at tilkoblingsmodusen (enkel) og rollen i Wi-Fi-kommunikasjon (stasjon) må konfigureres.
    • Koble til tilgangspunktet
    • Bekreft at tilkoblingen er riktig (faktisk er dette inngangspunktet) Hvis det ikke er noen tilkobling, start prosessen fra begynnelsen
    • Koble til serveren
    • Send forespørselen HTTP med dataene som skal lagres

    Rekkefølgen på operasjoner trenger ikke å være nøyaktig slik (selv om operasjonen er det), og hvert trinn kan kreve flere ESP8266 AT-kommandoerFor eksempel vil konfigurasjonen ovenfor trenge to: AT+CIPMUX=0 y AT+CWMODE=1.

    En datastruktur for å representere operasjoner på ESP8266

    I de foregående eksemplene, selv om det er på en veldig grunnleggende måte, er en generisk løsning på problemet allerede foreslått: bruke en datastruktur som lagrer mulige svar og handlinger som må iverksettes i hvert enkelt tilfelle; send en handling, vent på svar, og fortsett i henhold til hva svaret betyr. Siden hver kompleks operasjon vil kreve flere ESP8266 AT-kommandoer, må datastrukturen koble en operasjon med andre, etterfølgende eller tidligere, som må utføres i hvert enkelt tilfelle avhengig av responsen fra ESP8266.

    I de forrige eksemplene ble det søkt etter en melding i svaret til ESP8266 og det ble tolket som suksess eller feil. I tillegg til en mottakelse (og analyse) av all den mottatte teksten, For å ha et generisk minimum, er det tilrådelig å også ivareta fullføringen av meldingen eller, med andre ord, til tilgjengeligheten av ESP8266 wifi-modul for å motta nye bestillinger. På denne måten kan endringen til en tilstand som vi kan kalle, for eksempel "wifi tilgjengelig", være å motta navnet på tilgangspunktet og å motta teksten ERROR eller teksten OK vil bety at ESP8266 du er ferdig med svaret, og du kan nå sende det neste AT-kommando til ESP8266.

    Koden ovenfor bruker en vektor (operacion) for å lagre teksten til de påfølgende operasjonene som utgjør hele oppgaven. En todimensjonal matrise brukes (mensaje) med de tre svarene som er analysert. Som forklart ovenfor, er det nødvendig å se etter meldingene som representerer slutten av svaret i tillegg til meldingen som representerer et riktig eller feil svar. Ikke alle operasjoner vil ha like mange mulige svar; Når det er færre svar, kan en tom melding brukes som bruker minst mulig antall sykluser i analysen (selv om det ikke er den mest optimale måten). Logisk sett vil det være nødvendig at minimum antall svar som søkes (tre i eksempelet) inkluderer alle operasjonsmulighetene, selv om de ikke er alle mulige.

    Når du snakker om mulige svar, kan det allerede sees at dette eksemplet ikke er veldig nyttig for å motta data med et vilkårlig format fra en ESP8266 wifi-modul, men saken er at, i sammenheng med bruk med mikrokontrollere det er ikke vanlig; Det vanligste er å sende data samlet inn av sensorene de har koblet til og/eller motta informasjon om hva de skal gjøre med aktuatorene den styrer. Meget verdifull informasjon, som kan forutses veldig godt.

    I den forrige datastrukturen, akkurat som det er gjort for å uttrykke de mulige svarene som analyseres, brukes en todimensjonal matrise også for å bestemme operasjonen som må utføres i hvert tilfelle (siguiente_operacion). Konkret har vi valgt å svare på tre typer meldinger: ① en vilkårlig tekst (LITERAL) for å bekrefte om det er en tilkobling til Wi-Fi-tilgangspunktet og serveren, ② en tekst for å oppdage feil i prosessen (FALLO) og ③ en tekst som indikerer at operasjonen ble fullført (ACIERTO).

    Til slutt er det ytterligere to vektorer for å angi maksimal ventetid før du gir opp (timeout) og spesifiser (configuracion) hvis operasjonen avsluttes uten å vente på svar (ESPERAR_RESPUESTA) og meldinger som indikerer slutten på kommunikasjonen. Denne siste vektoren, for å illustrere et eksempel på hvordan minne kan lagres, arbeider med bitene i en konfigurasjonsbyte for å indikere de forskjellige tilstandene.

    Den første ESP8266 AT-kommandoer av datastrukturen alltid forvente et svar, som kan være suksessen eller feilmeldingen. Når det oppstår en feil, startes modulen på nytt og den starter igjen, og hvis meldingen indikerer at operasjonen er riktig, går den videre til neste.

    Når du har koblet til serveren endres mønsteret. I dette tilfellet er det nødvendig å ① sende lengden på datapakken som skal overføres og ② skrive forespørselen HTTP med en fast tekst pluss verdien (av temperaturen) som sendes for å lagres på serveren. Forberedelsen av disse dataene utføres i hver forsendelse, og det er nødvendig å dele dem i to (varsle lengden) eller tre (send forespørselen HTTP) Til ESP8266 AT-bestilling. Bare den siste av delene som operasjonen er delt inn i vil vente på svar.

    I dette tilfellet vil det fungere uten problemer (kanskje advarsel om at modulen er opptatt), men når lengden på dataene er større vil det være nødvendig å dele opp datablokkene i mindre biter og det kan til og med være nødvendig å implementere en venting, som gjøres med temperaturavlesningen, for å gi modulen tid til å sende dataene uten å fylle den buffer.

    Sammen med andre makroer som allerede er forklart før, viser eksempelkoden ovenfor hvordan de forskjellige tilstandene er definert for å spesifisere om man skal vente på svar og eventuelt hvilken melding som indikerer at den er ferdig.

    Som på forskjellige punkter i koden vil en operasjon bli sendt (når det er på tide å sende gjennomsnittstemperaturen, hvis ventetiden for en operasjon overskrides, når den nåværende operasjonen er vellykket fullført...), men hvordan gjøres det er etablert globalt, har det blitt definert som en makro ENVIAR_OPERACION som grupperer trinnene som er involvert i frakt.

    Følgende er koden til hovedprogrammet i eksemplet. Den mest eksterne oppgaven er den som har ansvaret for å ta prøver av temperaturen for å beregne gjennomsnittet, og hver bestemt tidsperiode sendes den til serveren ved å bruke ESP8266 wifi-modul. Når hver operasjon er sendt, analyseres svaret for å avgjøre hva som er neste eller om oppgaven med å sende informasjon er fullført.

    Logisk sett kan flere optimaliseringshandlinger utføres på den forrige koden, men siden dette er et eksempel for å forstå hvordan ESP8266 På en generisk måte er det bare verdt å fokusere på noen aspekter, den første er datastrukturen. Det virker som det logiske er bruk en datastruktur for programmeringsspråk (struct) for å representere informasjonen som behandles: den ESP8266 AT-kommandoer og meldingene som analyseres.

    Bruk en struktur (struct) å lagre dataene i stedet for eksempelmatrisene (basert på dem) er trivielt, og selv om det kan resultere i mer elegant kode, innebærer det ingen forbedring av resultatet. Det sanne alternativet som utgjøres av bruken av struct er å implementere, som forklart nedenfor, variable lengder i strukturer som inneholder "indre" data som er referert til av dem. På denne måten vil det for eksempel ikke være nødvendig for en operasjon å ha et fast antall svar å analysere.

    Denne tilnærmingen antyder at det er den beste måten å implementere løsningen på, men ulempen er at det ville være nødvendig bruke dynamisk minneallokering, en risikabel praksis å jobbe med en mikrokontroller som krever nøye måling av hvor mye minne som vil bli brukt under kjøring, siden kompilatoren neppe vil kunne advare oss om dette og det er en viss mulighet for å tømme minnet (eller stabelen) med fatale konsekvenser for gjennomføringen av programmet.

    I linjen med å optimalisere koden, er det interessant å huske at i et program av denne typen, som bruker en stor mengde tekst, kan spare minneplass SRAM lagring av tekststrenger i programminnet (blitz) med makroen F(). I de følgende skjermbildene kan du se det forskjellige programmet og den dynamiske minnedistribusjonen med normal bruk av tekst og ved bruk av makro F().

    Arduino-kodeeksempel ved bruk av tekst lagret i programminnet (flash)
    Arduino-kodeeksempel ved bruk av tekst i SRAM

    Med hensyn til handlingene som utføres i henhold til informasjonen som kommer fra ESP8266 wifi-modul, som et alternativ til å sjekke meldingen fra koden og utføre det ene eller det andre i henhold til det som mottas, kan lagres i denne datastrukturen pekere til funksjoner som utfører hver oppgave i stedet for statusindikatorer (flagg) som advarer om en viss tilstand som applikasjonen er ansvarlig for å administrere, for eksempel innenfor hovedsløyfen.

    Følgende er et eksempel på strukturer for å lagre dataene til forespørslene til ESP8266 (datatypen operacion_esp8266) og deres svar (datatypen respuesta_esp8266).

    Som strukturen som representerer operasjonen (dataene som sendes til ESP8266 wifi-modul) refererer til strukturen som responsene er definert med, og strukturen til responsene til strukturen til operasjonene, det er nødvendig å erklære begge først, ved å definere den nye datatypen, og deretter definere innholdet.

    Det forrige eksemplet vurderer at programmet som inkluderer det har valgt å bruke en statusindikator, som må tilsvare en variabel tilgjengelig fra koden som er ansvarlig for å utføre en eller andre operasjoner som indikert av nevnte verdi. Hvis i svaret fra ESP8266 Når en bestemt tekst analyseres, tar staten verdien som indikerer strukturen til den tilsvarende responsen.

    Som sagt før, vil et annet alternativ, enten å erstatte eller utfylle en statusindikator, være lagre en funksjon i referansestrukturen (en peker) som ville bli kalt ved å møte bestemt tekst i svaret fra ESP8266 wifi-modul.

    I forrige eksempel er det lagt til datastrukturen som brukes til å behandle svaret fra ESP8266 wifi-modul en peker til en (antatt) funksjon som returnerer data av typen float (kan være den vektede verdien av en analog avlesning) og som to byte er gitt som argumenter (to unsigned char som kan være pinnen som den analoge inngangen leses fra og den som aktiverer ENABLE for en hypotetisk integrert).

    Under utvikling for MCU, i motsetning til det som skjer i utviklingsstilen for større systemer, er det ikke så uvanlig å bruke globale variabler når man definerer den (globale) oppførselen til applikasjonen som kontrollerer en sammenstilling, så det vil ikke være spesielt sjelden å finne denne typen definisjoner som funksjoner uten parametere og som ikke returnerer verdier, noe sånt som void (*accion)();

    Hvis du jobber med denne måten å representere dataene på, ved hjelp av struct av data med variabel lengde, vil det være nødvendig å dynamisk allokere minne med malloc() (o new(), hvis objekter brukes), som vil bruke mengden minne som er tildelt som en parameter og returnere en peker til begynnelsen av minneområdet som er reservert. Med sizeof() På typen som er lagret, multiplisert med antall elementer som brukes, kan du få mengden minne som trengs. Et eksempel med og uten bruk kan ses i skjermbildene nedenfor. malloc(); Vær forsiktig med minnet som brukes av programmet i det første tilfellet, du må laste inn biblioteket som inneholder denne funksjonen.

    Eksempel på minnetildeling med malloc på Arduino

    Eksempel på tekstoppgave uten malloc i Arduino

    Hvis operasjonene på ESP8266 wifi-modul vil variere gjennom gjennomføringen av programmet, vil det være nødvendig å frigjøre minnet som ikke brukes med free() (o delete(), i tilfelle av å være objekter). Selv om det er rimelig å forvente at kompilatoren (GCC) vil optimere programmet for å unngå minnepartisjonering, ytelsen vil sikkert ikke være like optimal som å jobbe med statisk allokert minne.

    Selv om det i dette eksemplet (i begge implementeringene) ikke gir mye mening, for å generalisere operasjonen for å kunne bruke den på andre tilfeller, bør det bemerkes at å sende data gjentar alltid den samme protokollen: gi beskjed om antall byte som skal sendes, vent på indikatoren (>) og send dataene.

    Siden det i dette eksemplet bare brukes ved én anledning (hele forespørselen er laget i én pakke), virker det ikke særlig nyttig, men generelt kan det være nødvendig å utføre flere sendinger i samme operasjon, inkludert tilfeller der de må overføres betydelige mengder data som må fragmenteres for å unngå å flyte over minnet ESP8266.

    For å implementere denne oppførselen, kan de to siste elementene i forbindelsen brukes slik at hver gang dataene sendes, fylles dataene med de tilsvarende verdiene: i det første tilfellet, antall byte sendt og i det andre, ( del av forespørselen som skal overføres.

    For å gjenta tilordning og sending av de forskjellige elementene som må overføres kan lagres i en vektor. Denne nye vektoren vil være den som bestemmer slutten på den komplekse operasjonen og ikke den siste operasjonen som til nå.

    1 kommentar

    kommenterer bruker
    ดูบอลสด

    Det er definitivt mye å finne ut om dette emnet. Jeg liker alle poengene du kom med

    Legg inn kommentar

    Du kan ha gått glipp av