ESP32 va in tilt

ho costruito un progetto semplice di una scheda ESP32 che legge da un DHT11 temperatura ed umidità e pubblica su https://thingspeak.com/
Tutto funziona perfettamente solo che a volte si imballa tutto e smette di trasmettere.
A volte lavora per un giorno a volte per poche ore.
Sapete cosa potrebbe essere ? Posto il codice per controllo, ovviamente nel Secrets.h vi sono le mie credenziali

#include "Secrets.h"
#include <WiFi.h>
const char ssid[] = SECRET_SSID;
const char password[] = SECRET_PASS;
WiFiClient client;

#include <ThingSpeak.h>
const long CHANNEL = SECRET_CH_ID;
const char *WRITE_API = SECRET_WRITE_APIKEY;


#include <DHT.h>  // Including library for dht
#define DHTPIN 4          //pin where the dht11 is connected
DHT dht(DHTPIN, DHT11);

// inizializza lo schermo
#include <LiquidCrystal_I2C.h>
int lcdColumns = 16;
int lcdRows =2;
// set LCD address, number of columns and rows
// if you don't know your display address, run an I2C scanner sketch
LiquidCrystal_I2C lcd(0x27, lcdColumns, lcdRows);  

//float Temperatura = 0.0;
//float Umidita =0.0;
long prevMillisSensor = 0;
int intervalSensor = 2000;
long prevMillisThingSpeak = 0;
int intervalThingSpeak = 20000; // Minimum ThingSpeak write interval is 15 seconds


void setup()
{

  Serial.begin(115200);
  Serial.println();
  Serial.println("Send Sensor's Data to ThingSpeak Using ESP32");
  Serial.println();

  WiFi.mode(WIFI_STA);
  ThingSpeak.begin(client);  // Initialize ThingSpeak

  dht.begin(); //inizializza DHT

  lcd.begin(); //inizializza lo schermo I2C
  lcd.backlight(); //accende la luce I2


}

void loop()
{


    // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();

  
  if (isnan(h) || isnan(t)) {
    Serial.println(F("Failed to read from DHT sensor!"));
    lcd.setCursor(0,0);
    lcd.print("Controllare il ");
    lcd.setCursor(0,1);
    lcd.print("sensore DHT11 !!");
    return;
  }
  
  // Connect or reconnect to WiFi
  if (WiFi.status() != WL_CONNECTED) {
    Serial.print("Attempting to connect to SSID: ");
    Serial.println(ssid);
    while (WiFi.status() != WL_CONNECTED) {
      WiFi.begin(ssid, password);
      Serial.print(".");
      lcd.clear();
      lcd.print("Cerco il Wifi");
      delay(2000);
      
    }
    Serial.println("\nConnected.");
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Connesso al Wifi");
    delay(3000);
  }

  if (millis() - prevMillisSensor > intervalSensor) {

    
    Serial.print ("Temperatura: ");
    Serial.print(t);
    Serial.print(" gradi / ");


    Serial.print(h);
    Serial.println(" umidità");

    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Temp.: ");
    lcd.print(t);
    lcd.print("c");
    lcd.setCursor(0,1);
    lcd.print("Umidita': ");
    lcd.print(h);
    lcd.print("%");


    prevMillisSensor = millis();
    delay(500);//aggiunto
  }

  if (millis() - prevMillisThingSpeak > intervalThingSpeak) {

    // Set the fields with the values
    ThingSpeak.setField(1, t);
    ThingSpeak.setField(2, h);
    delay(500);//aggiunto

    // Write to the ThingSpeak channel
    int x = ThingSpeak.writeFields(CHANNEL, WRITE_API);
    if (x == 200) {
      Serial.println("Channel update successful.");
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("Carico i dati....");
      lcd.setCursor(0,1);
      lcd.print("via internet >>>");
      delay(2000);
    }
    else {
      Serial.println("Problem updating channel. HTTP error code " + String(x));
    }

    prevMillisThingSpeak = millis();
  }
}

ho dato uno sguardo veloce e ho visto una sola criticità

usi un oggetto String

ma ne fai un uso limitato, quindi non credo che possa essere veramente lui la causa,
cioè: è garantito che ti da/darà problemi, ma mi sembra strano nel breve periodo

male comunque non fa eliminarlo

questa riga:

    else {
      Serial.println("Problem updating channel. HTTP error code " + String(x));
    }

che è praticamente la penultima del programma, cambiala in

    else {
      Serial.print("Problem updating channel. HTTP error code ");
      Serial.println(x);
    }

male non fa di certo, tu fallo e vediamo

Installa l'estensione "ESP exception decode" ( GitHub - me-no-dev/EspExceptionDecoder: Exception Stack Trace Decoder for ESP8266 and ESP32 ).
In questo modo quando va in eccezione hai modo di vedere per quale motivo ed agire di conseguenza.

Visto che ti colleghi ad un server esterno e l'apparente "casualità" dell'errore potrebbe essere che non è ben gestita dalla libreria l'eventuale NON-risposta del server ThingSpeak o qualcosa di simile (in tal caso il reset dovrebbe essere dovuto all'intervento del watchdog).

Ho visto ora che c'è un bel while nel bel mezzo del loop per controllare se c'è connessione.

Visto che stai usando un ESP32, imposta l'auto reconnect e gli event handler per gestire la connessione WiFi invece di quel "pericoloso" pezzo di codice.

cotestatnt:
... invece di quel "pericoloso" pezzo di codice.

:slight_smile: ... vero, però, fortunatamente, dentro quel while() c'è un bel delay() e quindi, almeno il pericolo del wdt reset, dovrebbe essere scongiurato ... :wink:

Guglielmo

gpb01:
almeno il pericolo del wdt reset, dovrebbe essere scongiurato ... :wink:

Vero, però è proprio brutto da vedere :smiley: :smiley:

Grazie per ora a tutti delle annotazioni.
Sto correggendo e vediamo se sarà più stabile.

malgrado tutte le correzioni va ancora in tilt.
non e' la connessione con internet che manca ma sullo schermo appare tipo:
Temperatura 16.2° C
Umidit

e non appare la scritta, va quindi in tilt l'aggiornamento sul display, già cambiato anche lo schermo pensando che fosse difettato, ma stesso problema.

Devo revisare il codice di visione sullo schermo ?

Grazie

Stefano