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:
- Tarjeta compatible con Arduino nano CH340
- Display LCD de 16 x 2
- Adaptador para pantalla LCD a I2C PCF8574
- DS18B20 sensores de temperatura sumergible
- Resistencias de 4.7 KOhms
- Módulo Convertidor DC-DC ajustable
- Cables Dupont Hembra-Hembra
- 4 x Jacks de audio de 3.5 mm
- 4 x Pugs de audio de 3.5 mm
- Jack de alimentación (jack para plug invertido)
- Gabinete de acrílico o mander
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 | /** 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:
- Descarga la librería para el control del LCD por I2C (sitio del autor)
- Descarga la librería para dispositivos one wire (sitio del autor)
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.