esp8266-01 controlar salida GPIO2 para activar rele 5v

Hola , estoy intentando activar un rele con la salida GPIO2 del modulo esp8266 pero lo que me ocurre esque si el modulo pierde la corriente, al recuperarla activa la salida y me activa el rele. lo que quiero es que si el modulo pierde la alimentacion y la recupera, mediante algun sistema no active el rele.

No sé mucho de electronica, lo que tengo ahora mismo montado es esto:

La salida GPIO2 directa a la base de un transistor 547B, al activar la salida, el transistor deja pasar los 5v de una fuente externa y esos 5v activan el rele.

Me podeis echar una mano?

Gracias

Pero eso luce como una problema de programación.
Simplemente dile cuando arranque que ponga a 0 (LOW) la salida y el BC547 quedará al corto (no conduce) y tu relé no se accionará.
Cuando preguntes algo como esto, intenta incluir el código para ver de que estas hablando.
Por ahora lo que puedo decirte es lo que te he respondido.

Hola, gracias por la respuesta, he estado probandolo y no lo consigo, si pierdo la corriente por cualquier motivo, al recuperarla, la salida GPIO2 me activa el rele un instante, eso es lo que me gustaria solucionar.
Este es mi codigo, segun el comando UDP que recibo activo una salida. (El codigo funciona de la salida 2 a la 9 aunque solo tengo dos salidas en el esp8266-01)

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

const char* ssid     = "ssid";
const char* password = "password";
unsigned int localPort = 8888;      // local port to listen on

///////////////// UDP Variables  //////////////////
char packBuff[UDP_TX_PACKET_MAX_SIZE];
char ReplyOpening[] = "ABRIENDO"; //// Respuesta de arduino cada vez que se pulse el boton de abrir una puerta


// the IP address for the shield:
IPAddress ip(192, 168, 0, 177);
IPAddress gateway(192,168,0,1);
IPAddress subnet(255,255,255,0);

WiFiUDP Udp;

void setup() {
 for (int i = 2; i <= 9; i++) {
   pinMode(i, OUTPUT);
   digitalWrite(i,LOW);
 }
 
 // put your setup code here, to run once:
 Serial.begin(115200);
 delay(10);
 // We start by connecting to a WiFi network

 Serial.println();
 Serial.println();
 Serial.print("Connecting to ");
 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 connected");  
 Serial.println("IP address: ");
 Serial.println(WiFi.localIP());
 printWifiStatus();
 Serial.println("\nStarting connection to server...");
 // if you get a connection, report back via serial:
 Udp.begin(localPort);
}

void loop() {
   // if there's data available, read a packet
 int packetSize = Udp.parsePacket();
 if (packetSize)
 {
   Serial.print("Received packet of size ");
   Serial.println(packetSize);
   Serial.print("From ");
   IPAddress remoteIp = Udp.remoteIP();
   Serial.print(remoteIp);
   Serial.print(", port ");
   Serial.println(Udp.remotePort());

   // read the packet into packetBufffer
   int len = Udp.read(packBuff, UDP_TX_PACKET_MAX_SIZE);
   if (len > 0) packBuff[len] = 0;
   Serial.println("Contents:");
   Serial.println(packBuff);
   
   char rChar = packBuff[1];
   int rInteger = rChar-'0';
   // si se recibe el mensaje "C-numero_pin-A" y el pin esta entre 2 y 9
   if (packBuff[0] = 'C' && rInteger >= 2 && rInteger <= 9  && packBuff[2]=='A')  // Si recibimos el mensaje "C2A", el pin 2 se activa.(HIGH)
   {
     digitalWrite(rInteger, HIGH);    //Enciende Pin 
     Serial.print("Pin ON:"); 
     Serial.println(rInteger);   //Arduino manda confirmacion "Pin ON: pin"
     delay(500);                   //El pin 2 se activa durante 0,5 seg.
     digitalWrite(rInteger, LOW);       // El pin se desactiva
     Serial.print("Pin OFF:");  
     Serial.println(rInteger);  //Arduino manda confirmacion "Pin OFF: pin" 
 
     
     Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());  // envia una respuesta, a la dirección IP y el puerto que nos envió el paquete que recibimos "C2A".
     Udp.write(ReplyOpening); // La respuesta es "ReplyBuffer" que la declaramos mas arriba como "ABRIENDO"
     Udp.endPacket();
   
 }
 }
}


