Está en la página 1de 31

¡Bienvenido!

Muchas gracias por comprar nuestra AZ-Delivery Sonda Sensor de


Temperatura DS18B20 con un cable de 3m. En las siguientes páginas se
presentará como utilizar y configurar este práctico dispositivo.

¡Diviértase!
El sensor de temperatura DS18B20 está encerrado herméticamente en la
sonda. La punta de la sonda está fabricada en acero inoxidable y es la más
adecuada para medir la temperatura en ambientes húmedos.

El DS18B20 es un sensor digital de temperatura que proporciona


mediciones digitales de temperatura de 9 a 12 bits y tiene una función de
alarma con puntos de activación superiores e inferiores no volátiles
programables por el usuario. El sensor se comunica a través de un bus
One-Wire que requiere sólo un pin de datos, un pin de alimentación y un
pin de tierra para la comunicación con un microcontrolador.

Cada sensor tiene una dirección serial única de 64 bits, lo que permite que
varios sensores funcionen en el mismo bus One-Wire. Es sencillo utilizar un
microcontrolador para controlar los sensores distribuidos en una amplia
área. Las aplicaciones que se pueden beneficiar de esta característica
incluyen sistemas de monitoreo de temperatura dentro de edificios, equipos

o maquinaria, monitoreo de procesos y sistemas de control.

El sensor no requiere de energía de reserva, lo que indica que cuando no


se leen los datos de temperatura, el sensor no utiliza energía en absoluto.

El rango de medición de temperatura es de -55°C a +125°C (67°F a 257°F),


con una precisión de ±0.5°C (9 bits); ±0.25°C (10 bits); ±0.125°C (11 bits); y
±0.0625°C (12 bits) de resolución.
NOTA: Si experimenta algún problema de comunicación, intente añadir una
resistencia pull-up 4.7kΩ en el pin DATA.

NOTA: Los datos técnicos pertinentes sobre la interfaz One-Wire no


mencionan el número máximo de sondas que se pueden vincular en la
misma interfaz, pero en la aplicación práctica este número no es tan alto.

NOTA: Existe una limitación de la longitud del cable que se debe tener en
cuenta cuando se utilizan comunicaciones de larga distancia. Se debe
prestar atención a la capacitancia y resistencia distribuida del cable.

NOTA: El DS18B20 y los transistores ordinarios parecen similares, ¡así que


se debe tener cuidado de no considerarlo como un transistor para evitar
daños!
La disposición de pines

Pin "VCC" - es la fuente de alimentación para la sonda. Aunque el


voltaje de alimentación puede variar entre 3.3V y 5.5V; se recomienda una
alimentación de 5V. En el caso de una fuente de alimentación de 5V, puede
utilizar un cable que conecte la sonda y el microcontrolador hasta 20
metros de largo. Sin embargo, con un voltaje de alimentación de 3.3V, la
longitud del cable no debe ser mayor de un metro. De lo contrario, la caída
del voltaje de la línea provocará errores en la medición.
Pin"DATA" - es el pin de datos, y se utiliza para la comunicación entre
la sonda y el microcontrolador (se puede conectar en la interfaz One-Wire).
Pin "GND" - es el pin de tierra y se debe conectar a la tierra común, o
0V (en Atmega328P Board o Raspberry Pi).
Configuración del Arduino IDE

Si el Arduino IDE no está instalado, aquí se presenta como hacerlo. Seguir


el siguiente link: https://www.arduino.cc/en/Main/Software y descargar el
archivo de instalación para su plataforma de sistema operativo.

Para los usuarios de Windows, hacer doble clic en el archivo descargado


.exe y seguir las instrucciones de la ventana de instalación.
Para los usuarios de Linux, descargar un archivo con la extensión
.tar.xz, que se debe extraer. Cuando se la extrae, ir al directorio extraído
y abrir el terminal en ese directorio. Se deben ejecutar dos scripts .sh, el
primero es arduino-linux-setup.sh y el segundo es install.sh.

Para ejecutar el primer script en el terminal, ejecutar el siguiente comando:


sh arduino-linux-setup.sh user_name
user_name - es el nombre de un superusuario en el sistema operativo
Linux. Una contraseña para el superusuario se debe introducir cuando se
inicia el comando. Se debe esperar unos minutos para que el script
complete todo.

