Grundläggande funktioner på en ESP8266 wifi-modul från Arduino

Grundläggande funktioner på en ESP8266 wifi-modul från Arduino

Grundläggande funktioner på en ESP8266 wifi-modul från Arduino

När Espressiv lanserade de första modulerna på marknaden wiFi med den integrerade ESP8266 och firmware för att hantera det med hjälp av AT-kommandon, det vi användare var intresserade av var att integrera det i assembler med mikrokontroller och problemen reducerades till att känna till det (tidigare) mörkret ESP8266 AT kommandotabell, matningsbehov eller ESP8266 firmware uppdatering.

Innehållsförteckning

    Sedan kom snabbt alternativ för att programmera ESP8266 och modulimplementeringar wiFi av mycket olika format som väckte andra bekymmer: vilken ESP8266 wifi-modul att välja beroende på räckvidden för de olika antennerna (inklusive externa) eller den fysiska integrationen av dessa nya moduler i våra sammansättningar.

    På grund av alla dessa förändringar kanske tonvikten inte har lagts på de mest grundläggande aspekterna, den mest grundläggande hanteringen av ESP8266 wifi-modul. Fastän polaritet.es Du kan hitta information om användningen av ESP8266 och det finns några applikationer som är avsedda att på ett generiskt sätt förklara driften av ESP8266 wifi-modul använda AT-kommandon, särskilt i artikeln om bibliotek för att göra HTTP-frågor från Arduino med ESP8266 wifi-modulen, antyder läsarnas intryck att det skulle vara användbart att lägga till lite mer grundläggande information för att hjälpa användare av ESP8266 att genomföra sina egna implementeringar.

    Diskutera de grundläggande funktionerna för att arbeta med ESP8266 och att föreslå generiska lösningar är ett mål av flera mycket olika delar; För att hjälpa till att följa innehållet i artikeln kan följande index fungera som vägledning:

    Styr ESP8266 wifi-modulen från datorn genom serieporten

    Från en tallrik Arduino och använder din IDE det är möjligt att övervaka driften av en ESP8266 wifi-modul, skicka ESP8266 AT-kommandon och se svaret, men det är mycket bekvämare att göra det från en dator med ett terminalprogram.

    Använder CuteCom för att testa ESP8266 wifi-modulen genom serieporten

    Beroende på vilken tavla Arduino används, kan endast en seriell hårdvaruport vara tillgänglig, vilket ger lite besvär för sändning och mottagning. Att ändra kommunikationshastigheten är mycket bekvämare i en seriell kommunikationsapplikation från en dator och vissa moderkort. Arduino (och under vissa omständigheter) inte stöder de högre hastigheterna för seriell kommunikation bra, särskilt 115200 baud, som är standardhastigheten för de senaste versionerna av firmware.

    Vilket program man ska använda för att övervaka ESP8266 använder seriell port, det finns många att välja mellan efter behov och preferenser; på sistone har jag använt den klassiska mer CuteCom (den i skärmdumpen ovan) eftersom det är väldigt bekvämt för mig att upprepa vissa ESP8266 wifi-modul AT beställningar i projekttestning.

    Några rekommendationer har redan givits här om program som fungerar som en seriell konsol; Till exempel när man pratar om PuTTY för att styra seriella UART-enheter från datorn. PuTTYFörutom att vara en utmärkt applikation är den tillgänglig för de flesta stationära operativsystem. Dessutom, som PuTTY kan användas för att fungera som en konsol med både serieporten och Internetprotokollfamilj (TCP/IP), inklusive de som opererar TLS, blir ett vanligt verktyg som mer än betalar tillbaka den (lilla) tiden som går åt till att konfigurera den och vänja sig vid användningen.

    Använder PuTTY för att testa ESP8266 wifi-modulen genom serieporten

    Förutom programvara för seriell kommunikation, att ansluta till ESP8266 wifi-modul till hamnen USB En dator kräver också en omvandlare USB till serier TTL. Precis som i fallet med programvara finns det flera versioner, från vilka de endast används för att konvertera porten USB på en seriell port TTL (som kan erhållas från en Euro) till de som kan emulera olika protokoll (som t.ex SPI o I2C).

    Precis som ett program som fungerar som en seriell konsol, hårdvaran att kommunicera datorn via USB med en logisk krets (inte bara ESP8266) kommer att vara ett vanligt verktyg i arbetet med en mikrokontrollerad applikationsutvecklare, det är värt att ha det i verktygslådan så snart som möjligt och arbeta med det ESP8266 wifi-modul Det är ett utmärkt tillfälle att få en.

    Hårdvara för USB UART seriell kommunikation för att övervaka ESP8266 wifi-modulen

    Omvandlaren USB a UART TTL Den kan också användas för att övervaka beteendet hos en krets som använder ESP8266, för att göra detta ansluts utgångarna som du vill övervaka i serie till dataingången (RX) på omvandlaren med en snabb diod (den 1N4148t.ex.) och ett motstånd (t.ex. 2K2) parallellt med varandra. En sådan installation fungerar som en hårdvaruseriesniffer.

    Snifferexempel för ESP8266 ansluten till Arduino med en USB UART TTL-omvandlare

    Även om sniffern i bilden ovan förvisso är rudimentär (bland annat har den inte buffert) är tillräckligt för att övervaka driften av en sammansättning med Arduino och ESP8266.

    Ta bort sniffern från det tidigare schemat, den schematisk som visar hur man ansluter en ESP8266 wifi-modul till en tallrik Arduino. Förutom att mata den vid 3V3, måste återställningsstiftet och aktiveringsstiftet på den integrerade vara anslutna till en hög nivå (aktivera). Naturligtvis måste RX-stiftet på den ena anslutas till den andras TX.

    För att förenkla det föregående diagrammet har en platta representerats Arduino drivs med 3V3 och för vilken en spänning på serieporten också antas vara 3V3. Om du använder en mikrokontroller med en annan signalnivå på serieporten (vanligtvis 5 V) kommer att vara nödvändigt för att inte skada ESP8266, använda en nivåomvandlare som i diagrammen nedan. Denna krets återfinns ofta i många kommersiella färdiga modulimplementeringar.

    5V till 3V3 signalnivåomvandlare för ESP8266 WiFi-modul och Arduino

    Uppdatera ESP8266 firmware

    den ESP8266 AT-kommandon, dess avslutning, standardhastigheten för modulen... beror på versionen av ESP8266 firmware. Det är bäst att se till att du har samma version i alla moduler och om möjligt att det är den senaste versionen.

    Tyvärr har de flesta ESP8266 wifi-modulmodeller De har bara 4Mbit, så den senaste versionen kan inte installeras på dem. Den senaste (officiella) versionen av firmware som kan installeras på ESP8266 wifi-moduler med 4 Mbit (mest) är 0.9.4 som inkluderar version 0.2 av ESP8266 AT-kommandon.

    Sammanfattningsvis, för att uppdatera firmware behöver du:

    1. Ladda ner motsvarande firmwareversion. Den senaste (officiella) versionen för en modul med 4 Mbit minne, som finns i mappen Espressif på github. I Espressif hemsida Du kan ladda ner den senaste versionen av firmware, men det är mycket viktigt att kontrollera att modulen som den är installerad på har tillräckligt med minne.

    2. Ladda ner den senaste versionen av installationsverktyget för den fasta programvaran. Min favorit är esptool som är skrivet i Python, så det fungerar på vilken plattform som helst. Förutom att laddas ner kan den även installeras med pip install esptool (o pip2 o python -m pip…). Självklart, Espressiv Den erbjuder också ett eget verktyg men är för närvarande endast tillgängligt för Windows.

    3. Förbered nedladdade filer; packa upp dem i en tillgänglig mapp och, om nödvändigt, gör verktyget körbart esptool, i mitt fall sedan GNU / Linux, Med chmod +x esptool

    4. Anslut modulen till datorn med en omvandlare USB UART TTL som fungerar på 3V3 eller använd en nivåomvandlare om den fungerar på 5 V. Utöver strömmen måste du ansluta TX till RX på omvandlaren USB UART TTL, RX till TX, GPIO0 på låg nivå (GND) och kanske GPIO2 på hög nivå (i mina tester har det fungerat både att koppla in den på låg nivå och koppla bort den). Om modulen har GPIO15 anslutningsfri (som sker i ESP-12) måste den anslutas till en låg nivå. RESET, som normalt skulle vara på en hög nivå under drift, kan lämnas oansluten eller kopplas till en hög nivå med hjälp av ett motstånd (t.ex. 10K), eftersom det innan inspelningen kan vara nödvändigt att återställa enheten genom att ansluta den till en låg nivå.
      Genom att slå på modulen kommer den att vara tillgänglig att uppdatera men, Om ett anslutningsfel visas är det nödvändigt att återställa det ansluta RESET på en låg nivå för ett ögonblick och sedan lämna den i luften (utan att ansluta) för uppdateringsprocessen.
      Modulen har halv ampere förbrukningen toppar (upp till 600 mA, enligt vissa användare) så det är viktigt att använda en strömförsörjning som kan stödja denna förbrukning, speciellt för att uppdatera firmware.

      Anslutning wifi-modul ESP8266 ESP-01 till USB UART TTL-konverterare uppdatering firmware

    5. Kör verktyget för att uppdatera firmware. I mitt fall har jag sparat verktyget och firmwaredokumenten i steg 3 i samma mapp, så jag kör från konsolen:
      cd ~/Datos/firmwareESP8266 (byt till mappen som innehåller verktyget och firmware)
      ./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 ställer in hastigheten på ESP8266 (115200 baud i mitt fall) och --port serieporten den ansluts till (i mitt fall, emulerad, den första USB). De olika dokumenten som utgör den fasta programvaran går bakom write_flash föregås av adressen, med user1.bin-dokumentet som innehåller uppdateringens nyttolast.

      wifi ESP8266 firmwareuppdatering esptool konsolfångst

    Skicka kommandon till ESP8266 wifi-modul

    För att kontrollera ESP8266 från en dator vi måste börja med konfigurera appen för vilken det räcker med att ① välja den port som omvandlaren är ansluten till USB UART TTL, något liknande /dev/USB0 i GNU/Linux och liknande eller något liknande COM6 i Windows, ② välj den hastighet med vilken ESP8266, förmodligen 115200 baud, ③ ställ in 8 databitar plus en stoppbit, utan paritet eller handskakning, och ④ ställ in slutet av raden, beroende på firmware, nästan alltid CR+LF.

    Konfigurera CuteCom för att övervaka ESP8266 wifi-modul med en USB UART TTL-omvandlare

    Konfigurera PuTTY för att övervaka ESP8266 wifi-modulen med en USB UART TTL-omvandlare

    När applikationen är konfigurerad (eller, i förekommande fall, lagrad och vald), är den det öppna anslutningen ("öppen enhet" respektive "öppen", i skärmdumparna i exemplen ovan med CuteCom y PuTTY) och du kan börja skicka beställningar till ESP8266.

    Som kan ses i ESP8266 AT kommandotabell, formatet för att aktivera, avaktivera, ställa in ett värde och hänvisa till det är ganska förutsägbart, men i allmänhet är det inte lätt att komma ihåg dem alla och du kommer förmodligen att behöva ha det till hands för att referera till det.

    Vägen till skicka AT-ordrar al ESP8266 wifi-modul från Arduino är mycket enkelt: ① konfigurera kommunikation med Serial.begin(115200); (eller Serial1, Serial2... på kort med flera seriella hårdvaruportar) och ② skicka kommandona med formatet Serial.print(orden+"\r\n");

    Exemplet ovan visar hur du skickar ESP8266 wifi-modul AT beställningar från Arduino. I det här fallet är det illustrerat AT+CWJAP, som används för att ansluta till en åtkomstpunkt. Detta kommando använder som argument åtkomstpunktsidentifieraren (SSID) och nyckeln, båda inom citattecken, så att de blir ett objekt Srtring och omges av citattecken med hjälp av escape-koden (\"). För att slutföra beställningen, använd \r\n som motsvarar CR y LF.

    För att komma ihåg att den seriella porten inte alltid identifieras med Serial (på vissa tallrikar kan det vara Serial1, Serial2…) portobjektet som används har definierats genom att tilldela det till makrot PUERTO_SERIE. Att upptäcka vilken typ av kort som används kan lägga till lite intelligens till valet av serieportar; Vi kommer att gå igenom hur du kan ta reda på vilken typ av Arduino. Resten av definitionerna är de vanliga som låter dig "namna" de konstanta värdena för att undvika att upprepa dem (och göra misstag) och göra det lättare att ändra dem.

    Ovanstående exempel är tänkt att ansluta ESP8266 wifi-modul till den angivna åtkomstpunkten men var den redan ansluten tidigare? Har anslutningen fungerat? För att veta detta måste vi "lyssna" på vad ESP8266

    Ta emot data från ESP8266 wifi-modul

    Genom att koppla datasniffaren som förklaras ovan till datorn kan du se vad Arduino har skickat till ESP8266 och hans svar. Att läsa från Arduino och behandla informationen i den, kommer det att vara nödvändigt att upptäcka med Serial.available() om någon data har anlänt och i så fall ladda den med Serial.read(). Följande exempel visar hur du läser svaret från AT+CWJAP?, som kommer att rapportera om det finns en anslutning till någon åtkomstpunkt.

    Som på en tallrik Arduino Uno (och i andra) genom att öppna den seriella monitorn återställs programmet, det kan användas för att se i seriekonsolen Arduino informationen du skickar till ESP8266 som skärmdumpen av bilden nedan visar.

    Ta emot data från ESP8266 wifi-modulen från Arduino. Grundläggande exempel

    Analysera svaret som skickas av ESP8266 wifi-modulen

    Vi har redan sett hur man läser informationen som når Arduino från ESP8266. Problemet du måste ta itu med är att du inte vet när det börjar komma, hur lång tid det kommer att ta att komma fram, hur lång tid det kommer att vara... och det är inte särskilt effektivt att vänta på svar från ESP8266 tas emot utan att låta mikrokontroller utföra andra uppgifter under tiden.

    Ett enkelt sätt att hantera denna omständighet är upprepa de mottagna uppgifterna och leta efter konkreta svar som till exempel aktiverar indikatorer (flaggor eller booleska variabler) som avgör om man ska fortsätta söka i den mottagna texten och vilka åtgärder som ska utföras baserat på informationen som kommer från ESP8266. Medan svaret kommer mikrokontroller kan ägna sig åt andra uppgiftert.ex. ta emot data från sensorer och bearbeta det.

    Sök efter en text i informationen från ESP8266

    För att söka i texten som kommer från ESP8266 kan jämför varje mottagen brev med den som motsvarar meddelandet du letar efter. Det kommer att vara nödvändigt att använda en räknare (eller en pekare) som pekar på bokstaven som ska jämföras; Om karaktären som kommer från ESP8266 är densamma som den som undersöks i meddelandet, går räknaren framåt, om den är annorlunda initieras den.

    För att veta att slutet har nåtts, konsulteras nästa tecken i det sökta meddelandet, vilket kommer att vara noll (\0) eller längden på meddelandet lagras för att, genom att jämföra det med räknaren, veta om jämförelsen har avslutats och därför ESP8266 wifi-modul har skickat det önskade meddelandet.

    Följande exempel använder kommandot AT+CWLAP som kommer att returnera en lista med åtkomstpunkter och inom dem söks en som heter "wifi polaridad.es". Även om vi har valt att verifiera att det sista tecknet är noll, eftersom buffert Den lagrar bara den sökta texten och dess längd är känd, det skulle också kunna kontrolleras om ett sådant antal korrekta bokstäver har mottagits. Med en LED kopplad till stift 2 rapporteras att den förväntade texten har hittats.

    I koden i föregående exempel kan du också se ett sätt att välj serieport beroende på typ av kort Arduino Begagnade. Det här exemplet förutsätter att du har tre typer av brädor för projektet: en Arduino Uno, En Arduino Mega 2560 och en arduino leonardo. Om du arbetar med en Arduino Uno den kommer att användas Serial annars Serial1.

    Om du arbetar med en tallrik arduino leonardo Du kan använda samma metod för att stoppa programmet och vänta på konsolen (den seriella porten som är kopplad till Serial) är tillgänglig.

    Sök i olika texter i ESP8266-svaret

    Koden i föregående exempel används för att söka efter text i informationen som skickas av ESP8266 men svaret kan innehålla olika information beroende på operationen. Antag, för att börja med ett enkelt fall i nästa exempel, att texten som skickas av MCU ESP8266 es OK när operationen utförs korrekt och ERROR Annars, som med beställningen AT+CWJAP?, som tjänar till att verifiera om ESP8266 wifi-modul är redan ansluten till en åtkomstpunkt.

    Denna nya implementering av samma metod, som söker efter en matchning med flera möjliga meddelanden, låter dig välja mellan olika åtgärder beroende på svaret som mottagits från ESP8266, slå helt enkelt på LED motsvarande.

    Begränsa tiden det tar att få ett svar

    Hittills har ingen hänvisning gjorts till en relevant fråga: maximal väntetid (timeout) innan övervägande av en operation misslyckades. Om av någon anledning kopplingen till ESP8266 wifi-modul, modulen med åtkomstpunkten, åtkomstpunkten med Internet eller till exempel en hypotetisk server är inte tillgänglig, programmet kan blockeras vid ett tillfälle och väntar på obestämd tid, så ett svar måste artikuleras till sådana omständigheter. Den maximala väntetiden kan konfigureras för hela applikationen, vanligtvis blir den mer "generös" i så fall, eller individuella väntetider kan programmeras för varje operation.

    För att kontrollera att (minst) ett visst tidsintervall har gått "Klockan" för det ögonblick då kontot startas subtraheras vanligtvis från den aktuella "tiden" och det verifieras att skillnaden är större än den önskade gränsen. Denna "tid" behöver inte vara realtid, den motsvarar vanligtvis intervallet som har gått sedan MCU börja räkna tid; Detta påverkar inte programmet eftersom det som är intressant är förfluten tid och inte den absoluta tiden.

    Vanligtvis, för att kontrollera om ett visst intervall har förflutit, används ett uttryck av typen:

    variabel milisegundos_al_empezar innehåller värdet av millis() av ett visst ögonblick i utförandet från vilket det är tidsbestämt, så det är inte ovanligt att dess namn syftar på ordet "kronometer". Variabeln intervalo_de_tiempo innehåller det maximala antalet millisekunder som gör det föregående uttrycket sant, det vill säga det representerar timeout; Det är vanligtvis en konstant (eller ett makro) och som i föregående fall förekommer ordet "TIMEOUT" ofta i dess namn. Om du arbetar med mycket korta intervaller kan du använda micros() istället för millis() (mikrosekunder istället för millisekunder) även om det är mycket mindre vanligt och mycket mindre exakt.

    Ett långt heltal i Arduino (unsigned long) upptar 4 byte (32 bitar), så det största värdet den kan representera är 4294967295 (2 i potensen 32 minus ett, eftersom det börjar på noll). på en tallrik Arduino Medan den körs kontinuerligt kommer millisekundräknaren att återställas (återgå till noll) ungefär var 50:e dag. Vid subtrahering med osignerade datatyper reproduceras samma beteende (vända räknaren) så det är lönsamt att kontrollera timeouten på obestämd tid.

    Ovanstående kod visar en mycket grundläggande implementering av timeout-begränsning med de linjer som är markerade med avseende på exemplet som föregår det. Eftersom timeout-verifieringen utförs efter bearbetning av data som kommer från ESP8266 wifi-modul, kan operationen anses lyckad även om mottagningen tar längre tid än den pålagda väntetiden.

    Utför en komplex operation som definieras av flera AT-kommandon

    För att ha ett exempel på syftet med applikationen som utnyttjar ESP8266 wifi-modul, antar att det är det lagra information i en databas som nås via en webbtjänst för att hålla koll på temperaturen. Följande kod läser av en sensor ansluten till en analog ingång varje visst tidsintervall, beräknar medelvärdet och skickar det efter ett längre tidsintervall till webbservern (stil IoT) genom en petition HTTP (POSTA, HÄMTA...).

    I detta temperaturregistreringsexempel nås en webbserver var femte minut. Även om tillgängligheten inte är särskilt hög kan man förvänta sig att förslaget skulle fungera, men om en högre inspelningsfrekvens skulle behövas skulle andra resurser behöva sättas in, t.ex. databuffert väntar på att skickas, för att skicka flera när servern kan delta och lagra dem när den inte är tillgänglig. Om frekvensen med vilken data behöver registreras var ännu högre, skulle andra typer av protokoll behöva föreslås som ett alternativ till HTTP eller till och med byta ut TCP av UDP för att kunna skicka det mesta av datan med den hastighet som krävs även till priset av att förlora en del.

    Operationerna som utgör uppgiften som ska utföras för att skicka temperaturen skulle vara:

    • Återställ wifi-modulen
    • Koppla från den aktuella åtkomstpunkten (om det finns en standardanslutning)
    • Ställ in inställningarna. För exemplet antas det att anslutningsläget (enkelt) och rollen i Wi-Fi-kommunikation (station) måste konfigureras.
    • Anslut till åtkomstpunkt
    • Verifiera att anslutningen är korrekt (det här är faktiskt startpunkten) Om det inte finns någon anslutning, starta processen från början
    • Anslut till servern
    • Skicka förfrågan HTTP med de uppgifter som ska lagras

    Ordningen på operationerna behöver inte vara exakt så här (även om operationen är det) och varje steg kan kräva flera ESP8266 AT-kommandonTill exempel skulle konfigurationen som anges ovan behöva två: AT+CIPMUX=0 y AT+CWMODE=1.

    En datastruktur för att representera operationer på ESP8266

    I de tidigare exemplen, även om det är på ett mycket grundläggande sätt, föreslås redan en generisk lösning på problemet: använda en datastruktur som lagrar möjliga svar och de åtgärder som måste vidtas i varje enskilt fall; skicka en åtgärd, vänta på ett svar och fortsätt enligt vad svaret betyder. Eftersom varje komplex operation kommer att kräva flera ESP8266 AT-kommandon, måste datastrukturen koppla en operation med andra, efterföljande eller tidigare, som måste utföras i varje enskilt fall beroende på svaret från ESP8266.

    I de tidigare exemplen söktes ett meddelande i svaret från ESP8266 och det tolkades som framgång eller misstag. Förutom en mottagning (och analys) av all mottagen text, För att ha ett generellt minimum är det tillrådligt att även ta hand om ifyllandet av meddelandet eller, med andra ord, till tillgängligheten av ESP8266 wifi-modul att ta emot nya beställningar. På så sätt kan ändringen till ett tillstånd som vi kan kalla, till exempel "wifi tillgängligt", vara att ta emot namnet på åtkomstpunkten och ta emot texten ERROR eller texten OK skulle innebära att ESP8266 du har avslutat svaret och du kan nu skicka nästa AT-kommando till ESP8266.

    Koden ovan använder en vektor (operacion) för att lagra texten för de på varandra följande operationerna som utgör hela uppgiften. En tvådimensionell array används (mensaje) med de tre svaren som analyseras. Som förklarats ovan är det nödvändigt att leta efter de meddelanden som representerar slutet av svaret förutom meddelandet som representerar ett korrekt eller felaktigt svar. Inte alla operationer kommer att ha samma antal möjliga svar; När det finns färre svar kan ett tomt meddelande användas som förbrukar minsta möjliga antal cykler i sin analys (även så är det inte det mest optimala sättet). Logiskt sett kommer det att vara nödvändigt att det minsta antalet sökta svar (tre i exemplet) inkluderar alla driftmöjligheter, även om de inte alla är möjliga.

    När man talar om möjliga svar kan man redan se att detta exempel inte är särskilt användbart för att ta emot data med ett godtyckligt format från en ESP8266 wifi-modul, men grejen är att, i samband med användning med mikrokontroller det är inte vanligt; Det vanligaste är att skicka data som samlats in av de sensorer de har anslutit och/eller få information om vad man ska göra med de ställdon den styr. Mycket värdefull information, som kan förutsägas mycket väl.

    I den tidigare datastrukturen, precis som det görs för att uttrycka de möjliga svaren som analyseras, används också en tvådimensionell matris för att bestämma operationen som måste utföras i varje fall (siguiente_operacion). Specifikt har vi valt att svara på tre typer av meddelanden: ① en godtycklig text (LITERAL) för att verifiera om det finns en anslutning till Wi-Fi-åtkomstpunkten och servern, ② en text för att upptäcka fel i processen (FALLO) och ③ en text som indikerar att operationen slutfördes framgångsrikt (ACIERTO).

    Slutligen finns det ytterligare två vektorer för att ställa in den maximala väntetiden innan du ger upp (timeout) och specificera (configuracion) om operationen avslutas utan att vänta på svar (ESPERAR_RESPUESTA) och meddelanden som indikerar slutet på kommunikationen. Denna sista vektor, för att illustrera ett exempel på hur minne kan sparas, arbetar med bitarna i en konfigurationsbyte för att indikera de olika tillstånden.

    Den första ESP8266 AT-kommandon av datastrukturen alltid förvänta sig ett svar, vilket kan vara framgång eller felmeddelande. När ett fel uppstår startas modulen om och den startar igen och om meddelandet indikerar att operationen är korrekt går den vidare till nästa.

    När du har anslutit till servern ändras mönstret. I detta fall är det nödvändigt att ① skicka längden på datapaketet som ska överföras och ② sammanställa begäran HTTP med en fast text plus värdet (på temperaturen) som skickas för att lagras på servern. Beredningen av dessa uppgifter utförs i varje försändelse och det är nödvändigt att dela upp dem i två (meddela längden) eller tre (skicka förfrågan HTTP) På ESP8266 AT beställning. Endast den sista av de delar som operationen är uppdelad i väntar på svar.

    I det här fallet kommer det att fungera utan problem (kanske varning för att modulen är upptagen) men när längden på data är större kommer det att bli nödvändigt att dela upp datablocken i mindre bitar och det kan till och med bli nödvändigt att implementera en väntan, som görs med temperaturavläsningen, för att ge modulen tid att skicka data utan att fylla dess buffert.

    Tillsammans med andra makron som redan har förklarats tidigare visar exempelkoden ovan hur de olika tillstånden definieras för att specificera om man ska vänta på svar och, i förekommande fall, vilket meddelande som indikerar att det har avslutats.

    Som vid olika punkter i koden kommer en operation att skickas (när det är dags att skicka medeltemperaturen, om väntetiden för en operation överskrids, när den aktuella operationen har slutförts...) men hur man gör det är etablerat globalt, har det definierats som ett makro ENVIAR_OPERACION som grupperar stegen som ingår i sjöfarten.

    Följande är koden för huvudprogrammet i exemplet. Den mest externa uppgiften är den som ansvarar för att ta prover på temperaturen för att beräkna medelvärdet och, varje viss tidsperiod, skickas den till servern med hjälp av ESP8266 wifi-modul. När varje operation har skickats analyseras svaret för att avgöra vilken som är nästa eller om uppgiften att skicka information har slutförts.

    Logiskt sett kan flera optimeringsåtgärder utföras på den tidigare koden, men eftersom detta är ett exempel för att förstå hur ESP8266 På ett generiskt sätt är det bara värt att fokusera på vissa aspekter, den första är datastrukturen. Det verkar som att det logiska är använd en datastruktur för programmeringsspråk (struct) för att representera den information som behandlas: den ESP8266 AT-kommandon och de meddelanden som analyseras.

    Använd en struktur (struct) att lagra data istället för exempelmatriserna (baserat på dem) är trivialt och även om det kan resultera i mer elegant kod, innebär det ingen förbättring av resultatet. Det sanna alternativet som utgörs av användningen av struct är att implementera, som förklaras nedan, variabla längder i strukturer som innehåller "inre" data som de hänvisar till. På så sätt skulle det till exempel inte vara nödvändigt för en operation att ha ett fast antal svar att analysera.

    Detta tillvägagångssätt tyder på att det är det bästa sättet att implementera lösningen men nackdelen är att det skulle vara nödvändigt använd dynamisk minnesallokering, en riskabel praxis att arbeta med en mikrokontroller vilket kräver noggrann mätning av hur mycket minne som kommer att användas vid körning, eftersom kompilatorn knappast kommer att kunna varna oss för detta och det finns en viss möjlighet att tömma minnet (eller stacken) med ödesdigra konsekvenser för programmets exekvering.

    I raden för att optimera koden är det intressant att komma ihåg att i ett program av denna typ, som använder en stor mängd text, kan spara minnesutrymme SRAM lagra textsträngar i programminnet (blixt) med makrot F(). I följande skärmdumpar kan du se olika program och dynamisk minnesfördelning med normal användning av text och med hjälp av makrot F().

    Arduino-kodexempel med text lagrad i programminnet (flash)
    Arduino-kodexempel med text i SRAM

    Med hänsyn till de åtgärder som utförs enligt informationen som kommer från ESP8266 wifi-modul, som ett alternativ till att kontrollera meddelandet från koden och utföra det ena eller det andra enligt vad som tas emot, kan lagras i denna datastruktur pekare till funktioner som utför varje uppgift istället för statusindikatorer (flaggor) som varnar för ett visst tillstånd som applikationen ansvarar för att hantera till exempel inom huvudslingan.

    Följande är ett exempel på strukturer för att lagra data för förfrågningar till ESP8266 (datatypen operacion_esp8266) och deras svar (datatypen respuesta_esp8266).

    Som strukturen som representerar operationen (data som skickas till ESP8266 wifi-modul) hänvisar till strukturen med vilken svaren definieras och strukturen för svaren till strukturen för operationerna, det är nödvändigt att deklarera båda först, genom att definiera den nya datatypen och sedan definiera dess innehåll.

    Det föregående exemplet anser att programmet som innehåller det har valt att använda en Statusindikator, som måste motsvara en variabel tillgänglig från koden som är ansvarig för att utföra en eller annan operation som indikeras av nämnda värde. Om i svaret av ESP8266 När en viss text analyseras tar tillståndet det värde som indikerar strukturen för motsvarande svar.

    Som sagt tidigare skulle ett annat alternativ, antingen att ersätta eller komplettera en statusindikator, vara lagra en funktion i referensstrukturen (en pekare) som skulle kallas när man stöter på viss text i svaret från ESP8266 wifi-modul.

    I det föregående exemplet har det lagts till i datastrukturen som används för att bearbeta svaret från ESP8266 wifi-modul en pekare till en (förmodad) funktion som returnerar data av typen float (kan vara det viktade värdet av en analog avläsning) och till vilken två bytes tillhandahålls som argument (två unsigned char vilket kan vara stiftet från vilket den analoga ingången läses och den som aktiverar ENABLE för en hypotetisk integrerad).

    Under utveckling för MCU, i motsats till vad som händer i utvecklingsstilen för större system, är det inte så ovanligt att använda globala variabler när man definierar det (globala) beteendet för applikationen som styr en assembly, så det kommer inte att vara särskilt ovanligt att hitta den här typen av definitioner som funktioner utan parametrar och som inte returnerar värden, något liknande void (*accion)();

    Om du arbetar med detta sätt att representera data, använder du struct av data med variabel längd, kommer det att vara nödvändigt att dynamiskt allokera minne med malloc() (o new(), om objekt används), som kommer att använda mängden minne som tilldelats som en parameter och returnera en pekare till början av minnesområdet som är reserverat. Med sizeof() På den typ som lagras, multiplicerat med antalet använda element, kan du få mängden minne som behövs. Ett exempel med och utan användning kan ses i skärmdumparna nedan. malloc(); Var försiktig med minnet som används av programmet i det första fallet, du måste ladda biblioteket som innehåller denna funktion.

    Exempel på minnesallokering med malloc på Arduino

    Exempel på textuppgift utan malloc i Arduino

    Om verksamheten på ESP8266 wifi-modul kommer att variera under programmets körning, kommer det att vara nödvändigt att frigöra minnet som inte används med free() (o delete(), om det är föremål). Även om det är rimligt att förvänta sig att kompilatorn (GCC) kommer att optimera programmet för att undvika minnespartitionering, prestanda kommer säkert inte att vara lika optimal som att arbeta med statiskt allokerat minne.

    Även om det i det här exemplet (i båda implementeringarna) inte är så meningsfullt, för att generalisera operationen för att kunna tillämpa den på andra fall, bör det noteras att att skicka data upprepar alltid samma protokoll: meddela antalet byte som kommer att skickas, vänta på indikatorn (>) och skicka data.

    Eftersom det i det här exemplet bara används vid ett tillfälle (hela förfrågan görs i ett paket), verkar det inte särskilt användbart men i allmänhet kan det vara nödvändigt att utföra flera sändningar i samma operation, inklusive fall där de måste överföras avsevärda mängder data som måste fragmenteras för att undvika att minnet strömmar över ESP8266.

    För att implementera detta beteende kan de två sista delarna av anslutningen användas så att varje gång data skickas fylls data med motsvarande värden: i det första fallet, antalet skickade byte och i det andra, ( del av den) begäran som ska överföras.

    För att upprepa tilldelningen och sändningen av de olika elementen som måste sändas kan lagras i en vektor. Denna nya vektor kommer att vara den som bestämmer slutet av den komplexa operationen och inte den sista operationen som hittills.

    1 kommentar

    kommenterar användare
    ดูบอลสด

    Det finns definitivt mycket att ta reda på om detta ämne. Jag gillar alla poänger du gjorde

    Post kommentar

    Du kanske har missat