void printWifiStatus() {
 // print the SSID of the network you're attached to:
 Serial.print("SSID: ");
 Serial.println(WiFi.SSID());

 // print your WiFi shield's IP address:
 IPAddress ip = WiFi.localIP();
 Serial.print("IP Address: ");
 Serial.println(ip);

 // print the received signal strength:
 long rssi = WiFi.RSSI();
 Serial.print("signal strength (RSSI):");
 Serial.print(rssi);
 Serial.println(" dBm");
}

y estoy intentando usar este esquema de conexion entre el rele y el esp8266-01
de la pagina ESP8266 WiFi relay switch (Arduino IDE)

Gracias

viendo que el problema es de mantener el estado y justamente cuando arrancas lo pones a 0 tal como se ve en el setup().
Considera 2 opciones:

  1. cuando arranque tu sistema interrogue al dispositivo que envió la señal para que le pregunte el estado anterior
  2. guardar el estado a salvar en FLASH.
    La flash del ESP soporta 100.000 lecturas/escrituras.
    Yo usaría algun circuito de supervisión de tensión para detectar perdida de energía y un capacitor de 220 o 470uF conectado entre 3.3V y gnd que le de un margen de miliseg para detectar el corte.
    Usaría la otra GPIO disponible como entrada y no se si puede activarse como interrupción lo que sería ideal.
    Asi se activa, guardas en flash la variable y al arrancar en un power up, lees ese estado y tu rele estará como si no pasó nada.

Se me ocurre una cosa. El problema es que al recuperar la corriente, la salida en cuestión se pone en HIGH, pero luego tu, mediante programacion, la pones en LOW, pero hay un instante en que ha estado en HIGH, y eso no interesa.

¿Que tal usar lógica inversa? Que al poner la salida en HIGH, el relé esté apagado, y al poner la salida en LOW, el relé esté encendido, de forma que, cuando se recupera la alimentación, la salida está en HIGH (relé apagado), la mantenemos en HIGH mediante un digitalWrite en el setup, y el resto de la programación, como tenga que ser, pero siempre, pensando en "lógica inversa".

Me quiero morirrrrrrrrrrrrrrrrrrr no me digas que es un rele de lógica inversa y no que estas queriendo mantener tu estado cuando se corta la luz?
Bueno como diría Go_zalo me pasé dos puebles otra vez.
Olvida mi locura.
Pense que querías mantener el estado del rele con el corte de luz.

Hola, gracias a ambos por las respuestas.

Lo que me propones Carmeloco es que mantenga la salida siempre a HIGH?

Creo que de esa forma si que puede funcionar pero si algun dia falla el esp y deja de mandar el HIGH estaré en las mismas.

Por las pruebas que he realizado mantener una salida GPIO siempre a HIGH no es estable 100%.

No existe algo para controlar ese pulso inicial? es medio segundo el que esta activo GPIO2 pero suficiente para excitar el rele.

A vosotros no os a pasado que al encender el esp active las salidas un instante?

Gracias

Te contesto del que hace electrónica con el método de prueba-error.
¿Y su pones un condensador (digamos 10mF) entre la salida del transistor y masa para que actúe de "tampon" y absorba la salida durante ese instante inicial?

Hola,
Eso no lo he probado,a ver si te e entendido, conecto el positivo del condensador al emisor del transistor y el negativo a masa directo. Sin resistencias?
y disculpa mi ignorancia pero y la salida que manda la señal al IN del rele? tambien en el emisor del transistor?
Gracias

El emisor esta a masa, o sea según tu VISION conectarías los dos cables del condensador a masa.
Debes conectar el COLECTOR al positivo del condensador y el neg del condensador a masa.
Me parece que tienes equivocadas las conexiones.

Emisor del 2n2222 a GND
Base a R de 47k
Colector a R de 1K y a RELE

Hola,
He probado lo que comentas surbyte y no me a funcionado. Sin embargo si pongo el emisor a 5v si que me funciona. Me excita el rele solo cuando activo GPIO2.

Al final he puesto un condensador de 100mF 25v que era el que tenia.

