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?