El segundo script install.sh se debe utilizar después de la instalación


del primer script. Se debe ejecutar el siguiente comando en el terminal:
sh install.sh

Después de la instalación de estos scripts, ir a la sección All Apps, donde


Arduino IDE está instalado.
La mayoría de los sistemas operativos incluyen un editor de texto
preinstalado (por ejemplo, Windows incluye Notepad, Linux Ubuntu
incluye Gedit, Linux Raspbian incluye Leafpad, etc.). Todos estos
editores de texto se pueden utilizar perfectamente para el objetivo de este
E-book.

Lo siguiente es comprobar si el PC puede detectar una placa del


microcontrolador. Para esto, se debe abrir el Arduino IDE recién instalado, e
ir a:
Tools > Board > {your board name here}
{your board name here} debe ser el Arduino/Genuino Uno, como
se puede observar en la imagen a continuación:

Se debe seleccionar el puerto al que está conectado la placa del


microcontrolador. Ir a: Tools > Port > {port name goes here}
y cuando la placa de Atmega328P esté conectada al puerto USB, el
nombre del puerto se puede observar en el menú desplegable de la imagen
anterior.
Si el Arduino IDE se utiliza en Windows, los nombres de los puertos son los
siguientes:

Para los usuarios de Linux, por ejemplo, el nombre del puerto es


/dev/ttyUSBx, donde x representa un número entero entre 0 y 9.
Configuración del Raspberry Pi y Python

Para la configuración del Raspberry Pi, primero se debe instalar el sistema


operativo, después se debe configurar todo para que se pueda utilizar en el
modo Headless. El modo Headless permite la conexión remota al
Raspberry Pi, sin la necesidad de un monitor de pantalla de PC, ratón o
teclado. Las únicas opciones que se utilizan en este modo son el propio
Raspberry Pi, la fuente de alimentación y la conexión a internet. Todo esto
se explica muy detalladamente en el E-book gratuito:
"Raspberry Pi Quick Startup Guide", que se puede encontrar en
nuestro sitio:
https://www.az-delivery.de/products/raspberry-pi-kostenfreies-e-book?ls=en

El sistema operativo Raspbian incluye Python preinstalado.


Conectando la sonda con Atmega328P Board

Conectar la sonda DS18B20 con la tablero del microcontrolador como se


observa en el siguiente diagrama de conexión:

Pin DS18B20 > Pin de Placa


DATA > D2 Cable azul
VCC > 5V Cable rojo
GND > GND Cable negro

NOTA: La resistencia pull up 4.7kΩ está conectada entre el pin DATA y


VCC.
Para utilizar la sonda DS18B20 con las placas de Atmega328P Board,
primero se debe descargar una librería para esto. Ir a: Tools > Manage
Libraries, una nueva ventana aparecerá. Escribir “Dallas” en el cuadro de
búsqueda y descargar la librería “DallasTemperature” de "Miles Burton, Tim
Newsome Guil Barros y Rob Tillaart", como se observa en la siguiente
imagen:

A continuación, ir a: File > Examples > DallasTemperature > … y encontrará


muchos ejemplos de sketchs. Se utilizará y modificará un sketch
denominado “Multiple” para leer los datos de temperatura de tres sondas
DS18B20 diferentes.
Si solo utiliza una sonda DS18B20, entonces se utiliza el sketch
denominado “Simple”.

Conecte tres sondas DS18B20 con la placa del microcontrolador como se


observa en el siguiente diagrama de conexión:

El siguiente es el ejemplo de un sketch de tres sondas DS18B20 en la


misma interfaz One-Wire:

