Saltar al contenido
GEEKnodes

Electrónica · Actualizado el

Pantalla LCD I2C con sensor de temperatura DHT11 en Arduino

Conecta un LCD 16x2 con módulo I2C y un DHT11 a un Arduino UNO: esquema, librería LiquidCrystal_I2C, escáner de direcciones I2C, código completo y fallos.

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

Esquema en Fritzing: Arduino UNO conectado a una pantalla LCD 16x2 con módulo I2C y a un sensor DHT11

Pantalla LCD I2C

Módulo I2CArduino UNO
GNDGND
VCC5V
SDAA4
SCLA5

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

DHT11Arduino UNO
VCC5V
DATAPin digital 2
GNDGND

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:

Escáner que consulta la pantalla por el bus SDA y SCL y muestra las direcciones I2C posibles 0x27 o 0x3F.
El escáner localiza la dirección que debes usar en el código.
#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)223 es 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, usa 20, 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.

LCD de dos filas con temperatura y humedad, junto a un sensor DHT11 y un intervalo de actualización de dos segundos.
La pantalla muestra temperatura y humedad, y se actualiza cada dos segundos.

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

Material utilizado

En calidad de afiliado de Amazon, GEEKnodes obtiene ingresos por las compras adscritas que cumplen los requisitos aplicables.

Preferencias de accesibilidad

Perfiles rápidos

Texto y lectura

Tamaño del texto
Por defecto
Altura de línea
Por defecto
Espaciado entre letras
Por defecto
Espaciado entre palabras
Por defecto

Color

Movimiento y orientación

Cursor