¿Nos ayudas a pagar el Hosting?

Compartir en facebook Compartir en twitter Compartir en linkedin

Lectura de temperatura con sonda DS18B20

Publicado en Diciembre de 2017

La utilidad de este proyecto es aprender a utilizar la tecnología 1-Wire (1 cable), un protocolo bastante peculiar que utiliza un solo cable para enviar y recibir datos, en lugar de los más comunes 2 cables, Rx y Tx. Mediremos la temperatura con la sonda impermeable DS18B20 y mostraremos el valor a través de un navegador web. Usaremos Python y veremos que la utilización es bastante sencilla.

Que necesitas:

También necesitaremos una resistencia de 4k7 entre Vcc y OUT para que funcione correctamente con un cable de hasta 5 metros. Para otra medida de cable la resistencia cambiará. Consultar. Partimos, como casi siempre, de un Orange Pi con Armbian actualizado. Hay muchos modelos diferentes de sensor en lo que se refiere al encapsulado y dependerá de dónde y cómo lo vayas a utilizar, tendrás que elegir uno u otro. Yo he elegido la versión impermeable para usarlo en un proyecto de acuario automatizado, ya que éste se puede sumergir en agua. Para saber la disposición de los pines y su cableado tendrás que mirar la información disponible del sensor específico que compres. Podemos conectarlo a 3.3v o a 5v. El sensor tiene 3 cables, y yo lo he conectado de la siguiente manera:

  • Vcc (5v) al pin 2 del GPIO
  • GND (tierra o masa) al pin 6 del GPIO
  • OUT (señal) al pin 37 del GPIO

Usar el pin 37 (GPIO 20) es obligatorio.

Cableado del Sensor de temperatura impermeable DS18B20

Una de las ventajas de este sensor es que podremos usar todos los que necesitemos conectados al mismo bus (pin), todos en paralelo, y monitorizar áreas muy grandes con un solo controlador. Cada sensor dispone de una memoria ROM que es grabada de fábrica con un código de serie único de 64 bits. Los 8 primeros bits corresponden a la familia (0x28 para el DS18B20). Los siguientes 48 bits son el número de serie único. Los últimos 8 bits son un código CRC. Podremos hacer lecturas puntuales usando dicho número de serie único. Más adelante veremos cómo.

Para aquellos interesados en más información, aquí os dejo enlace al Datasheet:

https://datasheets.maximintegrated.com/en/ds/DS18B20.pdf

El primer paso es editar el archivo de configuración de carga de módulos en el arranque:

sudo nano /etc/modules-load.d/modules.conf

y activar los siguientes módulos:

w1-sunxi
w1-gpio
w1-therm					

Pueden interferir con otros que tengas cargados, si tienes problemas de detección, haz pruebas deshabilitando otros módulos hasta que averigües si hay alguna incompatibilidad, pero estos son imprescindibles. Reinicia con sudo reboot now. El siguiente paso es mirar si el sistema lo ha reconocido. Para ello mira en el directorio devices en el directorio bus w1 con ls:

orangepi@orangepiplus2e: ls /sys/bus/w1/devices/
28-031770cda8ff  w1_bus_master1

Si ves algún directorio que empiece por 28- son buenas noticias. Ahora para comprobar que funciona puedes usar una de las funciones de la librería que se llama w1_slave. Cambia 28-xxxxxxx por el nombre de tu sensor. Como muchas cosas en Linux, se trata como si fuera una carpeta y un fichero, así que puedes hacer lo siguiente:

cd /sys/bus/w1/devices/28-xxxxxxx$
cat w1_slave

Y obtendrás algo como esto:

63 00 4b 46 7f ff 0c 10 ec : crc=ec YES
63 00 4b 46 7f ff 0c 10 ec t=6187

Esta lectura no es demasiado confiable, pero afortunadamente nos dice si hay una temperatura válida para leer. La respuesta tendrá SÍ o NO al final de la primera línea (YES o NO). Si es así, entonces la temperatura estará al final de la segunda línea, en milésimas de grado centígrado. Así, en el ejemplo anterior, la temperatura realmente se lee como 6.187 grados centígrados (si, hace bastante frio y lo tengo en la ventana).

Puedes crear un archivo que haga la lectura, la actualice cada segundo y la muestre por pantalla con el siguiente código en Python. Yo lo he llamado termometro.py y está programado para funcionar con cualquier nombre de sonda:

