Tutorial sensor digital de temperatura DS18B20 Deja un comentario

Sensor DS18B20

El DS18B20 es un sensor digital de temperatura que utiliza el protocolo 1-Wire para comunicarse, este protocolo necesita solo un pin de datos para comunicarse y permite conectar más de un sensor en el mismo bus.

El sensor DS18B20 es fabricado por Maxim Integrated, el encapsulado de fabrica es tipo TO-92 similar al empleado en transistores pequeños. La presentación comercial más utilizada por conveniencia y robustez es la del sensor dentro de un tubo de acero inoxidable resistente al agua, con el que trabajemos este tutorial.

Sensor de Temperatura Digital DS18B20

Con este sensor podemos medir temperatura desde los -55°C hasta los 125°C y con una resolución programable desde 9 bits hasta 12 bits.

Cada sensor tiene una dirección unica de 64bits establecida de fábrica, esta dirección sirve para identificar al dispositivo con el que se está comunicando, puesto que en un bus 1-wire pueden existir más de un dispositivo.

El sensor tiene dos métodos de alimentación:

Alimentación a través del pin de datos:

De esto forma, el sensor internamente obtiene energía del pin de datos cuando este se encuentra en un estado alto y almacena carga en un condensador para cuando la línea de datos esté en una estado bajo, a esta forma de obtener energía se le llama “Parasite Power” y se usa cuando el sensor debe conectarse a grandes distancias o en donde el espacio es limitado, puesto que de esta forma no se necesita la línea de VDD. El diagrama para su conexión debe ser de la siguiente forma:

DS18B20 Parasite Power

Notar que el pin GND y VDD están ambos conectados a GND, esto es indispensable para que se active el  Parasite Power . EL MOSFET en la imagen es necesario para cuando se realicen conversiones de temperatura o copiar datos desde la memoria de circuito de la EEPROM, en estas operaciones la corriente de operación aumenta y si solo se suministra energía a través de la resistencia pueden causar caídas de voltaje en el condensador interno.

Alimentación usando una fuente externa:

De esta forma el sensor se alimenta a través del pin VDD, de esta forma el voltaje es estable e independiente del tráfico del bus 1-wire.

El diagrama de conexión es de la siguiente forma:

DS18B20 External Power

Esta forma de alimentación es la más recomendada y es la utilizada en este tutorial.

Librerías para el DS18B20 en Arduino

Para poder trabajar el DS18B20 en Arduino necesitamos dos librerías:

– Librería OneWire, descarga: https://github.com/PaulStoffregen/OneWire

En esta librería está implementado todo el protocolo del bus 1-wire. Y puede usarse tanto para el DS18B20 como para otros dispositivos 1-wire, para mayor información sobre la librería: http://www.pjrc.com/teensy/td_libs_OneWire.html

-Librería DallasTemperature, descarga: https://github.com/milesburton/Arduino-Temperature-Control-Library

En esta librería están implementadas las funciones necesarias para poder realizar las lecturas o configuraciones del DS18B20, para mayor información de la librería revisar: http://www.milesburton.com/Dallas_Temperature_Control_Library

Conexiones del DS18B20 con Arduino:

conexion DS18B20 y arduino

Notar que es necesario poner una resistencia Pull-Up de 4.7K, y pueden usar un protoboard para facilitar la conexión.

Ej.1: Realizando lecturas de temperatura con el DS18B20

Después de instalar las librerías y realizar la conexión anterior podemos realizar las lecturas de temperatura, para eso usamos el siguiente sketch:

#include <OneWire.h>                
#include 
 
OneWire ourWire(2);                //Se establece el pin 2  como bus OneWire
 
DallasTemperature sensors(&ourWire); //Se declara una variable u objeto para nuestro sensor

void setup() {
delay(1000);
Serial.begin(9600);
sensors.begin();   //Se inicia el sensor
}
 
void loop() {
sensors.requestTemperatures();   //Se envía el comando para leer la temperatura
float temp= sensors.getTempCByIndex(0); //Se obtiene la temperatura en ºC

Serial.print("Temperatura= ");
Serial.print(temp);
Serial.println(" C");
delay(100);                     
}

Como se observa medir la temperatura es simple, son necesarias solo dos líneas en el void loop() para realizar esta tarea.
El resultado es el siguiente:

Lectura DS18B20

Conectando varios sensores de temperatura:

Tenemos dos opciones o métodos que podemos usar cuando necesitamos leer más de un sensor de temperatura.

El primer método es manejando cada sensor con un pin diferente del Arduino. De esta forma sí tenemos 3 sensores, necesitaremos usar 3 pines digitales del Arduino.

Otra forma es usar el mismo pin para todos los sensores, en otras palabras todos los sensores se conectan al mismo bus 1-Wire, y como cualquier bus, cada elemento o dispositivo posee una identificación o dirección. En el caso del DS18B20 necesitamos averiguar su dirección que es única y viene establecida de fábrica.

Ej.2: Usando varios DS18B20 en diferentes pines del Arduino:

Para este caso las conexiones son las siguientes:

conexion de dos DS18B20 y arduino

Cada sensor trabaja con un pin diferente y necesita su propia resistencia Pull-Up de 4.7K.

El código para realizar las lecturas es el siguiente:

#include <OneWire.h>                
#include 
 
OneWire ourWire1(2);                //Se establece el pin 2  como bus OneWire
OneWire ourWire2(3);                //Se establece el pin 3  como bus OneWire
 
DallasTemperature sensors1(&ourWire1); //Se declara una variable u objeto para nuestro sensor1
DallasTemperature sensors2(&ourWire2); //Se declara una variable u objeto para nuestro sensor2

void setup() {
delay(1000);
Serial.begin(9600);
sensors1.begin();   //Se inicia el sensor 1
sensors2.begin();   //Se inicia el sensor 2
}
 
void loop() {
sensors1.requestTemperatures();   //Se envía el comando para leer la temperatura
float temp1= sensors1.getTempCByIndex(0); //Se obtiene la temperatura en ºC del sensor 1

sensors2.requestTemperatures();   //Se envía el comando para leer la temperatura
float temp2= sensors2.getTempCByIndex(0); //Se obtiene la temperatura en ºC del sensor 2

Serial.print("Temperatura 1 = ");
Serial.print(temp1);
Serial.print(" C");
Serial.print("   Temperatura 2 = ");
Serial.print(temp2);
Serial.println(" C");
delay(100);                     
}

Lectura de dos DS18B20

Esta forma de conectar dos o más sensores es fácil de entender e implementar y es útil cuando son pocos sensores o simplemente tenemos pines disponibles para conectar más DS18B20 como en un Arduino Mega.

Ej.3: Usando varios DS18B20 con un solo pin del Arduino:

En este caso conectamos todos los sensores al mismo bus 1-Wire.

Varios DS18B20 en un mismo bus

En caso sea necesario es posible conectar más sensores al mismo pin de datos.

La diferencia acá, es que al tratarse de un bus, necesitamos averiguar la dirección de cada sensor para poder identificarlo.

El siguiente sketch solo se utiliza para obtener la dirección de los dispositivos conectados en el bus 1-wire:

#include <OneWire.h>

OneWire ourWire(2);                //Se establece el pin 2  como bus OneWire

void setup(void) {
  Serial.begin(9600);
}

void loop(void) {
  byte addr[8];  
  Serial.println("Obteniendo direcciones:");
  while (ourWire.search(addr)) 
  {  
  Serial.print("Address = ");
  for( int i = 0; i < 8; i++) {
    Serial.print(" 0x");
    Serial.print(addr[i], HEX);
  }
  Serial.println();
}

Serial.println();
ourWire.reset_search();
delay(2000);
}

Direcciones OneWire

El código anterior nos sirve para obtener las direcciones de los sensores, en nuestro caso hemos obtenido las direcciones de los tres sensores que tenemos conectados, pero pueden ejecutar el código anterior para cada sensor de forma individual para saber con exactitud la dirección de su sensor.

Una vez obtenida la dirección podemos identificar la lectura del sensor que deseemos medir.

Para realizar las lecturas usamos el siguiente sketch:

#include <OneWire.h>                
#include 
 
OneWire ourWire(2);                //Se establece el pin 2  como bus OneWire
 
DallasTemperature sensors(&ourWire); //Se declara una variable u objeto para nuestro sensor

DeviceAddress address1 = {0x28, 0xFF, 0xCA, 0x4A, 0x5, 0x16, 0x3, 0xBD};//dirección del sensor 1
DeviceAddress address2 = {0x28, 0xFF, 0x89, 0x3A, 0x1, 0x16, 0x4, 0xAF};//dirección del sensor 2
DeviceAddress address3 = {0x28, 0xFF, 0x23, 0x19, 0x1, 0x16, 0x4, 0xD9};//dirección del sensor 3

void setup() {
delay(1000);
Serial.begin(9600);
sensors.begin();   //Se inicia el sensor
}
 
void loop() {
  
sensors.requestTemperatures();   //envía el comando para obtener las temperaturas
float temp1= sensors.getTempC(address1);//Se obtiene la temperatura en °C del sensor 1
float temp2= sensors.getTempC(address2);//Se obtiene la temperatura en °C del sensor 2
float temp3= sensors.getTempC(address3);//Se obtiene la temperatura en °C del sensor 3

Serial.print("Temperatura 1 = ");
Serial.print(temp1);
Serial.print(" C");
Serial.print("   Temperatura 2 = ");
Serial.print(temp2);
Serial.print(" C");
Serial.print("   Temperatura 3 = ");
Serial.print(temp3);
Serial.println(" C");
delay(100);    
delay(100);                     
}

Se debe tener en cuenta que se deben reemplazar la direcciones en el sketch con las direcciones correspondientes a los sensores que se tenga disponibles.

A continuación mostramos nuestros resultados:

ejemplo varios DS18B20 en bus one wire

Las temperaturas sensadas son similares puesto que los sensores se encontraban en el mismo ambiente:

Para cambiar la resolución del sensor a: 9, 10, 11 o 12 bits. solo se debe usar la función:

sensors.setResolution(Address, 9); // resolución de 9 bits

Normalmente la resolucion se configura en el void setup() después de inicializar los sensores. A menor resolución el tiempo de lectura será menor.

Deja una respuesta

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.

Enviar Whatsapp
Hola 👋
¿En qué podemos ayudarte?