Tutorial ESP32 53/55 - Construa um Relógio de Internet com LCD | Kit de Aprendizagem IoT ESP32 da SunFounder
Neste tutorial, construiremos um relógio LCD conectado à Internet usando o microcontrolador ESP32 da SunFounder. Este relógio se sincronizará automaticamente com a hora atual via Internet, exibindo a hora no formato de 12 ou 24 horas, juntamente com o dia da semana, data e mês. O uso do Protocolo de Tempo de Rede (NTP) garante que o relógio permaneça preciso sem ajustes manuais.
Este projeto aproveita as capacidades de Wi-Fi integradas do ESP32 para buscar a hora atual de um servidor NTP. Estaremos utilizando um Display de Cristal Líquido (LCD) para exibir a hora, que pode ser formatada de acordo com as preferências do usuário. Para mais esclarecimentos sobre quaisquer etapas, consulte o vídeo em (no vídeo em 00:30).
Hardware Explicado
Os componentes principais para este projeto incluem o microcontrolador ESP32, um display LCD 20x4 e uma fonte de energia. O ESP32 é um microcontrolador poderoso com Wi-Fi e Bluetooth integrados, tornando-o adequado para projetos de IoT. O LCD é utilizado para exibir a hora e a data, e pode ser configurado para diferentes tamanhos de display.
O LCD opera via o protocolo I2C, que permite comunicação por meio de dois fios (SDA e SCL). Isso simplifica a fiação e reduz o número de pinos necessários no ESP32. A conexão ao servidor NTP é feita utilizando as capacidades Wi-Fi do ESP32, permitindo atualizações em tempo real.
- Assegure-se da tensão de alimentação correta (5 V).
- Use capacitores de desacoplamento perto dos pinos de alimentação para estabilidade.
- Tenha cuidado com as conexões I2C para evitar conflitos no barramento.
- Verifique o endereço I2C do LCD (0x27 ou 0x3F).
- Verifique as credenciais do Wi-Fi para uma conexão precisa.
- Trate os ajustes do horário de verão no seu código.
- Utilize o servidor NTP correto para a sua localização geográfica.
- Sempre limpe o LCD antes de atualizar o display.
Instruções de fiação

