Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Nodemcu pierde conexión a las horas
#1
Saludos, tengo un Nodemcu enviado datos de Tª y humedad a thingspeak, y a su vez desde el móvil con tengo una aplicación para seleccionar la temperatura y que un relé actúe y me active o desactive una caldera...

Todo me funciona a la perfección, leo datos, envío datos, pero al pasar unas horas, da igual 8 que 24 el Nodemcu deja de enviar datos a thingspeak y también deja de poder recibir datos. Si trabajo en modo local no hay problema, pero cuando quiero trabajar desde el exterior de mi red wifi es cuando sucede esto.

Mi router es un compal de vodafone/ono...

¿Alguien ha tenido o tiene el mismo problema?

Saludos...
Citar
#2
Haces deepsleep entre envio de tramas?

Prueba a desconectar y volver a conectar a la red wifi.
Citar
#3
Voy a probar lo del wifi, en cuanto al deepsleep leeré cosas por la red, te voy contando, gracias por la ayuda...


Estoy mirando el tema del deepsleep, pero no me aclaro....si dejo el nodemcu en suspenso y le envío que me suba la temperatura, ¿éste lo lee?

P.D.: Tengo un repetidor wifi para darle señal a parte de la casa, ¿puede ser eso?
Citar
#4
Podria ser que al tiempo, la conexion wifi puede perderse y hay que estqblecerla de nuevo. Por eso te digo que imtentes hacer la conexiom de nuevo pasado un tiempo.
Citar
#5
Éste es el código que estoy usando, todo funciona bien, envío datos, recibo comandos, pero a las horas deja de funcionar.....




Código:
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>
#include <WiFiClient.h>
#include <WiFiServer.h>
#include <ThingSpeak.h> //librería conexión a thingspeak
#include<ESP8266WiFi.h> //librería esp8266
#define DHTTYPE DHT22

const int releCaldera = 14;
const int DHTpin = 4;
float histeresis = 1;
static unsigned long last_loop;
unsigned long int anteriorRefreshDatos = 0;
float temp= 0;
float humi= 0;
float tempDeseada = 00;
int calderaHabilitada;
int estadoRele = 0;

DHT dht(DHTpin, DHTTYPE);


IPAddress ip(192, 168, 1, 10);
IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 255, 0);


const char* ssid = "ONOABAB";
const char* password = "XXXXXXXXXXXX";
const char* server = "api.thingspeak.com";
unsigned long myChannelNumber = XXXXXXXXXXX;
const char * myWriteAPIKey = "XXXXXXXXXXXXXXXXXXX";

WiFiClient client;
WiFiServer servidor(80);

void setup() {
//Iniciamos puerto serie
Serial.begin(115200);
dht.begin();

//Relé de la caldera
pinMode(releCaldera, OUTPUT);
digitalWrite(releCaldera, LOW);

//Iniciamos el modulo wifi

WiFi.begin(ssid, password);
WiFi.config(ip, gateway, subnet);

WiFi.mode(WIFI_STA) ? "" : "¡Error al inicializar en modo Station!";

Serial.println();
Serial.println();
Serial.print("Connectandose a ");
Serial.println(ssid);

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


 Serial.printf("Connection status: %d\n", WiFi.status());
 //0=WL_IDLE_STATUS, 1=WL_NO_SSID_AVAIL, 3=WL_CONNECTED
 //4=WL_CONNECTED-FAILED y 6=WL_DISCONNECTED
 Serial.printf("RSSI: %d dB\n", WiFi.RSSI());


ThingSpeak.begin(client);
Serial.println("Cliente thingspeak iniciado");
servidor.begin();
Serial.print("Servidor iniciado, IP: ");
Serial.println(WiFi.localIP());
   
}

void refreshDatos(){

if (millis() > anteriorRefreshDatos + 20000){
anteriorRefreshDatos = millis();

float temp = dht.readTemperature();
float humi = dht.readHumidity();

 
   

   if (isnan(temp) || isnan(humi)){
   Serial.println("Fallo en lectura de temperatura y humedad");
   return;}
   
   if (calderaHabilitada = 1){
   if (temp + histeresis >= tempDeseada && temp > 0)  digitalWrite(releCaldera, LOW);
   
   else if (temp < tempDeseada && temp > 0) digitalWrite(releCaldera, HIGH);
   
   else digitalWrite(releCaldera, LOW);
        }
   
Serial.println("Leyendo datos....");
Serial.println();
 Serial.printf("RSSI: %d dB\n", WiFi.RSSI());
 Serial.printf("Connection status: %d\n", WiFi.status());
 
Serial.print("Temperatura deseada: ");
Serial.println(tempDeseada);

Serial.print("Temperatura: ");
Serial.println(temp);
Serial.print("Humedad: ");
Serial.println(humi);

     int estadoRele = digitalRead(releCaldera);
     if (estadoRele == LOW)
       {
       Serial.print("Estado relé caldera: ");  
       Serial.println("LOW");
       } else {
       Serial.print("Estado relé caldera: ");  
       Serial.println("HIGH");
        }


ThingSpeak.setField(1, temp);
ThingSpeak.setField(2, humi);
ThingSpeak.setField(3, estadoRele);
ThingSpeak.setField(4, tempDeseada);
ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);

Serial.println("Enviando datos...");
Serial.println();
}
}

