AYUDA PROYECTO RELES

Buenas

Estoy haciendo un programita para controlar un relé por web
En uno de los botones hace bien el proceso
Pero en el otro hace los dos
He probado con el comando exit(0), pero para todo

Me podéis echar una mano

Gracias

#include <SPI.h> //Importamos librería comunicación SPI
#include <Ethernet.h> //Importamos librería Ethernet

byte mac = { 0x90, 0xA2, 0xDA, 0x0F, 0xE7, 0x29 };//Ponemos la dirección MAC de la Ethernet Shield que está con una etiqueta debajo la placa
IPAddress ip(192,168,1,177); //Asingamos la IP al Arduino
EthernetServer server(80); //Creamos un servidor Web con el puerto 80 que es el puerto HTTP por defecto

int relay1=2; //Subir
int relay2=3; //Bajar
String estado=“OFF”; //Estado del Led inicialmente “ON”

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

// Inicializamos la comunicación Ethernet y el servidor
Ethernet.begin(mac, ip);
server.begin();
Serial.print("server is at ");
Serial.println(Ethernet.localIP());

pinMode(relay1,OUTPUT);
pinMode(relay2,OUTPUT);
// Initialize relay one as off so that on reset it would be off by default
digitalWrite(relay1, HIGH);
digitalWrite(relay2, HIGH);
}

