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
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.
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?
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.
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.
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.
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.
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
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.