Relé con ESP8266-01

Buenas, he adquirido un relé con una tarjeta wifi ESP8266-01 tipo este:

relé con ESP8266.JPG

y me surgen varios problemas...

1º - he configurado el ESP8266 para conectarme a mi red wifi y parece que todo está bien ya que le hago un ping desde el PC y me responde perfectamente, también lo he puesto a 9600 bps, he metido los comandos AT aquí descritos:

  AT+CWMODE=1, select STA mode;

    AT+RST, reset;

    AT+CWJAP=<ssid>, <password>, let WiFi module connect to the router, for example: AT+CWJAP="LCTECH","12345678";

    AT+CIPMUX=1, open multiple connections;

    AT+CIPSERVER=1,8080, configure the TCP server, set the port number;

    AT+CIFSR, view the IP address in STA mode, such as: STAIP, “192.168.1.103”;

    AT+CIOBAUD=9600, set Baud rate to 9600

Y todo me ha dicho "OK", por lo que la configuración creo que está correcta, luego he descargado una app de móvil llamada EasyTCP que es la que todos los fabricantes de este tipo de hardware te recomiendan para que el relé se active o se desactive cuando el usuario quiera y a través del teléfono móvil... en esa app hay que establecer una conexión a la ip del ESP y que sea por el puerto 8080, una vez que hago la conexión me aparece la palabra "conected to 192.168.0.XX" es decir... ha conectado bien el teléfono móvil con el ESP8266 que está conectado al relé... luego también configuro los botones de la APP para que me encienda y me apague el relé "activar y desactivar" y se supone que hay que hacerlo metiendo los parámetros A0 01 01 A2 para abrir el relé y A0 01 00 A1 para cerrarlo, pues hasta aquí todo perfecto... el problema que tengo es que el relé no hace nada de nada... los relés de este tipo hacen un ruido muy característico al abrir o cerrar y esto no hace nada de nada al pulsar el botón de la APP, pero sí que veo que el led rojo del ESP8266 está encendido constantemente y el led azul parpadea cada vez que le doy al botón de la APP de encender o apagar, por lo que pienso que recibe señal tanto de encendido como de apagado del relé, la duda es... ¿¿porqué no enciende ni apaga el relé??

2º - He leído que si se desconecta el ESP8266 de la electricidad hay que volverlo a configurar... para configurarlo he tenido que hacerlo con un conversor USB FTDI. Pero si enchufo el ESP8266 al FTDI para meter todos los comandos AT y dejarlo configurado correctamente, y luego tengo que desenchufarlo para volverlo a meter en el sócket que tiene el relé de fábrica... siempre perderé tensión y se desconfigurará ¿no?, lo que he tenido que hacer es una vez metido en el socket con el relé, conectándo el FTDI a la parte superior de sus propias patillas del ESP8266 "que sobresale uno o dos milímetros" así lo tengo conectado al FTDI y al relé a la vez para configurarlo y que se quede en su base con el relé sin perder tensión en ningún momento, aunque imagino que habrá una manera más sencilla ¿no?

P.D, comentar también que todo lo he realizado con una power supply y conectando las masas para que estén en común, ya que sino es muy difícil iniciar el ESP para configurarlo mediante comandos AT

GRACIAS Y PERDÓN POR EL TOSTÓN!!!!!!

relé con ESP8266.JPG

El problema es que casi nadie usa los comandos AT porque es como programar el ESP en modo cavernícola siendo que puedes usar el IDE para la misma tarea.

La forma de hacerlo requiere que previamente instales el soporte para ESP8266 que te dejo a continuacion.

Esta es la parte importante

Solo debes tener IDE mayor a 1.6.4 y luego
Arrancas el IDE, y vas a la ventana Preferencias

Ingresas http://arduino.esp8266.com/stable/package_esp8266com_index.json en el Gestor de URL de Adiciionales de tarjetas.
Puedes agregar multiples placas usando solo una , para separarlas
Luego abre el Gestor de placas, vas a Herramientas => Placas e instalala la plataforma ESP8266
Luego debes seleccionarla como Generic ESP8266 Module

Cuando lo hagas veras que te aparecen nuevas librerias como ESP8266Wifi y otras. Te recomiendo las pruebes y cuando lo hagas verás que todo eso se hace de manera mas simple.

Desde ya puedes seguir con el uso de comandos AT pero como dije ya pocos lo usan y ahi no puedo ayudarte.

