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> <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> <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> <a href=\"A14\"><button>OFF</button></a>");
client.println("Farol........................: <a href=\"E26\"><button>ON</button></a> <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> <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> <a href=\"A13\"><button>OFF</button></a>");
//client.println(//"<p style=\"color:#ffffff\">PIN 25.......................: <a href=\"E25\"><button>ON</button></a> <a href=\"A25\"><button>OFF</button></a>");
//client.println(//"<p style=\"color:#ffffff\">PIN 26.......................: <a href=\"E26\"><button>ON</button></a> <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!