En este artículo te presentamos la construcción de un Termómetro con Arduino y DS18B20. El termómetro tiene la capacidad de medir 4 zonas o canales independientes. El proyecto está principalmente orientado para usarse en un acuario (por eso proponemos el uso de sensores de temperatura a prueba de agua), pero puede utilizarse en muchas otras situaciones donde es necesario monitorear 4 sondas de temperatura. Por ejemplo, podemos utilizarlo para medir la temperatura en distintas zonas dentro de nuestra PC (procesador, fuente de alimentación, disco duro, etc.) lo que convierte a este proyecto en un desarrollo muy versátil aplicable en muchas situaciones. El cerebro del proyecto es un Arduino Nano que se encarga de gobernar toda la funcionalidad del equipo.

En la foto de portada observamos nuestro termómetro con arduino nano elaborado dentro de un gabinete realizado en corte láser.

Materiales necesarios

Puedes adquirir la mayoría de los materiales requeridos en nuestra tienda virtual:

Construcción del Termómetro con Arduino y DS18B20

Vamos a comenzar la construcción de nuestro termómetro con Arduino y DS18B20. Recomendamos tener el cautín encendido y nuestro maletín de herramientas a la mano. Comencemos…

1 – Soldamos los cables al convertidor DC-DC Buck para la entrada y salida de voltaje. Es necesario soldar dos cables en cada polo de la salida, es decir, dos al positivo y dos al negativo. Un par va al microcontrolador y otro a los sensores de temperatura.

2 – Una vez soldados los cables, es necesario conectar los cables de entrada de el módulo regulador de voltaje a una fuente de 12 volts y ajustar la salida de voltaje a 5 volts (utilizamos el trimpot para lograr el ajuste). Muy importante este paso, pues si se omite, se pueden quemar muy fácilmente los circuitos que estaremos alimentando (arduino y sensores).

3 – Soldar el Jack de alimentación en los cables de entrada del módulo convertidor DC-DC. En este jack conectaremos un eliminador de 9-12 volts para alimentar nuestro termómetro digital con Arduino y DS18B20.

4 – Colocar los headers al Arduino Nano, los soldaremos del lado de componentes como se muestra en la foto para poder pegar el arduino al interior del gabinete con cinta doble cara o cinchos sujeta cables.

5 – Soldar un par de cables de alimentación hacia el arduino nano desde la fuente de alimentación: Soldamos el negativo que viene desde el convertidor DC-DC a un pin de GND y el positivo al pin 5Vin del arduino nano. Soldaremos por la parte de atrás, ya que utilizaremos los headers macho para la alimentación de la pantalla LCD.

6 – Instalar los 4 jacks de audio en su posición y soldar la alimentación a los sensores (hacemos puentes entre todos los jacks) tanto para el polo positivo como el negativo. La posición de cada señal la determinamos a nuestro gusto en este paso. Colocamos la resistencia pull-up de 4.7K entre el pin de datos y el voltaje positivo. Soldamos un tramo de dupont hembra en los pines de datos.

Preparar y conectar la pantalla LCD del termómetro con arduino y DS18B20

7 – Soldar el adaptador I2C a la pantalla. Lo vamos a conectar con el arduino nano a través de un par de cables Dupont hembra hembra. Esto nos ahorra muchos pines y además el potenciómetro del contraste viene incluido en el módulo adaptador I2C. Debe quedarnos similar a la siguiente foto:

8 – Conectar los pines SDA y SCL del adaptador de pantalla a los pines A4 y A5 del Arduino (en ese orden) mediante cables Dupont Hembra-Hembra, conectar el cable VCC al pin de 5V de arduino nano y el pin GND a GND del nano.

9 – Conectar los pines de datos de los Jacks para conectar los sensores a los pines D2, D3, D4 y D5 de arduino mediante cables dupont Hembra-Hembra:

10 – Colocar la electrónica dentro del gabinete que hayamos elegido apoyándonos de cinta adhesiva de doble cara.

Programa para un Termómetro con Arduino y DS18B20

El código a cargar en nuestro termómetro se muestra a continuación. Para que compile correctamente es necesario tener instalada la librería de control del LCD a través de I2C y la librería para comunicarse con sensores one-wire. Hemos procurado comentar muy bien el código, de forma que sea entendible para todos.

/**
   GeekFactory - "Construye tu propia tecnologia"
   Distribucion de materiales para el desarrollo e innovacion tecnologica
   www.geekfactory.mx

   Firmware para el termometro multicanal de proposito general. Este sketch permite la lectura
   de 4 sondas de temperatura a prueba de agua o normales con el DS18B20 y muestra la temperatura
   en una pantalla LCD de 16x2 caracteres.
*/

#include <OneWire.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

/**
   Objeto para manejar la pantalla LCD a traves de I2C
*/
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

/**
   Objetos para el bus One Wire, se indica en cada uno el pin a utilizar
*/
OneWire bus1(2);
OneWire bus2(3);
OneWire bus3(4);
OneWire bus4(5);

/**
    Arreglo que contiene los valores de temperatura en grados centigrados
*/
float temperature[4];