Hi,
Una cosa que yo noto es que en el sketch solamente tienes la logica de cominicarte con el router usando el wifi. No veo como tu le indicas al esp8266 cuando abres/cierra el relay. Puede ser que este equibocado pero donde en el sketch le mandas los comandos para abrir/cerrar el relay.

gracias @surbyte intentaré configurarlo mediante el IDE de arduino... aunque no sé muy bien ni cómo empezar una vez añadida la librería del ESP al IDE...lo que más me extraña es que hay varios tutoriales en internet de cómo configurarlo con comandos AT, y les he seguido al dedillo y siempre respondiendo OK el ESP. Por lo que no entiendo porqué no funciona... pero lo intentaré hacerlo mediante programación en vez con comandos AT... una consulta... es el mismo lenguaje que para programar un arduino????

Gracias

Gracias por contestar @tauro0221, efectívamente no está puesto por ningún lado en la configuración de que cuando se metan esos dos comandos en hexadecimal "A0 01 01 A2 para abrir el relé y A0 01 00 A1 para cerrarlo" se active o se desactive el relé... pero en todos los tutoriales que he encontrado siempre dicen cómo configurar el ESP pero no dicen nada de porqué hay que poner esos dos códigos exactos en la APP de android para que el relé encienda o apague... imaginé que estaba así preestablecido, y que la PCB que tiene el relé y el ESP "como tiene varios chips soldados" ya sabía que cuando recibiese los parámentros A0 01 01 A2 sería para abrir el relé y A0 01 00 A1 para cerrarlo, pero no me funciona...

Gracias.

No entendiste.
Una vez configura el soporte para las placas ESP8266 aparecen librerías, ya te lo expliqué.
La librería ESP8266WIFI tiene muchos ejemplos y lo que estas haciendo esta contemplado en ellos.
Si luego aprendes a usar internet del modo que pones en GOOGLE : ESP8266 ESP8266Wifi tutorial o cosas parecidas verás todo lo que encuentras para guiarte.

Hi,
Adjunto 3 links que te explica como darle el flash al ESP8266 para poderlo compilar usando el IDE de Arduino. Ya surbyte te adjunto un link pero este yo lo use y explica bien como hacerlo. Tambien explica otros projectos usando el ESP8266. El tercero link es de un web de Random Nerd tutorial que tiene varios tutorias de como usar el ESP8266 y el MCU32. Suerte

@tauro0221 El primer link que has puesto es para LUA!!
El segundo link es copia del primero. O sea LUA 2 IDE 0

Aunque el modo de darle flash es el mismo sea LUA o Arduino espeo no se confunda.

Hi,
Gracias surbyte por corregir el error fue que copie el link incorrecto tenia varios link relacionado con el ESP8266. Ya borre el doble link. Ese procedimeinto trabajo para mi y ya abro el garage usando el telefono celular. Creo que yo uso el mismo relay con el ESp8266. Si creo que es un poco complicado pero si sigue el procedimiento al pie de la letra no tine problemas.

Hola de nuevo! gracias por contestar ante todo, comentar que he seguido los consejos de surbyte y he configurado el IDE de arduino para poder trabajar con el microcontrolador ESP-01, he conseguido subir un código "flash" el cual me conecta a mi red wifi y me funciona bastante bien, el código es el siguiente:

#include <ESP8266WiFi.h>

const char* ssid = "Reigadas";
const char* password = "XXXXXXX";  // las XXX sustituyen a mi clave del wifi

void setup()
{
  Serial.begin(9600);
  Serial.println();

  Serial.printf("Conectando a %s", ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }

  Serial.printf("Conectado a %s", ssid);
  Serial.print(" con IP: ");
  Serial.println(WiFi.localIP());
  Serial.printf("Modo WiFi establecido a WIFI_STA %s\n", WiFi.mode(WIFI_STA) ? "" : "Falló!");
  Serial.printf("Estado de la conexión: %d\n", WiFi.status());
  WiFi.printDiag(Serial);
}


void loop()
{

}

el caso es que me conecta a la perfección y si hago un ping a esa IP desde el PC me responde correctamente, ahora viene en que no sé cómo seguir para configurar el ESP y que me active o desactive el relé al que está enchufado de serie.... por lo que he leído tendría que asignarle los mismos parámetros que asigno con comandos AT pero desde el IDE de arduino, los comandos son estos:

AT+CIPMUX=1, open multiple connections;

AT+CIPSERVER=1,8080, configure the TCP server, set the port number;

Y no sé muy bién cómo configurárselos desde el IDE de arduino...