void loop() {
//Lectura del sensor de temperatura
refreshDatos();
//Codigo servidor
WiFiClient clienteDeServidor = servidor.available();
if (!clienteDeServidor) { //Si no se ha conectado nadie, saltamos al inicio del codigo
return;
}
Serial.println("Nuevo cliente conectado");
while(!clienteDeServidor.available()){
//Esperamos hasta que el cliente haya solicitado o enviado datos
delay(1);

//De paso que estamos esperando al cliente... pues comprobamos  si hemos de actualizar la temperatura.
refreshDatos();
}

// Read the first line of the request
String req = clienteDeServidor.readStringUntil('\r');
Serial.println(req);
clienteDeServidor.flush();

// Match the request

   int val;

     if (req.indexOf("/tempDeseada45") != -1){
     tempDeseada = 45;
     val = 1;
     } else if (req.indexOf("/tempDeseada46") != -1){
     tempDeseada = 46;
     val = 1;
     } else if (req.indexOf("/tempDeseada47") != -1){
     tempDeseada = 47;
     val = 1;
     } else if (req.indexOf("/tempDeseada48") != -1){
     tempDeseada = 48;
     val = 1;
     } else if (req.indexOf("/tempDeseada49") != -1){
     tempDeseada = 49;
     val = 1;
     } else if (req.indexOf("/tempDeseada50") != -1){
     tempDeseada = 50;
     val = 1;
     } else if (req.indexOf("/tempDeseada00") != -1){
     tempDeseada = 00;
     val = 0;
     } else {
     Serial.println("peticion invalida");
     clienteDeServidor.stop();
     return;
}
// Ponemos el pin a 0 o a 1, dependiendo de lo recibido
calderaHabilitada = val;
}
Citar
#6
Bueno, pues usando el código de arriba y colocando dos condensadores para estabilizar las tensiones de trabajo del nodemcu y del dht22 parece que tengo el tema solucionado, de momento llevo un día y medio sin ningún tipo de problema ni de corte, es el mayor tiempo posible que lo he tenido en marcha, y de momento sigue todo OK....
Citar
#7
Pues nada, sigo igual...el tema es que si uso el sketch para enviar datos a THINGSPEAK solamente, el nodemcu funciona de maravilla días y días, pero cuando meto en el sketch el tema de la comunicación dede internet hacia el nodemcu, a las horas deja de funcionar, por lo que creo que tiene que ser un conflicto entre thingspeak y el webserver.....
Citar
#8
Hola, algunos routers son bastante cojoneros con las coneiones wifi y si no hay actividad en un cierto tiempo, desconectan el cliente, vamos que cortan la conexión, vamos si avisas el cliente. Igual si ocurre esto, tu placa no se entera ya que queda el socket latente (el nodeMCU da como válida conexión) y se corta el envío de datos. Esto lo suelen hacen para ahorrar recursos y descartar clientes que no tengan actividad y usen slots que podrían ocupar otros ya que son limitados (en teoría 128, pero los barateiros aguantan 15-20 max, luego se cagan toditos). Yo lo que haría es usar el Deep Sleep tal que cada X tiempo despiertas, te conectas a la red, haces la lectura de los sensores, envías y DESCONECTAS la wifi para volver a dormir. De esta forma cada ciclo arrancará siempre fresco y el router, ya que el cliente desconecta su slot, no dejará el socket latente.

Saludos!
Citar
#9
OK, entiendo que he de hacer un modem-sleep....voy a preguntar al tito google, gracias por la ayuda...
Citar
#10
Si, es lo mejor. Y cada vez que despiertas, volver a configurar todo, incluida la conexion wifi
Citar
#11
El tema es que al controlar un relé, para el termostato, al reiniciar la placa el relé me cambia de estado, eso con un Deep sleep, si lo que hago es conectar y desconectar el wifi, todo está igual, pero no sé si eso me valdrá......estoy probando cosas...
La otra es hacer un deep sleep y usar EEPROM para dejar todo como estaba, sólo que eso me va a costar un poco mas Sonrisa
Citar
#12
Bueno, tras estar leyendo cosas por ahí y después de unos cuantos meses desde que inicié el proyecto de crearme un termostato controlado por wifi desde cualquier parte del mundo, y con supervisión del estado de la caldera y de la temperatura de la habitación, a través de una aplicación móvil, creo, que ya he conseguido que funcione a la perfección, al menos el cacharro lleva tres días funcionando sin caerse, y es todo un record, aunque sigo supervisando el funcionamiento y voy a ver cuantos días funciona sin problemas, espero que sean muuuuchos.....para solucionar el problema que estaba teniendo de pérdida de conexión he añadido el siguiente código en el void loop()

WiFi.forceSleepBegin();
delay(10000);
Serial.printf("Estado del wifi: %d", WiFi.status());
Serial.printf(" Desconectado \n");
WiFi.forceSleepWake();
delay(10000);
Serial.printf("Estado del wifi: %d", WiFi.status());
Serial.printf(" Conectado \n");

Y con ello lo que hago es desactivar y activar el wifi mediante SW, cada vez que lo activo envío datos y leo datos, y de momento me está funcionando a la perfección, y voy hacia el cuarto día de conexión ininterrumpida.

Dar las gracias a todos los que de una forma u otra me habéis ido ayudando, a ver si saco tiempo y hago un tutorial de mi cacharro....
Citar


Temas similares...
Tema Autor Respuestas Vistas Último mensaje
  [Guia] ESP8266 (NodeMCU) + sensor BME280 + MQTT grafisoft 17 3,710 09-10-2018, 09:49 PM
Último mensaje: grafisoft
  APORTE [SpainLabsIoT2018] ESP8266 NodeMCU - Ajustando su consumo (hack) grafisoft 4 947 15-06-2018, 06:47 AM
Último mensaje: grafisoft
  Subir datos desde NodeMCU a ThingSpeak victormh 2 314 07-06-2018, 12:02 PM
Último mensaje: victormh