Cómo usar sensor de temperatura DS18B20 con Arduino

Posted on by
Sonda de temperatura DS18B20 resistente al agua.

Sonda de temperatura DS18B20 resistente al agua.

Si estás automatizando un sistema hidropónico, acuapónico o simplemente un acuario, sabrás que tener monitorizada la temperatura del agua es fundamental para que tu sistema se mantenga en condiciones óptimas. Entre la variedad de sondas de temperatura sumergibles encontramos una solución basada en el sensor digital DS18B20. A continuación te explicaremos como puedes usarlo con Arduino.

Especificaciones

Este tipo de sondas resistentes al agua se venden con diferentes longitudes y en su interior se encuentra el sensor digital de temperatura DS18B20. Este sensor utiliza la interfaz de comunicación 1-Wire, por lo que permite conectar varios de estos sensores al mismo pin de Arduino. En su ROM interna tiene guardada una dirección identificativa única de 64 bits en cada sensor, permitiéndonos saber el sensor que nos esta dando la medida de temperatura o leer la temperatura de un sensor determinado. Mide en un rango de temperaturas de entre -55°C a 125°C (-67°F a 257°F) con una precisión de ±0.5°C ( dentro del rango de -10°C a 85°C).
También podemos establecer alarmas para que mediante un comando de búsqueda desde el dispositivo Master (en nuestro caso será Arduino) nos indique los sensores, con su correspondiente dirección, que están midiendo temperaturas  por encima o por debajo de un rango seleccionado. Este rango se establece mediante dos registros TL y TH un 1 byte cada uno donde el bit de mayor peso (MSB) es el signo y los siete restantes son el valor. Cuando la temperatura medida por el sensor sea mayor que TH o menor que TL el Master recibirá(cuando realice la búsqueda de alarmas) que se ha activado la alarma en el sensor. Los valores de los registros TH y TL quedarán guardados en la memoria interna no volátil, de manera que aunque se desconecte de la alimentación el sensor preservará los valores.
La resolución digital de la medida es ajustable de 9 bits a 12 bits, lo que nos permite obtener valores más precisos disminuyendo el número de medidas que podemos hacer por segundo, o por el contrario sacrificar parte de la precisión ganando más medidas por segundo, todo dependerá del uso que le queramos dar.

Alimentación: 3,3V ~ 5V
Rango de temperatura: -55 °C a +125 °C
Precisión: ±0.5°C ( dentro del rango de -10°C a 85°C)
Resolución: 9 a 12 bits (resolución ajustable)
Cableado: Rojo: VCC
Amarillo: DATA
Negro: GND

Código

En primer lugar antes de empezar a escribir nuestro código es recomendable buscar si ya existen librerías que nos faciliten y simplifiquen nuestra labor. Para el caso del DS18B20 existen varias librerías, aunque no todas utilizan todas las funcionalidades que nos permite este sensor. La mejor que hemos encontrado está en Github y se trata de la librería Arduino Library for Maxim Temperature Integrated Circuits de la que podemos descargarnos el zip en instalarlo en nuestro Arduino IDE tal y como explicamos en Instalar Librerías de GitHub en Arduino IDE.

Una vez instalada la librería podemos probar el sensor conectado los pines VCC, GND y DATA a nuestro Arduino, estableciendo en el código el pin digital de Arduino que usaremos para el protocolo 1-wire al cual conectaremos el pin DATA de nuestro sensor. A continuación tienes un código de ejemplo:

#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 2

OneWire oneWire(ONE_WIRE_BUS);

DallasTemperature sensors(&oneWire);

DeviceAddress AddThermometer;

void setup(void)
{
  Serial.begin(9600);
  Serial.print("Localizando dispositivos...");
  sensors.begin();
  Serial.print("Encontrado ");
  Serial.print(sensors.getDeviceCount(), DEC);
  Serial.println(" dispositivo(s).");

  Serial.print("Alimentacion parasita esta: "); 
  if (sensors.isParasitePowerMode()) Serial.println("ON");
  else Serial.println("OFF");
  
  if (!sensors.getAddress(AddThermometer, 0))   Serial.println("No se ha podido encontrar el dispositivo 0"); 

  Serial.print("DIreccion del Dispositivo 0: ");
  printAddress(AddThermometer);
  Serial.println();

  sensors.setResolution(AddThermometer, 9);
 
  Serial.print("Device 0 Resolution: ");
  Serial.print(sensors.getResolution(AddThermometer), DEC); 
  Serial.println();
}

void printTemperature(DeviceAddress deviceAddress)
{

  float tempC = sensors.getTempC(deviceAddress);
  Serial.print("Temp C: ");
  Serial.print(tempC);
  Serial.print(" Temp F: ");
  Serial.println(DallasTemperature::toFahrenheit(tempC)); 
}

void loop(void)
{ 
  Serial.print("Pidiendo temperaturas...");
  sensors.requestTemperatures(); 
  Serial.println("Hecho");
  
  printTemperature(insideThermometer);
}

void printAddress(DeviceAddress deviceAddress)
{
  for (uint8_t i = 0; i < 8; i++)
  {
    if (deviceAddress[i] < 16) Serial.print("0");
    Serial.print(deviceAddress[i], HEX);
  }
}
Comments are disabled