[RISOLTO] ESP32-PICO-D4 e pulsante di reset

Buongiorno a tutti, ho acquistato una schedina ESP32-PICO-D4 dove vorrei far girare un programma che su Esp8266 funziona regolarmente. A parte un errore di compilazione in WiFi.softAP(AP.ssid, AP.password) risolto inserendo WiFi.softAP(AP.ssid.c_str(), AP.password.c_str()) tutto sembrava andare liscio. Il monitor seriale risponde regolarmente, viene generato l’AP e una volta connesso riesco a puntare alle pagine in memoria dell’ESP32 senza problemi. Questo fino a quando non premo il pulsante di reset. A questo punto il monitor seriale continua a visualizzare i dati come dopo il caricamento del programma ma, pur restando attiva la connessione con l’AP, dal client le pagine non vengono più raggiunte. Pensando a qualche errore nel mio programma ho provato a caricarci un demo trovato su https://lastminuteengineers.com/creating-esp32-web-server-arduino-ide/ e che qui, per comodità, riporto al posto del mio che risulta troppo lungo ma purtroppo il comportamento risulta analogo.

#include <WiFi.h>
#include <WebServer.h>

/* Put your SSID & Password */
const char* ssid = "ESP32";  // Enter SSID here
const char* password = "12345678";  //Enter Password here

/* Put IP Address details */
IPAddress local_ip(192,168,1,1);
IPAddress gateway(192,168,1,1);
IPAddress subnet(255,255,255,0);

WebServer server(80);

uint8_t LED1pin = 4;
bool LED1status = LOW;

uint8_t LED2pin = 5;
bool LED2status = LOW;

void setup() {
  Serial.begin(115200);
  pinMode(LED1pin, OUTPUT);
  pinMode(LED2pin, OUTPUT);

  WiFi.softAP(ssid, password);
  WiFi.softAPConfig(local_ip, gateway, subnet);
  delay(100);
  
  server.on("/", handle_OnConnect);
  server.on("/led1on", handle_led1on);
  server.on("/led1off", handle_led1off);
  server.on("/led2on", handle_led2on);
  server.on("/led2off", handle_led2off);
  server.onNotFound(handle_NotFound);
  
  server.begin();
  Serial.println("HTTP server started");
}
void loop() {
  server.handleClient();
  if(LED1status)
  {digitalWrite(LED1pin, HIGH);}
  else
  {digitalWrite(LED1pin, LOW);}
  
  if(LED2status)
  {digitalWrite(LED2pin, HIGH);}
  else
  {digitalWrite(LED2pin, LOW);}
}

void handle_OnConnect() {
  LED1status = LOW;
  LED2status = LOW;
  Serial.println("GPIO4 Status: OFF | GPIO5 Status: OFF");
  server.send(200, "text/html", SendHTML(LED1status,LED2status)); 
}

void handle_led1on() {
  LED1status = HIGH;
  Serial.println("GPIO4 Status: ON");
  server.send(200, "text/html", SendHTML(true,LED2status)); 
}

void handle_led1off() {
  LED1status = LOW;
  Serial.println("GPIO4 Status: OFF");
  server.send(200, "text/html", SendHTML(false,LED2status)); 
}

void handle_led2on() {
  LED2status = HIGH;
  Serial.println("GPIO5 Status: ON");
  server.send(200, "text/html", SendHTML(LED1status,true)); 
}

void handle_led2off() {
  LED2status = LOW;
  Serial.println("GPIO5 Status: OFF");
  server.send(200, "text/html", SendHTML(LED1status,false)); 
}

void handle_NotFound(){
  server.send(404, "text/plain", "Not found");
}

String SendHTML(uint8_t led1stat,uint8_t led2stat){
  String ptr = "<!DOCTYPE html> <html>\n";
  ptr +="<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=no\">\n";
  ptr +="<title>LED Control</title>\n";
  ptr +="<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}\n";
  ptr +="body{margin-top: 50px;} h1 {color: #444444;margin: 50px auto 30px;} h3 {color: #444444;margin-bottom: 50px;}\n";
  ptr +=".button {display: block;width: 80px;background-color: #3498db;border: none;color: white;padding: 13px 30px;text-decoration: none;font-size: 25px;margin: 0px auto 35px;cursor: pointer;border-radius: 4px;}\n";
  ptr +=".button-on {background-color: #3498db;}\n";
  ptr +=".button-on:active {background-color: #2980b9;}\n";
  ptr +=".button-off {background-color: #34495e;}\n";
  ptr +=".button-off:active {background-color: #2c3e50;}\n";
  ptr +="p {font-size: 14px;color: #888;margin-bottom: 10px;}\n";
  ptr +="</style>\n";
  ptr +="</head>\n";
  ptr +="<body>\n";
  ptr +="<h1>ESP32 Web Server</h1>\n";
  ptr +="<h3>Using Access Point(AP) Mode</h3>\n";
  
   if(led1stat)
  {ptr +="<p>LED1 Status: ON</p><a class=\"button button-off\" href=\"/led1off\">OFF</a>\n";}
  else
  {ptr +="<p>LED1 Status: OFF</p><a class=\"button button-on\" href=\"/led1on\">ON</a>\n";}

  if(led2stat)
  {ptr +="<p>LED2 Status: ON</p><a class=\"button button-off\" href=\"/led2off\">OFF</a>\n";}
  else
  {ptr +="<p>LED2 Status: OFF</p><a class=\"button button-on\" href=\"/led2on\">ON</a>\n";}

  ptr +="</body>\n";
  ptr +="</html>\n";
  return ptr;
}

