El módulo de comunicación y control será el encargado de leer la información de los sensores de temperatura exterior, temperatura interior, humedad y presión atmosférica así como de hacer que esta información y la que se genere (predicción, tiempos,...) esté disponible para la parte Web y el display LCD.

El módulo será generado en lenguaje C y correrá como un proceso en segundo plano. Para evitar que el programa falle por cualquier motivo inesperado y se cierre tendremos un script que comprobará mediante el comando unix "pgrep" si el proceso está corriendo, en caso negativo lo volverá a arrancar.

Mysql

Los datos serán almacenados tanto en fichero (datos instantaneos) como en base de datos (datos estadísticos y temporales). Por lo que necesitamos en primer lugar instalar el conector C de mysql, lo que haremos con el comando:

sudo apt-get install libmysqlclient-dev

Para obtener más información de cómo gestionar bases de datos mysql en C podeís consultar aqui.

La información instantanea la guardamos en formato xml para que pueda ser fácilemente leída en PHP.

I/O

Los sensores y el display LCD emplean diferentes tipos de protocolos de comunicación. Tenemos desde el más sencillo que usa comunicación directa en el pin GPIO hasta protoclos serie más complejos. A continuación damos una pequeña explicación de cada uno de ellos y enlaces para poder obtener más información.

wiringPi

wiringPi es una librería creada por Gordon @ Drogon que permite la comunicación con los pines GPIO de la raspberry. En su página web puedes encontrar información más detallada. Para instalarlo ejecutaremos los siguientes comandos para descararla y compilarla desde su repositorio GIT(el primer paso solo es necesario si no tenemos GIT instalado):

sudo apt-get install git-core
git clone git://git.drogon.net/wiringPi
cd wiringPi
git pull origin
cd wiringPi
./build

Una vez instalada comprobamos si todo ha ido bien ejecutando los comandos que nos ha instalado, por ejemplo:

gpio -v gpio readall

En un nivel básico permite inicializar, establecer el modo del pin (IN/OUT) y leer o escribir de ellos de manera fácil. También Por ejemplo, el siguiente grupo de comandos permite encender y apagar un led conectado al puerto GPIO 17.

gpio -g mode 17 OUT
gpio -g write 17 1
gpio -g write 17 0

El primer comando pone el pin GPIO en modo salida. El segundo comando fija la salida del pin a 1 lógico encendiendo el LED, el segundo comando lo pone a 0 apagándolo.

El mismo ejemplo en C:

#include <wiringPi.h>
main () {
 wiringPiSetup () ;
 pinMode (0, OUTPUT) ;
 for (;;) {
 digitalWrite (0, HIGH) ;
 delay (500) ;
 digitalWrite (0, LOW) 
 delay (500) ;
 }
}

I2C

I2C es un protocolo de comunicación en serie que implementan muchos componentes electrónicos para simplificar la lectura y escritura de sus datos. Consta, normalmente de los pines de corriente y tierra, y los pines de comunicación de datos (SDA) y de reloj (SCL). El pin de reloj se emplea para coordinar la lectura en serie de los datos. Podeís encontrar más información de este protoclo en la wikipedia.

Para realizar la comunicación desde C con el sensor de presión atmosférica que implementa el protoclo I2C usaremos una librería creada específicamente para Raspberry para interactuar con el sensor BMP085, la librería smbus. Podeís consultar y descargar la librería en este enlace.

Librería para PCD8544 LCD

El display LCD está conectado directamente a puertos GPIO. Es posible manejarla directamente mediante wiringPi, si bien podeís encontrar una librería perfecta en internet en este enlace que encapsula todas las operaciones de salida de texto y gráficos, usando wiringPi.

1-Wire

Al igual que I2C 1-Wire es un protocolo de comunicación en serie. Podeís consultar más información al respecto en wikipedia.

Este protocolo también es empleado por muchos componentes electrónicos. En nuestro caso lo emplea el sensor de temperatura a prueba de agua que emplearemos para tomar la temperatura exterior.

Raspbian ya implementa en el propio kernel los drivers para leer este tipo de componentes por lo que podemos optar por leer directamente del "fichero" que genera o bien buscar alguna librería que implemente en C la lectura.

Hay varias opciones en internet al respecto, por ejemplo, en este enlace podeís descargar un ejemplo que lee, precisamente, de un sensor de temperatura igual al que usa la estación.