Operazioni di base su un modulo wifi ESP8266 di Arduino

Operazioni di base su un modulo wifi ESP8266 di Arduino

Operazioni di base su un modulo wifi ESP8266 di Arduino

Quando espresso ha lanciato i primi moduli sul mercato Wi-Fi con l'integrato ESP8266 e il firmware con cui gestirlo utilizzando i comandi AT, ciò che interessava a noi utenti era integrarlo negli assiemi microcontrollori e i problemi si riducevano a conoscere il (precedentemente) oscuro Tabella dei comandi AT ESP8266, esigenze alimentari o Aggiornamento del firmware ESP8266.

Sommario

    Poi sono arrivate rapidamente le alternative per programmare il ESP8266 e implementazioni dei moduli Wi-Fi di formati molto diversi che hanno sollevato altre preoccupazioni: quale modulo wifi ESP8266 scegliere a seconda della portata delle diverse antenne (comprese quelle esterne) o dell'integrazione fisica di questi nuovi moduli nei nostri assemblaggi.

    Sicuramente, a causa di tutti questi cambiamenti, l’enfasi potrebbe non essere stata posta sugli aspetti più elementari, sulla gestione più elementare del Modulo Wi-Fi ESP8266. Sebbene polarità.es È possibile trovare informazioni sull'uso di ESP8266 ed esistono alcune applicazioni destinate a spiegare in modo generico il funzionamento del Modulo Wi-Fi ESP8266 utilizzando i comandi AT, in particolare nell'articolo su libreria per effettuare query HTTP da Arduino con il modulo wifi ESP8266, le impressioni dei lettori suggeriscono che sarebbe utile aggiungere qualche informazione di base per aiutare gli utenti del ESP8266 per realizzare le proprie implementazioni.

    Discutere le operazioni di base per lavorare con ESP8266 e proporre soluzioni generiche è un obiettivo di più parti molto diverse; Per facilitare la comprensione del contenuto dell'articolo, il seguente indice può fungere da guida:

    Controlla il modulo wifi ESP8266 dal computer tramite la porta seriale

    Da un piatto Arduino e utilizzando il tuo IDE è possibile monitorare il funzionamento di a Modulo Wi-Fi ESP8266, Invia il Comandi AT ESP8266 e vedi la risposta ma è molto più comodo farlo da un computer con un'applicazione di tipo terminale.

    Utilizzo di CuteCom per testare il modulo Wi-Fi ESP8266 tramite la porta seriale

    A seconda di quale scheda Arduino utilizzata, potrebbe essere disponibile solo una porta seriale hardware, il che aggiunge un piccolo inconveniente all'invio e alla ricezione. La modifica della velocità di comunicazione è molto più comoda in un'applicazione di comunicazione seriale da un computer e da alcune schede madri. Arduino (e in alcune circostanze) non supportano bene le velocità più elevate delle comunicazioni seriali, in particolare 115200 baud, che è la velocità predefinita delle ultime versioni del firmware.

    Su Quale programma utilizzare per monitorare il ESP8266 utilizzando la porta seriale, ce ne sono tanti tra cui scegliere a seconda delle esigenze e delle preferenze; ultimamente sto usando di più il classico carinoCom (quello nello screenshot qui sopra) perché per me è molto comodo ripeterne alcuni Ordini AT per modulo wifi ESP8266 nella sperimentazione del progetto.

    Qui sono già state fornite alcune raccomandazioni sui programmi che funzionano come console seriale; Ad esempio, quando si parla di PuTTY per il controllo dei dispositivi seriali UART dal computer. PuTTYOltre ad essere un'ottima applicazione, è disponibile per la maggior parte dei sistemi operativi desktop. Inoltre, come PuTTY può essere utilizzato per fungere da console sia con la porta seriale che con Famiglia di protocolli Internet (TCP/IP), compresi quelli che operano su TLS, diventa uno strumento comune che più che ripaga il (poco) tempo impiegato a configurarlo e ad abituarsi al suo utilizzo.

    Utilizzo di PuTTY per testare il modulo Wi-Fi ESP8266 tramite la porta seriale

    Oltre al software di comunicazione seriale, per collegare il Modulo Wi-Fi ESP8266 al porto USB Un computer richiede anche un convertitore USB alle serie TTL. Come nel caso del software, esistono diverse versioni, dalle quali vengono utilizzate solo per convertire la porta USB su una porta seriale TTL (ottenibile con un Euro) a quelli che possono emulare protocolli diversi (come SPI o I2C).

    Proprio come un programma che funziona come una console seriale, l'hardware tramite cui comunicare con il computer USB con un circuito logico (non solo il ESP8266) sarà uno strumento comune nel lavoro di uno sviluppatore di applicazioni microcontrollate, vale la pena averlo nella cassetta degli attrezzi il prima possibile e lavorarci Modulo Wi-Fi ESP8266 È un'eccellente opportunità per ottenerne uno.

    Hardware per comunicazioni seriali USB UART per monitorare il modulo wifi ESP8266

    Il convertitore USB a bus digitale UART TTL Può anche essere utilizzato per monitorare il comportamento di un circuito che utilizza il ESP8266, per fare ciò, le uscite che si vogliono monitorare sono collegate in serie all'ingresso dati (RX) del convertitore con un diodo veloce (il 1N4148, ad esempio) e un resistore (ad esempio 2K2) in parallelo tra loro. Tale configurazione funziona come uno sniffer seriale hardware.

    Esempio di sniffer per ESP8266 collegato ad Arduino utilizzando un convertitore USB UART TTL

    Anche se lo sniffer nell'immagine sopra è sicuramente rudimentale (tra l'altro non ha bufferizzare) è sufficiente per monitorare il funzionamento di un assieme Arduino e il ESP8266.

    Togliendo lo sniffer dallo schema precedente, il schema che mostra come collegare a Modulo Wi-Fi ESP8266 ad un piatto Arduino. Oltre ad alimentarlo a 3V3, il pin di reset ed il pin di attivazione dell'integrato devono essere collegati a livello alto (enable). Naturalmente, il pin RX di uno deve connettersi al TX dell'altro.

    Per semplificare lo schema precedente è stata rappresentata una piastra Arduino alimentato a 3V3 e per il quale si presuppone anche una tensione sulla porta seriale pari a 3V3. Se usi a microcontrollore con un livello di segnale diverso sulla porta seriale (tipicamente 5 V) sarà necessario, per non danneggiare il ESP8266, usare un convertitore di livello come quelli negli schemi seguenti. Questo circuito si trova spesso in molte implementazioni di moduli commerciali standard.

    Convertitore di livello del segnale da 5 V a 3 V per modulo WiFi ESP3 e Arduino

    Aggiorna il firmware ESP8266

    Le Comandi AT ESP8266, la sua terminazione, la velocità predefinita del modulo... dipendono dalla versione del file Firmware ESP8266. È meglio assicurarsi di avere la stessa versione in tutti i moduli e, se possibile, che sia la versione più recente.

    Sfortunatamente, la maggior parte dei Modelli di moduli Wi-Fi ESP8266 Hanno solo 4Mbit, quindi non è possibile installare la versione più recente. L'ultima versione (ufficiale) del firmware su cui è possibile installare Moduli Wi-Fi ESP8266 con 4 Mbit (la maggior parte) è 0.9.4 che include la versione 0.2 del Comandi AT ESP8266.

    In sintesi, per aggiornare il firmware è necessario:

    1. Scarica la versione firmware corrispondente. il ultima versione (ufficiale) per un modulo con 4Mbit di memoria, che si trova nella cartella Espressif su github. Nel Sito dell'Espressif È possibile scaricare la versione più recente del firmware, ma è molto importante verificare che il modulo su cui è installato disponga di memoria sufficiente.

    2. Scarica la versione più recente dello strumento di installazione del firmware. Il mio preferito è pioppo tremulo che c'è scritto Python, quindi funziona su qualsiasi piattaforma. Oltre ad essere scaricato, può anche essere installato con pip install esptool (o pip2 o python -m pip…). Ovviamente, espresso Offre anche il proprio strumento ma attualmente è disponibile solo per Windows.

    3. Preparare i file scaricati; decomprimeteli in una cartella accessibile e, se necessario, rendete eseguibile lo strumento pioppo tremulo, nel mio caso, da allora GNU / Linux, Con chmod +x esptool

    4. Collega il modulo al computer utilizzando un convertitore USB bus digitale UART TTL che funziona a 3V3 oppure utilizzare un convertitore di livello se funziona a 5 V. Oltre all'alimentazione, dovrai collegare TX a RX del convertitore USB bus digitale UART TTL, RX to TX, GPIO0 a basso livello (GND) e forse GPIO2 ad alto livello (nei miei test ha funzionato sia collegandolo a basso livello che disconnettendolo). Se il modulo ha la connessione GPIO15 libera (come avviene nell'ESP-12) deve essere collegato a livello basso. Il RESET, che normalmente sarebbe a livello alto durante il funzionamento, può essere lasciato scollegato oppure collegato a livello alto tramite una resistenza (10K, ad esempio), poiché prima di iniziare la registrazione potrebbe essere necessario resettare il dispositivo collegandolo ad un livello basso.
      Accendendo il modulo sarà disponibile per l'aggiornamento ma, Se viene visualizzato un errore di connessione, sarà necessario reimpostarlo collegando RESET a livello basso per un istante e poi lasciandolo in onda (senza connettersi) per il processo di aggiornamento.
      Il modulo ha picchi di consumo di mezzo ampere (fino a 600 mA, secondo alcuni utenti) quindi è importante utilizzare un alimentatore in grado di supportare questo consumo, soprattutto per l'aggiornamento del firmware.

      Modulo wifi di connessione ESP8266 ESP-01 al firmware di aggiornamento del convertitore USB UART TTL

    5. Eseguire lo strumento per aggiornare il firmware. Nel mio caso, ho salvato i documenti dello strumento e del firmware nel passaggio 3 nella stessa cartella, quindi eseguo dalla console:
      cd ~/Datos/firmwareESP8266 (passare alla cartella contenente lo strumento e il 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 imposta la velocità di ESP8266 (115200 baud nel mio caso) e --port la porta seriale a cui si collega (nel mio caso, emulata, la prima USB). I diversi documenti che compongono il firmware vanno dietro write_flash preceduto dall'indirizzo, con il documento user1.bin contenente il payload dell'aggiornamento.

      aggiornamento firmware wifi ESP8266 acquisizione console esptool

    Invia comandi al modulo Wi-Fi ESP8266

    Per controllare il ESP8266 da un computer dovremo iniziare configurare l'app per cui basterà ① scegliere la porta a cui è collegato il convertitore USB bus digitale UART TTL, qualcosa di simile a /dev/USB0 in GNU/Linux e simili o qualcosa del genere COM6 in Windows, ② scegli la velocità alla quale ESP8266, probabilmente 115200 baud, ③ imposta 8 bit di dati più un bit di stop, senza parità o handshake, e ④ imposta la fine della linea, a seconda del firmware, quasi sempre CR+LF.

    Configura CuteCom per monitorare il modulo Wi-Fi ESP8266 utilizzando un convertitore USB UART TTL

    Configura PuTTY per monitorare il modulo Wi-Fi ESP8266 con un convertitore USB UART TTL

    Una volta che l'applicazione è configurata (o, se del caso, memorizzata e selezionata), lo è aprire la connessione ("apri dispositivo" e "apri", rispettivamente, negli screenshot degli esempi sopra con carinoCom y PuTTY) e puoi iniziare a inviare ordini a ESP8266.

    Come si può vedere nel Tabella dei comandi AT ESP8266, il formato per attivare, disattivare, impostare un valore e fare riferimento ad esso è abbastanza prevedibile, ma in generale non è facile ricordarli tutti e probabilmente sarà necessario averlo a portata di mano per consultarlo.

    La forma di inviare Agli ordini al Modulo Wi-Fi ESP8266 da Arduino è molto semplice: ① configurare le comunicazioni con Serial.begin(115200); (o Serial1, Serial2… su schede con più porte seriali hardware) e ② inviare i comandi utilizzando il formato Serial.print(orden+"\r\n");

    L'esempio sopra mostra come inviare il file Ordini AT per modulo wifi ESP8266 da Arduino. In questo caso è illustrato AT+CWJAP, che viene utilizzato per connettersi a un punto di accesso. Questo comando utilizza come argomenti l'identificatore del punto di accesso (SSID) e la chiave, entrambe tra virgolette, in modo che diventino un oggetto Srtring e racchiuderli tra virgolette utilizzando il codice escape (\"). Per completare l'ordine utilizzare \r\n che corrisponde a CR y LF.

    Da ricordare che non sempre la porta seriale viene identificata con Serial (su certi piatti può essere Serial1, Serial2…) è stato definito l'oggetto porta utilizzato assegnandolo alla macro PUERTO_SERIE. Rilevare il tipo di scheda utilizzata potrebbe aggiungere un po' di intelligenza alla selezione della porta seriale; Successivamente esamineremo come scoprire il tipo di Arduino. Il resto delle definizioni sono le solite che permettono di "dare un nome" ai valori costanti per evitare di ripeterli (e di commettere errori) e rendere più semplice modificarli.

    L'esempio sopra dovrebbe connettere il file Modulo Wi-Fi ESP8266 all'access point indicato ma era già connesso prima? La connessione ha funzionato? Per sapere questo, dobbiamo "ascoltare" ciò che il ESP8266

    Ricevi dati dal modulo Wi-Fi ESP8266

    Collegando lo sniffer di dati spiegato sopra al computer puoi vedere cosa Arduino ha inviato il ESP8266 e la sua risposta. Da leggere Arduino ed elaborare le informazioni in esso contenute che sarà necessario rilevare Serial.available() se sono arrivati ​​dei dati e in tal caso caricarli Serial.read(). L'esempio seguente mostra come leggere la risposta da AT+CWJAP?, che segnalerà se è presente una connessione a qualsiasi punto di accesso.

    Come su un piatto Arduino Uno (e in altri) l'apertura del monitor seriale ripristina il programma, può essere utilizzato per vedere nella console seriale Arduino le informazioni a cui invii ESP8266 come mostra lo screenshot dell'immagine qui sotto.

    Ricevi dati dal modulo wifi ESP8266 da Arduino. Esempio di base

    Analizza la risposta inviata dal modulo wifi ESP8266

    Abbiamo già visto come leggere le informazioni che arrivano Arduino dalla ESP8266. Il problema con cui devi fare i conti è che non sai quando inizierà ad arrivare, quanto tempo ci vorrà per arrivare, quanto durerà... e non è molto efficiente aspettare la risposta dal ESP8266 viene ricevuto senza lasciare che il microcontrollore svolgere altri compiti nel frattempo.

    Un modo semplice per gestire questa circostanza è iterare sui dati ricevuti cercando risposte concrete con cui, ad esempio, attivare indicatori (flag o variabili booleane) che determineranno se proseguire la ricerca nel testo ricevuto e quali azioni compiere in base alle informazioni che arrivano dal ESP8266. Mentre arriva la risposta microcontrollore può dedicarsi ad altri compiti, ad esempio, ricevere dati dai sensori e elaborarli.

    Cerca un testo nelle informazioni ricevute dall'ESP8266

    Per cercare il testo che proviene da ESP8266 possono essere confronta ogni lettera ricevuta con quella che corrisponde al messaggio che stai cercando. Sarà necessario utilizzare un contatore (o un puntatore) che punti alla lettera da confrontare; Se il carattere che arriva dal ESP8266 è uguale a quello in esame nel messaggio, il contatore avanza, se è diverso viene inizializzato.

    Per sapere se è stata raggiunta la fine viene consultato il carattere successivo del messaggio cercato, che sarà zero (\0) oppure la lunghezza del messaggio memorizzato per, confrontandolo con il contatore, sapere se il confronto è terminato e quindi il Modulo Wi-Fi ESP8266 ha inviato il messaggio desiderato.

    L'esempio seguente utilizza il comando AT+CWLAP che restituirà un elenco di punti di accesso e al loro interno ne verrà cercato uno chiamato "wifi polaridad.es". Sebbene abbiamo scelto di verificare che l'ultimo carattere sia zero, poiché il bufferizzare Memorizza solo il testo cercato e se ne conosce la lunghezza, si può anche verificare se è stato ricevuto un numero tale di lettere corrette. Con un LED collegato al pin 2 viene segnalato che è stato trovato il testo atteso.

    Nel codice dell'esempio precedente puoi anche vedere un modo per scegliere la porta seriale a seconda del tipo di scheda Arduino usato. Questo esempio presuppone che tu abbia tre tipi di schede per il progetto: uno Arduino Uno, One Arduino Mega2560 e Arduino Leonardo. Se lavori con a Arduino Uno verrà utilizzato Serial e altrimenti Serial1.

    Se lavori con un piatto Arduino Leonardo È possibile utilizzare lo stesso metodo per arrestare il programma e attendere la console (la porta seriale associata a Serial) è disponibile.

    Cerca vari testi nella risposta ESP8266

    Il codice nell'esempio precedente viene utilizzato per cercare testo nelle informazioni inviate dal ESP8266 ma la risposta potrebbe includere informazioni diverse a seconda dell'operazione. Supponiamo, per iniziare con un caso semplice nel prossimo esempio, che il testo inviato da MCU ESP8266 es OK quando l'operazione viene eseguita correttamente e ERROR Altrimenti, come con l'ordine AT+CWJAP?, che serve a verificare se il Modulo Wi-Fi ESP8266 è già connesso a un punto di accesso.

    Questa nuova implementazione dello stesso metodo, che ricerca una corrispondenza tra più messaggi possibili, permette di scegliere tra diverse azioni a seconda della risposta ricevuta dal ESP8266, è sufficiente accendere il LED quello corrisponde.

    Limita il tempo necessario per ricevere una risposta

    Finora non è stato fatto alcun riferimento ad una questione rilevante: l' tempo massimo di attesa (timeout) prima di considerare un'operazione fallita. Se per qualsiasi motivo la connessione con il Modulo Wi-Fi ESP8266, il modulo con il punto di accesso, il punto di accesso con Internet o, ad esempio, un ipotetico server non è disponibile, il programma potrebbe bloccarsi in un punto in attesa indefinitamente, quindi una risposta dovrà essere articolata a tali circostanze. È possibile configurare il tempo di attesa massimo per l'intera applicazione, solitamente sarà più "generoso" in quel caso, oppure è possibile programmare tempi di attesa individuali per ogni operazione.

    Per verificare che sia trascorso (almeno) un certo intervallo di tempo Solitamente si sottrae il “tempo” del momento in cui si avvia il conto al “tempo” attuale e si verifica che la differenza sia maggiore del limite desiderato. Questo "tempo" non deve essere necessariamente tempo reale, di solito corrisponde all'intervallo trascorso dal MCU iniziare a contare il tempo; Ciò non influisce sul programma poiché ciò che interessa è il tempo trascorso e non il tempo assoluto.

    Solitamente per verificare se è trascorso un certo intervallo si utilizza un'espressione del tipo:

    La variabile milisegundos_al_empezar contiene il valore di millis() di un certo momento dell'esecuzione da cui viene cronometrato, quindi non è insolito che il suo nome faccia riferimento alla parola "cronometro". La variabile intervalo_de_tiempo contiene il numero massimo di millisecondi che rende vera l'espressione precedente, ovvero rappresenta il timeout; Solitamente è una costante (o una macro) e, come nel caso precedente, nel suo nome compare spesso la parola "TIMEOUT". Se lavori con intervalli molto brevi puoi usare micros() al posto di millis() (microsecondi invece di millisecondi) sebbene sia molto meno comune e molto meno preciso.

    Un numero intero lungo in Arduino (unsigned long) occupa 4 byte (32 bit), quindi il valore più grande che può rappresentare è 4294967295 (2 elevato a 32 meno uno, perché inizia da zero). su un piatto Arduino Durante il funzionamento continuo, il contatore dei millisecondi si azzererà (tornerà a zero) circa ogni 50 giorni. Quando si sottrae con tipi di dati senza segno viene riprodotto lo stesso comportamento (capovolgendo il contatore), quindi è possibile controllare il timeout indefinitamente.

    Il codice sopra mostra a implementazione molto elementare della limitazione del timeout incorporando le righe segnate rispetto all'esempio che lo precede. Poiché la verifica del timeout viene eseguita dopo l'elaborazione dei dati provenienti dal file Modulo Wi-Fi ESP8266, l'operazione si può considerare andata a buon fine anche se la ricezione richiede un tempo superiore al tempo di attesa imposto.

    Esegui un'operazione complessa definita da più comandi AT

    Per avere un esempio di riferimento dello scopo dell'applicazione che sfrutta il Modulo Wi-Fi ESP8266, supponiamo che lo sia memorizzare le informazioni in un database a cui si accede tramite un servizio web per tenere traccia della temperatura. Il seguente codice legge un sensore collegato ad un ingresso analogico ogni certo intervallo di tempo, calcola il valore medio e, dopo un intervallo di tempo più lungo, lo invia al web server (stile IoT) attraverso a richiesta HTTP (POSTA, OTTIENI...).

    In questo esempio di registrazione della temperatura si accede a un server web ogni cinque minuti. Sebbene la disponibilità non sia particolarmente elevata, è prevedibile che la proposta funzioni, ma se fosse necessaria una frequenza di registrazione più elevata, dovrebbero essere implementate altre risorse, ad esempio un buffer dei dati in attesa di essere inviato, per inviarne diversi quando il server può essere presente e memorizzarli per quando non è disponibile. Se la frequenza con cui i dati devono essere registrati fosse ancora maggiore, si dovrebbero proporre altri tipi di protocolli in alternativa a quello HTTP o addirittura sostituire TCP by UDP poter inviare la maggior parte dei dati alla velocità richiesta anche a costo di perderne alcuni.

    Le operazioni che compongono l'attività da eseguire per inviare la temperatura sarebbero:

    • Ripristina il modulo Wi-Fi
    • Disconnettersi dal punto di accesso corrente (nel caso esista una connessione predefinita)
    • Configura le impostazioni. Nell'esempio si presuppone che sia necessario configurare la modalità di connessione (semplice) e il ruolo nelle comunicazioni Wi-Fi (stazione).
    • Connettersi al punto di accesso
    • Verificare che la connessione sia corretta (in realtà questo è il punto di ingresso) Se non c'è connessione, riavviare il processo dall'inizio
    • Connettiti al server
    • Invia la richiesta HTTP con i dati da memorizzare

    L'ordine delle operazioni non deve essere esattamente questo (anche se l'operazione lo è) e ogni passaggio potrebbe richiederne diversi Comandi AT ESP8266Ad esempio, la configurazione sopra elencata ne richiederebbe due: AT+CIPMUX=0 y AT+CWMODE=1.

    Una struttura dati per rappresentare le operazioni sull'ESP8266

    Negli esempi precedenti, seppure in modo molto elementare, viene già suggerita una soluzione generica al problema: utilizzare una struttura dati che memorizza le possibili risposte e le azioni che devono essere intraprese in ciascun caso; invia un'azione, attendi una risposta e procedi in base al significato della risposta. Poiché ogni operazione complessa ne richiederà diverse Comandi AT ESP8266, la struttura dati deve collegare un'operazione con altre, successive o precedenti, che dovranno essere effettuate caso per caso a seconda della risposta del ESP8266.

    Negli esempi precedenti, un messaggio veniva cercato all'interno della risposta del file ESP8266 ed è stato interpretato come un successo o un errore. Oltre ad una ricezione (e analisi) di tutto il testo ricevuto, Per avere un minimo generico è consigliabile occuparsi anche della compilazione del messaggio o, in altre parole, alla disponibilità del Modulo Wi-Fi ESP8266 per ricevere nuovi ordini. In questo modo, il passaggio ad uno stato che potremmo chiamare, ad esempio, "wifi disponibile", potrebbe essere ricevere il nome del punto di accesso e ricevere il testo ERROR o il testo OK significherebbe che il ESP8266 hai terminato la risposta e ora puoi inviare quella successiva Comando AT su ESP8266.

    Il codice sopra utilizza un vettore (operacion) per memorizzare il testo delle operazioni successive che compongono l'attività completa. Viene utilizzato un array bidimensionale (mensaje) con le tre risposte analizzate. Come spiegato sopra, è necessario cercare i messaggi che rappresentano la fine della risposta oltre al messaggio che rappresenta una risposta corretta o errata. Non tutte le operazioni avranno lo stesso numero di risposte possibili; Quando ci sono meno risposte, è possibile utilizzare un messaggio vuoto che consuma il minor numero possibile di cicli nella sua analisi (anche così, non è il modo ottimale). Logicamente sarà necessario che il numero minimo di risposte richieste (tre nell'esempio) comprenda tutte le possibilità operative, anche se non tutte possibili.

    Parlando delle possibili risposte si può già vedere che questo esempio non è molto utile per ricevere dati con un formato arbitrario da un Modulo Wi-Fi ESP8266, ma il fatto è che, nel contesto dell'uso con microcontrollori non è normale; La cosa più comune è inviare i dati raccolti dai sensori che hanno collegato e/o ricevere informazioni su cosa fare con gli attuatori che controlla. Informazioni molto preziose, che possono essere previste molto bene.

    Nella precedente struttura dati, così come si fa per esprimere le possibili risposte che si analizzano, viene utilizzata anche una matrice bidimensionale per determinare l'operazione che deve essere eseguita in ciascun caso (siguiente_operacion). Nello specifico, abbiamo scelto di rispondere a tre tipologie di messaggi: ① un testo arbitrario (LITERAL) per verificare se è presente una connessione al punto di accesso Wi-Fi e al server, ② un testo per rilevare errori nel processo (FALLO) e ③ un testo che indica che l'operazione è stata completata con successo (ACIERTO).

    Infine, ci sono altri due vettori per impostare il tempo massimo di attesa prima di arrendersi (timeout) e specificare (configuracion) se l'operazione termina senza attendere una risposta (ESPERAR_RESPUESTA) e messaggi che indicano la fine della comunicazione. Quest'ultimo vettore, per illustrare un esempio di come si potrebbe risparmiare memoria, funziona con i bit di un byte di configurazione per indicare i diversi stati.

    Il primo Comandi AT ESP8266 della struttura dati si aspettano sempre una risposta, che può essere il messaggio di successo o di errore. Quando si verifica un errore, il modulo viene riavviato e riparte e se il messaggio indica che l'operazione è corretta, passa a quella successiva.

    Una volta connesso al server, lo schema cambia. In questo caso è necessario ① inviare la lunghezza del pacchetto dati da trasmettere e ② comporre la richiesta HTTP con un testo fisso più il valore (della temperatura) che viene inviato per essere memorizzato sul server. La preparazione di questi dati viene effettuata in ogni spedizione ed è necessario dividerli in due (comunicare la durata) o in tre (inviare la richiesta HTTP) per ESP8266 AT ordine. Solo l'ultima delle parti in cui è suddivisa l'operazione attenderà una risposta.

    In questo caso funzionerà senza problemi (magari avvisando che il modulo è occupato) ma quando la lunghezza dei dati sarà maggiore sarà necessario dividere i blocchi di dati in pezzi più piccoli e potrebbe anche essere necessario implementare un'attesa, poiché viene effettuata la lettura della temperatura, per dare tempo al modulo di inviare i dati senza riempirli bufferizzare.

    Insieme ad altre macro già spiegate in precedenza, il codice di esempio qui sopra mostra come vengono definiti i diversi stati con cui specificare se attendere una risposta ed eventualmente quale messaggio indica che è terminata.

    Poiché in diversi punti del codice verrà inviata un'operazione (quando è il momento di inviare la temperatura media, se viene superato il tempo di attesa di un'operazione, quando l'operazione corrente viene completata con successo...) ma come farlo è affermato a livello globale, è stato definito una macro ENVIAR_OPERACION che raggruppa le fasi coinvolte nella spedizione.

    Quello che segue è il codice del programma principale dell'esempio. Il compito più esterno è quello preposto a campionare la temperatura per calcolarne la media e, ogni certo periodo di tempo, la invia al server tramite il comando Modulo Wi-Fi ESP8266. Una volta inviata ciascuna operazione, la risposta viene analizzata per determinare quale sarà la successiva o se l'attività di invio delle informazioni è stata completata.

    Logicamente si possono effettuare diverse azioni di ottimizzazione sul codice precedente ma, trattandosi di un esempio per capire come funziona il ESP8266 In maniera generica è opportuno soffermarsi solo su alcuni aspetti, primo fra tutti la struttura dei dati. Sembra che la cosa logica sia utilizzare una struttura dati del linguaggio di programmazione (struct) per rappresentare le informazioni in corso di elaborazione: il Comandi AT ESP8266 e i messaggi che vengono analizzati.

    Utilizzare una struttura (struct) memorizzare i dati invece degli array di esempio (basati su di essi) è banale e, sebbene possa risultare in un codice più elegante, non implica alcun miglioramento nel risultato. La vera alternativa posta dall'uso di struct è quello di attuare, come spiegato di seguito, lunghezze variabili in strutture che contengono dati “interni”. a cui fanno riferimento. In questo modo, ad esempio, non sarebbe necessario che un'operazione avesse un numero fisso di risposte da analizzare.

    Questo approccio suggerisce che sia il modo migliore per implementare la soluzione, ma lo svantaggio è che sarebbe necessario utilizzare l'allocazione dinamica della memoria, una pratica rischiosa lavorando con a microcontrollore che richiede un'attenta misurazione della quantità di memoria che verrà utilizzata in fase di esecuzione, poiché difficilmente il compilatore sarà in grado di avvisarci e c'è una certa possibilità di esaurire la memoria (o lo stack) con conseguenze fatali per l'esecuzione del programma.

    Nell'ottica dell'ottimizzazione del codice, è interessante ricordare che, in un programma di questo tipo, che utilizza una grande quantità di testo, può risparmiare spazio di memoria SRAM memorizzazione di stringhe di testo nella memoria del programma (flash) con la macro F(). Nelle schermate seguenti puoi vedere il diverso programma e la distribuzione dinamica della memoria con l'uso normale del testo e usando la macro F().

    Esempio di codice Arduino utilizzando il testo memorizzato nella memoria del programma (flash)
    Esempio di codice Arduino utilizzando il testo nella SRAM

    Rispetto alle azioni che vengono eseguite in base alle informazioni che arrivano dal Modulo Wi-Fi ESP8266, in alternativa alla verifica del messaggio dal codice ed effettuando l'uno o l'altro a seconda di quanto ricevuto, possono essere memorizzati in questa struttura dati puntatori alle funzioni che eseguono ciascuna attività invece degli indicatori di stato (flag) che avvisano di un certo stato che l'applicazione è incaricata di gestire, ad esempio, all'interno del loop principale.

    Di seguito è riportato un esempio di strutture per memorizzare i dati delle richieste al ESP8266 (il tipo di dati operacion_esp8266) e le relative risposte (il tipo di dati respuesta_esp8266).

    Poiché la struttura che rappresenta l'operazione (i dati inviati al file Modulo Wi-Fi ESP8266) si riferisce alla struttura con cui vengono definite le risposte, e la struttura delle risposte alla struttura delle operazioni, è necessario dichiararli prima entrambi, definendo il nuovo tipo di dati e quindi definendone il contenuto.

    L'esempio precedente considera che il programma che lo include abbia scelto di utilizzare a indicatore di stato, che deve corrispondere ad una variabile accessibile dal codice che ha il compito di eseguire l'una o l'altra operazione come indicato da detto valore. Se nella risposta di ESP8266 Quando si analizza un certo testo, lo stato assume il valore che indica la struttura della risposta corrispondente.

    Come detto prima, un’altra alternativa, per sostituire o integrare un indicatore di stato, sarebbe memorizzare una funzione nella struttura di riferimento (un puntatore) che verrebbe richiesto incontrando un determinato testo nella risposta del Modulo Wi-Fi ESP8266.

    Nell'esempio precedente è stato aggiunto alla struttura dati utilizzata per elaborare la risposta dal Modulo Wi-Fi ESP8266 un puntatore a una (presunta) funzione che restituisce un dato di tipo float (potrebbe essere il valore ponderato di una lettura analogica) e al quale vengono forniti due byte come argomenti (two unsigned char che potrebbe essere il pin da cui viene letto l'ingresso analogico e quello che attiva l'ENABLE di un ipotetico integrato).

    In sviluppo per MCU, contrariamente a quanto avviene nello stile di sviluppo per sistemi più grandi, non è così raro utilizzare variabili globali quando si definisce il comportamento (globale) dell'applicazione che controlla un assembly, quindi non sarà particolarmente raro trovare questo tipo di definizioni come funzioni senza parametri e che non restituiscono valori, qualcosa del genere void (*accion)();

    Se lavori con questo modo di rappresentare i dati, utilizzando struct di dati a lunghezza variabile, sarà necessario allocare dinamicamente la memoria malloc() (o new(), se vengono utilizzati oggetti), che utilizzerà la quantità di memoria allocata come parametro e restituirà un puntatore all'inizio dell'area di memoria riservata. Con sizeof() Dalla tipologia memorizzata, moltiplicata per il numero di elementi utilizzati, si ottiene la quantità di memoria necessaria. Un esempio con e senza utilizzarlo può essere visto negli screenshot qui sotto. malloc(); Fare attenzione alla memoria utilizzata dal programma: nel primo caso è necessario caricare la libreria che contiene questa funzione.

    Esempio di allocazione della memoria con malloc su Arduino

    Esempio di assegnazione di testo senza malloc in Arduino

    Se le operazioni su Modulo Wi-Fi ESP8266 varierà durante l'esecuzione del programma, sarà necessario liberare la memoria non utilizzata free() (o delete(), nel caso di oggetti). Sebbene sia ragionevole aspettarsi che il compilatore (GCC) ottimizzerà il programma per evitare il partizionamento della memoria, sicuramente le prestazioni non saranno ottimali come quando si lavora con la memoria allocata staticamente.

    Sebbene in questo esempio (in entrambe le implementazioni) non abbia molto senso, per generalizzare l'operazione per poterla applicare ad altri casi è bene notare che L'invio dei dati ripete sempre lo stesso protocollo: notificare il numero di byte che verranno inviati, attendere l'indicatore (>) e inviare i dati.

    Dato che in questo esempio viene utilizzato una sola volta (l'intera richiesta viene fatta in un unico pacchetto), non sembra molto utile ma, in generale, può essere necessario effettuare più invii nella stessa operazione, compresi i casi in cui devono essere Vengono trasmesse quantità significative di dati che devono essere frammentate per evitare di sovraccaricare la memoria del ESP8266.

    Per implementare questo comportamento si possono utilizzare gli ultimi due elementi della connessione in modo che ogni volta che i dati vengono inviati, i dati vengano riempiti con i valori corrispondenti: nel primo caso il numero di byte inviati e nel secondo il ( parte della) richiesta.da trasmettere.

    Per ripetere l'assegnazione e l'invio dei diversi elementi che devono essere trasmessi è possibile memorizzarli in un vettore. Questo nuovo vettore sarà quello che determinerà la fine dell'operazione complessa e non l'ultima operazione come fino ad ora.

    1 commento

    commenti utente
    dūbxls̄d

    C'è sicuramente molto da scoprire su questo argomento. Mi piacciono tutti i punti che hai fatto

    Invia commento

    Potresti aver perso