Ciao a tutti,
ho scritto un piccolo codice per creare un orologio digitale con un modulo ESP8266-01S e un display i2c TM1637 che si aggiorna ogni giorno ad una certa ora tramite WiFi e server NTP.
Funziona perfettamente, si connette al WiFi domestico, ottiene l'ora correttamente e poi chiude la connessione WiFi. Questo subito dopo il primo avvio.
Al successivo aggiornamento programmato, durante la fase di connessione all'AP, cioè durante l'esecuzione del ciclo while()
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
ottengo un Soft WDT reset Exception(4)
Dopo questo soft reset tutto funziona come al primo avvio, si connette al WiFi e acquisisce l'ora quindi in pratica non è di fatto un grosso problema ma mi piacerebbe capire se e dove sbaglio. Sono conscio del fatto che con un processore single core come l'8266 i loop bloccanti possono essere un problema, ma vorrei capire... come mai alla prima esecuzione il reset non avviene?
Ho provato ad abbassare il delay a 250, ho anche provato ad aggiungere uno yield() nel ciclo while ma non c'è verso, anzi con lo yield() ottengo un Soft WDT reset Panic __yield().
Questa è la funzione nella quale avviene il reset:
void UpdateTime() {
ITimer.detach(); //ferma il timer
disp.point(false); //spegne i due punti sul display
disp.displayByte(_t, _U, _P, _d); //visualizza tUPd sul display
delay(1000);
// Connect to Wi-Fi
Serial.printf("\n\nUpdate time from NTP Server");
Serial.printf("\nConnecting to WiFi");
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.printf("\nWiFi succesfully connected to %s", ssid);
Serial.print("\nLocal IP Address: ");
Serial.println(WiFi.localIP());
Serial.println();
//Init and get the time
configTzTime(TZ_Europe_Rome, ntpServer1, ntpServer2);
if (getLocalTime(&timeinfo)) {
Serial.println("Date and time succesfully acquired from NTP Server");
//disconnect WiFi as it's no longer needed
Serial.println("Disconnect from WiFi\n");
WiFi.disconnect(true);
WiFi.mode(WIFI_OFF);
} else {
Serial.println("Failed to obtain time");
return;
}
ITimer.attach(Tick_Second, TimerHandler); //riattiva il timer (500 ms)
}
Grazie anticipate per i suggerimenti



