un sensor y activación 2 reles

He utilizado 2 esp8266-01, uno como cliente y el otro como servidor

he conseguido que se comuniquen entre ellos y funciona bien ( copiado de internet)
.
El proyecto es: En el CLIENTE tengo conectado a la entrada gpio2, un sensor de lluvia, que cuando

llueve, activa un led (Relé/bajar persiana) en la salida gpio2 del SERVIDOR. Hasta aquí, todo bien.

Lo que quiero, y es la ayuda que os pido es:

1º-Cuando se moja el sensor(CLIENTE) que active el gpio2 SERVIDOR ( Relé/bajar persiana ) por

solo 20", aunque el sensor siga mojado.

2º-Cuando el sensor se seque, active el gpio0 SERVIDOR (Relé/subir persiana) por solo 20".

Os dejo el código para que hagáis las oportunas correcciones. Parece fácil, pero YO he sido incapaz de

hacerlo. GRACIAS

//SERVIDOR
#include <ESP8266WiFi.h>

const char WiFiClave[] = "xxxxx";  
const char AP_Nombre[] = "xxxxx";

const int LED_PIN = 2; // rele 
int val;
WiFiServer server(80);

void setup() {
  Serial.begin(115200);
  pinMode(LED_PIN, OUTPUT);
  digitalWrite(LED_PIN, LOW);
  WiFi.mode(WIFI_AP);
  WiFi.softAP(AP_Nombre, WiFiClave);   
  server.begin();
}

void loop() {
  WiFiClient client = server.available();   
  if (!client) { return;}
  String req = client.readStringUntil('\r');
    
  if (req.indexOf("/led/0") != -1) val=0;
  val=0;
  if (req.indexOf("/led/1") != -1) val=1;
  digitalWrite(LED_PIN, val); 
  val=1;
   
  client.flush();
}

En pseudocódigo, a lo tosco, sobre el código que tienes, necesitarías saber el estado en el que está la persiana (arriba o abajo) entonces:

  if (req.indexOf("/led/0") != -1) {
    if (estadoPersiana==Arriba) {
      digitalWrite(releAbajo, HIGH);
      delay(20000);
      digitalWrite(releAbajo, LOW);
      estadoPersiana=Abajo;
    }
  }
  if (req.indexOf("/led/1") != -1) {
    if (estadoPersiana==Abajo) {
      digitalWrite(releArriba, HIGH);
      delay(20000);
      digitalWrite(releArriba, LOW);
      estadoPersiana=Arriba;
    }    
  }

Gracias por contestar a mi pregunta, amigo noter. La verdad es que no se el estado de la persiana, como tampoco se el día que va a llover, en principio supongo que estarán a mitad o arriba.

Por otro lado pensaba que iría mejor la función Millis, aunque no tengo ni idea como va.

al compilar me da un error:

//SERVIDOR
#include <ESP8266WiFi.h>

const char WiFiClave[] = "";  //Sin clave
const char AP_Nombre[] = "ESP8266";

const int releAbajo = 2; 
const int releArriba = 0;



WiFiServer server(80);

void setup() {
  Serial.begin(115200);
  pinMode(releAbajo, OUTPUT);
  pinMode(releArriba,OUTPUT);
 
  WiFi.mode(WIFI_AP);
  WiFi.softAP(AP_Nombre, WiFiClave);   
  server.begin();
}