#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2 // Data wire is plugged into D2 pin
#define TEMPERATURE_PRECISION 12
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress one, two, three;
void setup() {
Serial.begin(9600);
Serial.println("Dallas Temperature IC Control Library Demo");
sensors.begin();
Serial.print("Locating devices...");
Serial.print("Found ");
Serial.print(sensors.getDeviceCount(), DEC);
Serial.println(" devices.");
Serial.print("Parasite power is: ");
if(sensors.isParasitePowerMode()) {
Serial.println("ON");
}
else {
Serial.println("OFF");
}
if(!sensors.getAddress(one, 0)) {
Serial.println("Unable to find address for Device 0"); }
if(!sensors.getAddress(two, 2)) {
Serial.println("Unable to find address for Device 2"); }
if(!sensors.getAddress(three, 1)) {
Serial.println("Unable to find address for Device 1"); }

Serial.print("Device 0 Address: ");


printAddress(one);
Serial.println(); Serial.print("Device 1 Address: ");
printAddress(two);
Serial.println(); Serial.print("Device 2 Address: ");
printAddress(three); Serial.println();
sensors.setResolution(one, TEMPERATURE_PRECISION);
sensors.setResolution(two, TEMPERATURE_PRECISION);
sensors.setResolution(three, TEMPERATURE_PRECISION);
// one tab
Serial.print("Device 0 Resolution: ");
Serial.print(sensors.getResolution(one), DEC);
Serial.println(); Serial.print("Device 1 Resolution: ");
Serial.print(sensors.getResolution(two), DEC);
Serial.println(); Serial.print("Device 2 Resolution: ");
Serial.print(sensors.getResolution(three), DEC);
Serial.println();
}
void printAddress(DeviceAddress deviceAddress) {
for(uint8_t i = 0; i < 8; i++) {
if(deviceAddress[i] < 16) Serial.print("0");
Serial.print(deviceAddress[i], HEX);
}
}
void printTemperature(DeviceAddress deviceAddress) {
float tempC = sensors.getTempC(deviceAddress);
Serial.print("Temp: "); Serial.print(tempC);
Serial.print(" C; ");
Serial.print(DallasTemperature::toFahrenheit(tempC));
Serial.print(" F");
}
void printResolution(DeviceAddress deviceAddress) {
Serial.print("Resolution: ");
Serial.println(sensors.getResolution(deviceAddress));
}
void printData(DeviceAddress deviceAddress) {
printTemperature(deviceAddress); Serial.print(" ; Device: ");
printAddress(deviceAddress); Serial.println();
}
void loop() {
Serial.print("Requesting temperatures...");
sensors.requestTemperatures(); Serial.println("DONE");
printData(one);
printData(two);
printData(three);
delay(1000);
}

Cargue el sketch en el placa del microcontrolador y abra el Serial Monitor


(Tools > Serial Monitor). La salida se debe observar como a la salida que se
observa en la imagen inferior:
Lo siguiente es una explicación del sketch.

Se utiliza la variable ONE_WIRE_BUS para definir en qué pin digital se


conecta la interfaz One-Wire. Para el objetivo del E-book, el valor de la
variable ONE_WIRE_BUS es D2, pero se puede utilizar cualquier otro pin
digital del Atmega328P Board, excepto los que se utilizaron en la interfaz
Serial, D0 y D1 (es una recomendación, se pueden utilizar, pero se debe
asegurar de que estos pines están desconectados cuando se cargan los
sketchs).

Se utiliza la variable TEMPERATURE_PRECISION para establecer la


precisión de las sondas DS18B20. El número guardado en esta variable es
un número de conversión digital en bits y puede estar en el rango de 9 a
12, cualquier otro número resultará en un error. Para el objetivo de este
E-book, se estable en el valor máximo, 12.

Se utiliza la siguiente línea de código:


DeviceAddress one, two, three
para crear variables para las direcciones de las sondas, y en este ejemplo
se crean tres.

Se define y crea el objeto oneWire, utilizado para la interfaz One-Wire:


OneWire oneWire(ONE_WIRE_BUS);

A continuación, se utiliza el objeto oneWire para definir y crear el objeto


sensors, que se utiliza para todas las sondas conectadas:
DallasTemperature sensors(&oneWire)
Para iniciar el objeto sensors se utiliza la siguiente línea de código:
sensors.begin()
Con esta línea de código, el objeto sensors detecta todas las sondas
conectadas en la interfaz One-Wire. También detecta todas las direcciones
de las sondas.

Ahora se puede comprobar si las sondas están funcionando correctamente,


utilizando las siguientes líneas de código para cada sonda que se conectó
a la interfaz One-Wire:
if(!sensors.getAddress(one, 0)) {
Serial.println("Unable to find address: Device 0"); }
donde one es la dirección de la primera sonda.