sudo nano termometro.py
#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-
# author    : "javier pérez santos para orangepiweb.es"
# credits   : "javier pérez santos, orangepiweb.es"
# copyright : "Copyright 2017, orangepiweb.es"
#
#   ___                             ____  ___        __   _
#  / _ \ _ __ __ _ _ __   __ _  ___|  _ \(_) \      / /__| |__   ___  ___
# | | | | '__/ _` | '_ \ / _` |/ _ \ |_) | |\ \ /\ / / _ \ '_ \ / _ \/ __|
# | |_| | | | (_| | | | | (_| |  __/  __/| | \ V  V /  __/ |_) |  __/\__ \
#  \___/|_|  \__,_|_| |_|\__, |\___|_|   |_|  \_/\_/ \___|_.__(_)___||___/
#                        |___/
#
# Lectura de temperatura con sonda DS18B20

import os
import glob
import time

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

t = u"\u00b0"
while True:
    print("Temperatura: {0}".format(read_temp())+t+"C")
    time.sleep(1)				

Cuando lo ejecutes debería darte una salida como esta:

sudo python ds18b20.py
Temperatura: 6.562°C
Temperatura: 6.562°C
Temperatura: 6.625°C
Temperatura: 6.625°C
...

Un extra para los que, como yo, quieran mostrar este dato vía web. Lo he hecho con el siguiente archivo en PHP llamado temp.php:

<?php
//Fichero a leer. CAMBIAR xxxxxxx por el tuyo
$file = '/sys/bus/w1/devices/28-xxxxxxx/w1_slave';
//Leer el fichero linea a linea
$lines = file($file);
//Obtener la temperatura de la segunda linea
$temp = explode('=', $lines[1]);
//Dar formato a la temperatura
$temp = number_format($temp[1] / 1000, 1, ',', '');
//Y mostrar la temperatura
echo $temp . " °C";
?>

Insértalo con un include y te mostrará la temperatura en la página web donde lo necesites.

Mostrar en web la lectura de una sonda de temperatura.

Espero que te haya sido de utilidad, no dudes en escribir un comentario si ves algún error o si puedo ayudarte.


Utiliza este espacio si quieres añadir algún comentario adicional o si tienes alguna duda.
No olvides añadir tu distribución y tu placa.

Todos los comentarios serán validados antes de su publicación.

Philip

Great guide and nice project. Thank you for share.


Cralos

Muchísimas gracias, estaba buscanbdo algo como esto desde hace bastante tiempo, pero solo encontraba para raspberry. Muy bien explicado, gracias


Manuel

Hola.
Estoy con una Orange Pi Zero 512. He seguido todos los pasos, h e cambiado varios sensores y o consigo que me reconozca el bus.
Tengo conectado los datos al pin 26.
¿Es el correcto?.
Se podría poner en otro pin?
¿Como se le indica que utilize ese pin?
Gracias


Administrador OrangePiWeb.es

Hola Manuel.
No me dices si usas Armbian, pero doy por hecho que si. Ha habido cambios en la forma de leer 1-Wire y no he tenido tiempo de actualizar esta guía. De momento decirte que leas estos enlaces:
https://docs.armbian.com/User-Guide_Allwinner_overlays/
https://github.com/armbian/sunxi-DT-overlays/blob/master/sun8i-h3/README.sun8i-h3-overlays#L231,L250

Activates 1-Wire GPIO master requires an external pull-up resistor on the data pin or enabling the internal pull-up
Parameters:
param_w1_pin (pin)
Data pin for 1-Wire master
Optional
Default: PD14
param_w1_pin_int_pullup (bool)
Enable internal pull-up for the data pin
Optional
Default: 0
Set to 1 to enable the pull-up
This option should not be used with multiple devices, parasite power setup
or long wires - please use external pull-up resistor instead

Hay que editar el archivo /boot/armbianEnv.txt y añadir:
overlays=w1-gpio
param_w1_pin=PA20
param_w1_pin_int_pullup=1

Reinicia y prueba con:
ls /sys/bus/w1/devices/

Cuéntanos. Saludos.


Nombre*

Email* Nunca será publicado ni compartido

Comentario*



Copyright © 2024 desde 2016. Todos los derechos reservados | Diseño JaviPSantos

Solicitamos su permiso para obtener datos estadísticos de su navegación en esta web, en cumplimiento del Real Decreto-ley 13/2012. Si continúa navegando consideramos que acepta el uso de cookies.

OK | Más información