ESP32 Sistema de encendido de luces casa

Hola a todos, esperando que se encuentren super bien, tengo hace tiempo un proyecto, cual está "terminado", de encendido de las luces de mi casa con un arduino ESP32 y Relays de 8, el tema mi arduino, lo logré programar con los dos núcleos, en base a mil búsquedas por internet de como hacerlo, hasta que lo logré, conectado a WIFI y todo, pero, me pasa que cuando, por ABC motivo se cae el WIFI, el arduino se "cuelga", es decir, pierde el hilo de lo que tenía hecho, es decir, por ejemplo, a x hora se prende una luz, pero si se cae el wifi, no funciona nada más, y tampoco se puede acceder a él, les comparto el código, por si alguien me puede dar una manito, desde ya, les estoy tremendamente agradecido, saludos a todos!!!


//#include <boarddefs.h>
#include <IRremote.h>
#include <IRremoteInt.h>
//#include <ir_Lego_PF_BitStreamEncoder.h>

byte SEND_PIN = 5;
//IRsend irsend(SEND_PIN);

//#include <IRremote.h>
//#include <IRremoteInt.h>

//#include <EasyDDNS.h>

#include <ESP32MailHTTPClient.h>
#include <ESP32TimeHelper.h>
#include <ESP32_MailClient.h>
#include <RFC2047.h>
#include <ssl_client32.h>
#include <WiFiClientSecureESP32.h>

#include <WiFi.h>
#include <NTPClient.h>
#include <WiFiUdp.h>
//#include <math.h>
#include <Arduino.h>
//#include <Thermistor.h>

//#include <LiquidCrystal_I2C.h>
//#include <EasyDDNS.h>;


//#define THERMISTOR_PIN_CON1 

TaskHandle_t Tarea1;


const char* ssid     = "MikroTik-7A54AD";
const char* password = "****";

//unsigned long t_LuzFondo;

bool bandera = true;


SMTPData datosSMTP;

WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP);
 
WiFiServer server(80);

//-----------------variables para encendido y apagado de luces en horario---------------

String formattedDate,
       dayStamp,
       timeStamp,
       hora1,
       hora2,
       hora3,
       hora4,hora5,hora6,
       hreset,
       hmi,
       hmt,estado16,estado27,estado17,estado25,
       estado14,estado12,estado13,estado26,
       estdoorpatio, estdoorliving,
       estp1, estp2, correo;


bool evento_inicio = true,      // variable de control para inicio de evento con valor true
 evento_fin = true,         // variable de control para finalizacion de evento con valor true
 evento_inicio2 = true,
 evento_fin2 = true,
 evento_inicio3 = true,
 evento_fin3 = true,
 evento_inicio4 = true,
 evento_fin4 = true;

//---------------variables para uso de pantalla----------------------
 
int lcdcols = 16;
int lcdfilas = 2;

//LiquidCrystal_I2C lcd(0x27, lcdcols, lcdfilas);

String scrollmensaje;
String mensajefijo = "Nueva Tarea";

const int luzv = 25;
const int luzf = 26;
const int luza = 16;
const int lint = 17;


void connectToWiFi() {
  Serial.begin(115200);
  Serial.printf("Connecting to WiFi %s\n", ssid);
  //WiFi.config(staticIP, gateway, subnet);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }
  Serial.println("Esta es la IP para conectar: ");
  Serial.print("http://");
  Serial.println(WiFi.localIP());
  //Serial.println(WiFi.localIP());
  //Serial.println(WiFi.macAddress());
}

void pinesyvariables(){
  pinMode(luza, OUTPUT);
  pinMode(lint, OUTPUT);
  pinMode(luzv, OUTPUT);
  pinMode(luzf, OUTPUT); 
  pinMode(12, OUTPUT);
  pinMode(14, OUTPUT);
  pinMode(27, OUTPUT);
  //Y los ponemos en alto
  //digitalWrite(13, HIGH);
  digitalWrite(luza, HIGH);
  digitalWrite(lint, HIGH);
  digitalWrite(luzv, HIGH);
  digitalWrite(luzf, HIGH);
  digitalWrite(12, HIGH);
  digitalWrite(14, HIGH);
  digitalWrite(27, HIGH); 
  //delay(10);

  estado16="apagados";
  estado26="apagado";
  estado17="apagadas";
  estado25="apagada";
}