y para activar y desactivar el relé, imagino que tenga que decirle que cuando reciba por ejemplo un 0 se active y cuando reciba un 1 de desactive. Imagino que se haga desde el GPIO0 aunque eso es lo que más duda tengo... no tengo ni idea de cómo configurar para que el pin GPIO0 se active o se desactive y todo ello desde el IDE de arduino...

¿¿¿alguna idea de cómo hacerlo???

GRACIAS!

@tauro0221 muchas gracias a ti también, aunque el inglés lo llevo un poco mal y me cuesta leer páginas en inglés!

Pero mil gracias!

Cuando te sugerí ESP8266Wifi es porque sabía del ejemplo que hace justamente lo que quieres hacer y que fue lo que escribí?

La librería ESP8266WIFI tiene muchos ejemplos y lo que estas haciendo esta contemplado en ellos.

Este es el ejemplo : WifiWebServer.ino

#include <ESP8266WiFi.h>

const char* ssid      = "ssid";
const char* password  = "password";

// Create an instance of the server
// specify the port to listen on as an argument
WiFiServer server(80);

void setup() {
  Serial.begin(115200);
  delay(10);

  // prepare GPIO2
  pinMode(2, OUTPUT);
  digitalWrite(2, 0);
  
  // Connect to WiFi network
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  
  // Start the server
  server.begin();
  Serial.println("Server started");

  // Print the IP address
  Serial.println(WiFi.localIP());
}

void loop() {
  // Check if a client has connected
  WiFiClient client = server.available();
  if (!client) {
    return;
  }
  
  // Wait until the client sends some data
  Serial.println("new client");
  while(!client.available()){
    delay(1);
  }
  
  // Read the first line of the request
  String req = client.readStringUntil('\r');
  Serial.println(req);
  client.flush();
  
  // Match the request
  int val;
  if (req.indexOf("/gpio/0") != -1)
    val = 0;
  else if (req.indexOf("/gpio/1") != -1)
    val = 1;
  else {
    Serial.println("invalid request");
    client.stop();
    return;
  }

  // Set GPIO2 according to the request
  digitalWrite(2, val);
  
  client.flush();

  // Prepare the response
  String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\nGPIO is now ";
  s += (val)?"high":"low";
  s += "</html>\n";

  // Send the response to the client
  client.print(s);
  delay(1);
  Serial.println("Client disonnected");

  // The client will actually be disconnected 
  // when the function returns and 'client' object is detroyed
}

Ok por fin lo solucioné!! quería hacer un tutorial de cómo lo he hecho funcionar por si alguien tiene la misma duda... lo hago aquí en el mismo hilo o lo hago en alguna otra sección??

como duda final me queda que este relé lo quiero para encender y apagar una lámpara que funciona a 220V directamente.... pero también tengo que conectarle 5V y GND al relé para que funcione... de dónde saco yo ahora 5V y GND cerca de la lámpara?? porque pensé en ponerle unas pilas, pero no sé cuales ponerle para que me de 5V...

¿Alguna idea??

Gracias!

Hi,
Puedes usar un adaptador de 220 a 5 voltios pues estas usando 220 voltios para prender la lampara.

Hola de nuevo!!! gracias tauro0221 por contestar, al final si que he comprado un adaptador de 220V a 5V para alimentarlo con el mismo cable, aún estoy esperando a que me llegue, de momento lo tengo funcionando con la fuente externa de la protoboard... pero tengo un problema que paso a describir.

Una vez que averigué cómo conectar el ESP8266 al arduino sin su microcontrolador y cargado el "flash" sketch en el ESP-01 todo funcionó a la perfección... conecto el relé a una lámpara y cuando en el navegador pongo:

"http://192.168.0.100/on" la lámpara se enciende y cuando pongo "http://192.168.0.100/off" la lámpara se apaga... además mi router me permite poner la configuración de mi cuenta con noip.org y redireccionar el puerto 80 a la ip 192.168.0.100 del ESP-01, por lo que puedo encender y apagar la lámpara desde una app móvil que he creado y desde cualquier punto del mundo siempre y cuando tenga internet en el teléfono móvil... por lo que estoy más que contento con el resultado... el problema viene cuando enciendo y apago la lámpara varias veces, luego deja de funcionar... puede funcionar tres o cuatro veces pero luego deja de funcionar y hay que reiniciar el dispositivo para que vuelva a funcionar... cuando no funciona, si le hago un ping desde el PC a la ip 192.168.0.100 del ESP-01 me responde a la perfección, por lo que veo que el ESP-01 sigue conectado correctamente a la red wifi de mi casa, por lo que no entiendo porqué no funciona lo que es encender y apagar al lámpara.. el código usado es el siguiente:

