Desconexion esp8266

Hola a todos! Soy nuevo en el foro y hace meses vengo con problema que no logro resolver.
Tengo conectado un módulo esp8266 a arduino uno. La idea es que el esp lee datos de mi servidor web y transmite esos datos al arduino. Luego de que el arduino procesa dichos datos devuelve una respuesta al servidor a través del módulo. Mi problema es que luego de un rato de estar funcionando a la perfección el módulo se queda "colgado" y debo resetearlo para que comience a funcionar nuevamente.
Tengo alimentado al módulo con una fuente externa de 3.3V.

Éste es el scketch del módulo:


#include <Arduino.h>

#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.h>
#define DEBUG(a) Serial.println(a);

ESP8266WiFiMulti WiFiMulti;
String valor;
String post;

void setup() {

  Serial.begin(9600);

 
  // Serial.setDebugOutput(true);

  Serial.printf("Desconectando WiFi");
  WiFi.disconnect();
  delay(5000);
  Serial.printf("Conectando WiFi");
  WiFi.mode(WIFI_STA);
  WiFiMulti.addAP("Fibertel WiFi895 2.4GHz", "00428447850");

}

void loop() {

 
  // wait for WiFi connection
  if ((WiFiMulti.run() == WL_CONNECTED)) {

    WiFiClient client;

    HTTPClient http;

  //  Serial.print("[HTTP] begin...\n");
 
    if (http.begin(client, "http://mi_web/index.php")) {  // HTTP


  //    Serial.print("[HTTP] GET...\n");
      // start connection and send HTTP header
     
      int httpCode = http.GET();

      // httpCode will be negative on error
      if (httpCode > 0) {
        String data = http.getString();

        //manipulamos la string data
        int index = data.indexOf("\"estatus\"");
        if (index !=-1){
          index +=28;
          int index2 = data.indexOf("\"", index);
          valor = data.substring(index, index2);
         
        }
        //Serial.print("El valor es:");
        Serial.println(valor);

      } else {
        Serial.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
        exit(0);
      }

      http.end();
    } else {
      Serial.printf("[HTTP} Unable to connect\n");
    }
  }  

  delay(5000);

// Respuesta de arduino

lectura_serial();  

delay(5000);

}


void lectura_serial(){
 
  if(Serial.available() >0)
  {
    char c; int n; String dato;
    while(Serial.available() > 0)
    {
      c = Serial.read();
      n = c;
      if(n >13){dato += c;}
      delay (10);
  }  
 
  if(dato == "Led1On")
  {
    post = "Led1On";
    POST();    
  }
  if(dato == "Led1OFF")
  {
    post = "Led1OFF";
    POST();    
  }

  if(dato == "Led2On")
  {
    post = "Led2On";
    POST();    
  }

  if(dato == "Led2OFF")
  {
    post = "Led2OFF";
    POST();    
  }

  if(dato == "AutomaticoOn")
  {
    post = "AutomaticoOn";
    POST();    
  }
   
  }
}  
   
void POST(){

    WiFiClient client;

    HTTPClient http;

   
    Serial.print("[HTTP] begin...\n");
    // configure traged server and url
    http.begin(client, "http://my_web/accion.php"); //HTTP
    http.addHeader("Content-Type", "application/x-www-form-urlencoded");
    String datos_a_enviar = "nombre=" + post; 

    Serial.print(datos_a_enviar);

    Serial.print("[HTTP] POST...\n");
    // start connection and send HTTP header and body
    int httpCode = http.POST(datos_a_enviar);

    // httpCode will be negative on error
    if (httpCode > 0) {
      // HTTP header has been send and Server response header has been handled
      Serial.printf("[HTTP] POST... code: %d\n", httpCode);

      // file found at server
      if (httpCode == HTTP_CODE_OK) {
        const String& payload = http.getString();
        Serial.println("received payload:\n<<");
        Serial.println(payload);
        Serial.println(">>");
      }
    } else {
      Serial.printf("[HTTP] POST... failed, error: %s\n", http.errorToString(httpCode).c_str());
    }

    http.end();  
}

Alguna sugerencia para resolver mi problema? Gracias!!!

Su publicacion se MUEVE a su ubicacion actual ya que es mas adecuada.

Primero respeta los niveles. El ESP8266 trabaja a 3.3 y el Arduino a 5V.
El TX del Arduino debe adaptarse en nivel para no dañar al ESP8266. Lo tienes con algo como divisor de tensión o adaptador de niveles?
El RX del Arduino no tiene problemas porque 3.3V estan dentro de la tolerancia TTL o sea el Arduino leerá bien la info enviada por el ESP.
Como te funciona bien, descarto que el GND entre ambos esta bien conectado.

Hola Surbyte. Si, al Rx lo tengo con un divisor de tensión. Pero luego de 30-40" deja de funcionar. Estuve viendo que hay técnicas para la reconexión wifi, pero no estoy seguro si ese es el problema. También pensé que por ahí podría ser el router.
El gnd de la fuente externa lo tengo conectado mediante protoboard al gnd de arduino.

Empieza a poner Serial.prints que te digan que esta pasando hata que el problema ocurre.
Cuando dice el modulo te refieres al ESP8266, que es quien se cuelga?

Muchas gracias por el consejo, habia pensado en hacer eso! Luego cuento como me va! Tambien voy a subir el scketch del arduino uno.
Cuando imprimo por el monitor serie la comunicacion con el esp8266 parece andar bien, el problema aparece cuando realizo la comunicacion entre el arduino uno y el esp8266.

Postea los dos códigos, de todos modos el que se cuelga es el ESP8266. Deberíamos intentar entender porqué lo hace.
Cuando un ESP8266 se cuelga si te conectas a el vía USB puedes ver en 74880 bps la razón de porque lo hace.
Tal vez ese sea un primer paso para dar, no te parece? Copia lo que refleje y luego lo analizamos.

tene cuidado que pines estas usando del esp8266 . Recorda que hay pines que no son seguros. Como el pin del led interno y el PIN de flash y el de reset.

Y fijate que no sea el arduino el que se este tildando a los 40 minutos. Eso me pasaba con un arduino nano . lo dejaba andando 40 minutos y se bloqueaba. termino en la basura por los disgusto que me dio.
fijate tambien como estas alimentando todo. El esp si lo alimentas con 3,3v tenes que alimentarlo con la tension justa. si usas el 5V para alimentarlo se puede entre 5 a 6V , y si tiene Vin podes alimentarlo de 6V a 12V.

Aunque tu comentario se aplica a muchas otras situaciones miraste el código del post#1. Los pines que usa para serial son los habilitados para el monitoreo serie en el ESP8266 ya que según se ve, no hay definición de ningún tipo.
Comparto contigo que en ningún momento ha dicho de que ESP8266 está hablando y claramente no es lo mismo un 01 a un 12.
A mi me hace pensar que es un nodemcu pero solo es intuición x el uso habitual, tmb podria ser un Wemos Mini de algún tipo x la misma razón. En ambos casos los pines dedicados a la comunicación serie no tienen problemas con el arranque.

Hola,este es un post muy antiguo, de 5 meses!!! pero para ampliar un poco mas: el ESP8266 puede quedarse sin memoria. Yo probaría incluir el espcrash etc etc e ir viendo dónde le está haciendo reset, cuánto le queda de memoria ram, etc.
Ya me he llevado algunas sorpresas con el los ESP8266.
Saludos.

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