Para configurar analógica a la precisión de la conversión digital de una


sonda específica se utiliza la siguiente línea de código:
sensors.setResolution(one, TEMPERATURE_PRECISION)

Si quiere leer analógica a la precisión de la conversión digital de una sonda


específica se utiliza la siguiente línea de código:
sensors.getResolution(one)
La función devuelve el valor hexadecimal, y para convertirlo en valor
decimal se utiliza la siguiente línea de código:
Serial.print(sensors.getResolution(one), DEC);

Para leer los datos de temperatura, primero se tiene que solicitar todos los
datos de todas las sondas, utilizando la siguiente línea de código:
sensors.requestTemperatures();
Sólo después de la anterior línea de código se pueden leer los datos de
una sonda en específico, utilizando la siguiente línea de código:
float tempC = sensors.getTempC(deviceAddress);
donde se pasa el argumento deviceAddress a la función para leer los
datos de temperatura de una sonda en específico. Estos datos es el valor
de la temperatura en Celsius, y para convertirlo en Fahrenheit se utiliza la
siguiente línea de código:
DallasTemperature::toFahrenheit(tempC)
Conectando la sonda con Raspberry Pi

Conectar la sonda DS18B20 con Raspberry Pi como se observa en el


siguiente diagrama de conexión:

Pin DS18B20 > Pin de Raspberry Pi


GND > GND [pin 4] Cable negro
DATA > GPIO4 [pin 7] Cable azul
VCC > 3V3 [pin 17] Cable rojo

NOTE: La resistencia pull up 4.7kΩ que está conectada entre OUT PIN y el
pin 3V3.
Habilitando la interfaz One-Wire

Antes de que se puede utilizar la sonda DS18B20 con Raspberry Pi,


primero se debe habilitar la interfaz One-Wire en Raspbian. Por defecto, el
hardware de la interfaz One-Wire está en el pin GPIO4 (pin 7), pero primero
se tiene que habilitar. Para habilitar la interfaz One-Wire, abrir All Apps y
dirigirse a:
Preferences > Raspberry Pi Configuration, como se observa:
Cuando la nueva ventana aparezca, abrir la pestaña “Interfaces” y buscar
los botones de radio denominados “1-Wire”, y seleccionar el botón de radio
“Enable”, como se observa en la siguiente imagen:

Se le pedirá que reinicie el sistema:


Cuando el Raspbian se inicie de nuevo, abra el terminal y ejecute los
siguientes comandos, uno por uno:
sudo modprobe w1-gpio
sudo modprobe w1-therm
cd /sys/bus/w1/devices/

y cuando ejecute el siguiente comando:


ls
la salida en el terminal debe ser como la siguiente:
28-7285b3116461 and w1_bus_master1
el primer número (28-7285b3116461) va a ser diferente al suyo, porque
esta es la dirección serial de la sonda específica, y cada sonda tiene su
propia dirección serial única. Ahora para probar si todo funciona, ejecute
estos dos comandos:
cd 28-7285b3116461- un número o dirección serial de la última página
cat w1_slave

La salida se debe observar como a la salida que se observa en la imagen:

t=25875 – son los datos de temperatura en °C (Celsius) = 25,875°C.


Habilitando múltiples interfaces One-Wire

Para habilitar la interfaz One-Wire, sin la interfaz gráfica de usuario (GUI),


antes de reiniciar su Raspberry Pi, al archivo que está ubicado en
"/boot/config.txt" debe agregar la siguiente línea:
dtoverlay=w1-gpio
o
dtoverlay=w1-gpio,gpiopin=x
donde x es un pin personalizado, si quiere utilizarlo (por defecto es GPIO4
[pin 7], como se mencionó en el capítulo anterior).

Los nuevos kernels (4.9.28 y posteriores) permiten utilizar la carga


superpuesta dinámica en su lugar, incluyendo la creación de múltiples
interfaces One-Wire para que se utilicen al mismo tiempo:
sudo dtoverlay w1-gpio gpiopin=4 pullup=0 # header pin 7
sudo dtoverlay w1-gpio gpiopin=17 pullup=0 # header pin 11
sudo dtoverlay w1-gpio gpiopin=27 pullup=0 # header pin 13

