Crear Control Rele ESP8266

Hola que tal, estoy intentando programar por primera vez el código yo solo para controlar 8 relés con una placa ESP8266 a través de WiFi. He seguido los consejos de varios foros, redes y he modificado el código innumerables veces para intentar corregir un error que hace que se active el modo reinicio de la placa sin resultados (cambiando tiempos de llamada, expresiones de tiempo(delay, milis...) potencia de la señal, etc.) En principio el código se compila correctamente, pero debe de haber una parte del código que hace que entre en loop y se reinicie o algún tiempo de espera que produce el mismo error. He configurado la red en ESP8266 la puedo detectar pero se reinicia.

**ECodigo de error: **

13:45:02.609 -> *wm:AutoConnect: FAILED for  11469 ms
13:45:02.654 -> *wm:StartAP with SSID:  ESP8266WiFiManager
13:45:03.753 -> *wm:AP IP address: 192.168.4.1
13:45:03.753 -> *wm:Starting Web Portal 
13:45:36.091 -> *wm:2 networks found
13:46:12.098 -> *wm:2 networks found
13:47:32.856 -> *wm:No networks found 
13:47:56.290 -> *wm:Connecting to NEW AP: MIWIFI_TNjN
13:47:56.337 -> *w:connectTimeout not set, ESP waitForConnectResult... 
13:47:59.980 -> *wm:Connect to new AP [SUCCESS] 
13:48:00.013 -> *wm:Got IP Address: 
13:48:00.013 -> *wm:192.168.1.187 
13:48:01.018 -> *wm:confia
13:48:08.414 ->  ets Jan  8 2013,rst cause:4, boot mode:(3,6)
13:48:08.414 -> 

Código

#include <ESP8266WiFi.h>
#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h>
#include <ArduinoJson.h>

#define NUM_RELAYS 8

const int relayPins[NUM_RELAYS] = {1, 2, 3, 4, 5, 6, 7, 8}; // Cambiar los pines según la configuración
bool relayStates[NUM_RELAYS] = {false};

ESP8266WebServer server(80);
DNSServer dns;

const char config_html[] PROGMEM = R"rawliteral(
<!DOCTYPE HTML><html><head>
  <title>Control de Relés</title>
  <style>
    body { font-family: Arial, sans-serif; }
    .container { display: flex; flex-direction: column; align-items: center; }
    .relay { margin-bottom: 10px; }
    .relay input[type="submit"] { padding: 5px 10px; background-color: #4CAF50; color: white; border: none; border-radius: 4px; cursor: pointer; }
    .relay input[type="submit"]:hover { background-color: #45a049; }
  </style>
</head><body>
  <h1>Control de Relés</h1>
  <div class="container">
    %BUTTONS%
  </div>
</body></html>
)rawliteral";

unsigned long previousMillis = 0;
const long interval = 100; 

void setup() {
  Serial.begin(115200);
  Serial.println("Inicializando...");

  WiFi.setOutputPower(20.00);

  // Configuración de WiFi y modo AP
  WiFiManager wifiManager;
  wifiManager.autoConnect("ESP8266WiFiManager");

  setupServer();
  initRelays();
  
  Serial.println("Inicialización completa.");
}

void loop() {
  unsigned long currentMillis = millis();

  server.handleClient();

  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    yield(); 
  }
}

void setupServer() {
  Serial.println("Configurando servidor web...");
  
  server.on("/", HTTP_GET, []() {
    String buttons = "";
    for (int i = 0; i < NUM_RELAYS; i++) {
      buttons += "<div class=\"relay\"><h2>Relé " + String(i+1) + "</h2><form action=\"/toggle\" method=\"POST\"><input type=\"hidden\" name=\"id\" value=\"" + String(i) + "\">";
     buttons += String("<input type=\"submit\" value=\"") + (relayStates[i] ? "Apagar" : "Encender") + "\"></form></div>";
    }
    
    String page = String(config_html);
    page.replace("%BUTTONS%", buttons);
    
    server.send(200, "text/html", page);
    yield();
  });

  server.on("/toggle", HTTP_POST, []() {
    yield(); 
    String relayId;
    if (server.hasArg("id")) {
      relayId = server.arg("id");
      int id = relayId.toInt();
      if (id >= 0 && id < NUM_RELAYS) {
        relayStates[id] = !relayStates[id];
        digitalWrite(relayPins[id], relayStates[id] ? HIGH : LOW);
        server.send(200, "text/plain", "OK");
      } else {
        server.send(400, "text/plain", "ID de relé inválido.");
      }
    } else {
      server.send(400, "text/plain", "Parámetros faltantes.");
    }
    yield(); 
  });

  server.begin();
  Serial.println("Servidor web iniciado.");
}