/**
   Configuracion inicial y operaciones de arranque
*/
void setup()
{
  // Prepare LCD Display
  lcd.begin(16, 2);
  lcd.backlight();
  lcd.clear();
  lcd.print("    Digital     ");
  lcd.setCursor(0, 1);
  lcd.print("  Thermometer   ");
  delay(500);
}

/**
   Ciclo principal del programa
*/
void loop()
{
  for (int i = 0; i < 4; i++)
  {
    // Leer datos desde el sensor
    thermometer_read(i, &temperature[i]);

    // Imprimir a la pantalla
    thermometer_print_temperature(i, temperature[i]);
  }
}

/**
   Retorna una referencia a un objeto OneWire de acuerdo al indice pasado como parametro
*/
OneWire& thermometer_get_bus(uint8_t busid)
{
  // Retornar la referencia al bus I2C apropiado para el canal seleccionado
  switch (busid) {
    case 0:
      return bus1;
    case 1:
      return bus2;
    case 2:
      return bus3;
    case 3:
      return bus4;
    default:
      return bus1;
  }
}

/**
   Lee un sensor de temperatura DS18B20 en la instancia del bus seleccionada mendiante
   el parametro busid. El codigo NO esta pensado para que cooexistan varios dispositivos
   one Wire en el mismo bus, pues envia los comandos como "broadcast" en vez de usar
   una direccion de dispositivo especifica.
*/
bool thermometer_read(uint8_t busid, float * result)
{
  uint8_t present;
  uint8_t data[12];
  int i;

  // Retornar una lectura invalida si falla la comunicacion con el sensor
  *result = - 100.0;

  // Obtiene la instancia del bus a usar para la comunicacion con el sensor
  OneWire onewire = thermometer_get_bus(busid);

  // Enviar comando de iniciar la conversion de temperatura
  onewire.reset();
  onewire.skip();
  onewire.write(0x44);

  // Esperar el termino de conversion AD en el sensor
  delay(1000);

  // Enviar comando de lectura de scratchpad
  if (!onewire.reset())
    return false;
  onewire.skip();
  onewire.write(0xBE);

  // Comenzar lectura de datos
  for (i = 0; i < 9; i++)
    data[i] = onewire.read();

  // Alinear los datos recibidos
  int16_t temp = (((int16_t) data[1]) << 11) | (((int16_t) data[0]) << 3);

  // Convertir a grados centigrados
  * result = (float)temp * 0.0078125;
  return true;
}

/**
   Imprime la temperatura con el simbolo de grados centigrados en la posicion
   adecuada del display LCD
*/
void thermometer_print_temperature(int probe, float temp)
{

  // Posicionar el cursor de la LCD en la posicion adecuada
  switch (probe)
  {
    case 0:
      lcd.setCursor(0, 0);
      break;

    case 1:
      lcd.setCursor(9, 0);
      break;

    case 2:
      lcd.setCursor(0, 1);
      break;

    case 3:
      lcd.setCursor(9, 1);
      break;
  }

  // Imprimir el numero de sonda
  lcd.print(probe + 1);
  lcd.write((uint8_t) ':');

  // Imprimer temperatura o errores
  if (temp <= -100.0) {
    lcd.print("Err!");
  } else if (temp < 0) {
    lcd.print("Low!");
  } else if (temp >= 100) {
    lcd.print("Hig!");
  }
  else if (temp < 10) {
    lcd.print(0);
    lcd.print(temp, 1);
  }
  else {
    lcd.print(temp, 1);
  }
  // Imprimir simbolo de grados
  lcd.print((char)223);
}

Los enlaces para la descarga de las librerías se proporcionan a continuación:

Hay que aclarar que nuestro programa NO contempla conectar varias sondas de temperatura por cada pin, aunque es posible hacerlo según la especificación del bus one-wire.

Puesta en Marcha del proyecto

Para poner en marcha el termómetro con Arduino y DS18B20, solamente debemos conectar los sensores y aplicar la alimentación. En la pantalla se deben visualizar las 4 temperaturas medidas por cada uno de los sensores.

Antes de aplicar la alimentación hay que verificar que hayamos realizado el ajuste del voltaje de salida del convertidor DC-DC, ya que si saltamos este paso, podemos dañar permanentemente el arduino, los sensores y todos los equipos conectados a éste por un alto voltaje presente en la salida del módulo DC-DC.

Conclusión

El termómetro con Arduino y DS18B20 que presentamos es un desarrollo bastante útil que nos puede servir como base para otros proyectos más complejos, ya que podemos, por ejemplo, desarrollar un termómetro con alarmas o que realice alguna acción correctiva en caso de detectar temperaturas anormales en alguno de los sensores. Por ejemplo, aplicándolo en un acuario, podemos hacer que se desactive el calentador si se detecta una temperatura muy alta. Al tratarse de la plataforma arduino, siempre podemos acceder a una cantidad suficientemente grande de aditamentos y agregar prácticamente cualquier funcionalidad con mínimo esfuerzo, convirtiendo este proyecto en algo muy versátil.