Domotiza tu casa – Día 4. Primeros pasos, el Servidor web II

Hoy vamos a hacer nuestro “hola mundo” de arduino con nuestro servidor web.

Para que tengais una referencia de lo que vamos a hacer, conviene que tengais documentación sobre la librería Ethernet donde se detalla el funcionamiento de las funciones usadas. (http://arduino.cc/en/Reference/Ethernet).

Supongo que ya habreis visto como funciona arduino y su entorno de desarrollo, sinó, es un buen momento para visitar el tutorial del día anterior (http://www.pedrocarrillo.es/?p=28).

Vamos a empezar con el planteamiento del programa en pseudocódigo, fácil de entender para los humanos,  y después lo pasaremos a código, para que lo entienda nuestro arduino.

La estructura sería la siguiente:

#includes y defines

Configuración de la ethernet

void setup(){

Inicializar Serial;

Inicializar Ethernet;

}

void loop() {

Detectar cliente conectado;

Leer petición HTTP;

Extraer de la petición HTTP los parámetros que nos hagan llegar;

Imprimir la web indicada en los parámetros;

Detener cliente;

}

Ahora que habeis visto el esquema, escribo el código comentado para facilitar su comprensión

/******** INCLUDES **********/

//Fundamental incluir las librerías para poder utilizar las librerías de funciones que utilizaremos a continuación

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

/******** DEFINES **********/

#define BUFSIZ 100;

/************ CONFIGURACION ETHERNET  ************/
//Definimos la MAC, IP, y declaración del server

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 1, 177 };
String ipString = “192.168.1.177”;

Server server = Server(80); // 80 es el puerto por el que nos llegan por defecto las peticiones http

void setup() {
// Inicializando Serial para debug
Serial.begin(9600);
//Inicialiciando ethernet y server
Ethernet.begin(mac, ip);
server.begin();

}

void loop()
{

//Creamos un contador “index”, que más adelante veremos para que sirve una variable “clientline” para almacenar la linea HTTP que nos llegará por cada petición

int index = 0;

String clientline= “”;

//Declaramos la variable cliente

Client client = server.available();

//Si hay un cliente conectado empezamos a leer la entrada HTTP
if(client) {
//una peticion http termina con una linea en blanco
boolean current_line_is_blank = true;
//reset el buffer de entrada
index = 0;

//mientras que el cliente esté conectado y disponible, leemos la entrada

while(client.connected()){
if(client.available()){
char c = client.read();

//Si no es una nueva linea, añade el caracter al buffer
if(c!= ‘n’ && c != ‘r’) {
clientline = clientline + c;
index++;
//si es demasiado grande para el buffer empieza a sacar fuera datos
if(index >=100)
index = BUFSIZ -1;
//continua leyendo datos
continue;
}

//si tenemos un n o un r, significa que el string está completo
clientline[index] = 0;

/****** Aquí haremos el filtrado de datos. Descartamos las partes que no nos interesan, y sacamos de la linea (clientline), el nombre del módulo a mostrar, que es lo que nos interesa

String params = clientline.substring(clientline.indexOf(“GET /”) + 5,clientline.indexOf(” HTTP/1.1″));
String modulo = params.substring(0, params.indexOf(“/”));

//Utilizamos el puerto serie para debugar
Serial.println (“Params: ” + params + ” Modulo: ” + modulo);

//Llamamos a una función para imprimir la cabecera de la web
header(client, modulo);

//Llamamos a una función para imprimir el cuerpo de la web
body(client, modulo);
//Llamamos a una función para imprimir el pir de la web

pie(client);

//paramos el cliente y dejamos un retardo de 1 segundo hasta que se vuelva a ejecutar este loop
client.stop();
delay(1000);
}
}

}
}

//Función para imprimir la cabecera de nuestra web
void header(Client client, String title){
client.print(“<html><head><title>HouseBox – ” + title + “</title></head><body><h1>HouseBox</h1>” + modulos(client) + “<h2>” + title + “</h2>”);
}
//Función para imprimir el menú de secciones de nuestra web

String modulos(Client client){
return (“<ul><li><a href=”../Inicio”>Inicio</a></li><li><a href=”../Balcon”>Balc&oacute;n</a></li><li><a href=”../Cocina”>Cocina</a></li><li><a href=”../Comedor”>Comedor</a></li><li><a href=”../Recibidor”>Recibidor</a></li><li><a href=”../General”>General</a></li></ul>”);
}

 

//Función para escribir el cuerpo de la web

void body(Client client, String modulo){
if (modulo == “Inicio”){
client.println(“Bienvenido a Inicio”);
}
else if (modulo == “Balcon”){
client.println(“<ul><li>Temperatura balc&oacute;n: XX oC</li><li>Luminosidad: XX</li><li>Humedad:XX</li><li>PH:XX</li><li>Riego programado de: XX a XX, y de YY a YY</li></ul>”);
}
else if (modulo == “Cocina”){
client.println(“<ul><li>Temperatura cocina: XX oC</li><li>Niveles Gas Natural</li><li>Niveles Monoxido de Carbono</li><li>Dectecci&oacute;n agua en suelo</li></ul>”);
}
else if (modulo == “Comedor”){
client.println(“<ul><li>Temperatura comedor: XX oC</li><li>Color ambiental</li></ul>”);
}
else if (modulo == “Recibidor”){
client.println(“<ul><li>Temperatura recibidor: XX oC</li><li>Encender alarma puerta/volum&eacute;trico:  <a href=”#”>ON</a> / <a href=”#”>OFF</a>”);
}
else if (modulo == “General”){
client.println(“<ul><li>Calefacci&oacute;n: <a href=”#”>Apagar</a> / <a href=”#”>Encender</a></li><li>Persianas autom&aacute;ticas: <a href=”#”>ON</a> / <a href=”#”>OFF</a></li><li>Apagado autom&aacute;tico de calefacci&oacute;n(en caso de ventanas abiertas): <a href=”#”>ON</a> / <a href=”#”>OFF</a></li></ul>”);
}
else{
client.println(“P&aacute;gina no encontrada”);
}
}

//Función para escribir el pie de la web

void pie(Client client){
client.print(“</body></html>”);
}

 

Con esto, probadlo y os saldrá una sencilla aplicación web accediendo a la IP de arduino (en este ejemplo 192.168.1.117). Vereis algo como esto:

Arduino web server
Arduino web server

A partir de este sencillo desarrollo iremos mejorando e implementando los diversos módulos.

Espero que haya sido de vuestro agrado, y que cualquier sugerencia la comenteis.

¡Hasta la semana que viene!

Domotiza tu casa – Día 3. Primeros pasos, el Servidor web I

Esta semana vamos a ir finalizando la teoría inicial, empezar a tocar componentes y hacer algo más práctico.

Vamos a montar el webserver en arduino. Sí señor, un servidor web para que nuestro arduino  pueda mostrarno datos, una sencilla aplicación web. De momento, la aplicación web que nos servirá arduino será sencilla, casi conceptual. La intención del capítulo de hoy es aprender a montar un servidor web con este ejemplo. Más adelante lo iremos completando con más opciones y estilos.

 

Para empezar, si queremos conectar nuestro arduino a la red, lo mejor será conectarla mediante la Ethernet + MicroSD Shield. Podeis encontrar información sobre ella en su web http://arduino.cc/en/Guide/ArduinoEthernetShield y en castellano, pero menos actualizado en http://arduino.cc/en/Guide/ArduinoEthernetShield.

Conectarla a la placa de Arduino es sencillo, simplemente encajará encima de nuestra placa.

Arduino Ethernet Shield
Arduino Ethernet Shield

 

Una vez insertada ya estamos listos para programar. Para ello, nos descargaremos el entorno de desarrollo de arduino, que lo podreis encontrar en su propia página web http://arduino.cc/es/Main/Software.

Una vez descargado e instalado mediante su sencillo instalador, necesitaremos conectar la placa mediante un cable USB  con conector tipo B (como el que utilizan las impresoras). Mediante este cable alimentaremos nuestra placa y nos comunicaremos con ella. También deberemos conectar un cable ethernet que venga desde nuestro router a la placa ethernet Shield.

Ahora ya está todo instalado y listo para funcionar, así que vamos a empezar a programar.

Os recomiendo que para ir practicando algo hagais este sencillo ejemplo que hace parpadear un led. Y vereis como funciona el lenguaje, etc…

http://arduino.cc/es/Tutorial/Blink

Y la básica referencia de funciones que iremos utilizando durante el tutorial la teneis aquí:

http://arduino.cc/es/Reference/HomePage

Echádle un vistazo que en el próximo capítulo empezamos a programar!

 

Cualquier duda o sugerencia, dejad un comentario y os responderé con mucho gusto.

 

Domotiza tu casa – Día 2. El hardware

Ahora que ya sabemos qué queremos domotizar de nuestra casa, vamos a proponer cómo lo haremos y qué necesitaremos.

La idea principal es que el sistema sea lo más independiente posible, que no dependa de tener un ordenador encendido en casa para recoger datos, mostrarlos, y sobretodo, que ocupe y consuma poco.

La estructura será de un arduino central, a los que los sensores serán por radiofrecuencia.

Para ello, he elegido la placa Arduino Mega (http://arduino.cc/es/Main/ArduinoBoardMega) por su gran cantidad de entradas y salidas y potencia, en combinación con una Ethernet Shield (http://www.arduino.cc/en/Main/ArduinoEthernetShield)

Placa Arduino Mega 2650
Placa Arduino Mega 2650
Placa Ethernet Shield
Placa Ethernet Shield

 

 

Con esta Ethernet Shield, añadimos a las posibilidades de arduino, la capacidad de conectarse a la red mediante Ethernet. Lo que haremos más adelante, es conectar nuestro arduino directamente al router para poder acceder a él desde cualquier lugar.

Para los sensores, en cada sala en la que haya que interactuar, utilizaré una sencilla placa Arduino Pro Mini ( http://arduino.cc/en/Main/ArduinoBoardProMini) .

 

Placa Arduino Pro Mini
Placa Arduino Pro Mini

Esta placa la podremos colocar en cualquier lugar discretamente grácias a su pequeño tamaño, y tendremos un mínimo consumo. Podeis ver sus características en el link anterior.

Estas placas se comunicarán por radiofrecuencia con un par de emisores y receptores RF a 433Mhz.

Kit Radio Frecuencia 433 Mhz
Kit Radio Frecuencia 433 Mhz

Estos kits de radiofrecuencia son muy económocos 10€ – 15€ y nos permitirán una comunicación básica, que alcanzará sobradamente en nuestra casa domotizada

 

¡El próximo día empezaremos a programar!