void loop()
{
EthernetClient client = server.available(); //Creamos un cliente Web
//Cuando detecte un cliente a través de una petición HTTP
if (client) {
Serial.println(“new client”);
boolean currentLineIsBlank = true; //Una petición HTTP acaba con una línea en blanco
String cadena=""; //Creamos una cadena de caracteres vacía
while (client.connected()) {
if (client.available()) {
char c = client.read();//Leemos la petición HTTP carácter por carácter
Serial.write(c);//Visualizamos la petición HTTP por el Monitor Serial
cadena.concat(c);//Unimos el String ‘cadena’ con la petición HTTP (c). De esta manera convertimos la petición HTTP a un String

//Ya que hemos convertido la petición HTTP a una cadena de caracteres, ahora podremos buscar partes del texto.
int posicion=cadena.indexOf(“SUBIR=”); //Guardamos la posición de la instancia “LED=” a la variable ‘posicion’
int posicion1=cadena.indexOf(“BAJAR=”); //Guardamos la posición de la instancia “LED=” a la variable ‘posicion’

if(cadena.substring(posicion)==“SUBIR=ON”)//Si a la posición ‘posicion’ hay “SUBIR=ON”
{
digitalWrite(relay1,LOW);
delay(5000);
digitalWrite(relay1,HIGH);
estado=“OFF”;

}
if(cadena.substring(posicion1)==“BAJAR=OFF”)//Si a la posición ‘posicion’ hay “LED=OFF”
{
digitalWrite(relay2,LOW);
delay(5000);
digitalWrite(relay2,HIGH);
estado=“OFF”;

}

//Cuando reciba una línea en blanco, quiere decir que la petición HTTP ha acabado y el servidor Web está listo para enviar una respuesta
if (c == ‘\n’ && currentLineIsBlank) {

// Enviamos al cliente una respuesta HTTP
client.println(“HTTP/1.1 200 OK”);
client.println(“Content-Type: text/html”);
client.println();

//Página web en formato HTML
client.println("");
client.println("");
client.println("");
client.println("");
client.println(“

Arduino Home

PERSIANA controlada por Arduino Home

”);
//Creamos los botones. Para enviar parametres a través de HTML se utiliza el metodo URL encode. Los parámetros se envian a través del símbolo ‘?’
client.println("
");
client.println("<button onClick=location.href=’./?SUBIR=ON’ style=‘margin:auto;background-color: #84B1FF;color: snow;padding: 30px;border: 1px solid #3F7CFF;width:265px;’>");
client.println(“SUBIR”);
client.println("");
client.println("<button onClick=location.href=’./?BAJAR=OFF’ style=‘margin:auto;background-color: #84B1FF;color: snow;padding: 30px;border: 1px solid #3F7CFF;width:265px;’>");
client.println(“BAJAR”);
client.println("");
client.println("

“);
client.println(“ESTADO = “);
client.print(estado);
client.println(”

“);
client.println(””);
client.println(”");
break;
}
if (c == ‘\n’) {
currentLineIsBlank = true;
}
else if (c != ‘\r’) {
currentLineIsBlank = false;
}
}
}
//Dar tiempo al navegador para recibir los datos
delay(1);
client.stop();// Cierra la conexión
}
}

Bienvenido al foro. Y cuales son los dos procesos, explicate mejor. Luego lee lo que te pongo al final

NOTA: Lee las normas del foro y edita este post usando tags |500x151

Lo siento soy nuevo en el foro,

Veras tengo dos estados el ON y el OFF, si uso el bajar genial, si uno el subir primero actua el subir y luego el bajar, como hago para separar las dos acciones.

Como puedo separar las dos acciones o hacer una pausa cuando acabe cada una de ellas?

Gracias

[/  if(cadena.substring(posicion)=="SUBIR=ON")//Si a la posición 'posicion' hay "SUBIR=ON"
          {
            digitalWrite(relay1,LOW);
            delay(5000);
            digitalWrite(relay1,HIGH);
            estado="OFF";
            
          }
          if(cadena.substring(posicion1)=="BAJAR=OFF")//Si a la posición 'posicion' hay "BAJAR=OFF"
          {
            digitalWrite(relay2,LOW);
            delay(5000);
            digitalWrite(relay2,HIGH);
            estado="OFF";
            
          }code]

Lo primero que debes aprender es que delay(X) es una instrucción que debes ELIMINAR como opción para programar estas cosas. Y yo diría que el 99.9% de las veces.
Solo usas delay() en un programa secuencial donde no se hace nada mas que algo repetitivo. Ejemplo un semáforo bobo.

Aca no es el caso, porque tu esperas eventos… acciones remotas y para ello se necesita que el CPU este atento… y no esperando 5000 mseg a un cambio y luego otros 5000 msg mas.
Eso se reemplaza por millis() pero su uso no es inmediato.

Esta es mi versión de tu programa, me cuentas si funciona o no

#include <SPI.h>  //Importamos librería comunicación SPI
#include <Ethernet.h>  //Importamos librería Ethernet
 
byte mac[] = { 0x90, 0xA2, 0xDA, 0x0F, 0xE7, 0x29 };//Ponemos la dirección MAC de la Ethernet Shield que está con una etiqueta debajo la placa
IPAddress ip(192,168,1,177); //Asingamos la IP al Arduino
EthernetServer server(80); //Creamos un servidor Web con el puerto 80 que es el puerto HTTP por defecto
 
int relay1=2; //Subir
int relay2=3; //Bajar
String estado="OFF"; //Estado del Led inicialmente "ON"
byte estadoSubir = 0;
byte estadoBajar = 0;
 
void setup()
{
  Serial.begin(9600);
 
  // Inicializamos la comunicación Ethernet y el servidor
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
 
  pinMode(relay1,OUTPUT);
  pinMode(relay2,OUTPUT); 
  // Initialize relay one as off so that on reset it would be off by default
  digitalWrite(relay1, HIGH);
  digitalWrite(relay2, HIGH);
}
 
void loop() {

  EthernetClient client = server.available(); 		//Creamos un cliente Web
  //Cuando detecte un cliente a través de una petición HTTP
  if (client) {
    Serial.println("new client");
    boolean currentLineIsBlank = true; 				//Una petición HTTP acaba con una línea en blanco
    String cadena=""; 								//Creamos una cadena de caracteres vacía
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();						//Leemos la petición HTTP carácter por carácter
        Serial.write(c);							//Visualizamos la petición HTTP por el Monitor Serial
        cadena.concat(c); 							//Unimos el String 'cadena' con la petición HTTP (c). De esta manera convertimos la petición HTTP a un String
 
        //Ya que hemos convertido la petición HTTP a una cadena de caracteres, ahora podremos buscar partes del texto.
        int posicion  = cadena.indexOf("SUBIR="); 	//Guardamos la posición de la instancia "LED=" a la variable 'posicion'
        int posicion1 = cadena.indexOf("BAJAR="); 	//Guardamos la posición de la instancia "LED=" a la variable 'posicion'
 
        if (cadena.substring(posicion) == "SUBIR=ON") {//Si a la posición 'posicion' hay "SUBIR=ON"
     		estadoSubir = 1;
     		estadoBajar = 0;
        }

        if (cadena.substring(posicion1) == "BAJAR=OFF") { //Si a la posición 'posicion' hay "LED=OFF"
            estadoSubir = 0;
     		estadoBajar = 1;     
        }

        if (estadoSubir) {
        	switch(estadoSubir) {
        		case 1: digitalWrite(relay1,LOW);
        				estadoSubir = 2;
        				tsart = millis()+ 5000UL;
        				break;
        		case 2: if (millis() > tsart) {
        					estadoSubir = 3;
        					tsart = millis()+ 5000UL;
        					digitalWrite(relay1, HIGH);
        				}
        				break;

        		case 3: if (millis() > tsart) {
        					estadoSubir = 4;
        					estado = "ON"
        				}
        				break;
        		default: 
        				break;
        	}
        }

        if (estadoBajar) {
        	switch(estadoBajar) {
        		case 1: digitalWrite(relay2,LOW);
        				tsart = millis()+ 5000UL;
        				estadoBajar = 2;
        				break;
        		case 2: if (millis() > tsart) {
        					estadoBajar = 3;
        					tsart = millis()+ 5000UL;
        					digitalWrite(relay2, HIGH);
        				}
        				break;

        		case 3: if (millis() > tsart) {
        					estadoBajar = 4;
        					estado = "OFF"
        				}
        				break;
        		default: 
        				break;
        	}
        }

        //Cuando reciba una línea en blanco, quiere decir que la petición HTTP ha acabado y el servidor Web está listo para enviar una respuesta
        if (c == '\n' && currentLineIsBlank) {
 
            // Enviamos al cliente una respuesta HTTP
            client.println("HTTP/1.1 200 OK");
            client.println("Content-Type: text/html");
            client.println();
 
            //Página web en formato HTML
            client.println("<html>");
            client.println("<head>");
            client.println("</head>");
            client.println("<body>");
            client.println("<h1 align='center'>Arduino Home</h1><h3 align='center'>PERSIANA controlada por Arduino Home</h3>");
            //Creamos los botones. Para enviar parametres a través de HTML se utiliza el metodo URL encode. Los parámetros se envian a través del símbolo '?'
            client.println("<div style='text-align:center;'>");
            client.println("<button onClick=location.href='./?SUBIR=ON\' style='margin:auto;background-color: #84B1FF;color: snow;padding: 30px;border: 1px solid #3F7CFF;width:265px;'>");
            client.println("SUBIR");
            client.println("</button>");
            client.println("<button onClick=location.href='./?BAJAR=OFF\' style='margin:auto;background-color: #84B1FF;color: snow;padding: 30px;border: 1px solid #3F7CFF;width:265px;'>");
            client.println("BAJAR");
            client.println("</button>");
            client.println("

");
            client.println("<b>ESTADO = ");
            client.print(estado);
            client.println("</b>
");
            client.println("</b></body>");
            client.println("</html>");
            break;
        }
        if (c == '\n') {
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          currentLineIsBlank = false;
        }
      }
    }
    //Dar tiempo al navegador para recibir los datos
    delay(1);
    client.stop();// Cierra la conexión
  }
}

Muchas Gracias Surbyte, lo he probado y faltaba declarar el tstart y una vez declarada me da un error de compilación, podrías mirarlo.

Gracias

#include <SPI.h>  //Importamos librería comunicación SPI
#include <Ethernet.h>  //Importamos librería Ethernet

byte mac[] = { 0x90, 0xA2, 0xDA, 0x0F, 0xE7, 0x29 };//Ponemos la dirección MAC de la Ethernet Shield que está con una etiqueta debajo la placa
IPAddress ip(192,168,1,177); //Asingamos la IP al Arduino
EthernetServer server(80); //Creamos un servidor Web con el puerto 80 que es el puerto HTTP por defecto
 
int relay1=2; //Subir
int relay2=3; //Bajar
String estado="OFF"; //Estado del Led inicialmente "ON"
byte estadoSubir = 0;
byte estadoBajar = 0;
 
void setup()
{
  Serial.begin(9600);
 
  // Inicializamos la comunicación Ethernet y el servidor
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
 
  pinMode(relay1,OUTPUT);
  pinMode(relay2,OUTPUT); 
  // Initialize relay one as off so that on reset it would be off by default
  digitalWrite(relay1, HIGH);
  digitalWrite(relay2, HIGH);
  #define tstart
}
 
void loop() {

  EthernetClient client = server.available();     //Creamos un cliente Web
  //Cuando detecte un cliente a través de una petición HTTP
  if (client) {
    Serial.println("new client");
    boolean currentLineIsBlank = true;        //Una petición HTTP acaba con una línea en blanco
    String cadena="";                 //Creamos una cadena de caracteres vacía
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();           //Leemos la petición HTTP carácter por carácter
        Serial.write(c);              //Visualizamos la petición HTTP por el Monitor Serial
        cadena.concat(c);               //Unimos el String 'cadena' con la petición HTTP (c). De esta manera convertimos la petición HTTP a un String
 
        //Ya que hemos convertido la petición HTTP a una cadena de caracteres, ahora podremos buscar partes del texto.
        int posicion  = cadena.indexOf("SUBIR=");   //Guardamos la posición de la instancia "LED=" a la variable 'posicion'
        int posicion1 = cadena.indexOf("BAJAR=");   //Guardamos la posición de la instancia "LED=" a la variable 'posicion'
 
        if (cadena.substring(posicion) == "SUBIR=ON") {//Si a la posición 'posicion' hay "SUBIR=ON"
        estadoSubir = 1;
        estadoBajar = 0;
        }

        if (cadena.substring(posicion1) == "BAJAR=OFF") { //Si a la posición 'posicion' hay "LED=OFF"
            estadoSubir = 0;
        estadoBajar = 1;     
        }

        if (estadoSubir) {
          switch(estadoSubir) {
            case 1: digitalWrite(relay1,LOW);
                estadoSubir = 2;
                tsart = millis()+ 5000UL;
                break;
            case 2: if (millis() > tsart) {
                  estadoSubir = 3;
                  tsart = millis()+ 5000UL;
                  digitalWrite(relay1, HIGH);
                }
                break;

            case 3: if (millis() > tsart) {
                  estadoSubir = 4;
                  estado = "ON"
                }
                break;
            default: 
                break;
          }
        }

        if (estadoBajar) {
          switch(estadoBajar) {
            case 1: digitalWrite(relay2,LOW);
                tsart = millis()+ 5000UL;
                estadoBajar = 2;
                break;
            case 2: if (millis() > tsart) {
                  estadoBajar = 3;
                  tsart = millis()+ 5000UL;
                  digitalWrite(relay2, HIGH);
                }
                break;

            case 3: if (millis() > tsart) {
                  estadoBajar = 4;
                  estado = "OFF"
                }
                break;
            default: 
                break;
          }
        }

        //Cuando reciba una línea en blanco, quiere decir que la petición HTTP ha acabado y el servidor Web está listo para enviar una respuesta
        if (c == '\n' && currentLineIsBlank) {
 
            // Enviamos al cliente una respuesta HTTP
            client.println("HTTP/1.1 200 OK");
            client.println("Content-Type: text/html");
            client.println();
 
            //Página web en formato HTML
            client.println("<html>");
            client.println("<head>");
            client.println("</head>");
            client.println("<body>");
            client.println("<h1 align='center'>Arduino Home</h1><h3 align='center'>PERSIANA controlada por Arduino Home</h3>");
            //Creamos los botones. Para enviar parametres a través de HTML se utiliza el metodo URL encode. Los parámetros se envian a través del símbolo '?'
            client.println("<div style='text-align:center;'>");
            client.println("<button onClick=location.href='./?SUBIR=ON\' style='margin:auto;background-color: #84B1FF;color: snow;padding: 30px;border: 1px solid #3F7CFF;width:265px;'>");
            client.println("SUBIR");
            client.println("</button>");
            client.println("<button onClick=location.href='./?BAJAR=OFF\' style='margin:auto;background-color: #84B1FF;color: snow;padding: 30px;border: 1px solid #3F7CFF;width:265px;'>");
            client.println("BAJAR");
            client.println("</button>");
            client.println("

");
            client.println("<b>ESTADO = ");
            client.print(estado);
            client.println("</b>
");
            client.println("</b></body>");
            client.println("</html>");
            break;
        }
        if (c == '\n') {
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          currentLineIsBlank = false;
        }
      }
    }
    //Dar tiempo al navegador para recibir los datos
    delay(1);
    client.stop();// Cierra la conexión
  }
}

Yo lo miro pero me doy cuenta que tu estas muy perdido. tstart se soluciona asi

unsinged long tstart = 0; // como global.

Modifica todos para que se llamen tstart porque puse cualquier cosa tsart en general, falta un t.

Luego

estado = "ON"

y

estado = "OFF"

a ambos les falta ;

Esfuérzate un poco, si?