Monitorizar la temperatura desde Raspberry Pi

En este pequeño tutorial os voy a enseñar como monitorizar la temperatura de una habitación con sólo una Raspberry Pi, un sensor de temperatura DS18S20 y un poco de software.

Vamos a utilizar Emoncms, del que ya os he hablado anteriormente, instalarlo es realmente fácil, no tengáis miedo de seguir estas instrucciones, enseguida lo tendréis funcionando.

El siguiente paso va a ser conectar a la Raspberry Pi el sensor DS18S20+, podéis pedir una muestra gratuita a Maxim Integrated. El sensor se conecta usando los pines que tenemos disponibles en la RPi. Para conectarlo hay que seguir el siguiente esquema:

DS18s20 conectado a Raspberry Pi.
DS18S20 conectado a Raspberry Pi.

Es muy sencillo de conectar utilizando unos conectores para jumpers, yo he reciclado los que venían para la placa base de un PC de sobremesa antiguo, los que la conectan con los LEDs y los botones de encender y reiniciar.

El siguiente paso es poner en marcha una aplicación que recoja la temperatura del sensor y la envíe al servidor EmonCMS. Para ello voy a utilizar Python, un lenguaje interpretado muy sencillo que se utiliza mucho en la comunidad Raspberry Pi. El acceso al sensor se realiza a través de un driver que nos proporciona ya nuestra distribución de Raspbian.

El siguiente código es plenamente funcional, aunque posiblemente algo espartano, es necesario que añadáis vuestra apikey de Emoncms, la encontraréis entrando a vuestro servidor Emoncms, en la ruta /emoncms/input/api, hay que elegir la «Read & Write:» puesto que vamos a escribir los valores.

También podéis modificar cada cuanto tiempo queréis que se envíen los datos, en este caso cada 10 segundos, pero es posible modificar la línea «time.sleep(10)» por el número de segundos que queráis.

import os
import glob
import time
import urllib2, httplib
os.system('sudo modprobe wire')
os.system('sudo modprobe w1-gpio')
os.system('sudo modprobe w1-therm')
base_dir = '/sys/bus/w1/devices'
f = open(base_dir + '/w1_bus_master1/w1_master_slave_count', 'r');
sensorCount = f.readlines()
sensorCount = [int(l[0]) for l in sensorCount]
f.close()
f = open(base_dir + '/w1_bus_master1/w1_master_slaves', 'r');
devices = f.readlines()
f.close()
def read_temp_raw(sensor):
device_file = base_dir + '/' + devices[sensor][:-1] + '/w1_slave'
f = open(device_file, 'r')
lines = f.readlines()
f.close()
return lines

def read_temp(sensor):
lines = read_temp_raw(sensor)
while lines[0].strip()[-3:] != 'YES':
time.sleep(0.2)
lines = read_temp_raw(sensor)

equals_pos = lines[1].find('t=')
if equals_pos != -1:
temp_string = lines[1][equals_pos+2:]
return temp_string[0:4]

while True:
url = "http://localhost/emoncms/input/post?json={"
for x in range(0, sensorCount[0]):
url = url + devices[x][:-1] + ":" + read_temp(x) + ","
url = url[:-1]+"}&apikey=LA_APIKEY_VA_AQUI"
print(url)
urllib2.urlopen(url)
time.sleep(10)

Acordaos de respetar la indentación (tabuladores) en el código, si no no funciona bien en Python. Guardamos este código como un archivo .py, por ejemplo temperatura.py y ya lo podemos ejecutar de la siguiente forma:

python temperatura.py

Ahora ya nos podemos ir a Inputs en Emoncms y encontrar la entrada correspondiente a nuestro sensor de temperatura. En su configuración añadiremos un proceso «x 0.01» para que nos muestre la temperatura en ºC y bajo de eso un «Log to feed» para poder mostrarla. Ahora ya aparecerá en la pestaña Feeds, donde la editaremos y la seleccionaremos como REALTIME. Por último en la pestaña Vis seleccionamos el visor Realtime y el feedid de nuestro sensor de temperatura. El resultado será algo parecido a esto:

Temperatura en tiempo real.
Temperatura en tiempo real.

Ahora podemos poner este visualizador en el Dashboard y habremos terminado.

Actualización: Ahora puedes bajar el archivo python desde mi Github: https://github.com/carsanbu/tipi-web/blob/master/utils/temp_DS18S20_emoncms.py

14 comentarios en “Monitorizar la temperatura desde Raspberry Pi”

  1. Estoy intentado compilarlo y me arroja error el scripts en esta linea, me he cansado de revisar y no se que podria ser

    device_file = base_dir + ‘/’ + devices[sensor][:-1] + ‘/w1_slave’

    Graias de antemano!

  2. Me sigue arrojando error, podria ser que estoy utilizando un sensor Ds18b20? compare ambos datasheet y no deberia der ser ese el problema.

  3. Hola amigo como estas?. Una pregunta más hacia la parte de instalar emoncms. Cuando le doy a la dirección localhost/emoncms no aparece nada. Sabes por casualidad a que se debe?. Ya he realizado los pasos muchas veces y nada

  4. ¿Donde le das la dirección localhost/emoncms? ¿En el navegador de la Raspberry? Porque si es en tu PC tendrás que poner la dirección IP de la Raspberry en lugar de localhost. Algo en plan http://192.168.x.y/emoncms
    PD: He corregido tu post para que se entienda bien.

  5. si en Midori, el navegador de raspberry, me dice que la respuesta del servidor esta vacia. Dale ya reviso el link . Muchas Gracias

  6. ya arregle lo del localhost!! wuju.. pero me sale el mismo error del la persona de arriba 0.o

  7. Amigo muchas gracias!! ya se soluciono todo disculpa las moelestias jajajaj era un error como dijiste de indentación, lo que pasa es que si haces un espacio y luego presionas tabular aunque parezca que quedan en el mismo sector no lo están, muchas gracias!

Deja un comentario

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

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.