Sensor DHT11 + Flotr2 (parte 1/2)

Muy buenos días a todos! portada Después de un laaaaaaaaaaaaargo proceso de inactividad…debido a que he estado realmente liado por varios cursos, me he preparado el advanced, el curro… he decidido retomar mis historias de electrónica desengrasándome un poco con un proyecto que llevo tiempo teniendo en mente, crear una BBDD en mi servidor, y usar la raspberry Pi para lanzar paquetes de datos a ella, como por ejemplo la temperatura y humedad de mi cuarto. Todo esto se pintará con una librería muy chula que es flotr2.
Como todo este proceso ha sido muy largo creo que lo voy a escribir en dos posts… Vamos poco a poco:
En este proyecto se van a utilizar las siguientes tecnologías/equipos:
  • DHT11: Sensor
  • RaspberryPi: Cerebro de operaciones 😛
  • Servidor remoto: Va montada la base de datos y la librería gráfica
Se han utilizado los siguientes lenguajes de programación y librarías gráficas
  • Python: Todos los códigos ejecutados en Rpi van en python
  • HTML & PHP: Las webs en las que se muestran los datos
  • Flotr2: Librería gráfica para pintar los valores
Como he comentado en entradas anteriores, el DHT11 es un sensor de temperatura y humedad de bajo coste. Este sensor ha sido escogido para este proyecto porque es digital, esto es, funciona con unos y ceros, no con valores analógicos (como el LM35 por ejemplo). La idea es guardar los valores que se reciben en una BBDD que se ha creado dentro de mi dominio (servidor remoto) y dibujarlos en una WEB para que sean accesibles desde cualquier parte del mundo mundial. He escogido el lenguaje de programación Python porque es muy sencillo de usar y no estoy tan acostumbrado a el como a C, así que me ha valido para aprenderJ. Lo primero es conectar el sensor de temperatura en la raspberry PI, esto se ha hecho de la siguiente manera:

Esquema

El código en Python que hace que se recojan los datos y se manden a la base de datos remota consta de varias partes:
  1. Descifrar el protocolo de comunicación y guardar el valor de temperatura y humedad en binario.
  2. Transformar este valor binario a valor “legible” en decimal.
  3. Filtrar posibles errores de transmisión (a veces llegan ceros…valores muy altos, o muy bajos…) es un sensor low cost y hace lo que puede.
  4. Aumentar la precisión, se realizan medias en cierto periodo de muestreo para ganar en fiabilidad del dato.
  5. Transmitir los datos a la BBDD.
Comenzamos con el código:
import sys
import RPi.GPIO as GPIO
import time
from conexiont import*
from conexionh import*
from binadec import*

#inicializo algunas variables

cuentatiempo=time.time()
contador=0
cadenah=[]
cadenat=[]
mediahh=0
mediatt=0
mediah=0,0
mediat=0,0
buc=0  
primera=1

#comienza el programa

while buc==0:

  data = []
  resultado = []
  GPIO.setmode(GPIO.BCM)
  pin=4

  GPIO.setup(pin,GPIO.OUT)
  GPIO.output(pin,GPIO.HIGH)
  time.sleep(0.025)
  GPIO.output(pin,GPIO.LOW)
  time.sleep(0.02)

  GPIO.setup(pin, GPIO.IN, pull_up_down=GPIO.PUD_UP)

  for i in range(0,500):
      data.append(GPIO.input(pin))
  bit_count = 0
  tmp = 0
  count = 0
  HumidityBit = ""
  TemperatureBit = ""
  crc = ""

  try:
    while data[count] == 1:
        tmp = 1
        count = count + 1

    for i in range(0, 32):
        bit_count = 0

        while data[count] == 0:
          tmp = 1
          count = count + 1

        while data[count] == 1:
          bit_count = bit_count + 1
          count = count + 1

        if bit_count > 3:
          if i>=0 and i<8:
              HumidityBit = HumidityBit + "1"
          if i>=16 and i<24:
              TemperatureBit = TemperatureBit + "1"
        else:
          if i>=0 and i<8:
              HumidityBit = HumidityBit + "0"
          if i>=16 and i<24:
              TemperatureBit = TemperatureBit + "0"

  except:
    errorjose=0

  try:
    for i in range(0, 8):
        bit_count = 0

        while data[count] == 0:
          tmp = 1
          count = count + 1

        while data[count] == 1:
          bit_count = bit_count + 1
          count = count + 1

        if bit_count > 3:
          crc = crc + "1"
        else:
          crc = crc + "0"
  except:
    errorjose=0

  #aqui convertimos los binarios a decimales

  Temperature=binadec(TemperatureBit)
  Humidity=binadec(HumidityBit)
  enterocrc=binadec(crc)

  #aqui filtramos los ceros

  if int(Humidity) + int(Temperature) - int(enterocrc) == 0:
    if (Humidity != int(0) and Temperature != int(0)):
       cadenah+= [Humidity]
       cadenat+= [Temperature]
       contador += 1
       print "Humedad = ",Humidity ,"Temperatura = ",Temperature, "contador = ", contador

  time.sleep(2)

  # aqui se hacen las medias 

  y=0
  if time.time()>cuentatiempo+300:
    for y in range(0,contador):
      mediahh += cadenah[y]
      mediatt += cadenat[y]
    mediah=float(mediahh)/float(contador)
    mediat=float(mediatt)/float(contador)
    print "La media en este minuto ha sido ", mediah, " y ", mediat

    #este es el filtro de valores excesivamente dispares
    #se hace la conexion con el script php remoto

    if primera==1:
	filtro1=Humidity
        primera=0
    filtro3=abs(filtro1-Humidity)
    if filtro3<1:
     conexiont(mediat)
     conexionh(mediah)
     filtro1=mediah
    else:
     conexiont(mediat)
     conexionh(filtro1)

    #reiniciamos las variables de acumulacion y vuelta a empezar

    mediah=0
    mediat=0
    mediahh=0
    mediatt=0
    del cadenah[:]
    del cadenat[:]
    cuentatiempo=time.time()
    contador=0

# FIN DEL CODIGO!!!!!
  Como vemos este codigo incluye las partes 1,3 y 4, las partes 5 y 6 las he hecho en librerías para mayor comodidad, librerias en archivos aparte, por eso las incluimos con:
from conexiont import*
from conexionh import*
from binadec import*
La librería para pasar de binario a decimal es:
def binadec(valorbin):
  valordec = 0

  valorbin= valorbin[::-1]

  for i in range( len(valorbin) ):
        b = valorbin[i]

        if ( b.isdigit() == False ):
            print("Errorel input debe ser una cadena de 0 y 1")
        else:
            b = int(b)

            if (b > 1) or (b < 0):
                print("Error! There's no such thing as 2")

            if b == 1:
                valordec += 2**(i)

  return valordec
y la librería de conexión al script php remoto es:
import httplib

def conexiont(valor):
	hola="/graficos/scriptempdb.php/?temp="
	hola += str(valor)
	connection = httplib.HTTPConnection("www.josehervas.es")
	connection.request("GET",hola)
	response = connection.getresponse()
	data = response.read()
	connection.close()
	print "hecho!!!!  ", valor, "C"
  La pinta que tiene esto en mi hall es esta, y el código que se lee en raspberry el de después: retoc  

crudos

En el próximo post veremos la parte chula! que es la de pintar la gráfica con flotr2, gracias por aguantar la chapa yyyyy hasta mañana!!!

2 thoughts on “Sensor DHT11 + Flotr2 (parte 1/2)

Deja un comentario

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

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>