Activar/Desactivar LEDs remotamente sin placa Ethernet (Processing + Arduino)

Hola de nuevo a todos!

No estoy del todo seguro de si este post debería ir aquí o en la sección de "Proyectos", pero como lo haré a modo de tutorial, supongo que este es un buen sitio.

Soy bastante novato en el mundo de Arduino, y poseo una Arduino Leonardo (incompatible con la mayoría de Shields actuales), y una de las cosas que mas ganas tenia de probar era la posibilidad de poder ejecutar acciones en la placa sin estar yo presente en el mismo lugar que la placa (es decir, a distancia).

Vi los Shields Ethernet/WiFi, pero aparte de ser una opción algo cara, no eran compatibles con mi Arduino Leonardo (se pueden adaptar con cables, pero eso es otra historia), así que me puse a buscar y encontré un método basado en Processing y Arduino, el cual he "mejorado"/"Adaptado" (si se le puede llamar así) para poder controlar varios LEDs desde una interfaz WEB sin tener ningun Shield de red.

PROS: Económico. Compatible con cualquier board. No requiere estar presente en el mismo sitio.
CONTRAS: Requiere registro (si se puede considerar contra). Interfaz arcaica

Empezamos

Material

  • Placa Arduino (Obvio) con los drivers instalados
  • Processing de 32bits (el de 64 a mi me da fallos, y tengo Windows 7 de 64b). Descarga aquí: Download Processing / Processing.org
  • LEDs diversos (para este tutorial, 3, uno Rojo, uno Verde y uno Amarillo)
  • Resistencias respectivas
  • Hosting Web con soporte PHP

Y con esto, algo de tiempo y ganas, ya podemos empezar a realizar el montaje.
Para el código que os adjuntaré, se debe conectar el LED Rojo al pin 13 (ergo no necesitará resistencia añadida), el Amarillo al 9, y el Verde al 5, con las resistencias necesarias.

CODIGO ARDUINO

const int ledR = 13; //PIN para el LED Rojo
const int ledV = 5; //PIN para el LED Verde
const int ledA = 9; //PIN para el LED Amarillo
int incomingByte;      // Variable para leer los datos del puerto Serial
 
void setup() {
  // Inicializamos comunicacion serial
  Serial.begin(9600);
  // Declaramos los PINs como salida
  pinMode(ledR, OUTPUT);
  pinMode(ledV, OUTPUT);
  pinMode(ledA, OUTPUT);  
}
 
void loop() {
  // Ver si hay datos en Serial
  if (Serial.available() > 0) {
    // Leemos los datos entrantes por el puerto Serial
    incomingByte = Serial.read();
    // Si se recibe 'H', encender el LED Rojo
    if (incomingByte == 'H') {
      digitalWrite(ledR, HIGH);
    }
    // Si se recibe 'L', apagar el LED Rojo
    if (incomingByte == 'L') {
      digitalWrite(ledR, LOW);
    }
    
    //Y así sucesivamente con los LED Verde y Amarillo
    
        if (incomingByte == 'V') {
      digitalWrite(ledV, HIGH);
    }
    
    
        if (incomingByte == 'F') {
      digitalWrite(ledV, LOW);
    }
    
    
        if (incomingByte == 'A') {
      digitalWrite(ledA, HIGH);
    }
    
    
        if (incomingByte == 'Q') {
      digitalWrite(ledA, LOW);
    }
    
    //Tambien podemos poner que si se recibe 'T' se enciendan todos
    
        if (incomingByte == 'T') {
      digitalWrite(ledR, HIGH);
      digitalWrite(ledA, HIGH);
      digitalWrite(ledV, HIGH);      
    }
    
    //Y con 'Y' se apaguen todos     
        if (incomingByte == 'Y') {
      digitalWrite(ledR, LOW);
      digitalWrite(ledA, LOW);
      digitalWrite(ledV, LOW);      
    }    
    
  }
}

Antes de pasar al Código en Processing, quiero destacar que necesitaremos un Hosting con soporte total de PHP.
Tras probar varios gratuitos que no me funcionaron, uno gratuito que si fue en Hostinger.es (no estoy pretendiendo hacer ningun tipo de publicidad de esta pagina, solo indico que a mi me funcionó como soporte PHP, ya que otras que probé, no). Solo hay que registrarse, y tras crear la cuenta y el dominio Web, en un par de horas ya me funcionaba el dominio (te avisan de que puede tardar hasta 12h en activarse el dominio, asi que no desespereis)