void setup(){
    //Serial.begin(115200);

    connectToWiFi();

    pinesyvariables();
    
    //Serial.print("Setup() se corre en el nucleo: ");
    //Serial.println(xPortGetCoreID());

      xTaskCreatePinnedToCore(
      loop_tarea1, //Funcion de la tarea1 
      "Tarea1",  //Nombre de la tarea 
      10000,   //Tamaño de la pila 
      NULL,   //Parametros de entrada 
      0,   //Prioridad de la tarea 
      &Tarea1,   //objeto TaskHandle_t. 
      0);  //Nucleo //donde se correra 
    
    // Seteamos estos pines como salida
    //pinMode(13, OUTPUT);      
     
    /*Comenzamos conectándonos a una red WiFi
    /*if (!WiFi.config(ip, gateway, subnet, primaryDNS, secondaryDNS)){
      Serial.println("Error en la configuración.");
    }*/
    //Serial.println();
    //Serial.println();
    //Serial.printf("Conectando con red WiFi : %s\n", ssid);
    //Serial.println(ssid);
 
    //WiFi.begin(ssid, password);
 
    //while (WiFi.status() != WL_CONNECTED) {
    //    delay(500);
    //    Serial.print(".");
    //}
    //Serial.println("");
    //Serial.println("Esta es la IP para conectar: ");
    //Serial.print("http://");
    //Serial.println(WiFi.localIP());
    
    server.begin();

    timeClient.begin();
    timeClient.setTimeOffset(-10800);
    /*14400 horario invierno
     *10800 horario de verano 
     * 
     */
    
 
}
 
//int value = 0;

void loop_tarea1(void * pvParameters)
{
  while(1){
   delay(1000);
   virgencita();
   
  }
}
 