Una vez que se hayan realizado cualquiera de los pasos anteriores, y se


haya completado el proceso de descubrimiento, puede enumerar los
dispositivos que el Raspberry Pi ha detectado a través de todas las
interfaces de One-Wire ejecutando el siguiente comando en el terminal:
ls /sys/bus/w1/devices/

NOTA: El uso de w1-gpio en el Raspberry Pi normalmente necesita una


resistencia pull-up de 4.7kΩ conectada entre el pin GPIO y un suministro de
3.3V.
Script Python para leer múltiples sondas DS18B20

Se escoge dividir el código en dos scripts, para una mejor legibilidad. El


siguiente es un código para el subscript de la clase:

import os
import glob
import time

class DS18B20:

def __init__(self):
os.system('modprobe w1-gpio')
os.system('modprobe w1-therm')
base_dir = '/sys/bus/w1/devices/'
device_folder = glob.glob(base_dir + '28*')
self._count_devices = len(device_folder)
self._devices = list()
i = 0
while i < self._count_devices:
self._devices.append(device_folder[i] + '/w1_slave')
i += 1

def device_names(self):
names = list()
for i in range(self._count_devices):
names.append(self._devices[i])
temp = names[i][20:35]
names[i] = temp

return names
# (one tab)
def _read_temp(self, index):
f = open(self._devices[index], 'r')
lines = f.readlines()
f.close()
return lines

def tempC(self, index = 0):


lines = self._read_temp(index)
retries = 5
while (lines[0].strip()[-3:] != 'YES') and (retries > 0):
time.sleep(0.1)
lines = self._read_temp(index)
retries -= 1

if retries == 0:
return 998

equals_pos = lines[1].find('t=')
if equals_pos != -1:
temp = lines[1][equals_pos + 2:]
return float(temp) / 1000
else:
return 999 # error

def device_count(self):
return self._count_devices

(la mayor parte del código en el script está modificado del script en el sitio de adafruit)

Guardar el script con el nombre “DS18B20classfile.py”.


Lo siguiente es un código para el script principal:

import time
from DS18B20classFile import DS18B20

degree_sign = u'\xb0' # degree sign


devices = DS18B20()
count = devices.device_count()
names = devices.device_names()

print('[press ctrl+c to end the script]')


try: # Main program loop
while True:
i = 0
print('\nReading temperature, number of sensors: {}'
.format(count))
while i < count:
container = devices.tempC(i)
print('{}. Temp: {:.3f}{}C, {:.3f}{}F of the device {}'
.format(i+1, container, degree_sign,
container * 9.0 / 5.0 + 32.0, degree_sign,
names[i]))
i = i + 1

time.sleep(1)

# Scavenging work after the end of the program


except KeyboardInterrupt:
print('Script end!')
Guardar el script con el nombre “DS18B20multiple.py” en el mismo
directorio donde guardó el primer script.

Por ejemplo, se conectan tres sondas DS18B20 en la misma interfaz


One-Wire del Raspberry Pi como se observa en el siguiente diagrama de
conexión:
Para ejecutar el script principal, abrir el terminal en el directorio donde
guardó ambos scripts, y ejecute el siguiente comando:
python3 DS18B20multiple.py

La salida se debe observar como a la salida que se observa en la imagen


inferior:

Para detener el script presione "CTRL + C" en el teclado.

Puede utilizar fácilmente el script para una o varias sondas DS18B20.

¡Lo ha logrado!
Ahora puede usar su módulo para varios proyectos.
Ahora es el momento de aprender y hacer sus propios proyectos. Puede
hacerlo con la ayuda de muchos scripts de ejemplo y otros tutoriales, que
puede encontrar fácilmente en Internet.

Si está buscando microelectrónica y accesorios de alta calidad, AZ-


Delivery Vertriebs GmbH es la compañía adecuada donde podrá
obtenerlos. Se le proporcionarán numerosos ejemplos de aplicación,
guías completas de instalación, libros electrónicos, librerías y la
asistencia de nuestros expertos técnicos.

https://az-delivery.de

¡Disfrute!

Impressum

https://az-delivery.de/pages/about-us

También podría gustarte