This forum uses cookies
This forum makes use of cookies to store your login information if you are registered, and your last visit if you are not. Cookies are small text documents stored on your computer; the cookies set by this forum can only be used on this website and pose no security risk. Cookies on this forum also track the specific topics you have read and when you last read them. Please confirm whether you accept or reject these cookies being set.

A cookie will be stored in your browser regardless of choice to prevent you being asked this question again. You will be able to change your cookie settings at any time using the link in the footer.

  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
CONSULTA Error fatal en ESP32
#1
Saludos, 

Soy nuevo en el foro y vengo desesperado a buscar ayuda porque me estoy quedando sin ideas.
En mi trabajo tengo una máquina electromecánica, y quiero medir los tiempos de trabajo y paro de la máquina.

Para esto, estoy usando un esp32 dev kit 1 con un shield que incluye los bornes para poder conectar cables.

He conectado los contactos normal abiertos de 2 relays a GND (común proveniente de GND de la tarjeta) y a los GPIO 35 y 27.
estas GPIO están configuradas como entradas PULLUP.

Al detectar que los relay se activan o se desactivan, mando a una base de datos de hostinger el estado (marcha, paro o alarma), y luego descargo los datos.

Mi problema es qué, mi ESP 32, empieza trabajando como se espera, pero al cabo de unas horas deja de responder. no reacciona a los relay.


Aunque puede parecer que se queda en algún fallo por comunicación, el puerto serial deja de imprimir lo que está haciendo o envía una serie de caracteres que no he programado en algún baudrate que no he seteado y desconozco.
me parece que no son fallas de conexión porque la falla sucede y un led que le he conectado me ha dejado ver que la salida GPIO 4 que está configurada como LOW, se pasa sola a un estado como si no estuviera configurada o definida.

me da fallo subir el archivo con el código, así que lo pondré acá:

//Librerías de Wifi
#include <WiFi.h>
#include <HTTPClient.h>
//Librerías y objeto para manejo de memoria eeprom
//#include <Preferences.h>      //Incluye la blioteca de EEPROM
//Preferences pref;  //inicia un objeto de memoria no volatil
/*
//Definir los hilos de multi tarea
TaskHandle_t FBTask;
TaskHandle_t SQLTask;
*/
//Server y credenciales de la base de datos
const char* serverName = "https://linkdemanejoyalmacenajededatos.php";
String apiKeyValue = "jfhdskls";
String nodo = "/nodonodo";  //dirección del nodo dentro de la base
//Definir las variables del programa principal y app
bool viSRUN = false;
bool viALARM = false;
int mSTAT = 10;
int INICIAR = 1;
//Definir variables a enviar por el POST
int RUN = 0;
int STOP = 0;
int ALARM = 0;
int COMANDO = 0;
int SENDDATA = 0;
String TALARM = "INICIO";
String USER = "";
String PRODUCT = "";
String SPAUSA = "";
int COUNTP = 0;
//Variables para reinicio de conexión en caso de fallas del wifi
bool reenvio = true;  //Variable para reenviar los datos http en caso de falla
int concheck = 0;
int resetcon = 0;
int intentos = 0;
bool aok = true;
int cuentare = 0;  //contador de fallas
//Define el objeto Servidor para recibir datos por WiFi
WiFiServer server(80);
String header;
//Variables para confirma de lectura de entradas
bool iRun = false;
bool iAlarm = false;
bool tRun = false;
bool tAlarm = false;
unsigned long lastTime, timeout = 2000;
unsigned long tread = 1000;
unsigned long tr1 = 0;
unsigned long tr2 = 0;
//*********Determinar los credenciales de conección a WIFI****************************//
const char* ssid = "wifi";
const char* password = "contraseña";


