Sensor DHT11 + Flotr2 (parte 1/2)
abril 6, 2014

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
- 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
- Descifrar el protocolo de comunicación y guardar el valor de temperatura y humedad en binario.
- Transformar este valor binario a valor “legible” en decimal.
- 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.
- Aumentar la precisión, se realizan medias en cierto periodo de muestreo para ganar en fiabilidad del dato.
- Transmitir los datos a la BBDD.
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 valordecy 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:

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!!!
Hola,
¿Falta el codigo de conexionh, no?
¿Podrias incluir todos los ficheros?
Gracias
Hola, muchas gracias por el tuto!!!… no encontre la librería conexionh, para importarla