Veis algo que se pueda mejorar ?

Pensais que los componentes son los adecuados?

Os adjunto el esquema.

Gracias

ves como inserto imágenes, por favor usa el tag de imágenes (Consulta las normas del foro que ahi esta bien explicado).
Determina si tienes un 2N o un P2N porque es imposible que conectando un transistor NPN con EMISOR a 5V funcione.
No voy a dar una charla sobre transistores NPN pero el Emisor debe estar a menor potencial que el colector para que circule corriente o estaríamos en modo inverso que es complicado de manejar y ya me olvidé como era.

Tu conección luce como de un P2N2222A porque parece que tuvieras COLECTOR a 5V, Base al resistor de 47K y emisor a 1K y al rele que cierra por GND.
No me quedan claras las conexiones del ESP pero no esta bajo análisis ahora.
Confirma esto que te estoy diciendo.
El capacitor de nuevo, repasemos + al emisor y - a GND.

El transistor que tengo es este: PN2222A

y este es el montaje que tengo:

Cable naranja 3.3v fuente externa - emisor transistor
Cable negro GPIO2 esp - resistencia 47k - base transistor
colector transistor - resistencia 1k - positivo condensador - IN rele

La conexion del esp está así:
vcc y ch-pd 3.3v
gnd -gnd
GPIO2 esp - resistencia 47k - base transistor

El caso es que funciona perfectamente, no entiendo el porqué.

Hay alguna forma mejor de hacerlo? Gracias

El caso es que funciona perfectamente, no entiendo el porqué.
Hay alguna forma mejor de hacerlo?

Yo ahora no entiendo este comentario tuyo

Muy buenas. Tengo el mismo problema y veo que parece que se ha solucionado puenteando un condensador de 100uF a 25v entre las bornas del rele.
Casualmente esta misma tarde he probado esta solución sin éxito.
El circuito que uso es mandando gpio0 a el diodo del optocoplador 4n32 en serie con un led de testigo y el rele que activo con 15v es el que uso para abrir la puerta del garaje. Pero claro se me abre la puerta sola después de restablecer un corte de corriente.
Sabéis con que condensador puedo solucionar este lapso, son unos 100 mili segundos calculo +- el voltaje son 15vdc.
Probé fortuna con los que tengo pero se ve no vale ninguno, no se que relación hay entre el voltaje los uF y el tiempo.
Gracias.

poner un condensador tan grande en paralelo con la bobina no es demasiado buena idea... cuando el condensador esta descargando se comporta como un cortocircuito generando mucha corriente (lo que impide que se active el rele, si el pulso positivo no es suficientemente grande como para 'llenar' el condensador -una vez lleno se comporta como un circuito abierto-)

Alguna vez me ha pasado esto y lo he solucionado de una manera no muy ortodoxa pero correcta a la antigua usanza, con un circuito de retardo a la conexión, es decir, intermediar un circuito cuya salida no se active si la entrada no esta activada por x ms o más

Por ejemplo este:

el retardo en este caso es de 0.85RC con esos valor unos 4.8s, demasiadiiiiiisimo para tu aplicación pero puedes jugar con el valor del contensador fácilmente

recuerda que con esta solución tu rele tardara x ms en activarse cuando realmente quieras activarlo, pero normalmente no es critico si es para encender una bombilla o un motor...

Cuajero:
Muy buenas. Tengo el mismo problema y veo que parece que se ha solucionado puenteando un condensador de 100uF a 25v entre las bornas del rele.
Casualmente esta misma tarde he probado esta solución sin éxito.
El circuito que uso es mandando gpio0 a el diodo del optocoplador 4n32 en serie con un led de testigo y el rele que activo con 15v es el que uso para abrir la puerta del garaje. Pero claro se me abre la puerta sola después de restablecer un corte de corriente.
Sabéis con que condensador puedo solucionar este lapso, son unos 100 mili segundos calculo +- el voltaje son 15vdc.
Probé fortuna con los que tengo pero se ve no vale ninguno, no se que relación hay entre el voltaje los uF y el tiempo.
Gracias.

Hola soy Fernando y te puedo contar que solucione el problema cambiando el 2N2222 por un 2N7000 y funciona perfecto.
Se demora 4 segundos en correjir problema !