[SOLUCIONADO] Problema Nodemcu+relé+downlight

Hola de nuevo, a ver si me podéis dar un poco de luz a un problema que tengo, estoy "domotizando" todas las luces de mi casa nueva, que se enciendan por wifi y por pulsador, hasta ahora lo había conseguido hacer funcionar correctamente, hasta que lo he probado con un downligth de led de 20w que son lo que voy a poner en la casa, con bombillas de led normales e incluso con un foco de led de 50w funciona correctamente, he probado a ponerle un diodo 1N4007, pero ni así, paso a comentar el código que utilizo y como lo tengo conectado.

#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>

#define UnoOn "1On"
#define UnoOff "1Off"
#define DosOn "2On"
#define DosOff "2Off"
#define TresOn "3On"
#define TresOff "3Off"
#define TodoOn "todoon"
#define TodoOff "todooff"
#define Puerto "Elije un puerto"


const char* ssid = "SSID";
const char* password = "contraseña";
IPAddress ip(192,168,1,224);
IPAddress gateway(192,168,1,1);
IPAddress subnet(255,255,255,0);
const int ledPin1 = 13; //Lo conectamos a D5
const int ledPin2 = 12; //Lo conectamos a D6
const int ledPin3 = 14; //Lo conectamos a D7
const int boton1 = 5; // boton2 al D1
const int boton2 = 4; // boton1 al D2
const int boton3 = 9; // boton2 al SD2
int val1 = 0; //val se emplea para almacenar el estado del boton
int val2 = 0; //val se emplea para almacenar el estado del boton
int val3 = 0; //val se emplea para almacenar el estado del boton
int state1 = 1; // 0 LED apagado, mientras que 1 encendido
int state2 = 1; // 0 LED apagado, mientras que 1 encendido
int state3 = 1; // 0 LED apagado, mientras que 1 encendido
int old_val1 = 0; // almacena el antiguo valor de val
int old_val2 = 0; // almacena el antiguo valor de val
int old_val3 = 0; // almacena el antiguo valor de val
WiFiServer server(Puerto);

void setup() {
 
 
 Serial.begin(115200);
 delay(10);
 pinMode(boton1, INPUT);
 pinMode(boton2, INPUT);
 pinMode(boton3, INPUT);
 pinMode(ledPin1, OUTPUT);
 pinMode(ledPin2, OUTPUT);
 pinMode(ledPin3, OUTPUT);
  
 WiFi.begin(ssid, password);
 WiFi.config(ip, gateway, subnet);

 // while (WiFi.waitForConnectResult() != WL_CONNECTED)
 //    {   Serial.println("Connection Failed! Rebooting...");
 //        delay(5000);
 //        ESP.restart();
 //    }

 ArduinoOTA.setPassword((const char *)"pass");
 Serial.println();
 Serial.println();
 Serial.print("Conectado a ");
 Serial.println(ssid);
 Serial.print("IP:");
 Serial.println(ip);
 Serial.printf("MAC Address = %s\n", WiFi.softAPmacAddress().c_str());
 Serial.print("Puerto:");
 Serial.print(Puerto);
 Serial.println();
 Serial.println("Ordenes:");
 Serial.println(UnoOn);
 Serial.println(UnoOff);
 Serial.println(DosOn);
 Serial.println(DosOff);
 Serial.println(TresOn);
 Serial.println(TresOff);
 Serial.println();
 Serial.print("Ordenes: todoton/todooff");
 Serial.println();
 
 ArduinoOTA.begin();
 server.begin(); 
 }