Para conectar o ESP32 ao LCD, comece ligando os pinos de energia. Conecte o VCC do LCD ao pino de 5V do ESP32 e o pino GND do LCD ao pino GND do ESP32. Para a comunicação I2C, conecte o pino SDA do LCD ao GPIO 21 do ESP32 e o pino SCL ao GPIO 22. Certifique-se de que as conexões estão seguras para evitar problemas de comunicação.
Ao configurar a fiação, use fios jumper de macho para fêmea para conexões fáceis. Se o seu LCD tiver um endereço I2C ou configuração de pinos diferente, ajuste o código conforme necessário. Consulte o vídeo em (no vídeo em 05:30) para opções de fiação alternativas, se necessário.
Exemplos de Código e Tutorial
O código inicializa o LCD e configura a conexão Wi-Fi para buscar dados de hora do servidor NTP. Identificadores chave, comossidepasswordsão usados para se conectar à rede Wi-Fi, enquantontpServer1entpServer2especifique os servidores NTP a serem usados.
const char* ssid = "dars";
const char* password = "llllllllllllll";
const char* ntpServer1 = "pool.ntp.org";
const char* ntpServer2 = "time.nist.gov";Este trecho mostra as credenciais de rede e os endereços do servidor. Certifique-se de inserir seu SSID e senha do Wi-Fi com precisão, pois qualquer erro impedirá o ESP32 de se conectar à Internet.
No textoprintLocalTime()função, a hora atual é formatada para exibição. A estruturatmé usado para armazenar informações de tempo, enquantostrftimeajuda a formatar o tempo em uma string legível.
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 se a hora local está disponível e recupera a hora. A hora formatada é então usada para exibir a hora atual no LCD. Se a hora ainda não estiver disponível, ele imprime uma mensagem no Monitor Serial.
Finalmente, osetup()a função inicializa o LCD e conecta-se ao Wi-Fi. Ela também configura as definições do servidor NTP e define uma callback para sincronização de tempo.
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 trecho inicializa o Monitor Serial para depuração, configura o LCD e tenta se conectar à rede Wi-Fi especificada. O status da conexão será impresso no Monitor Serial, permitindo que você verifique a conexão.
Demonstração / O que Esperar
Após a configuração bem-sucedida, o LCD exibirá a hora atual, o dia da semana e a data. Você pode esperar que a hora seja atualizada a cada 5 segundos, graças aoloop()função. Se a conexão com o servidor NTP falhar, uma mensagem aparecerá no Monitor Serial indicando que o tempo ainda não está disponível (no vídeo às 12:00).
Os erros comuns incluem fiação incorreta, endereços I2C errados e credenciais de Wi-Fi incorretas. Certifique-se de que todas as conexões estão seguras e de que o servidor NTP é acessível a partir da sua rede.
Marcação de Tempo do Vídeo
- 00:00 Início
- 2:10 Introdução
- 5:15 Explicação da fiação
- 7:32 Código Arduino explicado
- 18:43 Selecionando a placa ESP32 e a porta COM no Arduino IDE
- Demonstração do Relógio da Internet 20:27
/*
* Relógio de Internet usando o kit de aprendizado IoT ESP32 da SunFounder
* Instrução em vídeo completa https://youtu.be/0KnuNqfiVug
* 📚⬇️ Página de download e recursos https://robojax.com/RJT686
* Relógio de Internet para ESP32
* Escrito por Ahamd Shasmhiri em 31 de dezembro de 2023 às 19:29
* www.Robojax.com
*/
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// SDA->21,SCL->22
LiquidCrystal_I2C lcd(0x27,16,2); // defina o endereço LCD para 0x27 para um display de 16 caracteres e 2 linhas
const bool showSeconds = true; // defina como "verdadeiro" para mostrar segundos e "falso" para esconder
const bool showShortMonth = false; // dezembro = falso, dez=true
const bool show24Hours = true; // verdadeiro para ter 18:30 ou falso para ter 6:30
#include <WiFi.h>
#include "time.h"
#include "sntp.h"
#include "TZ.h"
// TZ.h é retirado 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");
// obter formato de hora HH:MM
char timeHour[5];
strftime(timeHour,5, "%H", &timeinfo);
String hourString = String(timeHour); // converter timeHour para string
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); // adicione segundos se 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);
}
// Função de callback (é chamada quando o tempo é ajustado via NTP)
void timeavailable(struct timeval *t)
{
Serial.println("Got time adjustment from NTP!");
printLocalTime();
}
void setup()
{
Serial.begin(115200);
lcd.init(); // inicializar o lcd
lcd.backlight(); // Liga a luz de fundo do LCD.
lcd.print("Internet Clock");
delay(3000); // waif 3 segundos
// definir função de retorno de chamada de notificação
sntp_set_time_sync_notification_cb( timeavailable );
/*
* O endereço do servidor NTP pode ser adquirido via DHCP,
*
* NOTA: Esta chamada deve ser feita ANTES que o esp32 adquira o endereço IP via DHCP, caso contrário, a opção 42 do SNTP será rejeitada por padrão.
* NOTA: A chamada da função configTime() se feita DEPOIS da execução do cliente DHCP
* SUBSTITUÍRA o endereço do servidor NTP adquirido.
*/
sntp_servermode_dhcp(1); // (optional)
/*
* Isso configurará os servidores NTP e o deslocamento de horário/dia deve estar certo se o seu fuso horário não precisar ajustar o deslocamento de dia duas vezes por ano; nesse caso, o ajuste de horário não será tratado automaticamente.
*/
// configTime(gmtOffset_sec, daylightOffset_sec, ntpServer1, ntpServer2);
/*
* Uma abordagem mais conveniente para lidar com TimeZones com daylightOffset seria especificar uma variável de ambiente com a definição de TimeZone, incluindo regras de ajuste de horário de verão. Uma lista de regras para a sua zona pode ser obtida em https://github.com/esp8266/Arduino/blob/master/cores/esp8266/TZ.h
*/
// configTzTime(TZ_America_Toronto, ntpServer1, ntpServer2);
configTzTime(TZ_America_Toronto, ntpServer1, ntpServer2);
// conectar ao 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(); // vai levar algum tempo para sincronizar o horário :)
}
Common Course Links
Common Course Files
Coisas que você pode precisar
-
AmazonasCompre o LCD1602-I2C na Amazonamzn.to
-
eBayCompre LCD1602-I2C no eBayebay.us
-
BanggoodCompre o display LCD1602 na Banggood.banggood.com
Recursos e referências
-
ExternoCompre o display LCD1602 na Banggood.banggood.com
Arquivos📁
Arquivo Obrigatório (.h)
-
TZ.h
TZ.h0.02 MB