Appunti ESP8266 – Come risolvere problemi di stabilità
Sembra che l’ESP8266 sia famoso per la sua instabilità, cioè la facilità con cui perde la connessione WiFi si resetta; queste ottime pagine spiegano come ovviare al problema: link1, link2.
Riassumendo:
- Il comando “delay()” resetta il WatchDog Timer (WD o WT); si tratta di un contatore che, se raggiunge un valore troppo alto (maggiore di 5 secondi e non modificabile), fa riavviare il dispositivo; è un sistema di sicurezza per evitare che il sistema, se si blocca, resti bloccato indefinitamente: in “sottofondo” è infatti sempre attivo un controllo hardware sul watchdog, anche quando uno sketch si blocca; se rimane bloccato per troppo tempo, il processore va in autoreset e quindi lo sketch si riavvia; quindi lo sketch deve essere predisposto per potersi riavviare da solo senza l’intervento dell’utente.
- Forse anche il comando wdt_feed() resetta il watchdog, ma probabilmente è un comando dell’SDK di ESP, quindi per utenti evoluti.
- Utilizzando l’ESP8266 come access point (ossia come router o come sever), bisogna evitare di gestire l’attesa dei comandi web durante alla funzione standard loop(), perchè sembra che la loop() interferisca con i meccanismi del wifi; bisogna invece implementare una funzione di callback che viene chiamata quando il client connesso all’ESP gli invia un comando (sketch di esempio: link).
- La connessione WiFi può spesso cadere senza motivo, quindi uno sketch deve sempre prevedere nella funzione loop() un monitoraggio della connessione, per ristabilirla se cade.
Queste righe servono a verificare se è attiva la connessione tra l’ESP e un router, non tra un dispositivo e l’ESP:
while (WiFi.status() != WL_CONNECTED) {
Serial.print(“.”);
delay(500);
}
Quindi vanno dopo la riga:
WiFi.begin(ssid, password);
Dove “ssid” è il nome del router.
Invece, per rilevare la connessione di un dispositivo bisogna usare questo codice:
#include <ESP8266WiFi.h>
WiFi.disconnect(true); // Più che disconnettere, cancella dalla PROM i parametri di connessione usati finora;
WiFi.persistent(false); // Evita che tali parametri vengano poi memorizzati
WiFi.mode(WIFI_AP); // Imposta la modalità di connessione su Access Point
WiFi.softAP(ssid); // Imposta il nome della rete e accende l’access point (senza password)
delay(1000); // Ritardo per azzerare il watchdog
WiFi.onEvent(WiFiEvent); // Rileva tutti gli eventi WiFi nella funzione “WiFiEvent(WiFiEvent_t event); - Quando usa il WiFi, l’ESP8266 ha bisogno di molta più corrente dei 500 mA che può fornire la porta USB di un PC, quindi va alimentato con un trasformatore.
- Anche utilizzare un adattatore USB/seriale può causare interferenze nel WiFi e perdita di connessione, quindi una volta terminate le prove, usare sempre un alimentatore per alimentare l’ESP.
- Ad ogni richiesta http GET proveniente da un client, l’ESP “perde un po’ di memoria (heap)”, per liberarla solo “dopo un po’ “, quindi non si può inondare l’ESP di richieste http GET, bisogna aspettare almeno due minuti tra l’una e l’altra (fonte).
- Un “bug noto” impedisce a SoftAP() di funzionare (cioè di impostare l’ESP come accesspoint) se l’ESP non è anche connesso a un router.
Esiste anche una libreria WiFi specifica che effettua la riconnessione automatica in caso di disconnessione, ma è per una Arduino collegata a un ESP:
https://github.com/ekstrand/ESP8266wifi
grazie mille
Davvero grazie!
Ottimo articolo, molto utile.
in realtà ormai il miglior modo per “risolvere” i problemi di stabilità dell’ESP8266 è passare all’ESP32: direi che l’ESP8266 era solo un prototipo per arrivare all’ESP32.
Un abbraccio e un ben ritrovato dal quel lontano 2005. Scenicmoto e le menate dell’A1000.
Ancora ci sono post in rete http://www.planetmobile.it/jumpjack/adattatore/index2-eng.html
A presto carissimo, Gaetano.
azz, devo ancora finire di scrivere BigKeys… 😉