#include <ESP8266WiFi.h>

const char* ssid = "Reigadas";  // Aquí poner el nombre de vuestra red WIFI
const char* password = "XXXXXX";  // Aquí poner la contraseña de vuestra red WIFI

const int rele = 0; //GPIO0 

WiFiServer server(80);

IPAddress ip(192, 168, 0, 100);  // Aquí poned la IP que queréis que tenga la tarjeta wifi ESP8266-01
IPAddress gateway(192, 168, 0, 1);  // Aquí poned la IP de vuestro router "la puerta de enlace"
IPAddress subnet(255, 255, 255, 0); // Aquí poned vuestra máscara de subred, suele ser la que ya está puesta 


void setup()
{
  Serial.begin(9600); //Aquí poned la velocidad a la que funcina vuestro ESP8266-01, suele ser 9600 ó 57600 ó 115200
  Serial.println();
  
  pinMode(rele,OUTPUT);
  digitalWrite(rele,LOW);

  Serial.printf("Conectando a %s", ssid);
  WiFi.begin(ssid, password);
  WiFi.config(ip, gateway, subnet);
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }

  server.begin();
  Serial.print("Servidor WEB activo: ");
  //Serial.println(WiFi.localIP());

  Serial.printf("Conectado a %s", ssid);
  Serial.print(" con IP: ");
  Serial.println(WiFi.localIP());
  Serial.printf("Modo WiFi establecido a WIFI_STA %s\n", WiFi.mode(WIFI_STA) ? "" : "Falló!");
  Serial.printf("Estado de la conexión: %d\n", WiFi.status());

}


void loop()
{
//comprueba si un cliente está conectado
 WiFiClient client = server.available();
 if (!client) {
    return;
 }
 //espera hasta que el cliente envía algún dato
 Serial.println("cliente conectado");
 while(!client.available()) {
    delay(1);
 }
 //lee la primera línea de la petición
 String req =client.readStringUntil('\r');
 Serial.println(req);
 client.flush();
 //busca en las peticiones los comandos de encendido y apagado
 int val;
 if (req.indexOf("/off") != -1)
    val = 0;
 else if (req.indexOf("/on") != -1)
    val = 1;
 else {
    Serial.print("Petición inválida");
    client.stop();
    return;
 }
 digitalWrite(rele,val);
 client.flush();
 //prepara la respuesta a la petición
 String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\nrele ";
 s += (val)?"encendido":"apagado";
 s += "</html>\n";
 //envía la respuesta
 client.print(s);
 delay(1);
 Serial.println("cliente desconectado");
}

¿¿alguna idea de porqué funciona unas cuantas veces cuando se inicia y luego deja de funcionar??

GRACIAS

Hi,
Te sugiero que hagas una prueba. Yo uso una aplicaccion que te permite prender el relay usando el cellphone. Es gratis y la puedes bajar usando google play. Esta aplicacion la puedes configurar usand el IP y el formato de prender y apagar el relay. Yo la uso para abrir/cerrar el garaje usando el cellphone. La aplicaccion es facil de configurar y se llama MY WIFI RELAY. Puedes bajarla gratis.

Si lo probaré, pero me extraña que el relay se quede bloqueado y no abra ni cierre después de haber estado funcionando... Porque se supone que si yo abro un navegador por ejemplo "Firefox" y pongo la dirección IP del relay con la palabra /on o la plabra /off encendería y apagaría... y lo hace correctamente pero durante un rato... luego deja de funcionar...y se supone que no debía de hacer falta una app de móvil para que funcionase....

No sé porqué me pasa esto....

Buenas de nuevo, ya he probado eso que me comentas @tauro0221, pero esa app nos maneja un arduino con un relé y un ESP-01 o NodeMCU, lo que yo tengo "el hardware" es diferente, partiendo de la base de que no uso el arduino, ya que es un ESP8266-01 conectado a un sócket que tiene una PCB con un relé... por lo que ni uso SoftwareSerial para emular RX y TX... el código que me dice esa APP que debo de cargarle al arduino es el siguiente:

#include "ESP8266.h"
#include <SoftwareSerial.h>

const char* SSID = "YOUR SSID";
const char* PASSWORD = "YOUR PASSWORD";

int PinRele01 = 2;
int PinRele02 = 3;
int PinRele03 = 4;
int PinRele04 = 5;


SoftwareSerial softSerial(10, 11); // RX, TX
ESP8266 wifi(softSerial);

