Publicado por el 12 marzo, 2016 Deja tus dudas en los comentarios
Dificultad bajaComplejidad baja
CC BY-SA 4.0

Si alguna vez has pensado en controlar una placa Arduino conectada a Internet y a través de una aplicación creada en App Inventor, pues bienvenido, vamos a por ello. AppInventor y Arduino Ethernet ¡¡¡Qué gran descubrimiento!!! En esta ocasión trataremos de controlar el encendido y apagado de un LED conectado a Arduino. Las órdenes las enviaremos desde una aplicación en nuestro smartphone.

Antes de meternos en harina hay que conocer, al menos el concepto, de petición GET, puesto que esto es lo que hacemos una y otra vez para comunicarnos con nuestro Ethernet Shield. Si bien es cierto que podríamos usar otro tipo de peticiones, estamos acostumbrados a, por ejemplo, usar un enlace creado con la etiqueta a con href en HTML para dar “ordenes” a nuestro Arduino. La información que pasamos dentro del href=”” se convertirá en parte de la petición GET que nuestro navegador mandará a la placa cuando se hace clic en el enlace.



Get es un método de petición HTTP que trata, en principio, solo de recuperar datos. Es decir, es una forma de decirle a un servidor web que datos queremos que nos envié. Sin embargo, nosotros podemos usarlo par enviar información en la propia petición. Podemos introducir las ordenes que queremos que siga Arduino. Para crearla, lo primero será formar la cadena de caracteres que la conformarán.  La estructura de una petición GET suele ser algo como:

GET /index.html HTTP/1.1 HOST: www.host.com

Si no lo conoces, no te preocupes de momento, pero si quieres seguir aprendiendo en el futuro sobre este tema, sería bueno que investigaras un poco sobre HTTP, GET, POST, TCP y UDP.

En cualquier caso, volvemos a nuestro objetivo, que nos estamos perdiendo. ¿cómo realizamos una petición GET desde AppInventor? Para realizar esto vamos a usar un módulo denominado Web que lo encontraremos dentro de la categoría de connectivity. Usarlo con este propósito es bien sencillo, solo tendremos que configurar la URL a la cual queremos conectar y luego lanzar la petición GET contra el servidor, que en este caso es Arduino.

Puedes ver como se crea la aplicación en el vídeo que hay un poco más abajo. Si quieres puedes descargar el .apk de la aplicación tal cual la uso en el vídeo en el siguiente enlace.

Descargar APK

Descargar APK

 

 

 

 

En relación al código de Arduino, es el de un tutorial anterior en el que controlamos un relé con Arduino y la ethernet shield, solo tiene una modificación, y es que en lugar de usar el puerto 81, para ese tutorial vamos a usar el 80.

El código prepara a Arduino para recibir peticiones HTTP mediante método GET y analizar estas buscando las instrucciones para encender o apagar el LED. Si el microcontrolador encuentra el texto “?ONa” en la petición HTTP encenderá LED activando la salida digital correspondiente. Si al analizar la petición encuentra el texto “?OFFa” entonces apagará el LED.

Para realizar el análisis y encontrar las instrucciones en la petición GET usamos el método .indexOf(). Si quieres aprender más sobre cómo usar el método indexOf puedes visitar el tutorial que hicimos al respecto.

/*
 
Ejemplo sobre uso de libreria ethernet 
para controlar un rele desde página web.
 
*/
 
#include <SPI.h>
#include <Ethernet.h>
 
//Ponemos la dirección MAC e IP que queremos que use nuestro Arduino para conectarse al Router
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1, 177);
 
String readString;
 
//Definimos que el puerto HTTP sera el 81
EthernetServer server2(80);
 
//Variables de control
int rele = 7;
 
void setup()
{
  //Iniciar la conexión de red y serie
  Ethernet.begin(mac, ip);
  server2.begin();
  Serial.begin(9600);
  pinMode(rele,OUTPUT);
}
 
void loop()
{
 
 
  // Esperamos que venga algún cliente web al puerto 81
  EthernetClient cliente = server2.available();
  if (cliente) {
    boolean currentLineIsBlank = true;
    while (cliente.connected()) {
      if (cliente.available()) {
        char c = cliente.read();
        if (readString.length() < 100) {
          //Almacenar caracteres en un string
          readString += c;
        }
       //Si ha terminado la petición del cliente
        if (c == 'n') {
           if(readString.indexOf("?ONa") >0)
           {
                digitalWrite(rele,HIGH);
           }
           else if(readString.indexOf("?OFFa") >0)
           {
                digitalWrite(rele,LOW);
           }
          //Enviamos la cabecera web
          cliente.println("HTTP/1.1 200 OK");
          cliente.println("Content-Type: text/html");
          cliente.println();
 
            //Mostrqamos la web de control
            cliente.println("<center> <h2>Bienvenido al control de reles</h2> "); 
            cliente.println("<br> Clic en los enlace para encender o apagar:");            
            cliente.println("<br> <a href='./?ONa'>Encender</a> - <a href='./?OFFa'>Apagar</a>");            
            cliente.println(" </center>");             
            cliente.println("<br />");
           
          break;
        }
         
      }
    }
    // Darle un respiro al navegador web para recibir los datos
    delay(1);
    //Limpiar String para proxima etición HTTP
    readString="";
    //Cerrar conexión
    cliente.stop();
  }
}

Puedes ver el vídeo para aprender más acerca de la técnica para comunicar la aplicación móvil con Arduino por medio de la ethernet shield.




Sobre el autor
Enrique Gómez
Amante de la ingeniería electrónica, de la comunicación audiovisual y de la divulgación ingenieril y científica. Friki de Star Wars desde el principio. Puedes saber más sobre mi y sobre mis trabajos en enrique.rinconingenieril.es
Artículos relacionados
Deja un comentario