Lección 20/31: Mostrando temperatura y humedad del DHT11 en la pantalla LCD
Este tutorial demuestra cómo combinar un sensor de temperatura y humedad DHT11 con una pantalla LCD1602 habilitada para I2C para crear una estación de monitoreo ambiental compacta. En lugar de leer datos brutos del sensor desde el monitor serie, aprenderás a mostrar lecturas de temperatura y humedad en tiempo real en una pantalla de caracteres de 16x2. Este proyecto es ideal para construir una estación meteorológica de escritorio, un monitor para un pequeño invernadero o para añadir una lectura local a cualquier proyecto de automatización del hogar. La interfaz I2C simplifica el cableado, lo que hace que este proyecto sea accesible para principiantes y una adición rápida para creadores experimentados.
Aquí tienes algunas ideas prácticas de lo que puedes construir con este conocimiento:
- Una estación meteorológica de escritorio que muestre las condiciones actuales de la habitación.
- Una pantalla compacta para un terrario de reptiles o plantas.
- Una lectura local para un servidor o entorno de taller.
- Un módulo base para un sistema de automatización del hogar más complejo.
Hardware y Componentes
Para construir este proyecto, necesitarás los siguientes componentes:
- Arduino Uno (o placa compatible)
- Pantalla LCD1602 con módulo de interfaz I2C
- Sensor de temperatura y humedad DHT11
- Una resistencia pull-up de 4.7kΩ o 10kΩ (si usas un sensor DHT11 sin módulo)
- Cables de conexión (jumper wires)
- Protoboard (opcional, para conexiones más fáciles)
Entendiendo el LCD1602 con I2C
El LCD1602 es una pantalla de caracteres común con 16 columnas y 2 filas. El módulo "I2C" soldado en la parte posterior de la pantalla es la clave de su simplicidad. Este módulo convierte la interfaz paralela del LCD en una interfaz serial I2C, que requiere solo dos cables para datos (SDA y SCL) y dos para alimentación (VCC y GND). Esto reduce drásticamente el número de pines necesarios en tu Arduino, dejando más disponibles para otros sensores y actuadores. El módulo también incluye un pequeño potenciómetro para ajustar el contraste de la pantalla, lo cual es crucial para asegurar que el texto sea visible. La dirección I2C del módulo se puede cambiar usando los pequeños puentes de soldadura (A0, A1, A2) en la placa, lo que permite que múltiples dispositivos I2C coexistan en el mismo bus.
Guía de Cableado
Conecta los componentes como se muestra en el diagrama a continuación. El LCD I2C usa los pines I2C del Arduino, mientras que el sensor DHT11 usa un pin digital.
Para el LCD1602-I2C:
- VCC al 5V del Arduino
- GND al GND del Arduino
- SDA al A4 del Arduino
- SCL al A5 del Arduino
Para el sensor DHT11:
- VCC (Pin 1) al 5V del Arduino
- Data (Pin 2) al Pin Digital 2 del Arduino (con una resistencia pull-up de 10kΩ a 5V)
- NC (Pin 3) - No Conectado
- GND (Pin 4) al GND del Arduino
(en el video en 25:16)
Configuración de las Librerías
Este proyecto requiere dos librerías. La librería Wire.h es parte de la instalación estándar de Arduino. Necesitarás instalar la librería LiquidCrystal_I2C y la librería dht11. El video demuestra cómo instalarlas. Puedes descargar las librerías desde los enlaces proporcionados en la descripción del video o desde el sitio web de Robojax. Una vez descargadas, puedes instalarlas a través del IDE de Arduino navegando a Sketch > Include Library > Add .ZIP Library... y seleccionando los archivos descargados. (en el video en 06:16)
Encontrando la Dirección I2C de tu LCD
Antes de poder usar la pantalla, debes determinar su dirección I2C. La dirección más común es 0x27 o 0x3F, pero puede variar. Para encontrarla, puedes usar un sketch de escaneo I2C. Este es un programa simple que escanea el bus I2C y reporta cualquier dirección que encuentre al Monitor Serie. Sube el código del escáner, abre el Monitor Serie a 9600 baudios, y mostrará la dirección de tu LCD. (en el video en 08:11)
Explicación del Código
Esta sección explica las partes clave y configurables del código. El programa completo está disponible para descargar debajo del artículo.
El código comienza incluyendo las librerías necesarias y definiendo los pines y objetos utilizados.
// archivo de cabecera de GetHub: https://github.com/adidax/dht11
#include <dht11.h>
dht11 DHT11; // crear objeto de DHT11
#define dhtpin 2 // establecer el pin para conectar a DHT11
// inicio de la configuración para LCD1602-I2C
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Establecer la dirección LCD a 0x3F para una pantalla de 16 caracteres y 2 líneas
LiquidCrystal_I2C lcd(0x3F, 16, 2);
// fin de la configuración para LCD1602-I2C
Estas son las líneas más importantes para configurar en tu sistema:
#define dhtpin 2: Esto define el pin del Arduino conectado al pin de datos del sensor DHT11. Cambia el número2si usas un pin diferente.LiquidCrystal_I2C lcd(0x3F, 16, 2);: Esta línea crea el objeto LCD. El primer parámetro,0x3F, es la dirección I2C que encontraste en el paso anterior. Los números16y2definen el número de columnas y filas de tu pantalla. Actualiza la dirección si tu escáner encontró una diferente (por ejemplo,0x27).
El código utiliza una función personalizada, getTemp(), para leer la temperatura y convertirla a diferentes unidades. Esta es una característica potente que hace que el código sea reutilizable para diferentes aplicaciones.
float getTemp(char type) {
float temp = (float)DHT11.temperature;//obtener temp
if(type =='F')
{
return temp * 1.8 + 32;// convertir a Fahrenheit
}else if(type =='K')
{
return temp + 274.15;// convertir a Kelvin
}else{
return temp;
}
}
Para usar esta función, la llamas con un argumento de un solo carácter que representa la unidad deseada. Por ejemplo, getTemp('C') devuelve la temperatura en Celsius, getTemp('F') la devuelve en Fahrenheit y getTemp('K') la devuelve en Kelvin. La función lee la temperatura cruda del sensor DHT11 y aplica la fórmula de conversión necesaria. Esto te permite cambiar fácilmente la unidad mostrada en el loop() principal sin reescribir la lógica de lectura del sensor. El bucle principal imprime la temperatura y la humedad en la LCD usando las funciones lcd.setCursor() y lcd.print() para controlar dónde aparecen los valores en la pantalla.
Mostrando el símbolo de grado
El conjunto de caracteres estándar de la LCD HD44780 no incluye un símbolo de grado dedicado (°). Para mostrarlo, debes usar la función lcd.write() con el valor decimal del carácter de la ROM de la LCD. Para el símbolo de grado, este valor es 223. El código demuestra esto usando lcd.print((char)223); para imprimir el símbolo después del valor de temperatura. (en el video en 30:16)
Demostración del proyecto en vivo
Una vez que el código se carga, la pantalla mostrará un mensaje de inicio antes de limpiarse y mostrar la temperatura y humedad actuales. La primera línea de la pantalla muestra el texto "LCD1602 DHT11", mientras que la segunda línea muestra la temperatura en Celsius, seguida del símbolo de grado y "C", y luego la temperatura en Fahrenheit, seguida del símbolo de grado y "F". El valor de humedad se imprime en el monitor serie. La demostración en el video muestra la pantalla actualizándose cada medio segundo mientras se sostiene el sensor, reflejando con precisión las condiciones ambientales. (en el video en 29:42)
Mostrar el voltaje de un potenciómetro en la LCD se cubre en Lección 20/31: Mostrando voltaje en LCD1602.
Usar la misma LCD para mostrar la distancia de un sensor ultrasónico se cubre en Lección 20/31: Usando LCD1602 con Arduino para mostrar temperatura, voltaje y distancia | Robojax.
Proyectos relacionados de este video
- Lección 20/31: Usando LCD1602 con Arduino para mostrar temperatura, voltaje y distancia | Robojax
- Lección 20/31: Mostrando voltaje en LCD1602
Capítulos
- [00:00] Introducción al LCD1602 y descripción general del proyecto
- [01:30] Explicación del hardware LCD1602 y el módulo I2C
- [02:47] Ajustando el contraste de la LCD
- [03:14] Configuración de pines de la LCD y dirección I2C
- [05:28] Diagrama de conexiones para el LCD1602
- [06:16] Instalando la biblioteca LiquidCrystal_I2C
- [08:11] Encontrando la dirección I2C con un escáner
- [09:28] Código básico para imprimir texto en la LCD
- [11:10] Ejemplos: cursor parpadeante y caracteres personalizados
- [13:46] Creando y usando caracteres personalizados
- [18:51] Ejemplo de visualización en serie
- [23:16] Texto desplazándose en la LCD
- [24:36] Combinando el código del sensor DHT11 con la LCD
- [30:16] Mostrando el símbolo de grado
- [32:03] Eliminando puntos decimales de la temperatura
- [33:00] Mostrando voltaje de un potenciómetro en la LCD
- [35:56] Mostrando distancia de un sensor ultrasónico
/*
Lesson 20/31: Displaying Temperature and humidity from DHT11 on LCD screen
Get this code and watch video Download and resource page https://robojax.com/RJT603
YouTube video https://www.youtube.com/watch?v=NXAswOc_2zg
* This is the Arduino code for DHT11 module to read temperature and humidity
* This code can display temperature in:
* C is used to get Celsius
* F is used to get Fahrenheit
* K is used for Kelvin
* *
* Written by Ahmad Shamshiri for Robojax
* on Jan 04, 2018
* Robojax.com
Please watch video instruction here https://youtu.be/0XMLnCYkvbE
This code is available at http://robojax.com/course1/?vid=lecture11
with over 100 lectures Free On YouTube Watch it here http://robojax.com/L/?id=338
Get the code for the course: http://robojax.com/L/?id=339
* This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.*
* This code has been download from Robojax.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
// header file from GetHub: https://github.com/adidax/dht11
#include <dht11.h>
dht11 DHT11; // create object of DHT11
#define dhtpin 2 // set the pin to connect to DHT11
// start of settings for LCD1602-I2C
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Set the LCD address to 0x3F for a 16 chars and 2 line display
LiquidCrystal_I2C lcd(0x3F, 16, 2);
// end of settings for LCD1602-I2C
void setup() {
Serial.begin(9600);// setting up serial monitor
// initialize the LCD,
lcd.begin();
// Turn on the blacklight and print a message.
lcd.backlight();
lcd.clear();
lcd.setCursor (0,0); //
lcd.print("DHT11 Sensor");
delay(2000);
}
void loop() {
//Robojax Step By Step Arduino Course YouTube Watch it here http://robojax.com/L/?id=338
DHT11.read(dhtpin);// initialize the reading
int humidity = DHT11.humidity;// get humidity
lcd.clear();// clear previous values from screen
lcd.setCursor (0,0); //character zero, line 1
lcd.print("LCD1602 DHT11"); // print text
// print distance in degrees C
lcd.setCursor (0,1); //character 0, line 2
lcd.print(getTemp('C'));// print Temperature Celsius
lcd.setCursor (4,1); //character 5, line 2
lcd.print((char)223);// print degree
lcd.setCursor (5,1); //character 6, line 2
lcd.print("C");// print C
// print distance degrees F
lcd.setCursor (7,1); //character 8, line 2
lcd.print(getTemp('F'));// print distance in cm
lcd.setCursor (13,1); //character 14, line 2
lcd.print((char)223);// print degree
lcd.setCursor (14,1); //character 16, line 2
lcd.print("F");// print F
//code for Robojax.com video
Serial.print(getTemp('C'));
Serial.print("C ");
Serial.print(getTemp('F'));
Serial.print("F ");
Serial.print(getTemp('K'));
Serial.print("K ");
Serial.print(" humidity:");
Serial.print (humidity);
Serial.print("% ");
Serial.println();
delay(500);
}
/*
* getTemp(char type)
* type character of upper case
* C is used to get Celsius
* F is used to get Fahrenheit
* K is used for Kelvin
*/
float getTemp(char type) {
//Robojax Step By Step Arduino Course YouTube Watch it here http://robojax.com/L/?id=338
float temp = (float)DHT11.temperature;//get temp
if(type =='F')
{
return temp * 1.8 + 32;// convert to Fahrenheit
}else if(type =='K')
{
return temp + 274.15;// convert to Kelvin
}else{
return temp;
}
}
Cosas que podrías necesitar
-
AmazonasSunFounder Arduino Learning Kit on AliExpresss.click.aliexpress.com
-
Amazonas
-
Amazonas
-
Amazonas
-
Amazonas
Recursos y referencias
-
Documentación
-
Externo
Archivos📁
Bibliotecas de Arduino (zip)
-
Código fuente del kit de aprendizaje para autos inteligentes 3 en 1 de SunFounder
3in1-kit-main-v2.zip12.80 MB
Manual del Usuario
-
SunFounder 3-in-1 Arduino Smart Car assembly manualThis document shows step by step assembly of SunFounder 3-in-1 Arduino Smart Car
SunFounder_car_assembly_manual.pdf1.20 MB