Vi scrivo per avere possibilmente qualche suggerimento sul motivo del blocco e su eventuali azioni da compiere per risolverlo. Utilizzo W10 e Arduino IDE 1.8.7 .
Alcuni dubbi che mi son venuti: se non vado a scrivere dati su memoria permanente resettando non dovrei riportarlo alla situazione originaria? Forse il pulsante di reset non funziona come aspettato o sbaglio procedura? Quando si utilizza il pulsante di boot?

Se il tasto reset funziona come sulla maggior parte di schede di sviluppo, non "cancella" la flash.

Probabilmente ho espresso male la domanda. Sono cosciente che il reset non cancella la memoria permanente. Quello che intendevo dire è che un programma può modificare il suo funzionamento in base a quello che viene scritto in flash o EEprom. Se però nulla viene scritto in memoria permanente il reset, salvo smentite, dovrebbe riportare il micro nelle stesse condizioni iniziali del post caricamento.

Ulteriori INFO

Ho provato a modificare il codice sopra riportato cambiando la modalità di funzionamento da Soft Access Point (soft-AP) a Station (STA). In questa modalità tutto sembra funzionare anche dopo svariati reset.

Codice:

  WiFi.softAP(ssid, password);
  WiFi.softAPConfig(local_ip, gateway, subnet);
  delay(100);

sostituito con:

WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.println("");

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

il problema è che il mio programma dovrebbe funzionare anche senza la presenza di una rete Wifi preesistente e quindi attendo suggerimenti.

Nuove info

Fino a questo momento tutti i tentativi li ho effettuati da PC con W10 e browser Chrome. Medesimo problema anche da Internet Explorer. Dopo averle provate tutte ho tentato anche la strada di Android e sorpresa, sorpresa, da qui le pagine risultano raggiungibili ad ogni restart.
Sinceramente la cosa mi ha lasciato basito. L'unica cosa strana che ho visto è che visualizzando le reti wireless disponibili sia da Windows che da Android, nel momento del restart dell' ESP32 da Windows si vede che il Soft_AP cade e poi si ripristina mentre da Android "apparentemente" non cade o quantomeno non visualizza la caduta......
Ribadisco che col ESP8266 su entrambi i sistemi non si riscontravano problemi dopo il restart.
Ulteriore differenza la sto riscontrando utilizzando EEPROM.put(). Su ESP32 pur non dando errori ne di compilazione ne blocchi di esecuzione i dati non vengono salvati.

[RISOLTO SCRITTURA SU EEPROM]

Per quanto riguarda la scrittura in EEPROM ho risolto. Avevo inserito un EEPROM.end di troppo. Ora i dati vengono salvati regolarmente.

Dopo N tentativi per risolvere il problema iniziale la situazione era peggiorata. L' AP si attivava ma nel momento in cui cercavo di connettermi sia da PC che da Smartphone l'ESP32 faceva un reboot con segnalazione guru... su core 0. Cercando nei più disparati forum ho trovato che il problema non era solo mia ma molti altri lo avevano riscontrato ma nessuno aveva dato una risposta risolutiva. Finalmente leggendo la descrizione di una anomalia diversa dalla mia ma sempre inerente al WiFi ho trovato un intervento che ha aiutato a risolvere anche il mio problema.

          WiFi.mode(WIFI_AP);
          delay(200);
          boolean EsitoConf = WiFi.softAPConfig(AP.IP, AP.Gateway, AP.Subnet);
          delay(200);
          boolean EsitoAtt = WiFi.softAP(AP.ssid.c_str(), AP.password.c_str());        
          delay(200);
        
          if (EsitoConf == true && EsitoAtt == true) Serial.println("Ready"); else Serial.println("Failed!");
        
          IPAddress myIP = WiFi.softAPIP();
          Serial.print("AP IP address: "); Serial.println(myIP); Serial.println("HTTP server started");
        
          delay(200);
        
          server.on("/", HTTP_GET, PaginaHome);
          server.on("/Home.htm", HTTP_GET, PaginaHome);
          server.on("/Pagina1.htm", HTTP_GET, Pagina1);
          server.on("/Pagina2.htm", HTTP_GET, Pagina2);
          server.on("/Pagina3.htm", HTTP_GET, Pagina3);
          server.onNotFound(PaginaNonTrovata);
        
          Serial.println("Pagine caricate");
          delay(200);
        
          server.begin();
          delay(200);

Anche se non ne ho capito il motivo l'inserimento dei vari delay(200) ha risolto il mio problema.
Ringrazio tutti per i preziosissimi consigli che mi avete fornito.