Código de Pesquisa

Tutorial ESP32 53/55 - Construa um Relógio de Internet com LCD | Kit de Aprendizagem IoT ESP32 da SunFounder

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.

esp32-53-relógio-internet-principal

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

ESP32-11_LCD-wiring

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

Imagens

ESP32-11_LCD-wiring
ESP32-11_LCD-wiring
ESP32-11_LCD-wiring-schematic
ESP32-11_LCD-wiring-schematic
esp32-53-internet-clock-main
esp32-53-internet-clock-main
854-ESP32 Tutorial 53/55- Internet Clock
Idioma: C++
/*
 * 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 :)
}

Coisas que você pode precisar

Recursos e referências

Arquivos📁

Arquivo Obrigatório (.h)