Aprende a mostrar tu lectura de temperatura en un LCD 16x2 con Arduino de forma clara y estable. Conecta correctamente el módulo, ajusta el contraste con un potenciómetro y usa la librería LiquidCrystal para imprimir valores y mensajes dinámicos sin tener la placa conectada a la computadora.
¿Cómo cablear el lcd 16x2 con Arduino y potenciómetro?
Para que el LCD funcione, primero alimenta y define contraste; luego comunica datos por pines digitales. Además, considera el backlight para mejor visibilidad.
¿Qué pines del lcd son clave?
BSS a tierra: referencia de 0 V del LCD.
BDD a 5 V: alimentación del circuito interno.
Tercer pin al potenciómetro: controla el contraste del texto.
RS a pin digital 12: selección de registro de datos/comando.
E (enable) a pin digital 11: habilita la lectura del dato.
D4, D5, D6, D7 a pines 5, 4, 3, 2: modo de 4 bits para datos.
A y K: alimentación del LED del backlight.
¿Cómo conectar el potenciómetro para contraste?
Extremos a 5 V y GND: crea el divisor de voltaje.
Pin central a la entrada de contraste del LCD: ajusta legibilidad.
Precaución: si inviertes o cortocircuitas, el potenciómetro puede humear. Desconecta y reemplaza.
¿Qué buenas prácticas evitarán errores?
Cables: claros a voltaje, oscuros a tierra para identificar rápido.
Protoboard: verifica si las líneas de alimentación están partidas a media altura. Si el LED del backlight no enciende, mueve la conexión a la parte alimentada.
Pin 13: evítalo si usas su LED integrado para otras pruebas.
¿Qué librería y comandos usar para mostrar la temperatura?
Usa la librería LiquidCrystal incluida con Arduino. Inicializa el LCD 16x2, posiciona el cursor con precisión y formatea el texto para evitar sobreescrituras.
¿Qué código mínimo necesitas?
#include<LiquidCrystal.h>// rs, en, d4, d5, d6, d7LiquidCrystal lcd(12,11,5,4,3,2);voidsetup(){ lcd.begin(16,2);// LCD 16x2.}voidloop(){// Supón que tempC ya existe y se actualiza con tu sensor. lcd.setCursor(0,0);// Fila 0, columna 0. lcd.print("Temperatura:"); lcd.setCursor(0,1);// Fila 1 (segunda fila), columna 0. lcd.print(tempC);// Imprime el valor de temperatura.delay(1000);}
Claves prácticas:
lcd.begin(16, 2): configura dos filas por dieciséis caracteres.
lcd.setCursor(col, fila): evita que el dato se sobreescriba con el título. Si ves que "Temperatura" pisa el número, corrige las coordenadas a 0,1 en la segunda fila.
lcd.print: imprime cadenas y números sin conversión adicional.
¿Cómo alternar mensajes y limpiar la pantalla?
Para mostrar mensajes alternos y evitar artefactos visuales, usa lcd.clear() y un retardo visible.
lcd.setCursor(0,0);lcd.print("Temperatura");lcd.setCursor(0,1);lcd.print(tempC);delay(1000);lcd.clear();lcd.setCursor(0,0);lcd.print("Temperature");// Cabe en 16 caracteres.lcd.setCursor(0,1);lcd.print(tempC);delay(1000);lcd.clear();
Si no ves el cambio entre "Temperatura" y "Temperature", agrega el delay y asegúrate de llamar a lcd.clear() antes de reimprimir.
¿Cómo depurar y extender el monitor de temperatura?
Verifica visibilidad, conexiones y comportamiento del dato. Luego agrega lógica para mensajes dinámicos.
¿Qué revisar si el lcd se ve negro o sin texto?
Conexiones de pines: confundir RS/E o D4–D7 provoca bloques negros.
Contraste: ajusta el potenciómetro hasta ver caracteres nítidos.
Backlight: valida A y K en la sección de la protoboard que sí tiene 5 V.
Hardware: si todo está bien y no aparece texto, el LCD podría estar dañado.
¿Cómo validar el sistema de lectura?
Calienta el sensor con los dedos: el valor debe subir en pantalla.
Déjalo reposar: la temperatura debe bajar con el tiempo.
Observa que el número no se solape con títulos: corrige setCursor si ocurre.
¿Qué reto programar para hacerlo útil?
Mensajes de tendencia con control de flujo: imprime "La temperatura está subiendo" mientras suba, y "La temperatura está bajando" mientras baje.
Puedes implementarlo con ifs o con un ciclo while: mantén el mensaje según la dirección del cambio hasta que cambie la tendencia.
Alterna títulos "Temperatura/Temperature" para un monitor bilingüe con lcd.clear() y delay.
¿Ya conectaste y programaste tu LCD 16x2 con Arduino? Comparte en comentarios tu código, fotos o un video mostrando tu monitor de temperatura y cuéntanos cómo resolviste el reto de tendencias.
I2C es un puerto y protocolo de comunicación serial. El módulo I2C es usado para reducir el número de cables para conectar el display. De los 4 pines que tiene los que nos interesan son el SDA y SCL que irán conectados en los SDA y SCL del arduino en la parte de comunicación. En mi caso están en los pines 20(SDA) y 21(SCL) ya que es un mega 2560.
Yo instale esta librería para mi sketch:
el display con modulo I2C:
conexión SDA y SCL:
Sketch
// librería para LCD1602 (LCD 16 caracteres 2 líneas) con módulo I2C#include <Wire.h>#include <LiquidCrystal_I2C.h>// definimos el objeto lcd// en la dirección 0x27, le especificamos que son 16 caracteres y 2 líneasLiquidCrystal_I2Clcd(0x27,16,2);//libreria DHT sensor library Adafruit#include "DHT.h"#define DHTPIN2// pin usado para recibir la medición#define DHTTYPEDHT11// impirtante verificar que sea el sensor que estamos usando// Inicializamos el sensor DHT11DHTdht(DHTPIN,DHTTYPE);voidsetup(){// Inicializamos comunicación serieSerial.begin(9600);// Inicializamos el sensor DHT dht.begin();// Inicializamos el LCD, lcd.begin();}voidloop(){// Esperamos 2 segundos entre cada medida del sensordelay(2000);// Leemos la humedad relativa float h = dht.readHumidity();// Leemos la temperatura en grados centígrados (por defecto) float t = dht.readTemperature();// Leemos la temperatura en grados Fahrenheit float f = dht.readTemperature(true);// Comprobamos si ha habido algún error en la lecturaif(isnan(h)||isnan(t)||isnan(f)){Serial.println("Error obteniendo los datos del sensor DHT11");return;}// Calcular el índice de calor o sensación térmica en Fahrenheit float hif = dht.computeHeatIndex(f, h);// Calcular el índice de calor o sensación térmica en grados centígrados float hic = dht.computeHeatIndex(t, h,false);//mensajes LCD lcd.clear();// limpiamos LCD lcd.setCursor(0,0);// vamos al inicio de la linea 1 lcd.print("Humedad: "); lcd.print(h); lcd.setCursor(0,1);// vamos al inicio de la linea 2 lcd.print("Temp: "); lcd.print(t);//mensajes Serial Serial.print("Humedad: ");Serial.print(h);Serial.print(" %\t");Serial.print("Temperatura: ");Serial.print(t);Serial.print(" *C ");Serial.print(f);Serial.print(" *F\t");Serial.print("Sensación Térmica: ");Serial.print(hic);Serial.print(" *C ");Serial.print(hif);Serial.println(" *F");}
Buen día compañero, excelente diagrama, me sirvió mucho 😄, sin embargo te recomiendo que para futuras ocasiones organices mejor el diagrama, acá te dejo el mio 😉 saludos.
1 GND (Tierra)
2 5 Voltios
3 Control de contraste pantalla
4 RS – Selector entre comandos y datos
5 RW – Escritura y lectura de comandos y datos
6 Sincronización de lectura de datos
7-14 Pines de datos de 8-bit
15 Alimentación luz de fondo (5V)
16 GND (Tierra) luz de fondo (0V)
Que tal, tengo problemas para hacer que el DHT11 funcione, es decir, ya instalé la librería de Adafruit, luego de EduIntro y no permite compilar el prog. ¿Cómo activo el DHT 11 en Arduino?
que tal amigos tengo armado mi circuito y cargado el código al arduino pero no me muestra los datos del sensor en la LCD, verifique mi monitor serial y ahí si esta corriendo la lectura del sensor de temperatura, alguna sugerencia con mi problema en la pantalla?
ayuda por favor
he revisado las conexiones , el programa y no me funciona
tambien cambie el display y no quiere funcionar
dentro del programa envie un blink al pin 13 para revisar que no sea falla del arduino y el led 13 prende y apaga correctamente pero el mensaje en el display no sale y el display brilla y da contraste correctamente
alguna sugerencia??
Excelente curso hasta ahora, me vuela la cabeza de imaginar las cosas que se pueden hacer combinando software y hardware sobre todo para educación.
Mi setup y código utilizando DHT11.
#include <DHT.h>#include <LiquidCrystal.h>int tempC;const int DHTPin=2;DHTdht(DHTPin,DHT11);LiquidCrystallcd(12,11,3,4,5,6);voidsetup(){// put your setup code here, to run once:Serial.begin(9600); dht.begin(); lcd.begin(16,2);}voidloop(){// put your main code here, to run repeatedly:delay(5000); tempC = dht.readTemperature();Serial.print("Temperatura: ");Serial.print(tempC);Serial.println(" ºC."); lcd.setCursor(0,0); lcd.print("Temperatura:"); lcd.setCursor(0,1); lcd.print(tempC); lcd.print(" "); lcd.print((char)223); lcd.print("C.");}```
Para el reto implementé una función varTemp(), ya que la función void loop() ya genera un ciclo.
Lo que hace esta función es mostrar 3 tipos de mensajes:
Temp. Estable. : La temperatura no varía
Aumenta Temp. : La temperatura aumenta
Disminuye Temp. : La temperatura disminuye
#include <LiquidCrystal.h>int tempC =0;//valor de la temperatura en Celsiusint tempAnt =0;//valor anterior de la temperaturaconst int sensorTemp =A0;LiquidCrystallcd(12,11,5,4,3,2);voidsetup(){// put your setup code here, to run once:Serial.begin(9600);lcd.begin(16,2);}voidloop(){ tempAnt = tempC; tempC =map(analogRead(sensorTemp),0,1023,0,500);Serial.println(tempC);varTemp(); lcd.setCursor(0,1); lcd.print(tempC); lcd.print((char)223); lcd.print("C");delay(1000); lcd.clear(); lcd.setCursor(0,1); lcd.print(tempC); lcd.print((char)223); lcd.print("C");delay(1000);}voidvarTemp(){if(tempC == tempAnt){ lcd.setCursor(0,0); lcd.print("Temp. Estable");}elseif(tempC>tempAnt){ lcd.setCursor(0,0); lcd.print("Aumenta Temp.");}else{ lcd.setCursor(0,0); lcd.print("Disminye Temp.");}}
Muestro imágenes del proyecto y un vídeo en el siguiente link
Hola.
¿Por que en el siguiente código, la variable TempC se repite en ambos lados de la expresión?
voidloop(){TempC=analogRead(Temp_Sensor);TempC=TempC*0.48828125;//¿Por qué TempC = TempC*0.48828125?: //Este es el factor que convierte de milivolts a grados Celsius.Serial.println(TempC);//Esta función imprime el valor de la temperatura en el monitor serial en tiempo real.: lcd.setCursor(0,0); lcd.print("Temperatura:"); lcd.setCursor(0,1); lcd.print(TempC);delay(1000); lcd.clear(); lcd.setCursor(0,0); lcd.print("Temperature:"); lcd.setCursor(0,1); lcd.print(TempC);}
<#include <FastIO.h>#include <I2CIO.h>#include <LCD.h>#include <LiquidCrystal.h>#include <LiquidCrystal_I2C.h>#include <LiquidCrystal_SR.h>#include <LiquidCrystal_SR2W.h>#include <LiquidCrystal_SR3W.h>int tempC;const int sensorTemp =A0;LiquidCrystallcd(12,11,5,4,3,2);voidsetup(){// put your setup code here, to run once:Serial.begin(9600); lcd.begin(20,4);}voidloop(){// put your main code here, to run repeatedly: tempC =analogRead(sensorTemp); tempC = tempC*0.34;Serial.println(tempC); lcd.setCursor(0,0); lcd.print("Temperatura"); lcd.setCursor(0,1); lcd.print(tempC);if(tempC <30){ lcd.setCursor(0,3); lcd.print(":'v");}else{ lcd.setCursor(0,3); lcd.print("Huele a carnitas");}delay(1000); lcd.clear();}>
int pinLM35 =A0;// Variable del pin de entrada del sensor (A0)LiquidCrystal_I2Clcd(0x27,16,2);//Establece la direccion del LCD 0x27 de 16 caracteres y 2 lineasvoidsetup(){// Configuramos el puerto serial a 9600 bpsSerial.begin(9600); lcd.init();//Inicializa la pantalla lcd.backlight();}voidloop(){// Con analogRead leemos el sensor, recuerda que es un valor de 0 a 1023 tempC =analogRead(pinLM35);// Calculamos la temperatura con la fórmula tempC =(5.0* tempC *100.0)/1024.0;// Envia el dato al puerto serialSerial.print(tempC);// Salto de líneaSerial.print("\n");//Enviamos el dato al LCD lcd.clear(); lcd.setCursor(0,0);//Posición Caracter 1,Fila 1 para el texto lcd.print("* Temperatura *"); lcd.setCursor(4,1);//Posición Caracter 5,Fila 2 para el valor lcd.print(tempC); lcd.setCursor(11,1);//Posición Caracter 12,Fila 2 para la C lcd.print("C");// Esperamos un tiempo para repetir el loopdelay(2000);}
;voidsetup(){// put your setup code here, to run once:Serial.begin(9600);lcd.begin(16,2);}voidloop(){// put your main code here, to run repeatedly:tempC =analogRead(sensorTemp);tempC = tempC*0.48828125;if(tempU == tempC){ tempV ="CONSTANT"; tempU = tempC;}elseif(tempU>tempC){ tempV ="DOWN"; tempU = tempC;}else{ tempV ="UP"; tempU = tempC;}Serial.println(tempC);Serial.println(tempV);Serial.println(tempU);lcd.setCursor(0,0);lcd.print("Temperatura:");lcd.setCursor(0,1);lcd.print(tempC);lcd.setCursor(4,1);lcd.print(tempV);delay(1000);lcd.clear();lcd.setCursor(0,0);lcd.print("Temperature:");lcd.setCursor(0,1);lcd.print(tempC);lcd.setCursor(4,1);lcd.print(tempV);delay(1000);lcd.clear();}>