Sensor de temperatura y humedad con una Raspberry Pi

Introducción

De entre los miles de proyectos que se pueden desarrollar con una Raspberry Pi, uno de los más básicos y útiles es el de un sensor de temperatura y humedad. Con la idea de monitorear algunos lugares específicos de mi casa (para saber, por ejemplo, que tan cálidos llegan a ser el ático o el depósito en verano) decidí poner manos a la obra y trabajar en uno.

En este artículo describo los pasos necesarios para medir temperatura y humedad y registrar los valores en una base de datos en MySQL.

Elementos necesarios

Elemento Precio
Raspberry Pi 3 US$ 39
AM2302 US$ 15
Gabinete para la Raspberry US$ 10
Fuente micro USB 5V 2.5A US$ 8
Memoria SD mayor a 8 GB US$ 12
TOTAL US$ 84

Los precios son en EEUU y hay algunas cosas que se pueden cambiar:

  1. Se puede usar la Raspberry Pi 2, ya que es totalmente compatible con la 3
  2. Se puede usar el DHT22 en lugar del AM2302. No es cableado pero solo cuesta US$ 10.

Hardware

2016-07-11 23.16.15La configuración del hardware es muy sencilla y básicamente consiste en conectar el AM2302. Para darle tensión al sensor se puede usar la línea de 3.3V o la de 5V ya que funciona con ambas. En mi caso trabajo con la línea de 3.3V.

La conexión de datos requiere conectar el cable amarillo a cualquier pin de datos (o pin GPIO – General Purpose Input/Output) de la Raspberry. Los pines de datos de la Raspberry 3 están claramente identificados en este link. Yo uso el pin 7 (GPIO04).

En la foto se puede observar la conexión, hecha en este caso mediante una protoboard.

Software

El primer paso para configurar el sistema es bajar la versión de Ubuntu Mate 16.04 para Raspberry Pi e instalarlo en la memoria SD mediante Win32DiskImager. Una vez instalado el sistema operativo, actualizarlo mediante apt-get update y apt-get upgrade. Por defecto, Ubuntu Mate 16.04 trae OpenSSH configurado así que a partir de la instalación es posible acceder remotamente.

Con el sistema operativo configurado, instalar MySQL mediante apt-get install mysql-server mysql-client libmysqlclient-dev. Una vez instalado, seguir estos pasos para configurarlo:

  1. Ingresar mediante mysql -u root -p
  2. Crear un nuevo usuario y darle todos los permisos mediante grant all privileges on *.* to ‘nuevo_usuario’@’%’ identified by ‘nuevo_password’;
  3. Editar el archivo de configuración con nano /etc/mysql/mysql.conf.d/mysqld.cnf
  4. Configurar bind-address = 0.0.0.0. La idea es poder acceder desde cualquier equipo.
  5. Reiniciar el servicio mediante service mysql restart
  6. Una vez que tengan MySQL configurado, pueden acceder con cualquier programa como HeidiSQL o MySQL Workbench (desde la misma Raspberry u otro equipo) y crear la base de datos y la tabla que vamos a usar. El código SQL es:

CREATE DATABASE monitoreo;

USE monitoreo;
CREATE TABLE TempHum (
Fecha INTEGER UNSIGNED,
temperatura DECIMAL(5,1),
humedad DECIMAL(5,1));

Desde luego que en lugar de usar un INTEGER para la fecha pueden usar DATETIME. En esta caso estoy usando un INTEGER ya que el INSERT en dicho lo campo lo hago mediante un UNIX_TIMESTAMP(), función de MySQL que entrega el número de segundos desde 1970-01-01 00:00:00 UTC.

El siguiente paso es trabajar con el sensor. A tal fin vamos a hacer uso de un conjunto de librerías para la Raspberry Pi que pueden descargarse de http://wiringpi.com/. Para hacerlo, hay que seguir los siguientes pasos:

  1. apt-get install git
  2. git clone git://git.drogon.net/wiringPi
  3. cd wiringPi
  4. ./build
  5. cd examples
  6. make rht03
  7. ./rht03

El último comando ejecuta el programa por lo que deberían automáticamente ver un listado de temperaturas y humedad, tal como pueden observar en la siguiente imagen:

TempHum

El último paso es setear el programa que va a grabar los datos en MySQL. Para hacerlo:

  1. En el directorio que deseen: mkdir monitoreo y cd monitoreo
  2. cp wiringPi/examples/Makefile .
  3. nano MakeFile y en el archivo cambiar tres líneas. Son las que comienzan con INCLUDE, LDFLAGS y LDLIBS. Tienen que quedar así:
    • INCLUDE = -I/usr/local/include,/usr/include/mysql
    • LDFLAGS = -L/usr/local/lib,/usr/lib/arm-linux-gnueabihf -lmysqlclient -lpthread -lz -lm -lrt -ldl
    • LDLIBS = -lmysqlclient -lwiringPi -lwiringPiDev -lpthread -lm
  4. Descargar este archivo mediante wget en la carpeta creada
  5. Abrir el archivo con nano th.c y modificar en la línea 69 la conexión a la base de datos (servidor -que es localhost-, nombre de usuario, contraseña y nombre de la tabla).
  6. Compilar el programa con make th
  7. Ejecutarlo con ./th

El programa automáticamente va a comenzar a grabar la temperatura y la humedad en la base de datos cada 60 segundos. En el caso que quieran modificarlo, en las líneas 25 a 27 del archivo th.c van a encontrar el PIN de datos del sensor (por defecto el 7), el tiempo de lectura (60 segundos) y la cantidad de reintentos (3).

Resumen

A lo largo del artículo vimos lo fácil que es desarrollar un sensor de temperatura y humedad con la Raspberry Pi y almacenar dichos valores en una base de datos.

Más información

  • https://cdn-shop.adafruit.com/datasheets/Digital+humidity+and+temperature+sensor+AM2302.pdf
  • http://wiringpi.com/
  • http://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_unix-timestamp
  • http://www.instructables.com/id/Raspberry-Pi-Temperature-Humidity-Network-Monitor/
  • https://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/temperature/
  • http://projects.privateeyepi.com/home/temperature-gauge
  • https://rethinkdb.com/blog/temperature-sensors-and-a-side-of-pi/