void initRelays() {
  Serial.println("Inicializando relés...");
  for (int i = 0; i < NUM_RELAYS; i++) {
    pinMode(relayPins[i], OUTPUT);
    digitalWrite(relayPins[i], LOW);
  }
  Serial.println("Relés inicializados.");
}

Quería probarlo para ver como queda la pagina HTML y modificarla para que sea más curiosa pero no puedo seguir al no poder corregir el error. Si me podéis guiar quizás lo tenga delante de mis ojos pero estoy ciego.
Gracias

NOTA: Editado por Moderador

Como alimentas los relés? Coloca un esquema de como alimentas los reles y que pines estas compartiendo con el ESP8266.
GND debe estar compartido SI o SI, descarto que eso esta bien.
Ahora, DE ningún modo alimentes los relés desde el ESP8266. Debes usar fuente externa y compartir GND con el ESP.

De momento no tengo nada conectado a ESP8266. La base de relés va con alimentación 12 V con GND en común. Los pines utilizados son D1,D2, D3, D4, D5, D6, D7, D8.
Quizás el problema sea que no tengo conectado los relés a ESP8266 y por eso me esta dando el error?

12V para reles del tipo arduino o son de otro tipo?
Se alimentan con 5V no con 12V
Publica esquema por favor, o foto de los reles que estas usando.
Si son los azules de Arduino te digo que con 12V los vas a quemar si no lo has hecho ya.

Creo que nos desviamos del hilo, el problema es que esp8266 se reinicia sin nada conectado por protección, debido a un problema seguramente del código ya que me pasa en los tres microcontroladores programados para descartar error. Los relés no se van a quemar, Arduino no se va a quemar, el código no va a quemar. He intentado cambiar las variables de tiempo a ver si es un error de bucle pero sin resultados. No puedo conectar reles si no consigo que el codigo sea estable :rofl: La seguridad es lo primero, si intentas conectar cosas sin saber ni si quiera si el codigo funciona produciras muchas perdidas monetarias, como en este caso son salidas digitales no es necesario tener nada conectado ya que no tiene confirmacion de una entrada digital y tampoco esta leyendo ningun sensor analogico, asi que descartemos reles y 12V, centrémonos en el codigo. Tambien intente instalar un tool que lee el codigo de error para localizar la ultima linea leida antes del error pero no se instala correctamente y no puedo utilizarla, si funcionara ya tendria localizada la linea de error y solventado el problema sin ayuda que es lo que busco actualmente. SI alguien tiene la herramienta instalada y puede probar el codigo o simplemente decirme como instalarlo correctamente pues mejor asi no molestare mucho más por aqui.

En el foro en inglés se planteó un problema similar, la solución fue un condensador (capacitor) de 220uF entre los pines 3.3V y Gnd de la placa.
Prueba, no pierdes nada.

1 Like

Pues probare. Leí sobre si el consumo, en casos si es elevado la placa se reiniciaba, por eso baje la potencia de la antena WiFi en el codigo, probando varias y si comprobe que en el ruter la potencia disminuia pero no cambiaba el fallo. Probare y si funciona te debo una.

Gracias por el aporte

Yo he compilado tu código y he llegado hasta este punto de la prueba

*WM: Configuring access point...
*WM: ESP8266WiFiManager
*WM: AP IP address: 
*WM: 192.168.4.1
*WM: HTTP server started
*WM: Request redirected to captive portal
*WM: Request redirected to captive portal
*WM: Request redirected to captive portal
*WM: Request redirected to captive portal
*WM: Handle root
*WM: Request redirected to captive portal
*WM: Handle root
*WM: Handle root
*WM: Scan done
*WM: DUP AP: WIFI_SCPL82808
*WM: Saavedra
*WM: -46
*WM: WIFI_SCPL82808

