En este proyecto vas a mostrar la temperatura y la humedad en una pantalla LCD de 16×2 conectada a un Arduino UNO mediante un módulo I2C, con un sensor DHT11. El módulo I2C (una pequeña placa soldada detrás de la pantalla, basada en el chip PCF8574) es lo que hace cómodo el montaje: sin él necesitarías unos 16 cables y 6 pines de Arduino; con él bastan 4 cables, dos de ellos de alimentación.
Es un buen proyecto para empezar con I2C y sensores, y la base de cualquier termómetro o estación meteorológica casera.
Material
- Arduino UNO (o compatible).
- Pantalla LCD 16×2 con módulo I2C (suele venir ya soldado; en el esquema aparece como LCM1602 IIC).
- Sensor DHT11 (suelto o en módulo de 3 pines).
- Resistencia de 10 kΩ si usas el DHT11 suelto (los módulos ya la llevan).
- Protoboard y cables.
Esquema de conexión

Pantalla LCD I2C
| Módulo I2C | Arduino UNO |
|---|---|
| GND | GND |
| VCC | 5V |
| SDA | A4 |
| SCL | A5 |
En el Arduino UNO, A4 y A5 son los pines I2C (también están duplicados como SDA y SCL junto a AREF). En otras placas cambian: en un Arduino Mega son los pines 20 y 21.
Sensor DHT11
| DHT11 | Arduino UNO |
|---|---|
| VCC | 5V |
| DATA | Pin digital 2 |
| GND | GND |
Si el DHT11 es el sensor suelto de 4 patas, la patilla 3 no se conecta y debes poner una resistencia de 10 kΩ entre DATA y VCC.
1. Instalar las librerías
En el IDE de Arduino, abre el Gestor de librerías (Herramientas › Administrar bibliotecas o el icono de librerías del panel lateral en el IDE 2) e instala:
- LiquidCrystal I2C, de Frank de Brabander. Controla la pantalla a través del módulo I2C.
- DHT sensor library, de Adafruit. Al instalarla, el IDE te ofrecerá instalar también su dependencia, Adafruit Unified Sensor: acepta.
La librería Wire, para el bus I2C, ya viene con el IDE.
2. Averiguar la dirección I2C de la pantalla
Cada dispositivo I2C tiene una dirección. La de estos módulos suele ser 0x27 o 0x3F, según el chip que lleven, pero lo más rápido es comprobarlo con este escáner. Súbelo al Arduino y abre el Monitor serie a 9600 baudios:

#include <Wire.h>
void setup() {
Wire.begin();
Serial.begin(9600);
Serial.println("Buscando dispositivos I2C...");
byte encontrados = 0;
for (byte direccion = 1; direccion < 127; direccion++) {
Wire.beginTransmission(direccion);
if (Wire.endTransmission() == 0) {
Serial.print("Dispositivo en 0x");
if (direccion < 16) Serial.print("0");
Serial.println(direccion, HEX);
encontrados++;
}
}
if (encontrados == 0) Serial.println("No se ha encontrado ninguno. Revisa SDA, SCL y la alimentacion.");
}
void loop() {}
Apunta la dirección que aparezca: la usarás en el código.
3. Código completo
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#define DHTPIN 2 // Pin de datos del DHT11
#define DHTTYPE DHT11 // Cambia a DHT22 si usas ese sensor
// Direccion I2C (la del escaner), columnas y filas de la pantalla
LiquidCrystal_I2C lcd(0x27, 16, 2);
DHT dht(DHTPIN, DHTTYPE);
void setup() {
lcd.init(); // Inicializa la pantalla
lcd.backlight(); // Enciende la retroiluminacion
dht.begin(); // Inicializa el sensor
lcd.setCursor(0, 0);
lcd.print("Iniciando...");
delay(2000); // El DHT11 necesita un momento tras encenderse
lcd.clear();
}
void loop() {
float humedad = dht.readHumidity();
float temperatura = dht.readTemperature(); // En grados Celsius
// Si la lectura falla, la libreria devuelve NaN
if (isnan(humedad) || isnan(temperatura)) {
lcd.setCursor(0, 0);
lcd.print("Error sensor ");
delay(2000);
return;
}
// Primera fila: temperatura
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(temperatura, 1);
lcd.print((char)223); // Simbolo de grado en la pantalla
lcd.print("C ");
// Segunda fila: humedad
lcd.setCursor(0, 1);
lcd.print("Hum: ");
lcd.print(humedad, 0);
lcd.print(" % ");
delay(2000); // El DHT11 no admite mas de una lectura por segundo
}
Algunos detalles del código:
- Los espacios al final de cada texto borran los restos de la lectura anterior sin tener que llamar a
lcd.clear(), que hace parpadear la pantalla. (char)223es el símbolo de grado en el juego de caracteres de estas pantallas.- Si tu escáner te dio otra dirección, cámbiala en
LiquidCrystal_I2C lcd(0x27, 16, 2);. Para una pantalla de 20×4, usa20, 4.
Comprobar que funciona
Al alimentar el Arduino, la pantalla debe mostrar «Iniciando…» y, a los dos segundos, la temperatura y la humedad, que se actualizan cada dos segundos. Acerca la mano al sensor: la humedad y la temperatura deberían subir poco a poco.

Problemas habituales
La pantalla se enciende pero no muestra texto, o solo rectángulos. Es el contraste. Gira con un destornillador el potenciómetro azul del módulo I2C hasta que aparezcan los caracteres. Es el fallo más común con diferencia.
La pantalla no se enciende ni muestra nada. Revisa VCC y GND. Si el escáner no encuentra ningún dispositivo, SDA y SCL están intercambiados o mal conectados.
El escáner encuentra la pantalla, pero no escribe. La dirección del código no coincide con la del escáner, o el jumper de retroiluminación del módulo no está puesto.
Aparece «Error sensor». Comprueba que el DATA del DHT11 va al pin 2, que DHTTYPE coincide con tu sensor y que lleva la resistencia de 10 kΩ si es el sensor suelto.
Los valores no cambian o son raros. El DHT11 es lento y poco preciso (unos ±2 °C). Si necesitas más precisión, el DHT22 se usa con el mismo código cambiando DHTTYPE.
Preguntas frecuentes
¿Puedo conectar otros dispositivos I2C a la vez? Sí: comparten SDA y SCL, siempre que cada uno tenga una dirección distinta. El escáner te lo dirá.
¿Funciona con una placa de 3,3 V, como un ESP32? La mayoría de estas pantallas necesitan 5 V para verse bien. Puedes alimentarla a 5 V, pero conviene usar un adaptador de nivel en SDA y SCL.
Relacionados
- Calculadora de resistencia para LED
- Código de colores de resistencias
- Crear un componente para Fritzing desde cero
- Descargar componentes personalizados para Fritzing