void loop() {
  WiFiClient client = server.available();   // ¿Hay un cliente conectado?
  if (!client) { return;}
  String req = client.readStringUntil('\r');  // Lee la primera linea de la petición del cliente

  if (req.indexOf("/gpio/0") != -1) {
    if (estadoPersiana==Arriba) {
      digitalWrite(releAbajo, HIGH);
      delay(20000);
      digitalWrite(releAbajo, LOW);
      estadoPersiana=Abajo;
    }
  }
  if (req.indexOf("/gpio/1") != -1) {
    if (estadoPersiana==Abajo) {
      digitalWrite(releArriba, HIGH);
      delay(20000);
      digitalWrite(releArriba, LOW);
      estadoPersiana=Arriba;

       client.flush();
    }    
  }

Hombre. Como te dije, el código no era literal, sino para darte una idea. Creo que así sí compilaría. Queda por ver si hace lo que quieres:

//SERVIDOR
#include <ESP8266WiFi.h>

const char WiFiClave[] = "";  //Sin clave
const char AP_Nombre[] = "ESP8266";

const int releAbajo = 2;
const int releArriba = 0;

enum {Arriba, Abajo} estadoPersiana=Arriba;

WiFiServer server(80);

void setup() {
  Serial.begin(115200);
  pinMode(releAbajo, OUTPUT);
  pinMode(releArriba,OUTPUT);
 
  WiFi.mode(WIFI_AP);
  WiFi.softAP(AP_Nombre, WiFiClave);   
  server.begin();
}

void loop() {
  WiFiClient client = server.available();   // ¿Hay un cliente conectado?
  if (!client) { return;}
  String req = client.readStringUntil('\r');  // Lee la primera linea de la petición del cliente

  if (req.indexOf("/gpio/0") != -1) {
    if (estadoPersiana==Arriba) {
      digitalWrite(releAbajo, HIGH);
      delay(20000);
      digitalWrite(releAbajo, LOW);
      estadoPersiana=Abajo;
    }
  }
  else if (req.indexOf("/gpio/1") != -1) {
    if (estadoPersiana==Abajo) {
      digitalWrite(releArriba, HIGH);
      delay(20000);
      digitalWrite(releArriba, LOW);
      estadoPersiana=Arriba;
    }   
  }
  
  client.flush();
}

No puedes suponer el estado de la persiana si quieres que el programa trabaje bien. O lo conoces de alguna manera y trabajas por tiempos como ahora, o bien necesitas unos sensores de final de carrera. En este caso, efectivamente, lo óptimo sería combinar tiempo y sensor de final de carrera. Para ello necesitarás millis.

Hola amigo, decirte que las persianas son motorizadas y tienen incorporadas el final de carrera en subida y bajada.
Por eso los 20", da tiempo en el caso de que estuvieran arriba del todo y al reves lo mismo.

Esa era tu preocupación??

Pues sí, porque no es bueno hacer trabajar los motores contra los topes. Si tienen final de carrera, el problema desaparece. Podríamos agregar el estado indeterminado, que haría que funcione tanto subir como bajar la persiana.

//SERVIDOR
#include <ESP8266WiFi.h>

const char WiFiClave[] = "";  //Sin clave
const char AP_Nombre[] = "ESP8266";

const int releAbajo = 2;
const int releArriba = 0;

enum {Indeterminado, Arriba, Abajo} estadoPersiana=Indeterminado;

WiFiServer server(80);

void setup() {
  Serial.begin(115200);
  pinMode(releAbajo, OUTPUT);
  pinMode(releArriba,OUTPUT);
 
  WiFi.mode(WIFI_AP);
  WiFi.softAP(AP_Nombre, WiFiClave);   
  server.begin();
}

void loop() {
  WiFiClient client = server.available();   // ¿Hay un cliente conectado?
  if (!client) { return;}
  String req = client.readStringUntil('\r');  // Lee la primera linea de la petición del cliente

  if (req.indexOf("/gpio/0") != -1) {
    if (estadoPersiana!=Abajo) {
      digitalWrite(releAbajo, HIGH);
      delay(20000);
      digitalWrite(releAbajo, LOW);
      estadoPersiana=Abajo;
    }
  }
  else if (req.indexOf("/gpio/1") != -1) {
    if (estadoPersiana!=Arriba) {
      digitalWrite(releArriba, HIGH);
      delay(20000);
      digitalWrite(releArriba, LOW);
      estadoPersiana=Arriba;
    }   
  }
  
  client.flush();
}

En cuanto a millis, se podría utilizar, aunque de momento no parece estrictamente necesario.

Edito:
Ya decía yo que me sonaba al día de la marmota. ¿Has buscado un poco por el foro antes de preguntar?

jOER --NOTER Es lo que yo quería y no me salia ni encontraba. Llevaba semanas con esto, si estuvieras

por aquí en Valencia te invitaba a un pelotazo,o si vienes alguna vez, esta hecho.

GRACIAS,GRACIAS,GRACIAS.............

Ahora me queda la segunda parte, meter el esp8266, rele mas alimentación de 5V, todo junto dentro de la

cajita de los pulsadores de subir/bajar persianas. Haber si me cabe todo, ya veremos.

bueno, si me surge otra historia, confió en contar contigo nuevamente. Un saludo y un un abrazo

Me alegro de que te funcione como deseabas. Seguro que además has aprendido alguna cosilla nueva en el proceso. Lo del pelotazo, va a estar difícil, porque estoy a una letra de allí (Palencia), pero te lo agradezco.
Si necesitas más ayudas, este es el lugar adecuado para obtener buenas respuestas, siempre que sepas formular buenas preguntas.
Un saludo.

Hola de nuevo.

Me gustaria saber lo siguiente:

Tengo un sensor que actua como interruptor (LOW/HIGH)

Normalmente esta en LOW (reposo) y ningun rele activado.

Quiero que cuando pase a HIGH, active el RELE-1 durante 2 minutos y se desactive.

y que cuando el sensor vuelva al estado LOW active el RELE-2 durante 2 minutos y se desactive.

Quedando todo como al principio, RELES desactivados.

Este proceso lo quiero implementar desde un esp8266-01 que actúa como servidor, el sensor esta en el

cliente.

Espero haberme explicado correctamente Gracias

//SERVIDOR
#include <ESP8266WiFi.h>

const char WiFiClave[] = "";  //Sin clave
const char AP_Nombre[] = "ESP8266";

WiFiServer server(80);

const int releAbajo = 2;
const int releArriba = 14;
String req;
enum {Indeterminado, Arriba, Abajo} estadoPersiana=Indeterminado;




void setup(void) {

 pinMode(releAbajo, OUTPUT);
 digitalWrite ( releAbajo, LOW );
 
 pinMode(releArriba,OUTPUT);
 digitalWrite ( releArriba, LOW );


  
  Serial.begin(115200);
  delay(10);
  
 Serial.println();
  Serial.println();
  Serial.print("Conectando a...");
  Serial.println();
  Serial.println(AP_Nombre); 
 
 
  WiFi.mode(WIFI_AP);
  WiFi.softAP(AP_Nombre, WiFiClave);  
   
  server.begin();
  Serial.print ( "Server Inicializado" );
  Serial.println();
}

void loop( void ) {

  int estado_releAbajo = digitalRead(releAbajo);

  WiFiClient client = server.available();  
  if (!client) { return;}
  
  Serial.println("Nuevo Cliente");

  
  String req = client.readStringUntil('\r'); 
  Serial.print (req);

  
  if (req.indexOf("/gpio/0") != -1){ 
   
   
    if (estadoPersiana!=Abajo) {
      digitalWrite(releAbajo,HIGH );
      delay(5000);
      digitalWrite(releAbajo,LOW);
      estadoPersiana=Abajo;
    } 
  }
  else if (req.indexOf("/gpio/1") != -1) {
  

    if (estadoPersiana!=Arriba) {
      digitalWrite(releArriba,HIGH);
      delay(5000);
      digitalWrite(releArriba,LOW );
      estadoPersiana=Arriba;
    }   
  }
  
  client.flush();
  delay(1);
    client.stop();
    Serial.println("Client disconnected.");
  
}

No te has expliado bien aunque de tanto leer casos como éste ya sabemos que pretendes.
Primero no veo mas que 3 lineas de código asi que esperas que te demos todo un código resuelto.

Eso no va a pasar de mi parte aunque el camino esta abierto para todo aquel que quiera ayudarte.

Te dire que si buscas hay ejemplos parecidos para controlar persinas via Web. Hace pocos días.
Ahi tendrías un buen punto de partida.

De todos modos si pusieras en google : Esp8266 /rele/0 seguro encuentras algo.

De acuerdo que eres el moderador, pero he visto que el primero en responder a los post, siempre eres tu, y

como siempre echando la bronca. yo formulo una pregunta y si requieren de mas información ,pues se

pide y ya esta. y yo contesto si puedo ampliando la pregunta o respuesta

Con tus reproches nada mas empezar este tema, no haces mas que desanimar a aquella persona que este

por la labor de poderme ayudar.

Si tu no quieres nadie te obliga, pero no me pongas zancadillas por dios. En esto soy un total ignorante.

Espero no te lo tomes a mal y tu replica sea algo benevola hacia mi persona.

Y este es mi codigo del servidor y no me funcionaaaaaaaaaaaaaa.

Llevo meses, como muy bien habrás visto con este tema, pero claro, como se supone que yo he nacido

enseñado ya esta todo dicho. Pongo toda la voluntad que puedo.

Y he de decir que no escribo mas por aquí, por el apuro que me da el que me echen broncas.

El que da lo que tiene, no esta obligado a dar mas. He dicho.

y al mismo tiempo, pido disculpas por las formas que tengo al expresarme.

//SERVIDOR
#include <ESP8266WiFi.h>

const char WiFiClave[] = "";  //Sin clave
const char AP_Nombre[] = "ESP8266";

WiFiServer server(80);

const int releAbajo = 0;
const int releArriba = 2;
String req;
enum {Indeterminado, Arriba, Abajo} estadoPersiana=Indeterminado;




void setup(void) {

 pinMode(releAbajo, OUTPUT);
 digitalWrite ( releAbajo, HIGH );
 
 pinMode(releArriba,OUTPUT);
 digitalWrite ( releArriba, HIGH );


  
  Serial.begin(115200);
  delay(10);
  
 Serial.println();
  Serial.println();
  Serial.print("Conectando a...");
  Serial.println();
  Serial.println(AP_Nombre); 
 
 
  WiFi.mode(WIFI_AP);
  WiFi.softAP(AP_Nombre, WiFiClave);  
   
  server.begin();
  Serial.print ( "Server Inicializado" );
  Serial.println();
}

void loop( void ) {

  int estado_releAbajo = digitalRead(releAbajo);

  WiFiClient client = server.available();   // ¿Hay un cliente conectado?
  if (!client) { return;}
  
  Serial.println("Nuevo Cliente");

  
  String req = client.readStringUntil('\r');  // Lee la primera linea de la petición del cliente
  Serial.print (req);

  
  if (req.indexOf("/gpio/0") != -1){ 
   
   
    if (estadoPersiana!=Abajo) {
      digitalWrite(releAbajo,HIGH );
      delay(5000);
      digitalWrite(releAbajo,LOW);
      estadoPersiana=Abajo;
    } 
  }
  else if (req.indexOf("/gpio/1") != -1) {
  

    if (estadoPersiana!=Arriba) {
      digitalWrite(releArriba,HIGH);
      delay(5000);
      digitalWrite(releArriba,LOW );
      estadoPersiana=Arriba;
    }   
  }
  
  client.flush();
  delay(1);
    client.stop();
    Serial.println("Client disconnected.");
  
}

Yo no te pido nada que no lo exijan las normas.
Si pones 3 lineas y supones que por ahi esta el problema nosotros no tenemos porque entender o proyectar cual es el posible resultado que persigues.

Ahora comprendo mejor todo!!. Por qué abres un tema con cada nueva duda que tienes en lugar de seguir con el mismo hilo una y otra vez hasta terminarlo?
Veo que vienes de este hilo ¿Como temporizar la salida 2 del esp8266-01? - Software - Arduino Forum donde dices ahora le agrego los reles.. y justamente estamos en el hilo donde le agregas el relé y te estancas una vez mas. Entonces el anterior no estaba solucionado y para nosotros ese hilo sumado a este tiene mas continuidad y tu post anterior tendría un mejor contexto.
Para mi este hilo estaba descontextualizado hasta leer tu hilo anterior.
Se comprende?
Voy a unir los hilos para que mejore la comprensión del tema.

Entonces veamos qué ocurre y porqué te estancas a cada paso, mas alla que lo que encaras no es fácil cuando tienes muchas dudas.

Yo he vuelto al msg original ESP8266WIFI y modifiqué levemente el tuyo

//SERVIDOR
#include <ESP8266WiFi.h>

const char WiFiClave[] = "";  //Sin clave
const char AP_Nombre[] = "ESP8266";

WiFiServer server(80);

const int releAbajo = 0;
const int releArriba = 2;
String req;
enum {Indeterminado, Arriba, Abajo} estadoPersiana=Indeterminado;


void setup(void) {

  pinMode(releAbajo, OUTPUT);
  digitalWrite ( releAbajo, HIGH );

  pinMode(releArriba,OUTPUT);
  digitalWrite ( releArriba, HIGH );

  Serial.begin(115200);
  delay(10);

  Serial.println();
  Serial.println();
  Serial.print("Conectando a...");
  Serial.println();
  Serial.println(AP_Nombre); 

 
  WiFi.softAP(AP_Nombre, WiFiClave);  
  IPAddress myIP = WiFi.softAPIP();
  Serial.print("AP IP address: ");
  Serial.println(myIP);
  server.begin();
  Serial.println("HTTP server started");
}

void loop( void ) {

  int estado_releAbajo = digitalRead(releAbajo);

  WiFiClient client = server.available();   // ¿Hay un cliente conectado?
  if (!client) { 
      return;
  }
  else {
      Serial.println("Nuevo Cliente");
     
      String req = client.readStringUntil('\r');  // Lee la primera linea de la petición del cliente
      Serial.println(req);
     
      if (req.indexOf("/gpio/0") != -1){ 
        if (estadoPersiana!=Abajo) {
            Serial.println("Procesando Persiana Abajo");       
            digitalWrite(releAbajo,HIGH );
            delay(5000);
            digitalWrite(releAbajo,LOW);
            estadoPersiana=Abajo;
        } 
      }
      else if (req.indexOf("/gpio/1") != -1) {
        if (estadoPersiana!=Arriba) {
          Serial.println("Procesando Persiana Arriba");       
          digitalWrite(releArriba,HIGH);
          delay(5000);
          digitalWrite(releArriba,LOW );
          estadoPersiana=Arriba;
        }   
      }
      
      client.flush();
      delay(1);
      client.stop();
      Serial.println("Client disconnected.");
 }
}

Y obtuve esto

Conectando a...
ESP8266
AP IP address: 192.168.4.1
HTTP server started
Nuevo Cliente
GET /gpio/0 HTTP/1.1 <=== ENVIO http://192.168.4.1/gpio/0
Procesando Persiana Abajo
Client disconnected.
Nuevo Cliente
GET /gpio/1 HTTP/1.1 <=== ENVIO http://192.168.4.1/gpio/1
Procesando Persiana Arriba
Client disconnected.
Nuevo Cliente

El problema que tengo es que cuando doy alimentación al esp8266, los 2 reles se quedan enclavados automáticamente,y no realiza ninguna función, otras se queda como bloqueado.

He hecho lo siguiente, como se que el gpio0 da problemas por que si deriva a GND puede entrar en modo programación, lo que he hecho a sido hacer una conexión quirúrgica con el pin 14 y dejo libre el gpio0.

pero me sigue fallando.

placa 2 reles.png

Para responderte, necesito un esquema y si usas Fritzing que sea el esquema electronico, no la imagen de como esta conectado todo que luce como la foto. Eso no se entiende para un electronico.

Gracias Surbyte, y me reitero en mis disculpas por las formas.

Tu pequeña modificación a mejorado algo lo que tenia, parece un poco mas estable.

pero a pesar de ello sigue fallando.

En el modulo 2 RELES he quitado el puente y va alimentado a 5V. (alimentación independiente)

y las entras IN1 a gpio0. la IN2 a gpio2 y VVC a 3.3v, GND es común con GND de 5V.

He leído que es mejor hacerlo así para evitar problemas en el 8266.

Aun así me pasa lo siguiente

1- Cuando doy alimentación al servidor, automáticamente y por medio segundo los 2 reles se activan, esto

podría quemar el motor persiana.

2- Pasado este medio segundo, el gpio0 activa su correspondiente rele por 5 segundos, pasado este tiempo

todo vuelve a la normalidad y es a partir de este momento cuando todo funciona correctamente.

Lo siento, pero no me manejo todavía con el Fritzing.

GRACIAS y un abrazo

Mira el post#8 y mira donde estamos, jaja.

Y este es mi codigo del servidor y no me funcionaaaaaaaaaaaaaa

Empezaste con eso.. pero no mencionaste que los reles tenian problemas.
Bueno tal vez eran varios problemas y ahora que se soluciona uno se concentra uno en el que sigue.

Por lo que veo en tus fotos no tienes Resistencias en los pines GPIO 0 y 2.

El consejo es el siguiente. Primero prueba esta configuración con resistencias PULL-UPs


Esta configuración te da los dos pines de salida, tmb te da 1 de entrada si asi lo quisieras.

Prueba a ver tal como sugiere la imagen si de ese modo se coportan mejor los RELES

Los reles conectalos de este modo

Olvida en este esquema el pulsador, eso quítalo. Y repite la conexión para el 2do rele.
Veamos que tal trabaja el sistema en el arranque de este modo.

Aca puedes ver toda la explicación LinkFuente

Hola de nuevo Surbyte.

Aunque no te lo creas, el enlace que me diste y los esquemas ya lo tenia guardado y estudiado desde hace

un mes, y si, ya provee con las resistencias pull-up y no funciono al dar alimentación los reles se activan

por medio segundo.

Resistencias de 3,3K no tenia, pero si de 6,8K, lo que hice es poner 2 en paralelo (3,4K).

Lo he vuelto a intentar otra vez intercalando las resistencias 3,4k, solo entre las salidas gpeo0/2 y

entradas IN1y IN2. Sigue fallando.....

Hace falta poner el resto de resistencias Pull-up???

La mencionada pagina de Forward lo explica todo con mucho detalle, pero a mi no me va.

Vaya vaya.. para entonces responder con mayor precisión debería armar tu esquema y comprobar tus problemas.
Algo que por ahora no puedo hacer.

Es decir que todo lo ahi sugerido ya lo consideraste.
Qué pena que no lo dijeras en tu explicación, ves cuando pido justamente esto.. que den detalles y que tmb pongan enlaces de lo que han investigado, solo he perdido tiempo y no te ayudé en nada.
Bueno lo mejor que por ahora puedo decirte es que esperes y que en algún momento lo intentaré probar, pero ahora no me da el tiempo.

Gracias amigo Surbyte, por tu paciencia, Ahora entiendo que te pongas en ocasiones irritable y molesto.

Somos muchos en el foro, y estoy seguro que el 98%, lo hacemos para preguntar, si encima lo

hacemos incorrectamente hay esta el problema. Me pongo en tu lugar, paciencia y buenos alimentos,

como se suele decir.

Quedo a ala espera de tu revisión o de cualquier otro amigo que pueda.

Gracias y un abrazo.