void setup(void)
{
  pinMode(PinRelay01, OUTPUT);
  pinMode(PinRelay02, OUTPUT);
  pinMode(PinRelay03, OUTPUT);
  pinMode(PinRelay04, OUTPUT);

  Serial.begin(9600);
  Serial.print("Begin with the configuration\r\n");

  wifi.restart();
  delay(500);
  if (wifi.setOprToStationSoftAP()) {
    Serial.print("AP y STA mode ok\r\n");
  }
  else {
    Serial.print("AP y STA mode Error\r\n");
  }

  if (wifi.joinAP(SSID, PASSWORD)) {
    Serial.print("Conected to AP \r\n");
    Serial.print("IP: ");
    Serial.println(wifi.getLocalIP().c_str());
  }
  else {
    Serial.print("Error to connect AP\r\n");
  }

  if (wifi.enableMUX()) {
    Serial.print("Multiple conection ok\r\n");
  }
  else {
    Serial.print("Multiple conection Error\r\n");
  }

  if (wifi.startTCPServer(80)) {
    Serial.print("Star web server ok\r\n");
  }
  else {
    Serial.print("Star web server Error\r\n");
  }

  if (wifi.setTCPServerTimeout(1)) {
    Serial.print("Time to disconect to server 1 seg  ok\r\n");
  }
  else {
    Serial.print("Time to disconect to server 1 seg Error\r\n");
  }

  Serial.println("Config finish \r\n");
}

#define wifiWrite(A) wifi.send(mux_id, (uint8_t*) A, sizeof(A) - 1);
void loop(void)
{
  uint8_t buffer[128] = { 0 };
  uint8_t mux_id;

  uint32_t len = wifi.recv(&mux_id, buffer, sizeof(buffer), 100);
  if (len > 0) {
    Serial.print("Recibido de: ");
    Serial.print(mux_id);
    Serial.print("\r\n");

    wifiWrite("HTTP/1.1 200 OK\r\nnContent-Type: /html\r\nConnection: close\r\n\r\n");
    wifiWrite("<html>\n<head>\n<title>MyRelayWifi</title>\n</head>\n<body>");
    wifiWrite("</body></html>");
  
    for (uint32_t i = 0; i < len; i++) {
      char c = (char)buffer[i];
      if (c == '?')
      {
        if ((char)buffer[i + 6] == '1') // You can change the control character in the settings App.
        {
          digitalWrite(PinRelay01, HIGH);
          Serial.println("Relay01 ON");
        }

       if ((char)buffer[i + 6] == '2')
        {
          digitalWrite(PinRelay01, LOW);
          Serial.println("Relay01 OFF");
        }

        if ((char)buffer[i + 6] == '3')
        {
          digitalWrite(PinRelay02, HIGH);
          Serial.println("Relay02 ON");
        }
        if ((char)buffer[i + 6] == '4')
        {
          digitalWrite(PinRelay02, LOW);
          Serial.println("Relay02 OFF");
        }
        if ((char)buffer[i + 6] == '5')
        {
          digitalWrite(PinRelay03, HIGH);
          Serial.println("Relay03 ON");
        }
        if ((char)buffer[i + 6] == '6')
        {
          digitalWrite(PinRelay03, LOW);
          Serial.println("Relay03 OFF");
        }
        if ((char)buffer[i + 6] == '7')
        {
          digitalWrite(PinRelay04, HIGH);
          Serial.println("Relay04 ON");
        }
        if ((char)buffer[i + 6] == '8')
        {
          digitalWrite(PinRelay04, LOW);
          Serial.println("Relay04 OFF");
        }
        
        break;
      }
    }
  }
}

y yo es que como digo no uso ese hardware... yo uso esta pieza que ya viene todo ensamblado:

relé con ESP8266.JPG

Alguien sabe porqué me deja de funcionar después de varios intentos funcinando correctamente???

GRACIAS

relé con ESP8266.JPG

Hi,
Deja el ESP8266-01 conectado al PC y mira a ver los mesajes de errores para ver si hay mesajes de que el ESP se desconecta. Si no hay errores entonces el problema puede ser en la comunicacion del browser.

El ESP no se deconecta, ya que como decía, aunque no me encienda ni me apague después de varios intentos, si le hago un ping desde el PC a la IP del ESP-01 me responde correctamente, eso significa, que está conectado a la red wifi de mi casa perfectamente, y del browser "navegador" no puede ser el problema, ya que cuando no funciona, no me funcina tanto desde el PC "desde el browser" como desde la app móvil que he creado, y cuando funciona, funciona desde ambos sitios....