void loop() {
ArduinoOTA.handle();
ESP.wdtDisable();
val1= digitalRead(boton1); // lee el estado del Boton1
if ((val1 == HIGH) && (old_val1 == LOW)){
state1=1-state1;
delay(100);
}
old_val1 = val1; // valor del antiguo estado
if (state1==1){
 digitalWrite(ledPin1, HIGH); // enciende el LED
}
else{
 digitalWrite(ledPin1,LOW); // apagar el LED
}

val2= digitalRead(boton2); // lee el estado del Boton
if ((val2 == HIGH) && (old_val2 == LOW)){
state2=1-state2;
delay(100);
}
old_val2 = val2; // valor del antiguo estado
if (state2==1){
 digitalWrite(ledPin2, HIGH); // enciende el LED
}
else{
 digitalWrite(ledPin2,LOW); // apagar el LED
}

val3= digitalRead(boton3); // lee el estado del Boton
if ((val3 == HIGH) && (old_val3 == LOW)){
state3=1-state3;
delay(100);
}
old_val3 = val3; // valor del antiguo estado
if (state3==1){
 digitalWrite(ledPin3, HIGH); // enciende el LED
}
else{
 digitalWrite(ledPin3,LOW); // apagar el LED
}

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

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

 String request = client.readStringUntil('\r');
 client.flush();
 client.println("HTTP/1.1 200 OK");
 client.println("Content-Type: text/html");
 client.println("");
    int val1 = digitalRead(ledPin1);
 if (request.indexOf(UnoOn) != -1)  {
   digitalWrite(ledPin1, LOW);
   state1 = 0;
 }
 if (request.indexOf(UnoOff) != -1)  {
   digitalWrite(ledPin1, HIGH);
   state1 = 1;
 }
  if (request.indexOf(TodoOn) != -1)  {
   digitalWrite(ledPin1, LOW);
   state1 = 0;
 }
 if (request.indexOf(TodoOff) != -1)  {
   digitalWrite(ledPin1, HIGH);
   state1 = 1;
 }

if (val1 == HIGH) {
 client.println(UnoOff);
    
 } 
if (val1 == LOW) {
   client.println(UnoOn);

 } 

 int val2 = digitalRead(ledPin2);
 if (request.indexOf(DosOn) != -1)  {
   digitalWrite(ledPin2, LOW);
   state2 = 0;
 }
 if (request.indexOf(DosOff) != -1)  {
   digitalWrite(ledPin2, HIGH);
   state2 = 1;
 }
  if (request.indexOf(TodoOn) != -1)  {
   digitalWrite(ledPin2, LOW);
   state2 = 0;
 }
 if (request.indexOf(TodoOff) != -1)  {
   digitalWrite(ledPin2, HIGH);
   state2 = 1;
 }
  

 if (val2 == HIGH) {
   client.println(DosOff);
    
 } 
if (val2 == LOW) {
   client.println(DosOn);

 } 

 int val3 = digitalRead(ledPin3);
 if (request.indexOf(TresOn) != -1)  {
   digitalWrite(ledPin3, LOW);
   state3 = 0;
 }
 if (request.indexOf(TresOff) != -1)  {
   digitalWrite(ledPin3, HIGH);
   state3 = 1;
 }
  if (request.indexOf(TodoOn) != -1)  {
   digitalWrite(ledPin3, LOW);
   state3 = 0;
 }
 if (request.indexOf(TodoOff) != -1)  {
   digitalWrite(ledPin3, HIGH);
   state3 = 1;
 }
  

 if (val3 == HIGH) {
   client.println(TresOff);
    
 } 
if (val3 == LOW) {
   client.println(TresOn);

 } 

 if (request.indexOf("/info") != -1)  {
 client.println("
");
 client.println("
");
 client.println("<b>Conectado a:   </b>");
 client.println(ssid);
 client.println("
");
 client.println("<b>IP:  </b>");
 client.println(ip);
 client.println("
");
 client.println("<b>Puerto:</b>");
 client.println(Puerto);
 client.println("
");
 client.printf("<b>Direccion MAC: </b>%s\n", WiFi.softAPmacAddress().c_str());
 client.println("
");
 client.println("<b>Ordenes:</b>");
 client.println(UnoOn);
 client.println("/");
 client.println(UnoOff);
 client.println("/");
 client.println(DosOn);
 client.println("/");
 client.println(DosOff);
 client.println("/");
 client.println(TresOn);
 client.println("/");
 client.println(TresOff);
 client.println("/");
 client.println(TodoOn);
 client.println("/");
 client.println(TodoOff);



 }

 delay(1);

}

El Nodemcu lo tengo conectado a los 5v de la fuente y el relé a los 3v del nodemcu y al D7,el pulsador en pull-down al D2, de esta manera me funciona bien, lo he tenido días de prueba y sin problemas, incluso controlando todo desde el móvil, pero si conecto al downlight, se enciende pero enseguida se apaga, si conecto el relé a los 5v de la fuente, el relé se queda siempre encendido y la luz funciona bien, pero no se puede apagar...

Alguien me puede dar alguna otra idea para probar?

Gracias de ante mano.

Editado: Pues ahora sí, solucionado con un filtro a la entrada de la fuente del downlight

El rele con 3.3V no funciona a menos que alimentes tmb la parte del opto con 5V.
Has verificado que el refle cambia de estado?

Si surbyte, al relé le basta con los 3v del nodemcu, lo he comprobado anteriormente, funciona sin problemas, lo tenía conectado a una lámpara estos días atrás, hasta que lo probé con el foco de luz nuevo. He probado también eso que dices, alimentándolo con los 5v, pero debo de hacer algo mal porque entonces se queda el relé siempre encendido.

No dije que lo alimentes con 5V, dije qeu debes alimentar (esto no lo dije) quitando el jumper de modo que la alimentación de 5V energice el colector y la R que estan en el circuito que comanda la bobina.
Los 3.3V de la salida GPIO se encargan de accionar el LED del Opto.

Aca tienes el esquema y se ve lo que digo.
Si quitas el jumper (cuando lo tienes) le darás 5V por el pin que dice JD-VCC
Gnd compartido y la salida comandara el LED del opto

Asi funciona perfecto con los nodemcu, los Raspi, los ESP01, etc etc

El relé no tiene jumper, es éste modelo:

Me he dado cuenta, que si dejo presionado el pulsador, el relé aguanta encendido, me estoy volviendo loco ya... yo creo que debe ser algo de ruido eléctrico producido por la fuente del led, os dejo una imagen por si sirve de algo.

Bueno, trasteando mas, he visto que lo que sucede es que se reinicia el nodemcu y me da este mensaje:

ets Jan 8 2013,rst cause:4, boot mode:(3,6)

wdt reset
load 0x4010f000, len 1384, room 16
tail 8
chksum 0x2d
csum 0x2d
v3de0c112
~ld

Alguna idea?

EDITO: Solo ocurre cuando acciono el relé por wifi, se enciende y a los segundos se reinicia, si lo hago desde el pulsador simplemente se desconecta el relé sin reiniciarse.

Te das cuenta!!!! no es el rele adecuado.

Luego te digo como salvar la situación, si es que se puede.

Ok, gracias surbyte.

He editado el post anterior para aportar un poco más de información.

A nadie se le ocurre nada?

Hola.

Pero el rele de la foto pone 5vdc, tu has medido cuanto voltaje le esta llegando? Puede que sea un poco menos que a los otros, y has mirado el consumo? Si dices que lo hace cuando lo accionas por wifi puede ser que te falte corriente ya que el wifi consume mas en la comunicacion que en reposo

Gracias jafox007, pero creo que no van por ahí los tiros, si le conecto otro tipo de lámpara funciona perfectamente.

En este caso estas sacando la alimentacion para el Nodemcu del transfor del downlight
si no me equivoco, y para los otros dos casos que dices?, El foco de 50w y la bombilla led normal.

Que vas, el nodemcu lo alimento siempre con una fuente de 5v 600mA, el downlight lo conecto igual que las demás lámparas, a 220v a través del relé.

A vale no me di cuenta de la fuente de alimentacion que sale en la foto.

Si fuera yo haria una prueba.

Supervisar el Nodemcu y conectar el led saltandome el rele, directamente a ver si al encenderse el Nodemcu tambien se reinicia, si conectas y desconectas el led manualmente y el Nodemcu tambien se reinicia, yo descartaria el rele.

No entiendo muy bien lo que quieres decir, el downlight se alimenta de 220v directamente, luego tiene una fuente que lo transforma a, según he medido, 55v

Es averiguar si la interferencia la mete la fuente de alimentacion al encenderse.
Conecta el Nodemcu a su fuente y conectas la fuente del led a 220 manualmente a ver si el Nodemcu se reinicia en el momento del arranque del led

No entiendo muy bien como dices que debo hacerlo, podrías hacer un esquema o algo parecido?

Gracias.

sigue este esquema y ver si al conectar S1 se reinicia el nodemcu.

Ok gracias, cuando vaya a casa lo probaré.