jueves, 26 de septiembre de 2013

Registro de humedad y temperatura con gráfico - DHT11 - Raspberry Pi


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 dth11archivo.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.sh
El 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&aacute;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&nbsp;&nbsp;
      D&iacute;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/