void loop(){
  while(!timeClient.update()) {
    timeClient.forceUpdate();
    }
  formattedDate = timeClient.getFormattedDate();
  int splitT = formattedDate.indexOf("T");
  dayStamp = formattedDate.substring(0, splitT);
  timeStamp = formattedDate.substring(splitT+1, formattedDate.length()-1);
  Serial.print("Hora: ");
  Serial.println(timeStamp);
  
  delay(1000);
  
  WiFiClient client = server.available();   // Escuchando a los clientes entrantes
  if (client) {                             // Si hay un cliente,
    Serial.println("Nuevo cliente");        // Imprime un mensaje en el puerto serie
    String currentLine = "";                // String para contener datos entrantes del cliente
    while (client.connected()) {            // Bucle mientras el cliente está conectado
      if (client.available()) {             // Si hay bytes para leer del cliente,
        char c = client.read();             // Lee un caracter
        Serial.write(c);                    // Lo imprimimos en el monitor serial
        if (c == '\n') {                    // Si el byte es un carácter de nueva línea
          if (currentLine.length() == 0) {
            client.println("HTTP/1.1 200 OK");
            client.println("Content-type:text/html");
            client.println();
            // Contenido HTML
            client.println("<!DOCTYPE html>");
            //client.println("<body style=\"background-color:#000000;\">");
            client.println("<html xmls='http://www.w3.org/1999/xhtml'>");
            client.println("<head>");
            client.println("<meta charset='utf-8' />");
            client.println("<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">");
            client.println("<title>IoT CASA MIRANDA - MUÑOZ</title>");
            //client.println(//"body {background: url(https://serving.photos.photobox.com/10362846aa896d8feef15c779e265fd08298dcba496c13528af439f183e2ef167723bce4.jpg);  font-weight: lighter;  width: 100%;}");
            client.println("</head>");
            client.println("<body>");
            client.println("<font face='Consolas'>");
            client.println("<h1 style=\"width:500px;height:20px;\">IoT CASA MIRANDA - MUÑOZ </h1>");
            client.println("</br>");
            client.println("Virgencita...................:  <a href=\"E25\"><button>ON</button></a>&nbsp;<a href=\"A25\"><button>OFF</button></a>");
            client.println("</br>");
            client.print("La Virgencita está : ");
            client.println(estado25);
            client.println("</br>");
            client.print("Se enciende a las : ");
            client.print(hora1);
            client.print(" y se apaga a las : ");
            client.println(hora2);
            client.println("<br><br>");  
            client.println("Luces interiores.............:  <a href=\"E17\"><button>ON</button></a>&nbsp;<a href=\"A17\"><button>OFF</button></a>");
            client.println("<br>");
            client.print("Las  luces interiores están : ");
            client.println(estado17);client.println("</br>");
            /*client.print("Se encienden a las : ");
            client.print(hmi);
            client.print(" y se apagan a las : ");
            client.println(hmt);*/
            client.println("<br><br>");
            //client.println(//"<p style=\"color:#ffffff\">PIN 14.......................:  <a href=\"E14\"><button>ON</button></a>&nbsp;<a href=\"A14\"><button>OFF</button></a>");
            client.println("Farol........................:  <a href=\"E26\"><button>ON</button></a>&nbsp;<a href=\"A26\"><button>OFF</button></a>");
            client.println("<br>");
            client.print("El farol está : ");
            client.println(estado26);
            client.println("</br>");
            client.print("Se enciende a las : ");
            client.print(hora3);
            client.print(" y se apaga a las : ");
            client.println(hora2);
            client.println("<br><br>");
            client.println("Alero y cobertizo............:  <a href=\"E16\"><button>ON</button></a>&nbsp;<a href=\"A16\"><button>OFF</button></a>");
            client.println("<br>");
            client.println("El alero y cobertizo están : ");
            client.println(estado16);
            client.println("</br>");
            client.print("Se enciende a las : ");
            client.print(hora5);
            client.print(" y se apaga a las : ");
            client.println(hora6);
            client.println("<br><br>");
            client.println("Luces Navideñas..............:  <a href=\"E13\"><button>ON</button></a>&nbsp;<a href=\"A13\"><button>OFF</button></a>");
            //client.println(//"<p style=\"color:#ffffff\">PIN 25.......................:  <a href=\"E25\"><button>ON</button></a>&nbsp;<a href=\"A25\"><button>OFF</button></a>");
            //client.println(//"<p style=\"color:#ffffff\">PIN 26.......................:  <a href=\"E26\"><button>ON</button></a>&nbsp;<a href=\"A26\"><button>OFF</button></a>");
            //client.println(//"<a href=\"pmenu\"><button>MENU</a></button></p>");
            client.println("</body>");
            client.println("</html>");
            client.println();
            // Salir del ciclo while:
            break;
          } else {    // si tienes una nueva línea, borra currentLine:
            currentLine = "";
          }
        } else if (c != '\r') {  
          currentLine += c;      
        }
        // Verifica si la solicitud del cliente fue "GET /E" de encendido o "GET /A de apagado":
        //-------------ENCENDER Y APAGAR LUZ VIRGENCITA----------
        if (currentLine.endsWith("GET /A25")) {
          digitalWrite(luzv, HIGH);
          estado25 = "apagada"; 
          Serial.println(" ");
          Serial.println( "Virgencita apagada manualmente" ); 
        }
        if (currentLine.endsWith("GET /E25")) {
          digitalWrite(luzv, LOW);
          estado25 = "encendida";
          Serial.println(" ");
          Serial.println( "Virgencita Encendida manualmente" );
        }
        //-------------ENCENDER APAGAR LUZ DEL FAROL--------------
        if (currentLine.endsWith("GET /A26")) {   //Enciende apaga farol
          digitalWrite(luzf, HIGH);
          //evento_fin3 = false;
          estado26="apagado"; 
          Serial.println(" ");
          Serial.println( "Farol apagado manualmente" );
        }
        if (currentLine.endsWith("GET /E26")) {
          digitalWrite(luzf, LOW);
          //evento_inicio3 = false;
          estado26="encendido";
          Serial.println(" ");
          Serial.println( "Farol encendido manualmente" );
        }
        //------------ENCENDER APAGAR LUCES "NAVIDEÑAS"-----------
        if (currentLine.endsWith("GET /A13")) {
          //irsend.sendNEC(0x8820040A,32);
          delay(500);
          //digitalWrite(13, HIGH);
          //Serial.println(" ");
          //Serial.println( "Luces Navideñas apagadas" );
        }
        if (currentLine.endsWith("GET /E13")) {
          //irsend.sendNEC(0xDC90060A,32);
          delay(500);
          //digitalWrite(13, LOW);         
          //Serial.println(" ");
          //Serial.println( "Luces Navideñas encendidas" );       
        }
        //-----------------------
        /*if (currentLine.endsWith("GET /A25")) {
          digitalWrite(25, HIGH);
          Serial.println(" ");
          Serial.println( "Pin 25 apagado" );
        }
        if (currentLine.endsWith("GET /E25")) {
          digitalWrite(25, LOW);
          Serial.println(" ");
          Serial.println( "Pin 25 encendido" );                
        }
        //-----------------------
        if (currentLine.endsWith("GET /A14")) {
          digitalWrite(14, HIGH);
          Serial.println(" ");
          Serial.println( "Pin 14 apagado" );   
        }
        if (currentLine.endsWith("GET /E14")) {
          digitalWrite(14, LOW);
          Serial.println(" ");
          Serial.println( "Pin 14 encendido" );
        }*/
        //------------LUCES INTERIORES-----------
       if (currentLine.endsWith("GET /A17")) {   //Luces interiores casa
         digitalWrite(lint, HIGH);
         estado17="apagados";
         Serial.println(" ");
         Serial.println("Luces interiores apagadas manualmente");
       }
       if (currentLine.endsWith("GET /E17")) {
         digitalWrite(lint, LOW);
         estado17 = "encendidos";
         Serial.println(" ");
         Serial.println("Luces interiores encendidas manualmente");                 
       }
        //-----------LUCES DEL COBERTIZO------------
        if (currentLine.endsWith("GET /A16")) {  //cobertizo alero
          digitalWrite(luza, HIGH);
          estado16="apagados";
          //evento_fin2 = false;
          Serial.println(" ");
          Serial.println("alero/cobertizo apagado manualmente");
          //correo = "Hola se acaba de apagar la luz del alero - cobertizo manualmente";
          //envio();
        }
        if (currentLine.endsWith("GET /E16")) {
          digitalWrite(luza, LOW);
          estado16="encendidos";
          //evento_inicio2 = false;
          Serial.println(" ");
          Serial.println( "alero/cobertizo encendido manualmente" );
          //correo = "Hola se acaba de encender la luz del alero - cobertizo manualmente";
          //envio();
        }
        //-----------------------
        /*if (currentLine.endsWith("GET /A26")) {  //
          digitalWrite(26, HIGH);                // APAGADO DEL PIN 26
          Serial.println(" ");                   //
          Serial.println( "Pin 26 apagado" );    //
        }
        if (currentLine.endsWith("GET /E26")) {
          digitalWrite(26, LOW);
          Serial.println(" ");
          Serial.println( "Pin 26 encendido" );
        }
        if (currentLine.endsWith("GET /pmenu")) {
          client.println("HTTP/1.1 200 OK");
            client.println("Content-type:text/html");
            client.println();
            // Contenido HTML
            client.println(pmenu);
            client.println();
        }
        if (currentLine.endsWith("GET /pagina")) {
          client.println("HTTP/1.1 200 OK");
            client.println("Content-type:text/html");
            client.println();
            // Contenido HTML
            client.println(pagina);
            client.println();
        }*/
      }
    }
    // Cierra la conexión
    client.stop();
    Serial.println("Cliente desconectado");
  }
  //interiores();
  farolnoche();
  alero();
  rcontadores();
}

void virgencita(){                                  
  while(!timeClient.update()){
    timeClient.forceUpdate();}
  int splitT = formattedDate.indexOf("T");
  dayStamp = formattedDate.substring(0, splitT);
  timeStamp = formattedDate.substring(splitT+1, formattedDate.length()-1);
  hora1 = "20:30:00";
  hora2 = "07:00:00";
  if ( timeStamp == hora1){                                // si hora = 14 y minutos = 30
    if ( evento_inicio == true ){                           // si evento_inicio es verdadero
      digitalWrite(luzv, LOW);                              // activa modulo de rele con nivel alto
      evento_inicio = false;                                // carga valor falso en variable de control
      estado25 = "encendida";
      Serial.println( "Virgencita luz encendida" );         // muestra texto en monitor serie
      correo = "Hola se acaba de encender la luz de la virgencita";
      envio();
    }                                               // para evitar ingresar mas de una vez
  }   
  if ( timeStamp == hora2 ){  // si hora = 15 y minutos = 30
    if ( evento_fin == true ){                      // si evento_fin es verdadero
      digitalWrite(luzv, HIGH);                       // desactiva modulo de rele con nivel bajo
      digitalWrite(luzf, HIGH);
      evento_fin = false;                           // carga valor falso en variable de control
      evento_fin3 = false;
      estado25 = "apagada";
      estado26 = "apagado";
      Serial.println( "Virgencita luz apagada" );         // muestra texto en monitor serie
      correo = "Hola se acaba de apagar la luz de la virgencita y el farol";
      envio();
    }                                               // para evitar ingresar mas de una vez
  }
}

//-------------------------------------------------------------------------------------------

void alero(){                                       // y el cobertizo
  while(!timeClient.update()) {
    timeClient.forceUpdate();
  }
  //DateTime fecha = rtc.now();                       // funcion que devuelve fecha y horario en formato
              // DateTime y asigna a variable fecha
  int splitT = formattedDate.indexOf("T");
  dayStamp = formattedDate.substring(0, splitT);
  timeStamp = formattedDate.substring(splitT+1, formattedDate.length()-1);
  hora5 = "21:00:00";
  hora6 = "00:00:00";
 if ( timeStamp == hora5 ){ // si hora = 14 y minutos = 30
    if ( evento_inicio2 == true ){                   // si evento_inicio es verdadero
      digitalWrite(luza, LOW);                     // activa modulo de rele con nivel alto
      evento_inicio2 = false;                        // carga valor falso en variable de control
      estado16 = "encendido";
      Serial.println( "alero - cobertizo encendido" );         // muestra texto en monitor serie
      correo = "Hola se acaba de encender la luz del alero - cobertizo";
      envio();
    }                                               // para evitar ingresar mas de una vez
  }

 if ( timeStamp == hora6 ){  // si hora = 15 y minutos = 30
    if ( evento_fin2 == true ){                      // si evento_fin es verdadero
      digitalWrite(luza, HIGH);                    // desactiva modulo de rele con nivel bajo
      evento_fin2 = false;                           // carga valor falso en variable de control
      estado16 = "apagado";
      Serial.println( "alero - cobertizo apagado" );         // muestra texto en monitor serie
      correo = "Hola se acaba de apagar la luz del alero - cobertizo";
      envio();
    }                                               // para evitar ingresar mas de una vez
  }
}

//-------------------------------------------------------------------------------------------

void farolnoche(){
  while(!timeClient.update()) {
    timeClient.forceUpdate(); }
  int splitT = formattedDate.indexOf("T");
  dayStamp = formattedDate.substring(0, splitT);
  timeStamp = formattedDate.substring(splitT+1, formattedDate.length()-1);
  hora3 = "21:20:00";
  hora4 = "07:35:00";
    if ( timeStamp == hora3){ 
      if ( evento_inicio3 == true ){
        digitalWrite(luzf, LOW);
        evento_inicio3 = false;
        estado26="encendido";
        Serial.println( "Farol encendido" );
        correo = "Hola se acaba de encender la luz del farol";
        envio();
      }
    }  
    /*if ( timeStamp == hora4 ){                       //ciclo desactivado
    if ( evento_fin3 == true ){                        //para realizar apagado
     digitalWrite(luzf, HIGH);                         //junto al apagado de 
     evento_fin3 = false;                              //la virgencita     
     estado26="apagado";
     Serial.println( "Farol apagado" );
     correo = "Hola se acaba de apagar la luz del farol";
     envio();
    }
   }*/
}

/*void interiores(){        //encendido o apagado de farol y luces de casa madrugada
  while(!timeClient.update()) {
    timeClient.forceUpdate(); }
  int splitT = formattedDate.indexOf("T");
  dayStamp = formattedDate.substring(0, splitT);
  timeStamp = formattedDate.substring(splitT+1, formattedDate.length()-1);
  hmi = "17:45:00";
  hmt = "23:50:00";
    if ( timeStamp == hmi){ 
      if ( evento_inicio4 == true ){
        digitalWrite(lint, LOW);
        evento_inicio4 = false;
        estado17="encendidas";
        Serial.println( "Luces interiores encendidas" );
      }
    }
    if ( timeStamp == hmt ){  // si hora = 15 y minutos = 30
    if ( evento_fin4 == true ){                      // si evento_fin es verdadero
      digitalWrite(lint, HIGH);                    // desactiva modulo de rele con nivel bajo
      evento_fin4 = false;                           // carga valor falso en variable de control
      estado17 = "apagadas";
      Serial.println( "Luces interiores apagadas" );         // muestra texto en monitor serie
    }                                               // para evitar ingresar mas de una vez
  }
    /*if ( timeStamp >= hmi  && timeStamp <= hmt){ 
      if (estado17 == "apagadas"){
        if ( evento_inicio4 == true ){
         digitalWrite(lint, LOW);
         estado17="encendidas";
         Serial.println( "Farol encendido" );
         evento_inicio4 = false;
        }
      }
    }else{
      if (estado17 == "encendidas"){
       if ( evento_fin4 == true ){
         digitalWrite(lint, HIGH);
         estado17="apagadas";
         Serial.println( "Farol apagado" );
         evento_fin4 = false;
       }
     }
    }

   if ( timeStamp >= hmi ){
     if (estado17 == "apagadas"){
       if ( evento_fin4 == true ){
         digitalWrite(lint, HIGH);
         estado17="encendidas";
         Serial.println( "Farol encendido" );
         evento_fin4 = false;
       }
     }
   }*/ 
   /*if ( timeStamp >= hmt ){
     if (estado17 == "encendidas"){
       if ( evento_fin4 == true ){
         digitalWrite(lint, HIGH);
         estado17="apagadas";
         Serial.println( "Farol apagado" );
         evento_fin4 = false;
       }
     }
   }  
}*/

void rcontadores(){
  while(!timeClient.update()) {
    timeClient.forceUpdate();
  }
  //DateTime fecha = rtc.now();                       // funcion que devuelve fecha y horario en formato
              // DateTime y asigna a variable fecha
  int splitT = formattedDate.indexOf("T");
  dayStamp = formattedDate.substring(0, splitT);
  timeStamp = formattedDate.substring(splitT+1, formattedDate.length()-1);
  hreset = "14:00:00";
  //hora4 = "00:00:00";
  if ( timeStamp == hreset ){  // si hora = 2 y minutos = 0 restablece valores de
    evento_inicio = true;       // variables de control en verdadero
    evento_fin = true;
    evento_inicio2 = true;       // variables de control en verdadero
    evento_fin2 = true;
    evento_inicio3 = true;       // variables de control en verdadero
    evento_fin3 = true;
    evento_inicio4 = true;       // variables de control en verdadero
    evento_fin4 = true;
    correo = "";
  }
}

/*void scrollText(int row, String message, int delayTime, int lcdColumns) {
  for (int i=0; i < lcdColumns; i++) {
    message = " " + message;  
  } 
  message = message + " "; 
  for (int pos = 0; pos < message.length(); pos++) {
    lcd.setCursor(0, row);
    lcd.print(message.substring(pos, pos + lcdColumns));
    delay(delayTime);
  }
}*/

/*void pantalla(){
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Accion iniciada");
  scrollText(1, scrollmensaje,150,lcdcols);
  lcd.clear();
}*/

void envio(){
  //lcd.clear();
  //lcd.setCursor(0,0);
  //lcd.print("Enviando Correo");
  //digitalWrite(26, LOW);
  //Configuración del servidor de correo electrónico SMTP, host, puerto, cuenta y contraseña
  datosSMTP.setLogin("smtp.gmail.com", 465, "***", "****");
  // Establecer el nombre del remitente y el correo electrónico
  datosSMTP.setSender("ESP32S", "aleganomas@gmail.com");
  // Establezca la prioridad o importancia del correo electrónico High, Normal, Low o 1 a 5 (1 es el más alto)
  datosSMTP.setPriority("High");
  // Establecer el asunto
  datosSMTP.setSubject("Luces Casa");
  // Establece el mensaje de correo electrónico en formato de texto (sin formato)
  datosSMTP.setMessage(correo, false);
  // Agregar destinatarios, se puede agregar más de un destinatario
  datosSMTP.addRecipient("***");
  
  //Comience a enviar correo electrónico.
  if (!MailClient.sendMail(datosSMTP))
  Serial.println("Error enviando el correo, " + MailClient.smtpErrorReason());
  //Borrar todos los datos del objeto datosSMTP para liberar memoria
  datosSMTP.empty(); 
  delay(10000);
  //lcd.clear();
  //digitalWrite(26, HIGH);
}

como ya dije, gracias a todos!

y sigan cuidándose!

Un ESP32 no es un Arduino. Tu ESP32 al no tener wifi pierde el server local ¿Por qué no comunicas tu ESP32 a un Arduino vía Serial? Se puede pero si no han cambiado las cosas debes poner otra Librería Serial (no la que trae por defecto el IDE) para el ESP32 y así usar 2 puertos Serial. Yo suelo separar la parte del servidor (ESP32) del Arduino que es quien maneja el resto de cosas
Primero porque separo el servidor del resto y segundo porque el ESP32 apenas tiene pines.
¿Se va el Wifi? Bueno el servidor está caído pero los datos (estados del relé) están el en Arduino.

Habría que ver también cómo están conectados esos relés/relay y qué ocurre con el estado en base a los interruptores de tu casa (si es que están conectados a ellos). También está la opción de saber en todo momento si realmente está encendida la luz pero desde la parte hardware.

P.D esos códigos son más viejos que hasta los que yo tengo. Hay algo llamado jquery y ajax y librerías para el ESP32 para usar esto.

Se cae el WIFI? Eso es un problema ajeno al ESP32 entonces porque no te enfocas en resolver porque se cae WIFI.
Tu red WIFI Local no debería caerse y por ende tu acceso al ESP32 no debería perderse.
Estoy en este momento en un lugar donde el Router se tilda o cuelga y como el dueño no tuvo el cuidado de proteger el acceso, he podido ingresar a el y ver el log de fallas. En este caso todo ocurre porque el proveedor de internet ISP no le da el soporte adecuado IPV6 asi que deshabilité el IPV6 y todo funcionó sin problemas desde hace mas de 24 hs y antes no aguantaba ni 4hs. Se colgaba de modo que ni podias acceder, algo que mas o menos se asemeja a lo que relatas.
Asi que ve a tu router, busca el log, revisa que ocurre e investiga como resolverlo.

Ahora si quieres hacer algo a nivel ESP32, mi sugerencia es que cuando el ESP32 se quede sin Red WIFI Local que pase a modo Access Point estableciendo una red propia con acceso como se suele usar con Wifi manager 192.168.4.1 o el que gustes.
De ese modo recuperas el control conectándote directamente a el.

hola maestro surbyte, si, es ajeno al esp, clarin clarinete, el tema es que cuando se cae la señal, por cierto revisaré aquello que me comentaste, el arduino esp32 se ajetona, como que deja de funcionar lo que estaba funcionando, y, comienza a funcionar lo que está desde se cayó en adelante, es decir, lo nuevo, y siempre y cuando se vuelva a conectar, saludos!

Porque estos tres procedimientos tienen de nuevo (ya hay uno en el loop) esto?

  while(!timeClient.update()){
    timeClient.forceUpdate();}

ahh ya veo, actualizan la hora, pero dime cuanto puede cambiar desde el comienzo del loop hasta cada uno de ellos? Muy pocos mseg si todo esta bien programado.
Si por alguna razón la actualización tiene problemas, justamente se queda parado en ese loop infinito y no sale, sea que este en la tarea que se encuentre.
Por ahi esta tu problema.

@elmiranda,

"el arduino esp32" -> Esto no existe.
Los arduinos con Wifi existen pero no son ESP32

¿No será como indica @surbyte qué tienes un bucle infinito, que hasta ahí llega tu código y que con el reinicio del servicio wifi el código vuelve a funcionar hasta esa parte?

no no no, si todo funciona bien, es solo que cuando por abc motivo se cae el wifi, que pasa bien seguido con mi proveedor, cual, revisaré lo que me mencionaste antes, es ahí, cuando el arduino se "cae", y vuelve a iniciar, pero con lo nuevo, es decir, si se cae después de la hora en que se enciende la última de las luces el arduino se "cae" y se vuelve a iniciar, no entiendo pq, porque, como sigo, es casi siempre en momentos que no tengo como saber que se cayó, solo me doy cuenta que, no se encendió alguna de las luces...

hola amigo.
es sencillo desde el setup llamas la función connectToWiFi pero desde el loop nunca compruebas si esta conectado, añade la comprobación y si no estas conectado llama a connectToWiFi de nuevo.
todo listo

if (WiFi.status() != WL_CONNECTED) {
      connectToWiFi ();
  }

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.