Página principal
Registro de humedad y temperatura con gráfico - DHT11
Raspberry Pi
xsetaseta@gmail.com
Buscando en internet algún montaje para hacer en Raspberry Pi, encontré en la página
http://www.davidfraj.com/2013/04/crear-una-estacion-meteorologica-con.html , que es la creación de
Crear una estacion meteorologica con raspberry pi y un sensor dth11. archivo.pdf
Como tengo todos los componentes incluido el DTH11, me he puesto a realizar el montaje propuesto.
He de comentar que existe diferentes páginas web donde comentan este montaje, no sé exactamente cual es la original, cada una tiene una cosa que la otra no tiene, pero en la que me he basado es en la que he comentado anteriormente.
http://chrisbaume.wordpress.com/author/chrisbaume/
http://www.rpiblog.com/2012/11/interfacing-temperature-and-humidity.html
Conexionado.
RPi VCC (pin 1) -> DHT11 pin 1
RPi GPIO4 (pin 7) -> DHT11 pin 2
RPi GND (pin 6) -> DHT11 pin 4
Imagen copiada de la página web.
En mi caso he colocado una resistencia de 10k.
Montaje eléctrico.
Todo el proyecto lo he realizado en un directorio creado en el directorio raiz llamado /aa , por lo cual todas la referencias se hacen a este directorio. Si alguno quiere cambiar el lugar del directorio, debera también modificar en el resto de programas la referencia a este directorio.
Este proyecto es una mezcla de varios tipos de programación.
En principio utiliza la librería wiringpi para manejar las entradas y salidas del Raspberry mediante el lenguaje C . Recomiendo ver la página https://projects.drogon.net/raspberry-pi/wiringpi/ donde te explica muchos proyectos para Raspberry utilizando C. Gracias Gordons.
Para instalar la librería tecleamos en la consola:
cd /aa
sudo apt-get install git-core build-essential
git clone git://git.drogon.net/wiringPi
cd wiringPi
./build
Una vez instalada la librería, creamos un fichero llamado dth11.c en el directorio wiringPi y lo compilamos con la siguiente orden.
gcc -o dth11 dth11.c -L /usr/local/lib -l wiringPi
Una vez que se obtiene el fichero ejecutable ./dth11 , lo copiamos en el directorio de trabajo /aa .
Si ejecutamos el comando ./dth11 obtendremos la temperatura y la humedad.
dth11.c |
//Incluimos librerias necesarias #include <wiringPi.h> #include <stdio.h> #include <stdlib.h> #include <stdint.h> //Definimos constantes #define MAX_TIME 85 #define DHT11PIN 7 #define ATTEMPTS 5 //Definimos un vector global int dht11_val[5]={0,0,0,0,0}; ///////////////////////////////////////////////////////////// //Funcion principal para leer los valores del sensor. int dht11_read_val(){ uint8_t lststate=HIGH; uint8_t counter=0; uint8_t j=0,i; for(i=0;i<5;i++){ dht11_val[i]=0; } pinMode(DHT11PIN,OUTPUT); digitalWrite(DHT11PIN,LOW); delay(18); digitalWrite(DHT11PIN,HIGH); delayMicroseconds(40); pinMode(DHT11PIN,INPUT); for(i=0;i<MAX_TIME;i++){ counter=0; while(digitalRead(DHT11PIN)==lststate){ counter++; delayMicroseconds(1); if(counter==255){ break; } } lststate=digitalRead(DHT11PIN); if(counter==255){ break; } //Las 3 primeras transiciones son ignoradas if((i>=4)&&(i%2==0)) { dht11_val[j/8]<<=1; if(counter>16) dht11_val[j/8]|=1; j++; } } // Hacemos una suma de comprobacion para ver si el dato es correcto. Si es asi, lo mostramos if((j>=40)&&(dht11_val[4]==((dht11_val[0]+dht11_val[1]+dht11_val[2]+dht11_val[3])& 0xFF))) { //printf("%d.%d,%d.%d\n",dht11_val[0],dht11_val[1],dht11_val[2],dht11_val[3]); //printf("data -> %02x, %02x, %02x, %02x paridad %d\n",dht11_val[0],dht11_val[1],dht11_val[2],dht11_val[3],dht11_val[4]); //printf("Temperatura=%d ºC /10 Humedad=%d /10\n",dht11_val[2]*256+dht11_val[3],dht11_val[0]*256+dht11_val[1]); printf("%d,%d\n",dht11_val[0]*256+dht11_val[1],dht11_val[2]*256+dht11_val[3]); return 1; } else { //printf("Error\n"); return 0; } } //////////////////////////////////////////////////////////////// //Empieza nuestro programa principal. int main(void){ //Establecemos el numero de intentos que vamos a realizar //la constante ATTEMPTS esta definida arriba int attempts=ATTEMPTS; //Si la libreria wiringPi, ve el GPIO no esta listo, salimos de la aplicacion if(wiringPiSetup()==-1){ exit(1); } while(attempts){ //Intentamos leer el valor del gpio, llamando a la funcion int success = dht11_read_val(); //Si leemos con exito, salimos del while, y se acaba el programa if (success){ break; } //Si no lee con exito, restamos 1, al numero de intentos attempts--; //Esperamos medio segundo antes del siguiente intento. delay(500); } return 0; } |
Mediante el comando cron creamos un script que se ejecute cada x tiempo, está realizado en Bash, y el resultado se almacena en /var/www/tempe.csv . Para quitar todos los datos registrados borrar el contenido de tempe.csv menos la primera línea, que contiene el título de la serie de registros.
dth11.sh |
#!/bin/bash FECHA=$(date +\%Y\%m\%d\%H\%M) COMA="," TEMP=$(/aa/dth11) echo "$FECHA$COMA$TEMP" >> /var/www/tempe.csv |
Debemos dar permisos de ejecución a dth11.sh.
Ejemplo de tempe.csv .Para borrar el registro, quitar todo menos la primera línea. |
Date,Humedad,Temperatura 201309241218,62.2,39.4 201309241219,60.2,44.1 201309241220,55,45 201309241221,54,40 201309241222,54,1 201309241223,54,-10 201309241224,54,-15 |
Para que ejecute cada minuto un registro de temperatura, editamos las tarea periódica a ejecutar mediante el comando, sudo crontab -e .
Y añadimos
* * * * * /aa/dth11.shEl servidor apache sirve la página tempe.html , en la cual existe un código en javascript que realiza una grafica. Para realizar la gráfica se utiliza la librería dygraph-combined.js en javascript . Para más información recomiendo visitar la página http://dygraphs.com/index.html . Nunca había realizado nada en javascript por lo que me he tenido que poner las pilas y estudiar algún tutorial.
tempe.html |
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"> <script type="text/javascript" src="dygraph-combined.js"></script> </head> <body> <h1><a href="index.html"><small><span style="font-weight: bold; color: rgb(0, 102, 0);">Volver</span></small></a></h1> <h1>Gráfica con humedad y temperatura<br> </h1> <big><big><span style="font-weight: bold; color: rgb(0, 102, 0);"></span></big></big> <hr> <div id="normal" style="width:600px; height:300px;"></div> <span style="color: rgb(153, 0, 0); font-weight: bold;">Formato - Hora:minutos Día/mes</span> <hr> <script type="text/javascript"> g4 = new Dygraph( document.getElementById("normal"), "tempe.csv", { title: 'Grafico Humedad-Temperatura', xlabel: ' ', ylabel: 'Humedad - Temperatura', labelsDivWidth: 150, labelsSeparateLines: true, axes: { x: { axisLabelFormatter: function(x) { var anyString=x.toString(); return (anyString.substring(8,10) + ":" + anyString.substring(10,12) + ".\n"+anyString.substring(6,8)+"/"+anyString.substring(4,6) ); }, } }, } ); </script> </body> </html> |
Si abrimos en un ordenador la página http://direcciónIPraspberry/tempe.html obtenemos el registro con la gráfica de la temperatura.
Quizás en la página de esté mejor explicado todo el proceso, pero yo he corregido algunos errores que tenía, modificando a mi gusto el javascript y el código C.
Saludos.
Juan Galaz
Bibliografía:
http://www.davidfraj.com/2013/04/crear-una-estacion-meteorologica-con.html
http://chrisbaume.wordpress.com/author/chrisbaume/
http://dygraphs.com/index.html
http://www.rpiblog.com/2012/11/interfacing-temperature-and-humidity.html
https://projects.drogon.net/raspberry-pi/wiringpi/
Hola enhorabuena por el proyecto, yo también dándole vueltas al sensor de temperatura, pero no consigo con ese script que me muestre los datos. El sensor que estoy utilizando es éste http://articulo.mercadolibre.com.ar/MLA-456038247-dht11-dht22-sensor-de-temperatura-y-humedad-_JM. Necesito añadir una resistencia? porque le he puesto una entre el PIN 1 y el PIN 2 del sensor y sigue sin mostrar resultados. Un saludo
ResponderEliminarHola
ResponderEliminarSi debes colocar una resistencia entre el pin1 y pin2 del sensor, en mi caso he utilizado 10k, pero prueba con 4k7 igual te funciona mejor.
Con solo teclear ./dth11 debería mostrar la temperatura y la humedad, de lo contrario has hecho algo mal..
Saludos
Juan
muy buenas, te ha pasado alguna vez que al cabo de un tiempo este deja de funcionar haces un ./dht11 y el sensor no te devuelve valor alguno?.
ResponderEliminarNo logro saber donde esta el problema.
Gracias por el tutorial.
Hola
EliminarLo cierto es que solo lo ha probado durante unas de horas, funcionando perfectamente.
No te puedo ayudar, además el circuito lo tengo desmontado.
Si lo vuelvo a montar te diré si me pasa lo mismo a mi.
Saludos
SETA43
Buen dia,
ResponderEliminarHe realizado el tutorial al pie de la letra, pero no me muestra las dos graficas, no me esta midiendo temperatura, y la humedad me aparece en la grafica como constante... es necesario descargar la libreria de I2C para la muestra de los datos en el servidor web?
Saludos, gracias por tu tutorial me ha sido de gran ayuda.