Cómo hacer un registrador de temperatura online con Raspberry Pi

Facebook
Twitter
WhatsApp

Hace tiempo vimos en Nergiza cómo hacer un registrador de temperatura con Arduino, como despertó bastante interés y hace poco hemos presentado la Raspberry Pi 2 B en sociedad, vamos a hacer un registrador de temperatura online con la Rasp de forma que pueda leer la temperatura de una sonda cada X minutos y volcarla en una web para poder consultarla desde cualquier sitio.

Regsitrador de temperatura Raspberry Pi

La verdad es que cuanto más utilizamos la Raspberry más nos damos cuenta de la gran cantidad de posibilidades que existen con este microPC de bajísimo consumo, así que vamos allá con este DIY que no será el último que hagamos con la Rasp.

 

Montando nuestro registrador de temperatura Raspberry

El montaje es muy sencillo, utilizaremos la misma sonda de temperatura que utilizamos con Arduino, la Dallas DS18B20. Este tipo de sonda la podéis encontrar en varios formatos, aunque en algunas fotos veís que hemos usado una más pequeña, creo que este tipo (foto) es más versatil ya que se puede sumergir en agua y viene con el cable incorporado.

Sonda de temperatura DS18B20

Para la conexión de la sonda con la Raspberry Pi utilizaremos el puerto GPIO 4 y una resistencia de 4,7K tal y como aparece en este esquema.

Esquema sonda de temperatura Raspberry Pi

 

Subiendo los datos de temperatura a ThingSpeak

Como servidor donde volcar los datos de nuestro registrador de temperatura vamos a usar el servicio ThingSpeak, una web gratuita que ofrece facilitarnos el "Internet de las cosas" registrando y creando gráficos con cualquier tipo de dato que el envíemos. El proceso aquí es muy sencillo.

  1. Nos registramos en ThingSpeak
  2. Agregamos un nuevo canal "New Channel"
  3. En el apartado "Name" ponemos "Raspberry"
  4. En el apartado "Field label" ponemos "Temperatura"
  5. Pinchamos en "API Keys" dentro del canal y copiamos la clave que aparece en "Write API Key" ya que la necesitaremos luego

 

Configurando la Raspberry Pi

Ahora nos queda configurar la Raspberry Pi para que suba los datos a ThingSpeak, para ello nos ponemos en modo Fulgencio ya que vamos a tener que teclear algunos datos en la consola de Raspbian, así que cogemos nuestra bolsa de Doritos y apagamos la luz.

En primer lugar vamos a configurar la Raspberry para que sea capaz de leer la información de la sonda de temperatura conectada al puerto GPIO, abrimos un terminal y tecleamos sudo nano /boot/config.txt para editar el archivo de arranque, al final del mismo incluimos el siguiente código:

dtoverlay=w1-gpio

Salimos con crt+X y decimos "yes" cuando nos pregunte si queremos guardar (con el mismo nombre).

Volvemos al terminal y tecleamos: sudo nano registradortemperatura.py . Mediante este comando creamos un archivo llamado registradortemperatura.py (extensión de python) y aparecemos directamente en el editor de archivos (nano). Ahora pegamos el siguiente código:

# Registrador de temperatura Nergiza.com
# python
import httplib, urllib, os, glob, time
 
os.system('modprobe w1-gpio')
os.system('modprobe w1-therm')
base_dir = '/sys/bus/w1/devices/'
device_folder = glob.glob(base_dir + '28*')[0]
device_file = device_folder + '/w1_slave'
 
def read_temp_raw():
    f = open(device_file, 'r')
    lines = f.readlines()
    f.close()
    return lines
 
def read_temp():
    lines = read_temp_raw()
    while lines[0].strip()[-3:] != 'YES':
        time.sleep(0.2)
        lines = read_temp_raw()
    equals_pos = lines[1].find('t=')
    if equals_pos != -1:
        temp_string = lines[1][equals_pos+2:]
        temp_c = float(temp_string) / 1000.0
        return temp_c
 
temperatura = read_temp()
params = urllib.urlencode({'field1': temperatura, 'key':'Pon_aquí_tu_key'})
headers = {"Content-type": "application/x-www-form-urlencoded","Accept":
        "text/plain"}
conn = httplib.HTTPConnection("api.thingspeak.com:80")
conn.request("POST", "/update", params, headers)
response = conn.getresponse()
print response.status, response.reason
data = response.read()
conn.close()

Recordar salir del editor con crt+X y poner "yes" cuando nos pregunte si queremos guardar.

Ojo, es necesario cambiar el 'Pon_aquí_tu_key" por la key que hemos copiado de ThingSpeak en el apartado anterior.

Ahora tenemos un script en python que cada vez que ejecutemos enviará nuestro dato de temperatura a nuestro canal en Thingspeak.

Solo nos queda configurar la Raspberry de forma que ejecute ese script cada cierto tiempo para tener un verdadero registrador de temperatura. Para ello editaremos el archivo crontab que nos permite programar tareas de este tipo. Tecleamos en una sesión de terminal: crontab -e , y pegamos el siguiente texto:

*/1 * * * * python /home/pi/registradortemperatura.py

Puedes sustituir el "1" por la cadencia de registro de datos que necesites (en minutos).

Recordar salir del editor con crt+X y poner "yes" cuando nos pregunte si queremos guardar.

Una vez tenemos todo montado, podremos ver en nuestro canal de ThingSpeak registros como el de la imagen o incluso descargar los datos en un archivo .csv para hacer "cosas Nergizas" con excel.

Gráfico registro temperatura Raspberry Pi

 

Lista de ingredientes

A continuación ponemos la lista de ingredientes necesarios para esta receta que puedes encontrar en la tienda online Banggood:

  • Raspberry Pi 2 B (46,80€): También puedes usar la versión B+ pero por la diferencia de precio creo que la 2 ofrece mejores prestaciones.
  • Sonda de temperatura DS18B (2,51€)
  • Resistencia 4,7K: puedes comprarla en cualquier tienda de electrónica por unos céntimos o utilizar un pack de resistencias (640 uds.) como este para tener disponibles para futuros DIY.
  • Bolsa de Doritos (1€)

Si estás pensando en llevar a cabo este DIY te recomendamos que leas nuestra review sobre la Raspberry Pi 2 B ya que tiene muchas otras utilidades que podrían interesarte.

¿Tienes pensado hacer este DIY?

Ver respuestas

Cargando ... Cargando ...

Si necesitas que te ayude con tu caso particular, puedes usar el servicio de consulta PRO para enviarme tu duda junto con toda la información necesaria (planos, presupuestos recibidos, etc.) y te responderé en un plazo de 2 días.

59 comentarios en «Cómo hacer un registrador de temperatura online con Raspberry Pi»

    • Cierto, el problema es que no tengo contador accesible para probarlo, por lo tanto va a ser complicado, pero a ver si puedo hacer algo.

      Un saludo

      Responder
  1. Hola, muy interesante el artículo. En realidad, tengo hecho este mismo montaje en casa excepto la parte de publicación en web, así que me ha venido muy bien para conocer el servicio de ThingSpeak. Eso sí, sugeriría que en la parte de configuración de la Raspberry Pi incluyeras los comandos para instalar los módulos de python necesarios (con apt-get o pip, lo que se prefiera).

    buen trabajo!
    jordi

    Responder
  2. Interesante, voy a pedir la sonda y a montarme uno 😉
    Lo que habría que avisar es que la raspy no tiene ninguna protección el el puerto GPIO (por cierto: Entradas/Salidas de Propósito General) por lo que un error al montar cualquier "cosa de estas" puede quemar la placa. Tampoco es tanta perdida, es baratita 😉 pero mejor tener cuidado y no dejar que Fulgencio conecte los cables

    Responder
    • -En el caso de la Rasp tienes un ordenador en el cual una de sus funciones es hacer de registrador de temperatura, en el caso de Arduino tienes un "registrador de temperatura" a secas.

      -La Rasp registra los datos online en una web que puedes consultar desde cualquier lugar, en el caso del Arduino lo graba en una microSD que tienes que extraer y leer en un PC. Supongo que se podría hacer el registrador online con arduino pero haría falta una shield ethernet o wifi también.

      -El registrador con Arduino es más barato.

      Lo más importante es el primer punto creo yo, la Rasp tiene un abanico de posibilidades infinto que puedes simultanear con el registrador de temperatura. Yo por ejemplo al tengo registrando pero a su vez hace de servidor de descargas y de centro multimedia, además de plataforma para "experimientar" futuros DIY, todo ello en Raspbian.

      Responder
  3. Carlos:
    Mas que interes en la RB (que tambien), me interesa lo que se puede hacer/ ver con los datos subidos a la nube...
    Hay forma de ver ls datos que ha subido tu RB a Thingspeak?

    Responder
    • Creo que no permite compartir esos datos, pero si quieres registrate y pásame tu key y pongo mi Raspberry para que suba los datos a tu usario durante un tiempo para que lo pruebes.

      Un saludo

      Responder
      • No hace falta, gracias. Al final, en Thingspeak he visto que hay "piblic channels" de gente que conecta sus cosas a internet, con lo que me he hecho una idea de la potencia de explotacion de datos qur tiene.
        Es curioso ver a uno de Bilbao (ceo) que controla y publica los Kilometros que corre su hamster en la rueda de su jaula cada dia... 🙂

        Responder
    • Seguro que sí Argi, aunque no sabría decirte como ahora mismo, quizás lo más sencillo es que el smartphone cree un red wifi y que la raspberry se conecte a esa red pare enviar los datos.

      Responder
  4. Al parecer da un problema con la linea 8 a mi me sale esto. Si alguien sabe como solucionarlo o donde encontrar la solucion lo agradeceria enormemente.
    Me encanata NERGIZA

    Responder
    • Mmmm... de momento nadie ha tenido problema. Creo que te has olvidado de pegar cual es el error que te sale exactamente, cuando lo pongas vemos como podemos resolverlo. Gracias por seguirnos!!
      Un saludo

      Responder
  5. Decir tambien que en Thingspeak no recibia datos y por eso decidi ejecutrarlo a mano, de hacerlo con el modo crontab no se ve el error por eso nadie dice nada ,creo.
    pi@raspberrypi ~ $ python /home/pi/registradortemperatura.py
    ERROR: could not insert 'w1_therm': Operation not permitted
    Traceback (most recent call last):
    File "/home/pi/registradortemperatura.py", line 8, in
    device_folder = glob.glob(base_dir + '28*')[0]
    IndexError: list index out of range

    P.D.
    Siento la falta de puntuaci'on aun tengo el teclado en otro idioma.

    Responder
    • Hola Samuel.

      Me tiene pinta de que no te encuentra la sonda de temperatura, a mi me da ese error si lo ejecuto sin sonda conectada. Comprueba que está bien conectada (ojo polaridad). Una vez conectada debería de aparecerte algo aquí: cd /sys/bus/w1/devices

      Responder
      • Una pregunta Carlos.
        A mi tambien me sale el mismo error, pero estoy usando el sensor DHT22 . Ya probe con otro aplicativo para ver si esta conectado, y me sale todo bien. Presiento que algo tiene que ver el código w1, porque estamos usando el GPIO 4 . Espero me puedas asesora. Gracias y saludos.

        Responder
  6. ¡Muchas gracias por el pequeño script! Por fin logré pasarlo a mi Pi B. Tenemos un solo DS1820 (no DS18B20) que parece produce 10 en vez de 28 como nombre de archivo pero al correr el programa con "python registradora.....py" me arroja un error en la línea 4 de sintáxis. Estoy usando nano para leer el archivo pero no tiene numerado las líneas y no sé cuál es la #4. Sería la de "base-dir"? ó la siguiente - lol.

    Lo siento - estoy en la étapa de "copy/paste" y pensaba que una vez que pudiera hacer correr bien este programa que podría hacer la traducción al inglés y subirlo al sitio de ThingSpeak con un enlace a tu página.

    Bueno, a ver qué piensas. Mientras, qué tengas una noche muy hermosa - 🙂

    Responder
    • Hola Fred.

      En primer lugar sería importante saber cual es la línea 4 en tu código, simplemente cuéntalas ya que en el que hemos puesto la línea 4 está en blanco.

      Un saludo

      Responder
      • Tienes razón. Empezando desde #Registrador de ..., el cuarto renglón está en blanco.

        Gracias por contestar y ¡qué tengas un día hermoso!

        Responder
      • Muchas gracias, Carlos. Parece que hubo muchos problemas con el copy/paste por carácters no deseables - aunque lo guardé como "texto".
        Bueno, parece que está funcionando. Me arroja dos datos: 200 y OK. Supongo que el 200 es debido a que este sensor es DS1820 y no el DS18B20. No hay cuete - solo divido entre 10,000 en vez de 1000. No programo en python pero me ayudó recordar que algunas de las programas son sensibles a la posición del rengón.

        Ahora a ver si logró subir el dato.

        Otra vez, gracias Carlos por ayudar. 🙂

        Responder
  7. Hola, ya realicé tu diy y funcionó perfectamente, lo adapté con la lectura de otras 4 variables..

    Pero ahora intento enviar los datos directamente a un host local, aún no me ha funcionado pero en caso de que sepas como manejar los comados de request con el metodo POST que usas te agradecería información.

    Saludos!

    Responder
  8. Hola, muchas gracias por el articulo. Tengo una sonda termica y no sé como programar en python, mi duda es ¿cómo quedaría el código si quisiera tomar lecturas locales en tiempo real?
    De antemano gracias

    Responder
  9. Carlos una consulta.
    Que Sistema Operativo se está usando en el raspberry, y si se requiere alguna aplicación extra para ingresar el código que nos compartes. Te agradeceria me puedas ayudar con mis inquietudes. Acabo de comprar el Raspberry PI 3 Model B y deseo hacer los mismo. Un cordial saludo.

    Responder
    • Lo que preguntas está contestado en el post, además puedes ampliar información aquí: http://nergiza.com/raspberry-pi-2-b-que-es-y-para-que-nos-puede-servir/

      Responder
  10. Buenas tardes.
    Funciona perfectamente, pero tengo el siguiente problema.
    Al conectar un segundo sensor ds18b20. Si ejecutó cualquiera de los dos, funciona perfectamente, pero al ejecutarlo en cron. Solo me sube a thingspeak uno de los datos.
    Gracias

    Responder
    • No se que puede suceder, lo siento. En breve publicaremos un DIY similar pero para registrar en Thingspeak con Arduino, quizás te sea útil.

      Responder
  11. Estoy haciendo un proyecto similar, lo que tengo son 2 dudas:

    - con ese codigo py como lo modifico para que en vez de enviar los datos a thingspeak me los mande a una api propia ej: http://www.miservidor.com/api.php?temp=22.5 (donde ahi los guardo yo en un mysql y muestro los datos en una web) ???

    - se podria leer a tiempo real la temperatura remotamente desde un servidor externo, con una api php por ejemplo???

    Gracias

    Responder
    • Hola Rubén, ni idea de lo que me preguntas, no soy un experto en programación 🙁 aunque seguro que se puede hacer lo que preguntas.

      Responder
  12. Buenas,

    antes de nada muchas gracias por toda la información que proporcionáis.

    Soy nuevo en este mundillo de la Raspberry y viendo el esquema donde se indica cómo conectar la sonda de temperatura y la resistencia a los conectores de la Raspberry, me surge la duda de cómo se conecta la resistencia, ¿se puede conectar directamente en los mismos pines?.

    Muchas gracias de antemano.
    Un saludo.

    Responder
    • Hola,

      No, no puedes conectar directamente ya que son dos cables los que van ahí, si no sabes soldar o unir cables de alguna otra forma te recomiendo que lo hagas con una protoboard y cables con punteras dupont, es lo más sencillo.

      También hemos hecho algo parecido con arduino por si te interesa: https://nergiza.com/control-de-humedad-avanzado-con-arduino-diy/

      Responder
      • Muchas gracias, dudé al ver la imagen con la protoboard y el esquema.

        Le echaré un vistazo a ver si me animo también!.

        Gracias de nuevo!
        Un saludo.

        Responder
  13. Buenas,
    Gracias por compartir este fabuloso tutorial que reúne muchas de las ideas que llevo tiempo queriendo poner en práctica.
    He tratado de realizarlo y al ejecutar el programa Python, me da el error siguiente:

    Traceback (most recent call last):
    File "tempera.py", line 8, in
    device_folder = glob.glob(base_dir + '28*')[0]
    IndexError: list index out of range

    Te agradecería alguna orientación.

    Saludos

    Responder
  14. Muy buen post, te queria preguntar si es posible conectar más de un sensor, lo quiero utilizar para 4 fermentadores de cerveza, si es posible, me indicarias como seria esa conexion?

    Responder
  15. Soy de Alemania y utilizo Google Translator. Lo siento, no puedo hablar español.
    Tengo un Raspberry Pi y quiero mostrar mi temperatura de la piscina y la temperatura exterior.
    Tengo que 2 DS18B20 sensores.
    ¿Cuántos sensores envía la secuencia de comandos de Python? Se transmiten todos los sensores conectados?

    Gracias

    Responder
    • En principio el sistema está pensado para un solo sensor, pero supongo que se podría adaptar para vario sensores.
      Un saludo

      Responder
  16. Buenos días, yo tengo tres conectados. Esta noche lo pongo aquí. Javier siento no haberte contestado hasta ahora, pero he estado fuera y no he podido hacerlo, esta noche copio el código

    Responder
  17. Buenas tardes.
    Como he indicado yo tengo tres sensores conectados en paralelo.
    Este es el codigo:
    # Open the file that we viewed earlier so that python can see what is in it. Re$
    tfile = open("/sys/bus/w1/devices/28-************/w1_slave")/los asteriscos se cambian por la numeracion de tu sensor
    # Read all of the text in the file.
    text = tfile.read()
    # Close the file now that the text has been read.
    tfile.close()
    # Split the text with new lines (\n) and select the second line.
    secondline = text.split("\n")[1]
    # Split the line into words, referring to the spaces, and select the 10th word $
    temperaturedata = secondline.split(" ")[9]
    # The first two characters are "t=", so get rid of those and convert the temper$
    temperature = float(temperaturedata[2:])
    # Put the decimal point in the right place and display it.
    temperature = temperature / 1000
    print temperature

    /Este código se utiliza para cada sensor

    Responder
    • Hola Oscar,
      Gracias por compartir esta información. Este código se debe pegar al final del código compartido por Carlos??

      Responder
  18. Excelente. Como puedo hacer para que me envie una alarma en sierta temperatura??
    Estoy haciendo cerveza casera y en el fermentador tengo un parametro. Si pasa de largo esa temperatura quiero que me avise de alguna manera. En la web manda alarmas?.
    Lo que mas me gustaria es recolectar los datos en el archivo y leerlos en una web propia dentro de la misma raspberry y que mande alarmas en el caso de que pase algo con un parametro que tambien se pueda setear por la web.
    Me ayudarias????

    Responder
  19. Me ha costado un poco pero al final lo he conseguido, lo he hecho con una raspberry pi zero y funciona perfectamente.
    El error que casi todo el mundo comenta se debe a los caracteres, al copiar el texto de la pagina y pegarlo en la raspberry cambia los caracteres ' por `.
    Para solucionarlo hay que cambiar todos los `o ´ po ' y tambien las " por '
    O copia y pega el programa de aqui:

    # Registrador de temperatura Nergiza.com
    # python

    import httplib, urllib, os, glob, time

    os.system('modprobe w1-gpio')
    os.system('modprobe w1-therm')
    base_dir = '/sys/bus/w1/devices/'
    device_folder = glob.glob(base_dir + '28*')[0]
    device_file = device_folder + '/w1_slave'

    def read_temp_raw():
    f = open(device_file, 'r')
    lines = f.readlines()
    f.close()
    return lines

    def read_temp():
    lines = read_temp_raw()
    while lines[0].strip()[-3:] != 'YES':
    time.sleep(0.2)
    lines = read_temp_raw()
    equals_pos = lines[1].find('t=')
    if equals_pos != -1:
    temp_string = lines[1][equals_pos+2:]
    temp_c = float(temp_string) / 1000.0
    return temp_c

    temperatura = read_temp()
    params = urllib.urlencode({'field1': temperatura, 'key':'Pon_aquí_tu_key'})
    headers = {'Content-type': 'application/x-www-form-urlencoded','Accept':
    'text/plain'}
    conn = httplib.HTTPConnection('api.thingspeak.com:80')
    conn.request('POST', '/update', params, headers)
    response = conn.getresponse()
    print response.status, response.reason
    data = response.read()
    conn.close()

    Responder
  20. Y tambien pasa con el signo menos de las lineas:

    while lines[0].strip()[-3:] != ‘YES’:

    if equals_pos != -1:

    Cambiar el signo que parece un menos por un -

    Responder
  21. Hola q tal, soy nuevo con la raspberry pi, y en tu código cuando lo puse me genero error en las librerías y creo q las del problema son la librerías 'import httplib, urllib' ya q con las otras librerías hice otro programa y si me funciono,
    Alguna idea de cual es el problema?
    Y si no tengo esas librerías sabes como puedo instalarlas?

    Responder

Deja un comentario

Los datos de carácter personal que proporciones rellenando el presente formulario serán tratados por Carlos Gutiérrez (Nergiza) como responsable de esta web. La finalidad de la recogida y tratamiento de los datos personales solicitados es gestionar los comentarios que realizas en este blog y/o suscribirte a los mismos. Legitimación: Consentimiento del interesado. Te informo que los datos que me facilitas estarán ubicados en los servidores de Cubenode (proveedor de hosting de Nergiza) dentro de la UE. Política de privacidad de Cubenode. El hecho de que no introduzcas los datos de carácter personal que aparecen en el formulario como obligatorios podrá tener como consecuencia que no pueda atender tu solicitud. Podrás ejercer tus derechos de acceso, rectificación, limitación y suprimir los datos en [email protected] así como el derecho a presentar una reclamación ante una autoridad de control. Puedes consultar información adicional sobre Protección de Datos en: https://nergiza.com, así como consultar mi política de privacidad.