Bloqueo NodeMcu webserver

Hola, antes de nada, saludos a todos, soy nuevo y no he visto ningún apartado para presentaciones, me llamo Juan y... bueno, pues eso que soy nuevo :stuck_out_tongue:

Al lío, el tema es que tengo varios módulos NodeMCu ESP8266 esp-12e que quiero usar para domótica en casa, y he empezado por programar uno de ellos para activar un relé por web o android y a su vez con un pulsador.
Me costó media vida poder combinar dos códigos que encontré por internet para que hiciese lo que quiero, por un lado encontré el código para activarlo desde web y por otro para activarlo y desactivarlo desde un pulsador, pues la idea es conectarlo a la llave de la luz y encender la luz de una habitación, y a su vez poder hacerlo desde el móvil. Pero, no se porqué, al tiempo de estar funcionando, se bloquea y no funciona ni por web ni por el pulsador, y tengo que reiniciarlo.
Como dato decir que lo alimento con el cargador de un móvil de 2500mA y estoy haciendo la prueba con un led en sustitución del relé, no se si es culpa del código o de hardware, os dejo el código para lo que saben, que yo ando muy muy pez.

// Codigo para encender y apagar un relé desde web y/o desde un pulsador
#include <ESP8266WiFi.h>

const char* ssid = "SSID"; //Tu SSID
const char* password = "PASSWORD"; //Tu Password
IPAddress ip(192,168,1,222); // IP estática que deseas
IPAddress gateway(192,168,1,1); // IP puerta de enlace
IPAddress subnet(255,255,255,0); // Máscara subnet
const int ledPin = 13; //Lo conectamos a D7
const int boton = 4; // boton al D2
int val = 0; //val se emplea para almacenar el estado del boton
int state = 0; // 0 LED apagado, mientras que 1 encendido
int old_val = 0; // almacena el antiguo valor de val
WiFiServer server(83);

void setup() {
 Serial.begin(115200);
 delay(10);
 pinMode(boton, INPUT);
 pinMode(ledPin, OUTPUT);
 digitalWrite(ledPin, HIGH);

 // Conecto con la red WiFi en modo estación (STA)
  Serial.println();
  Serial.println();
  Serial.print("Conectando a ");
  Serial.println(ssid);
 

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

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

void loop() {

 // Codigo pulsador
 
 val= digitalRead(boton); // lee el estado del Boton
if ((val == HIGH) && (old_val == LOW)){
  state=1-state;
delay(10);
}
old_val = val; // valor del antiguo estado
if (state==1){
 digitalWrite(ledPin, HIGH); // enciende el LED
}
else{
 digitalWrite(ledPin,LOW); // apagar el LED
}

// Codigo web

WiFiClient client = server.available();
 if (!client) {
   return;
 }

 Serial.println("new client");
 while(!client.available()){
   delay(1);
 }

 String request = client.readStringUntil('\r');
 client.flush();

   int val = digitalRead(ledPin);
 if (request.indexOf("/LED=ON") != -1)  {
   digitalWrite(ledPin, LOW);
   state = 0;
 }
 if (request.indexOf("/LED=OFF") != -1)  {
   digitalWrite(ledPin, HIGH);
   state = 1;
 }
 client.println("HTTP/1.1 200 OK");
 client.println("Content-Type: text/html");
 client.println("");
 client.println("<!DOCTYPE HTML>");
 client.println("<html>");
 
 client.print("Led ");


 if (val == HIGH) {
  client.println("Apagado"); 
  client.println(""); 
    
 } 
if (val == LOW) {
      client.println("Encendido"); 
  client.println(""); 

 } 
 client.println("</html>");

 delay(1);

}

Otra consulta, fuera de arduino pero relacionada, ¿hay alguna manera con APP Inventor, cuando le envío por web que el led está encendido, poder utilizar eso para abrir dentro de la aplicación una foto y otra?

Mil gracias y saludos.

Tu problema parece ser de energía. O sea un cargador con 250mA no es suficiente.
Mira, el USB teoricamente entrega 500mA y yo tuve problemas alimentandolo por USB. Luego arme un cable especial en el que los 5V se los doy con una fuente de 1A y se solucionó.

Perdón, son 2500mA, me he "comido" un "0".

Gracias por responder.

Cambia el módulo para sacarte la duda de que sea un problema de él. Cambia x otro que funcione bien. Usa tu celular con alguna aplicación WIFI que muestre el nivel de señal presente en donde tienes ese nodemcu.

Con eso descartarás estas dos posibles causas.

surbyte:
Cambia el módulo para sacarte la duda de que sea un problema de él. Cambia x otro que funcione bien. Usa tu celular con alguna aplicación WIFI que muestre el nivel de señal presente en donde tienes ese nodemcu.

Con eso descartarás estas dos posibles causas.

Gracias, pero he probado con varios módulos, y lo tengo justo al lado de router, con lo cual no puede ser problema de señal, puede ser del código o lo veis correcto?

Serviría de algo utilizar el comando "watchdog"? Para que cuando se quede colgado y no conecte con el router se reinicie?

YO lo uso de otro modo y nunca me dio problemas. Qué andará mal?

surbyte:
YO lo uso de otro modo y nunca me dio problemas. Qué andará mal?

Gracias surbyte, estudiaré como adaptarlo al código.

Hola, entonces despues de cuantas peticiones se te cuelga el nodemcu??
pues en mi caso yo quite algunas comparaciones de return del cliente y lo deje asi tan cual y funciona:

WiFiClient client = server.available();  // Comprueba si el cliente ha conectado  
  String peticion = client.readStringUntil('\r');   
  client.flush();

y nada mas tal vez sea eso.... puedes probar

Perdon... al decir otro modo no me refería a otro modo del NODEMCU y por eso escribo esto, sino que yo hago que los Nodemcu reportes mensajes MQTT a mi Raspi y no se cuelgan alimentados del mismo modo que tu lo tienes alimentado, con un cargador de celular de 700mA (el negro).

Gracias, aún me falta mucho que aprender :stuck_out_tongue:

1 Like