void conectarWiFi() {
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED && intentos < 30) {
    intentos++;
    Serial.print("Intento de conexión número ");
    Serial.print(intentos);
    Serial.println("...");
    delay(1000);
  }
  if (WiFi.status() == WL_CONNECTED) {
    Serial.println("Conexión WiFi exitosa");
    Serial.print("Dirección IP: ");
    Serial.println(WiFi.localIP());
    intentos = 0;
  } else {
    Serial.println("No se pudo conectar a la red WiFi");
    ESP.restart();
  }
}
void setup() {
  //Setear el PINOUT
  pinMode(2, OUTPUT);         //habilita el pin 4 como salida
  pinMode(4, OUTPUT);         //habilita el pin 4 como salida
  pinMode(14, OUTPUT);        //habilita el pin 14 como salida
  pinMode(22, OUTPUT);        //habilita como Salida START
  pinMode(23, OUTPUT);        //habilita como Salida STOP
  pinMode(27, INPUT_PULLUP);  //habilita el pin 27 como entrada RUN
  pinMode(26, INPUT_PULLUP);  //habilita el pin 26 como entrada  SENSOR
  pinMode(35, INPUT_PULLUP);  //habilita el pin 35 como entrada  ALARMA
  digitalWrite(4, LOW);       //Apaga el RS485
  digitalWrite(14, LOW);      //0VDC
  digitalWrite(22, HIGH);     //RELÉ DE RUN
  digitalWrite(23, HIGH);     //RELÉ DE STOP
  //Definimos los objetos Multitask
  /*
  xTaskCreatePinnedToCore(LFB, "Task1", 8000, NULL, 1, &FBTask, 0);    // Core 0
  xTaskCreatePinnedToCore(LSQL, "Task2", 8000, NULL, 1, &SQLTask, 0);  // Core 0
  */
  //Serial.begin(9600);  //Inicia la comunicación Serial por el puerto COM
  delay(1000);
  Serial.println("Iniciando Wifi...");
  //Llama la funcion de conexion wifi
  conectarWiFi();
  //inicia el objeto de servidor Wifi para leer los post desde la app
  server.begin();
  //Carga los datos de la EEPROM en ajustes de whatsapp
  //pref.begin("WhaSettings", false);
  INICIAR = 1;
  TALARM = "INICIO";
}
void loop() {
  if (INICIAR == 1) {
    if (digitalRead(35) == HIGH) {
      ALARM = 1;
    }
    if (digitalRead(27) == LOW) {
      RUN = 1;
    } else {
      STOP = 1;
    }
    SENDDATA = 1;
    delay(1000);
    INICIAR = 0;
  }
  //Evaluacion si se solicitó enviar datos
  if (SENDDATA == 1) {
    enviodata();
    Serial.println("Envio de data");
  } else {
    //En caso de no intentar enviar datos, se mantiene leyendo cambios de estado
    //Rutina al iniciar el ESP32, manda un registro a la base de datos con el status actual y avisa que se acaba de iniciar el void loop
    //Evaluación y filtrado de los pulsos o interferencias en las entradas del ESP32 (ALARMA)
    if (digitalRead(35) == HIGH) {
      if (tAlarm == false) {
        tr1 = millis();
        tAlarm = true;
      } else {
        if (millis() - tr1 >= tread) {
          iAlarm = true;
        }
      }
    } else {
      if (tAlarm == true) {
        tr1 = millis();
        tAlarm = false;
      } else {
        if (millis() - tr1 >= tread) {
          iAlarm = false;
        }
      }
    }
    //Evaluación y filtrado de los pulsos o interferencias en las entradas del ESP32 (RUN/STOP)
    if (digitalRead(27) == LOW) {
      if (tRun == false) {
        tr2 = millis();
        tRun = true;
      } else {
        if (millis() - tr2 >= tread) {
          iRun = true;
        }
      }
    } else {
      if (tRun == true) {
        tr2 = millis();
        tRun = false;
      } else {
        if (millis() - tr2 >= tread) {
          iRun = false;
        }
      }
    }
    //Rutina de checkeo de cambio de estados
    if (iAlarm == true) {
      if (ALARM == 0) {
        ALARM = 1;
        TALARM = "ALARMA";
        SENDDATA = 1;
      }
      ALARM = 1;
      mSTAT = 3;
    }
    if (iAlarm == false) {
      if (ALARM == 1) {
        ALARM = 0;
        TALARM = "CONFIRMA ALARMA";
        SENDDATA = 1;
      }
      ALARM = 0;
      mSTAT = 4;
    }
    if (iRun == true) {
      if (RUN == 0) {
        RUN = 1;
        STOP = 0;
        TALARM = "RUN";
        SENDDATA = 1;
        Serial.println("MARCHA");
      }
      RUN = 1;
      STOP = 0;
      digitalWrite(2, HIGH);
      mSTAT = 1;
    }
    if (iRun == false) {
      if (RUN == 1) {
        RUN = 0;
        STOP = 1;
        TALARM = "STOP";
        SENDDATA = 1;
        Serial.println("DETENIDA");
      }
      RUN = 0;
      STOP = 1;
      mSTAT = 2;
      digitalWrite(2, LOW);
    }
  }

  /*
  WiFiClient client = server.available();
  if (client) {
    lastTime = millis();
    Serial.println("Nuevo cliente");
    String currentLine = "";
    while (client.connected() && millis() - lastTime <= timeout) {
      if (client.available()) {
        char c = client.read();
        Serial.write©;
        header += c;
        if (c == '\n') {
          if (currentLine.length() == 0) {
            client.println("HTTP/1.1 200 OK");
            client.println("Content-type:text/html");
            client.println("Connection: close");
            client.println();
            //pruebas, habrá que modificar esto
            if (header.indexOf("GET /refresh") >= 0) {
              client.println(mSTAT);
            } else {
              int start = header.indexOf("GET ") + 4;
              int end = header.indexOf("HTTP/1.1") - 1;
              String requestValue = header.substring(start, end);
              Serial.println("Request:");
              //Serial.println(requestValue);
              client.println(mSTAT);
              aok = false;
              char* token = strtok(requestValue.begin(), "$");
              USER = token;
              token = strtok(NULL, "$");
              USER = token;
              token = strtok(NULL, "$");
              PRODUCT = token;
              token = strtok(NULL, "$");
              String strtoint = token;
              COMANDO = strtoint.toInt();
              token = strtok(NULL, "$");
              SPAUSA = token;
              token = strtok(NULL, "$");
            }
            break;
          } else {
            currentLine = "";
          }
        } else if (c != '\r') {
          currentLine += c;
        }
      }
    }
    header = "";
    client.stop();
    Serial.println("Cliente desconectado.");
    Serial.println("");
    Serial.println("Valores extraídos:");
   
    //Serial.println(USER);
    //Serial.println(PRODUCT);
   
    Serial.println(COMANDO);
    if (aok == false) {
      switch (COMANDO) {
        case 1:
          Serial.println("SOLICITUD DE RUN");
          viSRUN = true;
          viALARM = false;
          if (RUN != 1) {
            digitalWrite(22, LOW);
            digitalWrite(23, HIGH);
            TALARM = "CONFIRMA SEGURIDAD";
            Serial.println("ON RELÉ RUN");
            aok == true;
          }
          break;
        case 2:
          viSRUN = false;
          Serial.println("SOLICITUD DE STOP");
          if (STOP != 1) {
            digitalWrite(23, LOW);
            digitalWrite(22, HIGH);
            TALARM = "CONFIRMA SEGURIDAD";
            Serial.println("ON RELÉ STOP");
            aok == true;
          }
          break;
        //Lectura de Comando Alarm
        case 3:
          viALARM = true;
          viSRUN = false;
          if (TALARM != "ALARMA DESDE LA APP") {
            TALARM = "ALARMA DESDE LA APP";
            digitalWrite(23, LOW);
            digitalWrite(22, HIGH);
            if (RUN == 0) {
              SENDDATA = 1;
            }
            Serial.println("SET ALARM");
            aok == true;
          }
          break;
        case 5:
          if (TALARM != SPAUSA) {
            viSRUN = false;
            Serial.println("SET " + SPAUSA);
            digitalWrite(23, LOW);
            digitalWrite(22, HIGH);
            TALARM = SPAUSA;
            SENDDATA = 1;
           
            aok == true;
          }
          break;
      }
    }
  }
  //Evalua si el estado de de la maquina coincide con la solicitud de la app
  if ((viSRUN == true && mSTAT == 1) || (viSRUN == false && mSTAT == 2)) {
    //Si está en pide run y está en run deja las salidas inactivas
    digitalWrite(23, HIGH);
    digitalWrite(22, HIGH);
    //Serial.println("RELÉS DESACTIVADOS");
    COMANDO = 10;
    //Serial.println("SOLICITUD DE LA APP RESUELTA");
  }
*/
  delay(200);
}
void enviodata() {
  //Si está habilitado el WiFi inicia el objeto HTTP
  if (WiFi.status() == WL_CONNECTED) {
    HTTPClient http;
    http.begin(serverName);
    http.addHeader("Content-Type", "application/x-www-form-urlencoded");
    //Envia los datos recibidos a la base de datos
    String httpRequestData = "api_key=" + apiKeyValue + "&RUN=" + RUN + "&STOP=" + STOP + "&ALARM=" + ALARM + "&TALARM=" + TALARM + "&USER=" + USER + "&PRODUCT=" + PRODUCT + "&COUNTP=" + COUNTP + "";
    Serial.print("httpRequestData: ");
    Serial.println(httpRequestData);
    int httpResponseCode = http.POST(httpRequestData);
    //Codigo de verifiacion de la request
    if (httpResponseCode > 0) {
      Serial.print("HTTP Response code: ");
      Serial.println(httpResponseCode);
      reenvio = false;
      concheck = 0;
      SENDDATA = 0;
    } else {
      reenvio = true;
      Serial.print("Error code: ");
      Serial.println(httpResponseCode);
      concheck = concheck + 1;
      Serial.println("Fallas de conexión: ");
      Serial.println(concheck);
      if (concheck >= 20) {
        Serial.println("Demasiadas fallas, reseteando conexión");
        desconectarWiFi();
        reconectarWiFi();
      }
      http.end();
    }
  } else {
    Serial.println("WiFi Disconnected");
    desconectarWiFi();
    reconectarWiFi();
    delay(500);
  }
}
//Funcion para desconectar el wifi en caso de exeder errores
void desconectarWiFi() {
  WiFi.disconnect();
  Serial.println("Desconectado de la red WiFi");
}
//Funcion para reconectar el wifi
void reconectarWiFi() {
  WiFi.reconnect();
  Serial.println("Reconectando a la red WiFi...");
  conectarWiFi();
}

/*
void LFB(void* parameter) {  //
  while (1 == 1) {
    delay(1000);
  }
}
void LSQL(void* parameter) {  //
  while (1 == 1) {
    if (SENDDATA == 1) {
      enviodata();
      Serial.println("Envio por el core: " + xPortGetCoreID());
    }
    delay(200);
  }
}
*/
  Responder


Posibles temas similares…
Tema Autor Respuestas Vistas Último mensaje
  PROBLEMAS CON UN ESP32 carsoto 5 510 14-06-2022, 09:51 PM
Último mensaje: asesorplaza1