activar dos relés con tarjeta ethernet (SOLUCIONADO)

Buenas a todos, he utilizado este código para activar un relé por medio de mi navegador y usando una tarjeta shield ethernet, más mi arduino ONE. Es un ejemplo que circula por muchas webs, pero no consigo activar dos relés. Os dejo primero el que activa un relé y me funciona sin problemas y después el mio.

Scketch de un relé:

#include <SPI.h>
#include <Ethernet.h>

//Declaración de la direcciones MAC e IP. También del puerto 80
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; //MAC
IPAddress ip(192, 168, 1, 100); //IP
EthernetServer servidor(80);

int PIN_LED = 8;
String readString = String(30);
String state = String(3);

void setup()
{
  Ethernet.begin(mac, ip); //Inicializamos con las direcciones asignadas
  servidor.begin();
  pinMode(PIN_LED, OUTPUT);
  digitalWrite(PIN_LED, HIGH);
  state = "OFF";
}

void loop()
{
  EthernetClient cliente = servidor.available();

  if (cliente)
  {
    boolean lineaenblanco = true;
    while (cliente.connected()) //Cliente conectado
    {
      if (cliente.available())
      {
        char c = cliente.read();
        if (readString.length() < 30) //Leemos petición HTTP caracter a caracter
        {
          readString.concat(c); //Almacenar los caracteres en la variable readString
        }
        if (c == '\n' && lineaenblanco) //Si la petición HTTP ha finalizado
        {
          int LED = readString.indexOf("LED=");
          if (readString.substring(LED, LED + 5) == "LED=T")
          {
            digitalWrite(PIN_LED, LOW);
            state = "ON";
          } else if (readString.substring(LED, LED + 5) == "LED=F")
          {
            digitalWrite(PIN_LED, HIGH);
            state = "OFF";
          }


          //Cabecera HTTP estándar
          cliente.println("HTTP/1.1 200 OK");
          cliente.println("Content-Type: text/html");
          cliente.println();
          //Página Web en HTML
          cliente.println("<html>");
          cliente.println("<head>");
          cliente.println("<title>LAMPARA ON/OFF</title>");
          cliente.println("</head>");
          cliente.println("<body width=100% height=100%>");
          cliente.println("<center>");
          cliente.println("<h1>LAMPARA ON/OFF</h1>");
          cliente.print("

");
          cliente.print("Estado de la lampara: ");
          cliente.print(state);
          cliente.print("



");
          cliente.println("<input type=submit value=ON style=width:200px;height:75px onClick=location.href='./?LED=T\'>");
          cliente.println("<input type=submit value=OFF style=width:200px;height:75px onClick=location.href='./?LED=F\'>");
          cliente.println("</center>");
          cliente.println("</body>");
          cliente.println("</html>");
          cliente.stop();//Cierro conexión con el cliente
          readString = "";
        }
      }
    }
  }
}

Scketch para dos relés, no me funciona y no se porqué, ¿alguien me puede ayudar ?

#include <SPI.h>
#include <Ethernet.h>

//Declaración de la direcciones MAC e IP. También del puerto 80
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; //MAC
IPAddress ip(192, 168, 1, 100); //IP
EthernetServer servidor(80);

int PIN_LED1 = 8;
String readString1 = String(30);
String state1 = String(3);
int PIN_LED2 = 9;
String readString2 = String(31);
String state2 = String(4);


void setup()
{
  Ethernet.begin(mac, ip); //Inicializamos con las direcciones asignadas
  servidor.begin();
  pinMode(PIN_LED1, OUTPUT);
  digitalWrite(PIN_LED1, HIGH);
  state1 = "OFF";
  pinMode(PIN_LED2, OUTPUT);
  digitalWrite(PIN_LED2, HIGH);
  state2 = "OFF";

}

void loop()
{
  EthernetClient cliente = servidor.available();

  if (cliente)
  {
    boolean lineaenblanco = true;
    while (cliente.connected()) //Cliente conectado
    {
      if (cliente.available())
      {
        char c = cliente.read();
        if (readString1.length() < 30) //Leemos petición HTTP caracter a caracter
        {
          readString1.concat(c); //Almacenar los caracteres en la variable readString
        }
        if (c == '\n' && lineaenblanco) //Si la petición HTTP ha finalizado
        {
          int LED1 = readString1.indexOf("LED1=");
          if (readString1.substring(LED1, LED1 + 5) == "LED1=T")
          {
            digitalWrite(PIN_LED1, LOW);
            state1 = "ON";
          } else if (readString1.substring(LED1, LED1 + 5) == "LED1=F")
          {
            digitalWrite(PIN_LED1, HIGH);
            state1 = "OFF";
          }
          if (readString2.length() < 30) //Leemos petición HTTP caracter a caracter
          {
            readString2.concat(c); //Almacenar los caracteres en la variable readString
          }
          if (c == '\n' && lineaenblanco) //Si la petición HTTP ha finalizado
          {
            int LED = readString2.indexOf("LED=");
            if (readString2.substring(LED, LED + 5) == "LED=T")
            {
              digitalWrite(PIN_LED2, LOW);
              state2 = "ON";
            } else if (readString2.substring(LED, LED + 5) == "LED=F")
            {
              digitalWrite(PIN_LED2, HIGH);
              state2 = "OFF";
            }

            //Cabecera HTTP estándar
            cliente.println("HTTP/1.1 200 OK");
            cliente.println("Content-Type: text/html");
            cliente.println();
            //Página Web en HTML
            cliente.println("<html>");
            cliente.println("<head>");
            cliente.println("<title>LAMPARA ON/OFF</title>");
            cliente.println("</head>");
            cliente.println("<body width=100% height=100%>");
            cliente.println("<center>");
            cliente.println("<h1>LAMPARA ON/OFF</h1>");
            cliente.print("

");
            cliente.print("Estado de la lampara: ");
            cliente.print(state1);
            cliente.print("



");
            cliente.println("<input type=submit value=ON style=width:200px;height:75px onClick=location.href='./?LED1=T\'>");
            cliente.println("<input type=submit value=OFF style=width:200px;height:75px onClick=location.href='./?LED1=F\'>");
            cliente.print("

");
            cliente.print("Estado de la lampara: ");
            cliente.print(state2);
            cliente.print("



");
            cliente.println("<input type=submit value=ON style=width:200px;height:75px onClick=location.href='./?LED=T\'>");
            cliente.println("<input type=submit value=OFF style=width:200px;height:75px onClick=location.href='./?LED=F\'>");
            cliente.print("

");
            cliente.println("</center>");
            cliente.println("</body>");
            cliente.println("</html>");
            cliente.stop();//Cierro conexión con el cliente
            readString1 = "";
            readString2 = "";
          }
        }
      }
    }
  }
}

Hola Blown!!

Igual que tu hace poco estuve probando el código para encender 1 relé a traves de Internet.

Como no había probado con 2 relés he aprovechado tu post para probarlo y he encontrado el siguiente error en tu código:

blown:
if(readString1.substring(LED1,LED1+5)=="LED1=T")

sería LED1+6 ya que 6 son los caracteres de la cadena LED1=T

Con esto ya te funcionaría el primer relé.

He estado "trasteando" el código para activar el segundo pero he tenido que realizar algunas modificaciones para simplificarlo un poco hasta que ha funcionado.

Resumiendo un poco:

  • utilizar solo una variable que recoja 1 sola vez el valor pulsado en la web (readString1)
  • asignar a LED1 y LED2 su valor de texto correspondiente
  • y a partir de ahí comparar a base de "if´s" el contenido de las mismas y ejecutar sobre el relé correspondiente el encendido o apagado según proceda.

Aquí te dejo el código para que le eches un vistazo:

#include <SPI.h>
#include <Ethernet.h>

//Declaración de la direcciones MAC e IP. También del puerto 80
byte mac[]={0xDE,0xAD,0xBE,0xEF,0xFE,0xED}; //MAC
IPAddress ip(192,168,1,100); //IP
EthernetServer servidor(80);

int PIN_LED1=8;
String readString1=String(30);
String state1=String(3);
int PIN_LED2=9;
String state2=String(3);


void setup()
{
  Ethernet.begin(mac, ip); //Inicializamos con las direcciones asignadas
  servidor.begin();
  pinMode(PIN_LED1,OUTPUT);
  digitalWrite(PIN_LED1,HIGH);
  state1="OFF";
  pinMode(PIN_LED2,OUTPUT);
  digitalWrite(PIN_LED2,HIGH);
  state2="OFF";
  
}

void loop()
{
  EthernetClient cliente= servidor.available();
  
  if(cliente)
  {
    boolean lineaenblanco=true;
    while(cliente.connected())//Cliente conectado
    {
      if(cliente.available())
      {
        char c=cliente.read();
        if(readString1.length()<30)//Leemos petición HTTP caracter a caracter
        {
          readString1.concat(c); //Almacenar los caracteres en la variable readString
        
        }
        if(c=='\n' && lineaenblanco)//Si la petición HTTP ha finalizado
        {
          int LED1 = readString1.indexOf("LED1=");
          int LED2 = readString1.indexOf("LED=");
          if(readString1.substring(LED1,LED1+6)=="LED1=T")
          {
            digitalWrite(PIN_LED1,LOW);
            state1="ON";
          } else if (readString1.substring(LED1,LED1+6)=="LED1=F")
          {
            digitalWrite(PIN_LED1,HIGH);
            state1="OFF";
          }
          if(readString1.substring(LED2,LED2+5)=="LED=T")
          {
            digitalWrite(PIN_LED2,LOW);
            state2="ON";
          } else if (readString1.substring(LED2,LED2+5)=="LED=F")
          {
            digitalWrite(PIN_LED2,HIGH);
            state2="OFF";
          }  
          
          //Cabecera HTTP estándar
          cliente.println("HTTP/1.1 200 OK");
          cliente.println("Content-Type: text/html");
          cliente.println();        
          //Página Web en HTML
          cliente.println("<html>");
          cliente.println("<head>");
          cliente.println("<title>LAMPARA ON/OFF</title>");
          cliente.println("</head>");
          cliente.println("<body width=100% height=100%>");
          cliente.println("<center>");
          cliente.println("<h1>LAMPARA ON/OFF</h1>");
          cliente.print("

");
          cliente.print("Estado de la lampara: ");
          cliente.print(state1);
          cliente.print("



");
          cliente.println("<input type=submit value=ON style=width:200px;height:75px onClick=location.href='./?LED1=T\'>");
          cliente.println("<input type=submit value=OFF style=width:200px;height:75px onClick=location.href='./?LED1=F\'>");
          cliente.print("

");
          cliente.print("Estado de la lampara: ");
          cliente.print(state2);
          cliente.print("



");
          cliente.println("<input type=submit value=ON style=width:200px;height:75px onClick=location.href='./?LED=T\'>");
          cliente.println("<input type=submit value=OFF style=width:200px;height:75px onClick=location.href='./?LED=F\'>");
          cliente.print("

");
          cliente.println("</center>");
          cliente.println("</body>");
          cliente.println("</html>");
          cliente.stop();//Cierro conexión con el cliente
          readString1="";
        }
      }
    }
   }
  }

No afectaba al funcionamiento pero el tamaño de la string Estate2 es 3 no 4.

Un saludo!!!

Jukar, muchísimas gracias por la respuesta tan rápida que me has dado. Voy a echarle un vistazo a tu código y si me entra alguna duda te pregunto. He estado trasteando por internet y me he encontrado con una web, en mi opinión, buenísima para entender el funcionamiento de la ethernet shield. Arduino Ethernet Shield Web Server Tutorial

Un saludo y si no entiendo algo te preguntare en breve, soy nuevisimo en arduino pero tengo muchas ganas de progresar jejeje.

blown:
...he encontrado con una web, en mi opinión, buenísima para entender el funcionamiento de la ethernet shield. Arduino Ethernet Shield Web Server Tutorial

Un saludo y si no entiendo algo te preguntare en breve, soy nuevisimo en arduino pero tengo muchas ganas de progresar jejeje.

Tiene muy buena pinta esa web, gracias!

Yo también soy nuevo en esto pero en lo que pueda ayudarte no dudes que lo haré :wink:

Un saludo!!!

Jukar, cuando puedas explícame lo de "string" por que no entiendo muy bien qué es lo que quieres decir.
El sketch que pones funciona perfectamente.

Un arduino ¿ puede activar dos relés (o uno) usando una página web pero por medio de wify, no usando el cable de datos conectado al router como hacía con la ethernet shield?, en resumen, ¿puedo hacer lo mismo que con la ethernet shield pero con un módulo RNXV?. Voy a probar con un módulo RN-XV mientras alguien me pueda contestar.

Muchísimas gracias.

blown:
Jukar, cuando puedas explícame lo de "string" por que no entiendo muy bien qué es lo que quieres decir.

No tiene importancia, solo es que pusiste en tu código:

String state2=String(4);

igual que

"String readString2=String(31);

cuando los valores son 3 y 30 respectivamente :wink:

Respecto a lo que preguntas entiendo que si.

Aquí tienes un buen tutorial http://www.arduteka.com/2013/04/comunicar-con-arduino-por-wifi-xbee-shield-wifly-rn-xv/

Un saludo!!!

Gracias Jukar, estoy con ese tutorial, todo lo hago igual pero al final dice "associated" y no pasa de el DHCP:start, se queda ahí....

Lo siento pero ahí si que no puedo ayudarte porque no tengo ningún módulo wifi para probarlo...

Dale unas vueltas más y si no lo consigues abre un nuevo hilo.

(Ah, y en este si quieres modifica el título agregandole "SOLUCIONADO"

Un saludo!!!!

Hola que tal
Soy bastante nuevo en arduino y pues yo no he logrado encender la lámpara pienso que el problema está en mi pag. web.
No se como hacer que se comuniquen tanto la placa arduino como la pagina de internet ya que al precionar el botón de encender no envía información
Estuve leyendo algo sobre el puerto 80 que hay que abrirlo o algo parecido, no se si me puedan ayudar se los agradeceré.
:slight_smile: buen día. saludos

Buenos días.
Lo primero dar las gracias por vuestros aportes.
Estoy interesado en este tema de saber el estado de las salidas por Internet para control remoto pero me encuentro con un problema gordo cuando dos ordenadores se conectan a arduino y ambos ejecutan los botones de encender y apagar...os cuento.
En el que ejecuta la orden se refresca bien pero en el segundo sigue saliendo con le mismo estado en el que se quedo y claro esa información no es real por eso le metí un refresco a la pagina pero entonces solo me refresca uno de los dos botones....en el que no estoy actuando en el otro si.
Metí este código para el refresco:

//Página Web en HTML
         
         cliente.print("<meta http-equiv=\"refresh\" content=\"5\">");
         
               
         cliente.println("<html>");

Bueno si me podéis ayudar os estaría muy agradecido.
Un saludo y muchas gracias por todo.

blown:
Jukar, muchísimas gracias por la respuesta tan rápida que me has dado. Voy a echarle un vistazo a tu código y si me entra alguna duda te pregunto. He estado trasteando por internet y me he encontrado con una web, en mi opinión, buenísima para entender el funcionamiento de la ethernet shield. Arduino Ethernet Shield Web Server Tutorial

Un saludo y si no entiendo algo te preguntare en breve, soy nuevisimo en arduino pero tengo muchas ganas de progresar jejeje.

Increible tutorial de ethernet shield

gracias por el aporte... funciona de maravilla
una Pregunta- se puede mantener activado el Relé por cierto tiempo 3 minutos por ejemplo..
gracias por su respueta

Hola! Yo tambien empece con un proyecto parecido hace tiempo y finalmente me topé con una libreria que es capaz de hacer eso y muchisimo mas! con App de Android para controlarlo todo y tambien con entorno WEB. Por si a alguno le interesa el link esta en mi firma :stuck_out_tongue:

Salu2 y buen trabajo!

Hola soy nuevo en esto del arduino, yo soy de hardware y me cuesta mucho esto.
en mi caso estaba pensando en hacer esto con mas reles, pero no me aclaro con que es lo que hay que modificar, ademas de poder tener un feedback de los reles via lectura de pines digitales asi como valores de entradas analogicas.
¿me podriais hechar un cable?
Gracias

Hola!!

He seguido vuestra técnica para conectar releés via ethernet con arduino.

He podido activar 1, 2, 3 y hasta 4 reles. Curiosamente el copypaste para 5 o mas relés no funciona.

Alguno ha activado 5 o mas relés via ETHERNET?

Muchas gracias y un saludo!!

Os dejo el código, siendo PIZTUTA=ON y ITZALITA=OFF:

#include <SPI.h>
#include <Ethernet.h>

// Hemen IP helbidea jarriko da
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; //MAC
IPAddress ip(169, 254, 231, 252); //IP 192.168.0.200
EthernetServer servidor(80); // Ethernet serbitzariaren liburutegia
int PIN11 = 2;  int PIN22 = 3;  int PIN33 = 4;  int PIN44 = 5;  int PIN55 = 6; int PIN66 = 7;

String readString = String(30);
String state1 = String(3); String state2 = String(3); String state3 = String(3);
String state4 = String(3); String state5 = String(3); String state6 = String(3);

void setup() {
  Ethernet.begin(mac, ip);  // Hasieratu Ethernet konexioa eta serbitzaria
  servidor.begin();
  pinMode(PIN11, OUTPUT); digitalWrite(PIN11, LOW);
  pinMode(PIN22, OUTPUT); digitalWrite(PIN22, LOW);
  pinMode(PIN33, OUTPUT); digitalWrite(PIN33, LOW);
  pinMode(PIN44, OUTPUT); digitalWrite(PIN44, LOW);
  pinMode(PIN55, OUTPUT); digitalWrite(PIN55, LOW);
  pinMode(PIN66, OUTPUT); digitalWrite(PIN66, LOW);

  state1 = "ITZALITA";  state2 = "ITZALITA";  state3 = "ITZALITA";
  state4 = "ITZALITA";  state5 = "ITZALITA";  state6 = "ITZALITA";
}

void loop() {
  EthernetClient cliente = servidor.available();
  if (cliente) {
    boolean lineaenblanco = true;
    while (cliente.connected()) {
      if (cliente.available()) {
        char c = cliente.read();
        if (readString.length() < 30) {
          readString.concat(c);
        }
        if (c == '\n' && lineaenblanco)
        {
          int LED1 = readString.indexOf("LED1=");
          int LED2 = readString.indexOf("LED2=");
          int LED3 = readString.indexOf("LED3=");
          int LED4 = readString.indexOf("LED4=");
          int LED5 = readString.indexOf("LED5=");
          int LED6 = readString.indexOf("LED6=");

          if (readString.substring(LED1, LED1 + 6) == "LED1=T") {
            digitalWrite(PIN11, HIGH);
            //state1="<span style=font-size:20px><span style=color:green>PIZTUTA</span>"; }
            state1 = "PIZTUTA";
          }
          if (readString.substring(LED1, LED1 + 6) == "LED1=F") {
            digitalWrite(PIN11, LOW);
            state1 = "ITZALITA";
          }

          if (readString.substring(LED2, LED2 + 6) == "LED2=T") {
            digitalWrite(PIN22, HIGH);
            state2 = "PIZTUTA";
          }
          if (readString.substring(LED2, LED2 + 6) == "LED2=F") {
            digitalWrite(PIN22, LOW);
            state2 = "ITZALITA";
          }

          if (readString.substring(LED3, LED3 + 6) == "LED3=T") {
            digitalWrite(PIN33, HIGH);
            state3 = "PIZTUTA";
          }
          if (readString.substring(LED3, LED3 + 6) == "LED3=F") {
            digitalWrite(PIN33, LOW);
            state3 = "ITZALITA";
          }

          if (readString.substring(LED4, LED4 + 6) == "LED4=T") {
            digitalWrite(PIN44, HIGH);
            state4 = "PIZTUTA";
          }
          if (readString.substring(LED4, LED4 + 6) == "LED4=F") {
            digitalWrite(PIN44, LOW);
            state4 = "ITZALITA";
          }

          if (readString.substring(LED5, LED5 + 6) == "LED5=T") {
            digitalWrite(PIN55, HIGH);
            state5 = "PIZTUTA";
          }
          if (readString.substring(LED5, LED5 + 6) == "LED5=F") {
            digitalWrite(PIN55, LOW);
            state5 = "ITZALITA";
          }

          if (readString.substring(LED6, LED6 + 6) == "LED6=T") {
            digitalWrite(PIN66, HIGH);
            state6 = "PIZTUTA";
          }
          if (readString.substring(LED6, LED6 + 6) == "LED6=F") {
            digitalWrite(PIN66, LOW);
            state6 = "ITZALITA";
          }


          //Web orrialdea sortu
          cliente.println("HTTP/1.1 200 OK");
          cliente.println("Content-Type: text/html");
          cliente.println("Connection: close");
          cliente.println("Refresh: 5");  // freskatzea 5 segundoro
          cliente.println(); // Web orrialdea HTML formatuan
          cliente.println("<!DOCTYPE HTML>");
          cliente.println("<html>");
          cliente.println("<head>");
          cliente.println("<title>BOST LEDen KONTROLA</title>");
          cliente.println("</head>");
          cliente.println("<body>"); //cliente.println("<body width=100% height=100%>");
          cliente.println("<body bgcolor=#97FC95 height=100% width=100%>");
          //cliente.println("<p style=text-align: right;>Playground <a href=http://playground.arduino.cc/ >Arduino</a></p>");
          cliente.println("<center>");

          cliente.print("ID1  ");
          cliente.println("<input type=submit value=PIZTU style=width:100px;height:40px onClick=location.href='./?LED1=T\'><input type=submit value=ITZALI style=width:100px;height:40px onClick=location.href='./?LED1=F\'>");
          cliente.println("   ID1=");  cliente.println(state1);  cliente.print("<p>&nbsp;</p>");

          cliente.print("ID2  ");
          cliente.println("<input type=submit value=PIZTU style=width:100px;height:40px onClick=location.href='./?LED2=T\'><input type=submit value=ITZALI style=width:100px;height:40px onClick=location.href='./?LED2=F\'>");
          cliente.println("   ID2=");  cliente.println(state2);  cliente.print("<p>&nbsp;</p>");

          cliente.print("ID3  ");
          cliente.println("<input type=submit value=PIZTU style=width:100px;height:40px onClick=location.href='./?LED3=T\'><input type=submit value=ITZALI style=width:100px;height:40px onClick=location.href='./?LED3=F\'>");
          cliente.println("   ID3=");  cliente.println(state3);  cliente.print("<p>&nbsp;</p>");

          cliente.print("ID4  ");
          cliente.println("<input type=submit value=PIZTU style=width:100px;height:40px onClick=location.href='./?LED4=T\'><input type=submit value=ITZALI style=width:100px;height:40px onClick=location.href='./?LED4=F\'>");
          cliente.println("   ID4=");  cliente.println(state4);  cliente.print("<p>&nbsp;</p>");
          /*
            cliente.print("ID5  ");
            cliente.println("<input type=submit value=PIZTU style=width:100px;height:40px onClick=location.href='./?LED5=T\'><input type=submit value=ITZALI style=width:100px;height:40px onClick=location.href='./?LED5=F\'>");
            cliente.println("   ID5=");  cliente.println(state5);  cliente.print("<p>&nbsp;</p>");

            cliente.print("ID6  ");
            cliente.println("<input type=submit value=PIZTU style=width:100px;height:40px onClick=location.href='./?LED6=T\'><input type=submit value=ITZALI style=width:100px;height:40px onClick=location.href='./?LED6=F\'>");
            cliente.println("   ID6=");  cliente.println(state5);  cliente.print("<p>&nbsp;</p>");
            /*

            cliente.println("</body>");
            cliente.println("</html>");
            cliente.stop();
            // bezeroarekin konexioa bukatu
            readString="";
          */
        }
      }
    }
  }
}

El copy & Paste si funciona pero lo que no funciona es que se queda sin RAM.
Mas cosas, mas consumo, y el UNO esta limitado.
Usa un MEGA y funciona