Del código fuente disponible para descarga al final del hilo, deberéis descomprimir el contenido del zip RemoteLedWeb en la carpeta public_html de vuestro Hosting.

Probé a hacerlo con un único archivo .txt y/o un único .php, pero no fui capaz, obtenía demasiados errores, así que lo separé en 3 archivos

Y ahora, vamos a por el Código de Processing

/*
 
A simple Processing script for enabling or disabling the LED on an Arduino using a web interface and serial communication.
Author: Sindre Lindstad
Created: 19th of January 2011
 
http://projects.sindrelindstad.com

Modified by Arduleo
 
*/
 
 import processing.serial.*;
 Serial port;
 
 void setup()  {
 
   /* This part must be altered to fit your local settings. The number in brackets after "Serial.list()" is where you declare what COM port your Arduino is connected to.
      If you get error messages, try a different number starting from 0 (e.g. 0, 1, 2, 3...) . */
      println(Serial.list());
    port = new Serial(this, Serial.list()[0], 9600);  // Open the port that the Arduino board is connected to, at 9600 baud
 
}
 void draw() {
 
  String onR[] = loadStrings ("http://TUDOMINIO.com/LEDRstate.txt"); // Cambialo por la ubicacion a tu archivo LEDRstate.txt
  String onV[] = loadStrings ("http://TUDOMINIO.com/LEDVstate.txt"); // Cambialo por la ubicacion a tu archivo LEDVstate.txt
  String onA[] = loadStrings ("http://TUDOMINIO.com/LEDAstate.txt"); // Cambialo por la ubicacion a tu archivo LEDAstate.txt
 
  
  //LED ROJO
  if (onR[0].equals("1")) {
    println(" - LED ROJO ENCENDIDO");
    port.write('H'); // Send "H" over serial to set LED to HIGH
 
  } else if (onR[0].equals("0")) {
    println(" - LED ROJO APAGADO");
    port.write('L');  // Send "L" over serial to set LED to LOW
 }
 
 delay(10);
 
 //LED VERDE
 
  //print(onoroffV[0]);  // Prints whatever is in the file ("1" or "0")
 
   if (onV[0].equals("1")) {
    println(" - LED VERDE ENCENDIDO");
    port.write('V'); // Send "H" over serial to set LED to HIGH
 
  } else if (onV[0].equals("0")) {
 
    println(" - LED VERDE APAGADO");
    port.write('F');  // Send "L" over serial to set LED to LOW
 }
 
 delay(10);
 
 
 //LED AMARILLO
 
  //print(onoroffA[0]);  // Prints whatever is in the file ("1" or "0")
 
   if (onA[0].equals("1")) {
    println(" - LED AMARILLO ENCENDIDO");
    port.write('A'); // Send "H" over serial to set LED to HIGH
 
  } else if (onA[0].equals("0")) {
 
    println(" - LED AMARILLO APAGADO");
    port.write('Q');  // Send "L" over serial to set LED to LOW
 }
 
 
 println("**************************");
 
 
onR[0] = "0";  //Si os da error, podeis quitar esta linea
onV[0] = "0";  //Si os da error, podeis quitar esta linea
onA[0] = "0";  //Si os da error, podeis quitar esta linea
 delay(1000);
 }

Y al ejecutar el codigo de Processing, si todo ha salido bien, al acceder a vuestro dominio, podreis ver la pagina arcaica en la que poder modificar el estado de los leds, y al pulsar sobre ellos, ver como va cambiando el estado de estos en la placa.

Así podréis modificar su estado estando en otro ordenador (el conectado a la placa deberá estar encendido)

Realmente yo lo único que he hecho es adaptar el uso para manejar 3 o más LEDs (siguiendo la misma estructura podréis fácilmente añadir/quitar LEDs), ya que el proyecto original no es mio.

Espero que este tutorial os sirva para aprender a utilizar cambios en PHP junto a Processing para controlar vuestros Arduinos (En cuanto me llegue un modulo LCD estoy planteandome aplicar este principio para poder enviar mensajes personalizados a la pantalla remotamente) y sobretodo, que os permita hacer pruebas basadas en RED sin tener Shields Ethernet/WiFi

CODIGO FUENTE COMPLETO:
http://arduleo90.16mb.com/DESCARGAS_PUBLICAS/LEDRemotoCompleto.zip

le doy click para descargar el codigo PHP pero no muestra el zip :frowning: