Una de las aplicaciones más fáciles e inmediatas a realizar con nuestra Raspberry Pi es convertirla en un termómetro de precisión. Para ello solo tenemos que contar con un sensor modelo DS1820 y unos pocos componentes más. Vamos a comentar esta sencilla práctica que, a buen seguro, animará a practicar con la Raspi y el puerto GPIO a todos los que aún no se hayan decidido.
En caso de que tengamos problemas para localizar los componentes precisos podemos adquirir el Kit de prácticas de Electrónica Digital que la firma Webtronika publica en su tienda online, y que está especialmente enfocado a nuestra Raspberry Pi.
Los materiales precisos para realizar la práctica son:
1 Tarjeta Raspberry Pi (con s.o. Linux Wheezy instalado)
1 Placa para prototipos
1 Resistencia de 4K7 ohmios
3 Cables para prácticas (macho-hembra)
1 Sensor DS18B20 de la firma Dallas (Maxim)
HARDWARE
La conexión del sensor ha de efectuarse cuidadosamente para evitar problemas (o incluso daños) a nuestra Raspberry. En estas ilustraciones podemos ver el conexionado que ha de efectuarse.
Como podemos observar, la alimentación del sensor se toma desde la propia patilla de +5V de nuestra Raspberry (podía hacerse también desde los 3.3 V pero preferimos no sobrecargar esta línea). Referente a la señal y patilla de lectura, hemos de conocer que ,una vez cargados los módulos precisos (lo vemos más adelante) la señal con la información de temperatura se transmite vía protocolo serie 1-Wire y llega a la patilla que gestiona la señal GPIO4 (es la patilla 7 de acuerdo a la numeración estándar). Al sensor DS1820 tan solo ha de añadirse una resistencia de «pull-up» en la línea de datos.
Es importante reseñar que los dispositivos 1-Wire se identifican mediante un número (ID) único, razón por la que podríamos conectar varios en cascada, viajando la señal de todos ellos por la misma línea de datos. El software se encargará de «interrogar» al sensor/dispositivo adecuado.
Si hacemos uso del kit de Webtronika comentado tenemos la posibilidad de descargar un detallado documento (ficha) que nos resume el proceso completo de montaje.
La secuencia de montaje recomendada en la citada ficha puede ser utilizado también aquí:
- Apagamos corectamente la tarjeta Raspberry Pi ( sudo halt )
- Conectamos a la placa de prototipos la resistencia (pull-up) de datos (4K7) y el sensor 18(B)20 de acuerdo al esquema mostrado.
- Conectamos los 3 hilos desde la placa de prototipos al puerto GPIO de la Raspberry Pi.
- Nos aseguramos de que el cableado es el correcto
- Arrancamos la Raspberry Pi.
- Ejecutamos el software de control del sensor.
SOFTWARE
Describimos a continuación la operativa a llevar a cabo para las primeras pruebas software de nuestro montaje, las cuales pueden efectuarse desde el propio terminal Linux. Posteriormente mostraremos un código desarrollado en Python para el manejo del sensor. Este código puede copiarse, o bien descargarse en forma de fichero al final de esta entrada.
El software preciso para manejar el sensor de temperatura parte de la carga de los módulos que precisa la comunicación 1-Wire y, despues, del lenguaje elegido para su implementación. Si decidimos probar el montaje sin desarrollar un programa específico podemos hacerlo desde el propio terminal Linux, mediante comandos simples. Esto es lo que hemos de hacer :
Accedemos al terminal y tecleamos (con privilegios de root)
sudo modprobe wire
sudo modprobe w1-gpio
sudo modprobe w1-therm
Ahora, – si el sensor DS1820 está correctamente conectado – se habrá creado una carpeta con el ID del dispositivo sensor en /sys/bus/w1/devices/
IMPORTANTE : cada dispositivo DS1820 tiene un ID diferente, por lo que los pasos siguientes han de ejecutarse con el ID de nuestro sensor. Saber el ID de nuestro sensor es imprescindible para desarrollar cualquier aplicación de lectura para el mismo.
Por ejemplo (con el sensor usado por nosotros) si ejecutamos
ls /sys/bus/w1/devices/
obtendremos
10-0008027f3664 w1_bus_master1
por lo que el ID de nuestro sensor DS1820 sería 10-0008027f3664
Ejecutamos ahora el comado “more” para visualizar la lectura del sensor.
(nota : usando el ID del sensor de Webtronika, deberemos usar el ID de nuestro sensor )
more /sys/bus/w1/devices/10-0008027f3664/w1_slave
28 00 4b 46 ff ff 0d 10 57 : crc=57 YES
28 00 4b 46 ff ff 0d 10 57 t=19937
vemos que la lectura ( en milésimas de grado) es 19937 por lo que sabemos que nuestro sensor está midiendo 19,9 ºC
Podemos también utilizar un lenguaje de alto nivel para «interrogar» al sensor. Comentamos ahora un programa desarrollado en Python y que puede copiarse tal como está y guardarse en un fichero llamado mide.py en nuestra Raspberry Pi. También puede ser descargado al final de este artículo y copiarse a la carpeta deseada de nuestra Raspberry Pi. Para ponerlo en marcha hemos de seguir cuidadosamente estos pasos:
(1) Tener el sistema operativo Raspbian Wheezy instalado en nuestra Raspberry Pi.
(2) Efectuar correctamente el conexionado del sensor DS1820 a nuestra Raspberry Pi.
(3) ¡¡ IMPORTANTE !! => Editad el código de mide.py y cambiad la linea ( 24 en el código mostrado) con el ID del dispositivo por el nuestro.
Cambiamos 10-0008027f3664 por ejemplo por XX-XXXXXXXXXXXX en la línea 24
tfile = open(«/sys/bus/w1/devices/10-0008027f3664/w1_slave»)
( XX-XXXXXXXXXXXX será el ID de nuestro dipositivo, el cual podemos averiguar efectuando los comandos comentados anteriormente en este artículo)
(4) Vamos al directorio del programa y damos al fichero mide.py permisos de ejecución (totales realmente) con
sudo chmod 777 mide.py
(5) En un terminal Linux, desde el directorio donde esté situado el programa, ejecutamos
python mide.py
(6) El programa no recorta los decimales mostrados. Podemos forzar a que muestre – por ejemplo – una sola posición decimal ejecutándolo con el parametro 1, o sea :
python mide.py 1
Código del programa mide.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
# ======================================== # - Programa para lectura de sensor 1820 - # ---------------------------------------- # - Develop : DIVERTEKA - Webtronika 2013 # ======================================== #!/usr/bin/python import sys import os import curses import time # - Carga de modulos para OneWire ------------------------------- os.system("sudo modprobe wire") os.system("sudo modprobe w1-gpio") os.system("sudo modprobe w1-therm") # - Rutina de lectura del sensor -------------------------------- # El valor de temperatura se devuelve por defecto con 3 decimales # puede devolver 1 o 2 posiciones decimales ejecutando: # python mide.py 1 // python mide.py 2 # --------------------------------------------------------------- def dametemp(param1): tfile = open("/sys/bus/w1/devices/10-0008027f3664/w1_slave") lectura = tfile.read() tfile.close() linea2 = lectura.split("\n")[1] temperaturaleida = linea2.split(" ")[9] temperatura = float(temperaturaleida[2:]) temperatura = temperatura / 1000 rtemp = round (temperatura,ndec) return rtemp # - Detecta el argumento ---------------------------------------- # si no existe, ndec=3 (valor por defecto para decimales) # --------------------------------------------------------------- narg = len(sys.argv) if narg > 1: ndec = int(sys.argv[1]) else: ndec = 3 # - Programa principal ------------------------------------------ # Utiliza curses para visualizar salida a pantalla # Muestra lectura del sensor y refresca pantalla cada 500 ms. # --------------------------------------------------------------- stdscr = curses.initscr() curses.cbreak() curses.start_color() # Definicion de paletas de colores, borde curses.init_pair(1, curses.COLOR_RED, curses.COLOR_BLACK) curses.init_pair(2, curses.COLOR_YELLOW, curses.COLOR_BLACK) stdscr.border(0) hsize = curses.COLS vsize = curses.LINES stdscr.keypad(1) stdscr.nodelay(1) try: curses.curs_set(0) # Rutina principal del programa while True: char = stdscr.getch() if (char == 113 or char == 81): break # q else: stdscr.addstr(vsize/6, (hsize/2)-14,"Sensor 1820 - Raspberry Pi",curses.color_pair(1)) stdscr.addstr((vsize/5)+2, (hsize/2)- 14,"Temperatura = ") stdscr.addstr((vsize/5)+2, (hsize/2) ,str(dametemp(ndec)),curses.color_pair(2)) stdscr.addstr(vsize-4, (hsize/2)- 14,"Pulsa (Q) para salir") stdscr.refresh() time.sleep(0.5) # Sale educadamente del programa finally: curses.nocbreak() stdscr.keypad(0) curses.echo() curses.endwin() |
Descarga del código :
Mide.py