Tutorial ESP32 53/55 - Construye un reloj de internet LCD | Kit de aprendizaje IoT ESP32 de SunFounder
En este tutorial, construiremos un reloj LCD con conexión a Internet utilizando el microcontrolador ESP32 de SunFounder. Este reloj se sincronizará automáticamente con la hora actual a través de Internet, mostrando la hora en un formato de 12 horas o 24 horas, junto con el día de la semana, la fecha y el mes. El uso del Protocolo de Tiempo de Red (NTP) garantiza que el reloj siga siendo preciso sin ajustes manuales.
Este proyecto aprovecha las capacidades de Wi-Fi integradas del ESP32 para obtener la hora actual de un servidor NTP. Utilizaremos una Pantalla de Cristal Líquido (LCD) para mostrar la hora, que se puede formatear según las preferencias del usuario. Para más aclaraciones sobre cualquier paso, consulte el video en (en el video a :30).
Hardware explicado
Los componentes principales para este proyecto incluyen el microcontrolador ESP32, una pantalla LCD de 20x4 y una fuente de energía. El ESP32 es un microcontrolador potente con Wi-Fi y Bluetooth integrados, lo que lo hace adecuado para proyectos de IoT. La LCD se utiliza para mostrar la hora y la fecha, y se puede configurar para diferentes tamaños de pantalla.
El LCD funciona a través del protocolo I2C, que permite la comunicación a través de dos hilos (SDA y SCL). Esto simplifica el cableado y reduce el número de pines necesarios en el ESP32. La conexión al servidor NTP se realiza utilizando las capacidades Wi-Fi del ESP32, lo que permite actualizaciones en tiempo real.
- Asegúrate de que la tensión de alimentación sea la correcta (5 V).
- Utiliza capacitores de desacople cerca de los pines de alimentación para estabilidad.
- Ten cuidado con las conexiones I2C para evitar conflictos en el bus.
- Verifica la dirección I2C del LCD (0x27 o 0x3F).
- Verifique las credenciales de Wi-Fi para una conexión precisa.
- Maneja los ajustes de horario de verano en tu código.
- Utiliza el servidor NTP correcto para tu ubicación geográfica.
- Siempre borra el LCD antes de actualizar la pantalla.
Instrucciones de cableado