A partir de aqui y una vez elegida la WIFI, se reinicia diciendo


wdt reset
load 0x4010f000, len 3424, room 16
tail 0
chksum 0x2e
load 0x3fff20b8, len 40, room 8
tail 0
chksum 0x2b
csum 0x2b
v0004f230
~ld
Inicializando...
*WM:
*WM: AutoConnect
*WM: Connecting as wifi client...
*WM: Status:
*WM: 0
*WM: Using last saved values, should be faster
*WM: Connection result: 

Ahora fui a la base de todo. Tus elecciones de librerías. Probé este ejemplo

Con este resultado..

wdt reset
load 0x4010f000, len 3424, room 16
tail 0
chksum 0x2e
load 0x3fff20b8, len 40, room 8 
tail 0
chksum 0x2b
csum 0x2b
v0004f1f0
~ld
Inicializando...
*WM:
*WM: AutoConnect
*WM: Connecting as wifi client...
*WM: Status:
*WM: 0
*WM: Using last saved values, should be faster

El mismo que el tuyo, entonces no es TU programa sino la librería por el momento.
Probaré otro mas simple

EDITO: Ahora probé el ejemplo simple y tampoco conecta.

1 Like

Tuve problemas con ellas al compilar y al final elegí las del código porque no me daban error a la hora de carga, ya que otras eran para ESP32 y Arduino a la hora de carga me decía que no era compatible.
También probé lo que comentaba el compañero del condensador sin cambios. Entonces el problema es la librería.
Nada, será mejor entonces realizar de nuevo el código con otras librerías?


De ser necesario volver a realizar el código me podéis recomendar las librerías y empiezo a realizarlo de nuevo, así poco a poco se me va quedando algo y dejo de cometer estos errores X(.

Y... ¿a vos que te parece? :wink:

Prueba esto

Yo me manejo de este modo.

¿Qué versión de json estás usando? En las últimas versiones hay problemas con resets inesperados. Prueba a instalar la 6.18.4.
Saludos

Habiendo leído vuestros consejos, he utilizado mi experiencia en averías y os resumiré. El problema no esta en el código, ni en las librerías. Todo es funcional el problema es el numero de relés y como el fabricante del microcontrolador nombra a cada uno de los pins, si seleccionas 4 relés el código funciona correctamente si expones más de 4 entra en error.

Para evitar el problema esta es la solución editar el numero del pin:

const int relayPins[NUM_RELAYS] = {15, 1, 2, 3, 13, 12, 14, 5};

ya no habrá error.

Saludos

Yo corrí ejemplos SIN ningun rele o pin que generara problemas y el código no funcionó. Solo para tenerlo en cuenta.

Perdón, ¿Qué?

No señor, el software se tiene que adaptar al harware (justamente lo que has hecho), no el hardware al software.

El problema es de código, te guste o no. :wink:

Me exprese mal, me referia que los pines en la placa tienen un codigo pero que no corresponde al numero del pin real a la hora de implementarlo en el codigo, lo que crea confusion, desde mi parte por poca experiencia, pero que al final crea problemas asi de absurdos. Basicamente por pensar que seria como un arduino (pin 1 = 1) y que no sabia que hay pines que no son utilizables (memoria, bajo al arranque, alto en el arranque, etc). Lo que me pasa ahora es que a traves de la web no activo los reles, pero si cambio el codigo y pongo los estado de los reles en high si funcionan todos, pero no hay cambio desde la web, vamos que la web no hace su funcion. como que algo hice mal en el codigo de la web que al tocar el boton no se activan, se que es basica. A ver si lo arreglo. Cualquier sugerencia sera atendida.

Saludos

Así pues sí, diría El Chavo. :wink:

Los ESP tienen GPIOs no Pines y su corespondiencia con los DX que se leen en las serigrafías y lo que usa o no el IDE para relacionarlos es todo un tema.