Introducción
En este proyecto, aprenderás a crear un medidor de temperatura utilizando un sensor DS18B20 y un display de 7 segmentos TM1637, controlados por una placa Arduino. El display mostrará la temperatura en grados Celsius, incluyendo la precisión decimal y el signo negativo si la temperatura baja de cero.
Materiales Necesarios
- 1x Arduino mini pro (o cualquier placa compatible)
- 1x Sensor de temperatura DS18B20
- 1x Display TM1637
- 1x Resistencia de 4.7kΩ (para el sensor DS18B20)
- Cables jumper
- Protoboard
Componentes electrónicos
Arduino mini pro
El Arduino Pro Mini es una placa de microcontrolador basada en el ATmega328 .
Tiene 14 pines de entrada / salida digital (de los cuales 6 se pueden usar como salidas PWM), 6 entradas analógicas, un resonador integrado, un botón de reinicio y orificios para montar encabezados de pines. Se puede conectar un encabezado de seis pines a un cable FTDI o una placa de conexión Sparkfun para proporcionar alimentación USB y comunicación a la placa.
El Arduino Pro Mini está diseñado para su instalación semipermanente en objetos o exposiciones. La placa viene sin encabezados pre montados, lo que permite el uso de varios tipos de conectores o la soldadura directa de cables. El diseño del pin es compatible con el Arduino Mini.
Hay dos versiones del Pro Mini. Uno corre a 3.3V y 8 MHz, el otro a 5V y 16 MHz.
Microcontrolador | ATmega328 * |
Fuente de alimentación de la placa | 3,35-12 V (modelo de 3,3 V) o 5-12 V (modelo de 5 V) |
Voltaje de funcionamiento del circuito | 3.3V o 5V (dependiendo del modelo) |
Pines de E / S digitales | 14 |
Pines PWM | 6 6 |
UART | 1 |
SPI | 1 |
I2C | 1 |
Pines de entrada analógica | 6 6 |
Interrupciones externas | 2 |
Corriente CC por pin de E / S | 40 mA |
Memoria flash | 32 KB de los cuales 2 KB utilizados por el gestor de arranque * |
SRAM | 2 KB * |
EEPROM | 1 KB * |
Velocidad de reloj | 8 MHz (versiones de 3.3V) o 16 MHz (versiones de 5V) |
Pines hembra
Zócalo para arduino nano
Sensor ds18b20
El sensor DS18B20 es un sensor de temperatura digital muy popular, que ofrece una alta precisión y una sencilla interfaz de comunicación. A continuación te detallo sus características más importantes:
Características del Sensor DS18B20
- Rango de Temperatura:
- Puede medir temperaturas en un rango amplio:
- -55°C a +125°C.
- Precisión:
- ±0.5°C en el rango de -10°C a +85°C.
- Puede medir temperaturas en un rango amplio:
- Resolución Programable:
- La resolución de la temperatura es ajustable y puede configurarse en:
- 9, 10, 11 o 12 bits, siendo la más común 12 bits, que ofrece una precisión de 0.0625°C por paso.
- La resolución de la temperatura es ajustable y puede configurarse en:
- Interfaz OneWire:
- Se comunica con el microcontrolador mediante el bus OneWire, lo que significa que solo requiere un pin de datos para la comunicación (además de VCC y GND).
- Permite conectar múltiples sensores en el mismo bus, cada uno con una dirección única de 64 bits.
- Alimentación:
- Puede alimentarse de dos maneras:
- Modo parasitario: Solo requiere dos cables (GND y Data) para operar, tomando energía directamente del pin de datos.
- Modo estándar: Requiere tres cables (VCC, GND y Data).
- Voltaje de operación:
- 3.0V a 5.5V.
- Puede alimentarse de dos maneras:
- Tiempos de Conversión:
- El tiempo de conversión de la temperatura depende de la resolución seleccionada:
- 9 bits: 93.75 ms.
- 10 bits: 187.5 ms.
- 11 bits: 375 ms.
- 12 bits: 750 ms.
- El tiempo de conversión de la temperatura depende de la resolución seleccionada:
- Calibración Interna:
- El sensor no necesita ser calibrado, ya que viene pre-calibrado de fábrica.
- Encapsulado:
- Está disponible en diferentes formatos, incluyendo:
- TO-92 (similar a un transistor).
- Versión impermeable para aplicaciones en líquidos.
- Está disponible en diferentes formatos, incluyendo:
- ID Único:
- Cada sensor tiene una dirección de 64 bits única que lo identifica en el bus OneWire, lo que permite la conexión de varios sensores en paralelo.
- Consumo de Energía:
- Bajo consumo de energía en modo inactivo, ideal para proyectos con baterías.
- Uso Común:
- Aplicaciones comunes incluyen sistemas de monitoreo ambiental, control de temperatura en HVAC, y medición de temperatura en sistemas embebidos.
Ventajas del DS18B20
- Fácil de usar: Solo requiere un pin para comunicación.
- Alta precisión: Resolución de hasta 12 bits con pasos de 0.0625°C.
- Amplitud de medición: Ideal para una variedad de entornos con rangos de temperatura amplios.
- ID único: Puedes conectar múltiples sensores en un mismo bus de datos.
- No requiere calibración.
Limitaciones
- Velocidad de conversión: Para la máxima resolución de 12 bits, el tiempo de conversión es de 750 ms, lo que puede ser lento para algunas aplicaciones.
- Rango de precisión: Fuera del rango de -10°C a 85°C, la precisión puede verse reducida.
Estas características hacen del DS18B20 una excelente opción para proyectos de medición de temperatura, ya sea en aplicaciones domésticas, industriales o experimentales.
Display TM1637
El TM1637 es un controlador de display de 7 segmentos de uso común, que permite controlar hasta 4 dígitos con facilidad utilizando solo 2 pines de un microcontrolador (comunicación tipo I2C-like). Está integrado en muchos módulos de displays de 7 segmentos y es ideal para proyectos de Arduino y otras plataformas. A continuación te doy una lista de sus características principales:
Características del Display TM1637
- Controlador de 4 dígitos:
- El chip TM1637 puede controlar hasta 4 dígitos en un display de 7 segmentos.
- Cada dígito puede mostrar números del 0 al 9 y algunas letras y símbolos (como A, b, C, d, E, F).
- Conexión simplificada:
- Utiliza solo 2 pines para la comunicación con el microcontrolador:
- CLK (Reloj).
- DIO (Datos).
- Aunque no usa el protocolo I2C estándar, sigue un patrón similar.
- Utiliza solo 2 pines para la comunicación con el microcontrolador:
- Brillo ajustable:
- El brillo del display es programable en 8 niveles diferentes, lo que permite ajustarlo según las condiciones de iluminación.
- Voltaje de operación:
- Funciona con un voltaje de 3.3V a 5V, lo que lo hace compatible con la mayoría de microcontroladores como Arduino, ESP32, y Raspberry Pi.
- Bajo consumo de energía:
- El controlador TM1637 tiene un bajo consumo de energía, lo que lo hace adecuado para proyectos alimentados por baterías.
- Pantalla de punto decimal:
- Cada dígito tiene un punto decimal (DP) que puede ser encendido o apagado de manera independiente, lo que permite la visualización de números decimales o para indicar algún estado.
- Facilidad de uso:
- Existe una amplia gama de librerías disponibles para controlar el TM1637 en diferentes plataformas de hardware, lo que simplifica su programación.
- En Arduino, la librería TM1637Display proporciona métodos sencillos para mostrar números, encender/apagar puntos decimales, ajustar el brillo, etc.
- Multiplexado interno:
- El chip TM1637 se encarga del multiplexado de los dígitos, por lo que no es necesario que el microcontrolador gestione el refresco de la pantalla.
- Almacenamiento en buffer:
- El controlador tiene un buffer de datos interno para almacenar los dígitos y símbolos que se mostrarán, permitiendo que el microcontrolador envíe los datos y luego se dedique a otras tareas.
- Comunicación rápida:
- El protocolo de comunicación pseudo-I2C es rápido y eficiente, permitiendo la actualización de la pantalla en tiempo real.
Ventajas del TM1637
- Simplicidad en la conexión: Solo requiere 2 pines para controlar hasta 4 dígitos, liberando pines en el microcontrolador.
- Fácil control: Existen librerías que simplifican el uso del controlador, especialmente en Arduino.
- Brillo ajustable: Puedes modificar la intensidad de la pantalla para adaptarse a diferentes condiciones de iluminación.
- Punto decimal: Ideal para mostrar valores con decimales.
Aplicaciones comunes:
- Relojes digitales.
- Termómetros digitales.
- Contadores de tiempo o eventos.
- Visualización de estados o lecturas de sensores.
Limitaciones
- Capacidad limitada: Solo controla 4 dígitos, lo que puede no ser suficiente para proyectos que requieren la visualización de más datos.
- Simbolismo limitado: Los displays de 7 segmentos tienen una capacidad limitada para mostrar caracteres alfanuméricos más complejos.
El TM1637 es una solución de bajo costo, fácil de usar y eficiente para agregar pantallas de 7 segmentos a tus proyectos de electrónica.
Un resistor de 4.7 Kohm
PCB
Descargar archivo gerber –> pcb alarma ir
Circuito
Diagrama de Conexión
- Conexión del Display TM1637:
- CLK (Clock) → Pin 3 de Arduino.
- DIO (Data) → Pin 4 de Arduino.
- VCC → 5V.
- GND → GND.
- Conexión del Sensor DS18B20:
- VCC → 5V.
- GND → GND.
- DQ (Data) → Pin 2 de Arduino, con una resistencia de 4.7kΩ entre DQ y VCC.
Código Fuente
A continuación, te dejo el código completo para este proyecto. El código lee la temperatura del sensor DS18B20, la muestra en el display TM1637 y maneja el signo negativo.
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 |
#include <TM1637Display.h> #include <OneWire.h> #include <DallasTemperature.h> // Pines de conexión del TM1637 #define RELOJ 3 // Pin de reloj del display TM1637(CLK) #define DATOS 4 // Pin de datos del display TM1637(DIO) TM1637Display pantalla(RELOJ, DATOS); // Configuración del DS18B20 #define BUS_UNICO 2 // Pin de datos del DS18B20 OneWire unAlambre(BUS_UNICO); DallasTemperature sensores(&unAlambre); void setup() { pantalla.setBrightness(0x0a); // Ajusta el brillo de la pantalla (0x0a = brillo medio) pantalla.showNumberDec(0); // Muestra 0 al iniciar sensores.begin(); // Inicializa el sensor de temperatura Serial.begin(9600); // Para monitorear por terminal } void loop() { sensores.requestTemperatures(); // Solicita la temperatura float temperaturaC = sensores.getTempCByIndex(0); // Obtiene la temperatura en grados Celsius // Verifica si hay error en la lectura if (temperaturaC == -127) { Serial.println("Error: Sensor no encontrado o mal conectado."); pantalla.showNumberDec(-99); // Muestra -99 en la pantalla como error } else { int temperaturaMostrar = (int)temperaturaC; pantalla.showNumberDec(temperaturaMostrar); // Muestra la temperatura en la pantalla Serial.print("Temperatura: "); Serial.print(temperaturaC); Serial.println(" °C"); } delay(1000); // Actualiza cada segundo } |
Este código fuente es un programa en Arduino que utiliza un sensor de temperatura DS18B20 para leer la temperatura ambiente y luego la muestra en un display de 7 segmentos TM1637. A continuación te explico el código en detalle:
Librerías
1 2 3 |
#include <TM1637Display.h> // Librería para controlar el display TM1637 #include <OneWire.h> // Librería para comunicarse con el sensor DS18B20 a través de un solo pin (OneWire) #include <DallasTemperature.h> // Librería para manejar sensores de temperatura como el DS18B20 |
- TM1637Display.h: Proporciona las funciones necesarias para controlar el display de 7 segmentos TM1637.
- OneWire.h: Permite la comunicación con dispositivos que usan el protocolo OneWire, como el DS18B20.
- DallasTemperature.h: Facilita la interacción con sensores de temperatura como el DS18B20.
Definición de pines
1 2 3 4 5 6 7 |
#define RELOJ 3 // Pin de reloj del display TM1637 (CLK) #define DATOS 4 // Pin de datos del display TM1637 (DIO) TM1637Display pantalla(RELOJ, DATOS); // Instancia de la pantalla TM1637 #define BUS_UNICO 2 // Pin de datos del DS18B20 OneWire unAlambre(BUS_UNICO); // Instancia para comunicación OneWire DallasTemperature sensores(&unAlambre); // Instancia de la librería para manejar el sensor DS18B20 |
- RELOJ (pin 3) y DATOS (pin 4): Estos son los pines a los que conectas el display TM1637.
- BUS_UNICO (pin 2): Este es el pin donde se conecta el sensor de temperatura DS18B20 para transmitir los datos.
- Las instancias
pantalla
,unAlambre
ysensores
permiten el control del display y la comunicación con el sensor DS18B20.
Función setup()
1 2 3 4 5 6 |
void setup() { pantalla.setBrightness(0x0a); // Ajusta el brillo del display (0x0a = brillo medio) pantalla.showNumberDec(0); // Muestra 0 al iniciar en el display sensores.begin(); // Inicializa el sensor DS18B20 Serial.begin(9600); // Inicia la comunicación serial para monitorear la temperatura por el puerto serial } |
pantalla.setBrightness(0x0a)
: Ajusta el brillo del display TM1637. El valor 0x0a establece un brillo medio.pantalla.showNumberDec(0)
: Muestra el número 0 en el display al iniciar.sensores.begin()
: Inicializa la comunicación con el sensor de temperatura DS18B20.Serial.begin(9600)
: Configura la velocidad de transmisión de datos por el puerto serial a 9600 baudios, lo que permite monitorear las lecturas de temperatura en el Monitor Serial de Arduino.
Función loop()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
void loop() { sensores.requestTemperatures(); // Solicita al sensor que mida la temperatura float temperaturaC = sensores.getTempCByIndex(0); // Obtiene la temperatura en grados Celsius // Verifica si hay un error en la lectura if (temperaturaC == -127) { Serial.println("Error: Sensor no encontrado o mal conectado."); pantalla.showNumberDec(-99); // Muestra -99 en el display como indicación de error } else { int temperaturaMostrar = (int)temperaturaC; // Convierte la temperatura a entero para mostrarla pantalla.showNumberDec(temperaturaMostrar); // Muestra la temperatura en la pantalla TM1637 Serial.print("Temperatura: "); Serial.print(temperaturaC); Serial.println(" °C"); } delay(1000); // Espera un segundo antes de volver a medir } |
sensores.requestTemperatures()
- Esta función le pide al sensor que realice una lectura de temperatura.
float temperaturaC = sensores.getTempCByIndex(0)
- Esta línea obtiene la temperatura en grados Celsius desde el sensor DS18B20. La función
getTempCByIndex(0)
obtiene la temperatura del sensor que está conectado en la posición 0 (si hay varios sensores en el bus OneWire).
Error de lectura (-127)
1 2 3 4 |
if (temperaturaC == -127) { Serial.println("Error: Sensor no encontrado o mal conectado."); pantalla.showNumberDec(-99); // Muestra -99 en el display si hay un error } |
- Si la lectura de la temperatura es -127, significa que hay un error (el sensor no está conectado correctamente o está dañado).
- Si esto ocurre, se muestra -99 en el display y se imprime un mensaje de error en el Monitor Serial.
Mostrar la temperatura
1 2 3 4 5 |
int temperaturaMostrar = (int)temperaturaC; // Convierte la temperatura a un número entero pantalla.showNumberDec(temperaturaMostrar); // Muestra la temperatura en la pantalla TM1637 Serial.print("Temperatura: "); Serial.print(temperaturaC); Serial.println(" °C"); |
- Si no hay error, el valor de la temperatura se convierte en un número entero y se muestra en el display.
- La temperatura también se imprime en el Monitor Serial, permitiendo visualizarla en grados Celsius con una precisión decimal.
delay(1000)
- Esta línea inserta una pausa de 1 segundo entre las lecturas de temperatura.
Este código permite leer la temperatura ambiente utilizando el sensor DS18B20 y mostrarla en un display TM1637. Además, se verifican errores en la conexión del sensor y se maneja ese error mostrando -99 en el display. La temperatura también se puede monitorear a través del Monitor Serial.
No te pierdas ningún video más suscríbete a nuestro canal de telegram https://t.me/carlosvolt_electronica_robotica
PROYECTO RECOMENDADO
Un comentario en “Termómetro digital con display hw-069 y sensor ds18b20”