Para conectar el ESP32 con el LCD, comienza conectando los pines de alimentación. Conecta el VCC del LCD al pin de 5V en el ESP32 y el pin GND del LCD al pin GND en el ESP32. Para la comunicación I2C, conecta el pin SDA del LCD al GPIO 21 en el ESP32 y el pin SCL al GPIO 22. Asegúrate de que las conexiones estén seguras para evitar problemas de comunicación.
Al configurar el cableado, utiliza cables jumper de macho a hembra para conexiones fáciles. Si tu LCD tiene una dirección I2C o configuración de pines diferente, ajusta el código en consecuencia. Consulta el video (en el video a :30) para opciones de cableado alternativas si es necesario.
Ejemplos de código y tutoriales
El código inicializa el LCD y configura la conexión Wi-Fi para obtener datos de tiempo del servidor NTP. Identificadores clave comossidypasswordse utilizan para conectarse a la red Wi-Fi, mientrasntpServer1yntpServer2especifica los servidores NTP a utilizar.
const char* ssid = "dars";
const char* password = "llllllllllllll";
const char* ntpServer1 = "pool.ntp.org";
const char* ntpServer2 = "time.nist.gov";Este fragmento muestra las credenciales de la red y las direcciones del servidor. Asegúrate de ingresar tu SSID de Wi-Fi y contraseña con precisión, ya que cualquier error impedirá que el ESP32 se conecte a Internet.
En elprintLocalTime()función, la hora actual está formateada para su visualización. La estructuratmse utiliza para almacenar información temporal, mientrasstrftimeayuda a formatear la hora en una cadena legible.
void printLocalTime() {
struct tm timeinfo;
if(!getLocalTime(&timeinfo)) {
Serial.println("No time available (yet)");
return;
}
char timeHour[5];
strftime(timeHour, 5, "%H", &timeinfo);Este código verifica si la hora local está disponible y recupera la hora. La hora formateada se utiliza para mostrar la hora actual en el LCD. Si la hora aún no está disponible, imprime un mensaje en el Monitor Serial.
Finalmente, elsetup()la función inicializa el LCD y se conecta a Wi-Fi. También configura la configuración del servidor NTP y establece una función de retorno para la sincronización de tiempo.
void setup() {
Serial.begin(115200);
lcd.init(); // initialize the lcd
lcd.backlight(); // Turns on the LCD backlight.
Serial.printf("Connecting to %s ", ssid);
WiFi.begin(ssid, password);Este extracto inicializa el Monitor Serial para depuración, configura el LCD e intenta conectarse a la red Wi-Fi especificada. El estado de conexión se imprimirá en el Monitor Serial, lo que te permitirá verificar la conexión.
Demostración / Qué Esperar
Tras la configuración exitosa, la pantalla LCD mostrará la hora actual, el día de la semana y la fecha. Puede esperar que la hora se actualice cada 5 segundos, gracias a laloop()función. Si la conexión con el servidor NTP falla, aparecerá un mensaje en el Monitor Serial indicando que el tiempo no está disponible aún (en el video a las 12:00).
Las trampas comunes incluyen cableado incorrecto, direcciones I2C equivocadas y credenciales de Wi-Fi incorrectas. Asegúrese de que todas las conexiones estén seguras y de que el servidor NTP sea accesible desde su red.
Marcas de tiempo del video
- 00:00 Comenzar
- 2:10 Introducción
- 5:15 Explicación del cableado
- 7:32 Código de Arduino explicado
- 18:43 Seleccionando la placa ESP32 y el puerto COM en el IDE de Arduino
- Demostración del Reloj de Internet 20:27
/*
* Reloj de Internet utilizando el kit de aprendizaje IoT ESP32 de SunFounder
* Instrucción en video completa https://youtu.be/0KnuNqfiVug
* 📚⬇️ Página de descarga y recursos https://robojax.com/RJT686
* Reloj de Internet para ESP32
* Escrito por Ahamd Shasmhiri el 31 de diciembre de 2023 a las 19:29
* www.Robojax.com
*/
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// SDA->21,SCL->22
LiquidCrystal_I2C lcd(0x27,16,2); // configura la dirección LCD a 0x27 para una pantalla de 16 caracteres y 2 líneas
const bool showSeconds = true; // está configurado en "verdadero" para mostrar los segundos y "falso" para ocultarlos
const bool showShortMonth = false; // Diciembre = falso, Dic=true
const bool show24Hours = true; // verdadero para tener 18:30 o falso para tener 6:30
#include <WiFi.h>
#include "time.h"
#include "sntp.h"
#include "TZ.h"
// TZ.h se toma de https://github.com/esp8266/Arduino/blob/master/cores/esp8266/TZ.h
const char* ssid = "dars";
const char* password = "llllllllllllll";
const char* ntpServer1 = "pool.ntp.org";
const char* ntpServer2 = "time.nist.gov";
const long gmtOffset_sec = -5 * 3600;
const int daylightOffset_sec = 3600;
const String months[][2] ={
"January","Jan",
"February","Feb",
"March","Mar",
"April","Apr",
"May","May",
"June","Jun",
"July","Jul",
"August","Aug",
"September","Sep",
"October","Oct",
"November","Nov",
"December","Dec"
};
void printLocalTime()
{
struct tm timeinfo;
if(!getLocalTime(&timeinfo)){
Serial.println("No time available (yet)");
return;
}
// Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S 12Horas: %I:%M:%S");
// obtener formato de hora HH:MM
char timeHour[5];
strftime(timeHour,5, "%H", &timeinfo);
String hourString = String(timeHour); // convertir timeHour a cadena
char timeMinute[3];
strftime(timeMinute,3, "%M", &timeinfo);
String minuteString = String(timeMinute);
// Serial.println(hourString);
if(!show24Hours)
{
if(hourString.toInt() >= 12)
{
minuteString = minuteString + "PM";
}else{
minuteString = minuteString + "AM";
}
}
char timeSeconds[3];
strftime(timeSeconds,3, "%S", &timeinfo);
char timeDayofWeek[10];
strftime(timeDayofWeek, 10 , "%A", &timeinfo);
char timeMonth[10];
strftime(timeMonth, 10 , "%B", &timeinfo);
String Month = String(timeMonth);
if(showShortMonth)
{
for(int m=0; m <12; m++)
{
if(Month == months[m][0] )
{
Month = months[m][1];
// Serial.println(meses[m][1]);
}
}
}
char timeDayofMonth[3];
strftime(timeDayofMonth,3 , "%d", &timeinfo);
char timeYear[5];
strftime(timeYear, 5 , "%Y", &timeinfo);
String time = String(timeHour) + ":" + minuteString ;
if(showSeconds) time = time +":" + String(timeSeconds); // agregar segundos si showSeconds=true
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(time);
lcd.print(" ");
lcd.print(String(timeDayofWeek));
lcd.setCursor(0, 1);
lcd.print(timeDayofMonth);
lcd.print(" ");
lcd.print(Month);
lcd.print(" ");
lcd.print(timeYear);
}
// Función de retorno de llamada (se llama cuando el tiempo se ajusta a través de NTP)
void timeavailable(struct timeval *t)
{
Serial.println("Got time adjustment from NTP!");
printLocalTime();
}
void setup()
{
Serial.begin(115200);
lcd.init(); // inicializar el lcd
lcd.backlight(); // Enciende la retroiluminación de la LCD.
lcd.print("Internet Clock");
delay(3000); // waif 3 segundos
// establecer función de retorno de llamada de notificación
sntp_set_time_sync_notification_cb( timeavailable );
/*
* La dirección del servidor NTP podría obtenerse a través de DHCP.
*
* NOTA: Esta llamada debe hacerse ANTES de que el esp32 adquiera la dirección IP a través de DHCP, de lo contrario, la opción SNTP 42 sería rechazada por defecto.
* NOTA: La llamada a la función configTime() si se hace DESPUÉS de que el cliente DHCP se ejecute, SOBRESCRIBIRÁ la dirección del servidor NTP adquirida.
*/
sntp_servermode_dhcp(1); // (optional)
/*
* Esto configurará los servidores NTP y el desplazamiento horario/dia siempre y cuando tu zona horaria no necesite ajustar el desplazamiento de horario dos veces al año; en tal caso, el ajuste de tiempo no se manejará automáticamente.
*/
// configTime(gmtOffset_sec, daylightOffset_sec, ntpServer1, ntpServer2);
/*
* Un enfoque más conveniente para manejar las zonas horarias con daylightOffset sería especificar una variable de entorno con la definición de TimeZone que incluya las reglas de ajuste de horario de verano. Una lista de reglas para tu zona podría obtenerse de https://github.com/esp8266/Arduino/blob/master/cores/esp8266/TZ.h
*/
// configTzTime(TZ_America_Toronto, ntpServer1, ntpServer2);
configTzTime(TZ_America_Toronto, ntpServer1, ntpServer2);
// conectar a WiFi
Serial.printf("Connecting to %s ", ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(" CONNECTED");
}
void loop()
{
delay(5000);
printLocalTime(); // tomará un tiempo sincronizar el tiempo :)
}
Common Course Links
Common Course Files
Cosas que podrías necesitar
-
AmazonasCompra LCD1602-I2C en Amazonamzn.to
-
eBayCompra LCD1602-I2C en eBay.ebay.us
-
BanggoodCompra la pantalla LCD1602 de Banggood.banggood.com
Recursos y referencias
-
ExternoCompra la pantalla LCD1602 de Banggood.banggood.com
Archivos📁
Archivo Requerido (.h)
-
TZ.h
TZ.h0.02 MB