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!

10 Replies to “Domotiza tu casa – Día 4. Primeros pasos, el Servidor web II”

  1. todo esto va conectado a un router, no? con lo que desde un iphone me puedo conectar al aparato?
    que tiene caracteres estandar o yo puedo encenderlo y apargarlo cuando quiera?
    no se son tantas preguntas,,,,

    1. En efecto, esto va conectado al router, por un cable ethernet (el cable del internet de toda la vida 🙂 ). La idea es que no tenga que estar conectado a ningún Pc, así nos evitamos ruidos y el consumo del ordenador en sí. Por lo que dejarlo encendido todo el día no supondrá un gasto apreciable.

      Al estar conectado al router directamente podemos acceder a él mediante un Iphone o cualquier otro dispositivo móvil, desde el pc de casa, el de la oficina, etc….

      Si no sabes cómo, más adelante ya lo explicaré con detalle. Todo paso a paso 🙂

  2. ok ok, a ver si tiras fotos y demas por que estoy interesado y esperando a que vayan saliendo mas ediciones.
    Mi idea es como te dije tener sensores en 4 cuartos de tº y poder abrir y cerrar trampillas de aire. Abrir y cerrar persianas. Luces en salon y sensores de grases y humos. Que comprar de base?
    Y ademas como te veo metido en el tema, tengo un video portero Golmar platea, sabes si hay alguna forma de pasar la imagen a una tv?

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *