Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <NTPClient.h> // Biblioteca do NTP
- #include <ESP8266WiFi.h> // Biblioteca do WiFi
- #include <WiFiUdp.h> // Biblioteca do UDP
- WiFiUDP UDP; // Instancia UDP
- NTPClient timeClient(UDP, "a.st1.ntp.br", -3 * 3600, 60000); // Cria um objeto "NTP" e corrige fuso
- #include <Wire.h> // I2C library
- #include <LiquidCrystal_I2C.h> // Biblioteca LCD I2C
- //LiquidCrystal_I2C lcd(0x39, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Endereco LCD I2C (Invertido)
- LiquidCrystal_I2C lcd(0x39, 2, 1, 0, 7, 6, 5, 4, 3, POSITIVE); // Endereco LCD I2C e pinos
- #include <RTClib.h> // RTC library
- RTC_DS3231 rtc; // Instancia RTC
- DateTime now; // variavel formato DateTime para RTC
- #include <Ticker.h> // Biblioteca Tiker
- Ticker flipper; // Instancia Tiker
- #define SDA 0 // SDA do bus I2C
- #define SCL 4 // SCL do bus I2C
- int segESP = 0; // Segundos gerados pelo ESP
- int segNTP = 0; // Segundos gerados pelo NTP
- int segRTC = 0; // Segundos gerados pelo RTC
- bool newSeg = false; // Controle de comparacao
- unsigned long horasTeste = 0; // Contador de horas de teste
- //--------------------------------------------------------------
- void relogio()
- {
- Serial.print("segNTP "); Serial.println(segNTP); // Print
- Serial.print("segRTC "); Serial.println(segRTC); // Print
- Serial.print("segESP "); Serial.println(segESP); // Print
- Serial.println(" "); // Print
- lcd.setCursor(0, 1); // Posicao linha
- lcd.print(segNTP - segESP ); // Print diferenca entre segNTP e segESP
- lcd.print(" "); // Print
- lcd.setCursor(4, 1); // Posicao linha
- lcd.print(segRTC - segNTP ); // Print diferenca entre segRTC e segNTP
- lcd.setCursor(8, 1); // Posicao linha
- lcd.print(horasTeste / 60 ); // Print time atualizado
- lcd.print(" "); // Print
- lcd.setCursor(14, 1); // Posicao linha
- lcd.print(segNTP ); // Print Segundos do NTP
- lcd.print(" "); // Print
- }
- //-----------------------------------------------------------------------
- void flip() {
- String tempSeg; // Varavel de trabalho
- ++segESP; // Incrementa segESP a cada segundo
- if (segESP == 60) // Completou 1 minuto
- {
- segESP = 0; // Reincia segESP
- horasTeste++; // Incrementa contador (horas em minutos)
- }
- tempSeg = timeClient.getFormattedTime().substring(6); // Busca segundo do NTP
- segNTP = tempSeg.toInt(); // Converte para inteiro
- newSeg = true; // Informa que contou segundo;
- }
- //-----------------------------------------------------------------------
- void setup() {
- Serial.begin(115200); // Inicializa Serial
- Wire.begin(SDA, SCL); // Inicializa I2C
- lcd.begin(16, 2); // Inicializa LCD
- lcd.clear(); // Limpa LCD
- lcd.setCursor(0, 0); // Posicao linha
- lcd.print("Synk relogios."); // Print time atualizado
- lcd.setCursor(0, 1); // Posicao linha
- WiFi.begin(ssid, password); // Conecta na rede (Digitie aqui suas credenciais)
- while ( WiFi.status() != WL_CONNECTED ) { // Enquanto nao conecta
- delay ( 500 ); // Aguarda nova tentativa
- Serial.print ( "." ); // Print
- lcd.print("."); // Print
- }
- Serial.println(" "); // Print
- Serial.print("Servidor iniciado com o IP \""); // Print
- Serial.print(WiFi.localIP()); // Informe IP obtido pelo DHCP
- Serial.println(" "); // Print
- timeClient.begin(); // Inicializa NTP
- timeClient.update(); // Aguarda atualizacao
- timeClient.forceUpdate(); // Forca atualizacao
- rtc.begin(); // Inicializa RTC
- lcd.clear(); // Limpa LCD
- lcd.setCursor(0, 0); // Posicao linha
- lcd.print("ESP"); // Print titulo
- lcd.print(" "); // Print
- lcd.print("RTC"); // Print titulo
- lcd.print(" "); // Print
- lcd.print("HTst"); // Print titulo
- lcd.print(" "); // Print
- lcd.print("Seg"); // Print titulo
- lcd.print(" "); // Print
- int oldTemp = 0; // Variavel para ajudar na sincronizacao dos relogios
- String tempSeg; // Varavel de trabalho
- flipper.attach(1, flip); // Define tempo e nome da rotina de interrupt
- tempSeg = timeClient.getFormattedTime().substring(6); // Busca segundo do NTP
- segNTP = tempSeg.toInt(); // Converte para inteiro
- oldTemp = segNTP; // Salva o valor para comparacao
- while (segNTP == oldTemp) // Quamdo forem diferentes mudou o segundo em NTP
- {
- delay(10); // Tempo para não travar o ESP
- tempSeg = timeClient.getFormattedTime().substring(6); // Busca segundo do NTP
- segNTP = tempSeg.toInt(); // Converte para inteiro
- }
- if (segNTP == 0) // Verifica se é final de contagm de segundo
- segESP = 59; // Recua 1 segundo para sincronizar
- else // Ou em outros segundos
- segESP = segNTP - 1; // Recua 1 segundo para sincronizar
- rtc.adjust(DateTime(2021, 11, 01, 0, 0, segNTP)); // Atualiza os segundo do RTC3231
- now = rtc.now(); // Le o RTC
- tempSeg = now.second(); // Separa o segundo
- segRTC = tempSeg.toInt(); // Converte para numero inteiro
- }
- //-----------------------------------------------------------------------
- void loop() {
- if (newSeg == true) // Se passou 1 segundo
- {
- String tempSeg; // Varavel de trabalho
- now = rtc.now(); // Le o RTC
- tempSeg = now.second(); // Separa o segundo
- segRTC = tempSeg.toInt(); // Converte para numero inteiro
- relogio(); // Compara e mostra
- newSeg = false; // Aguarda novo segundo
- }
- }
Add Comment
Please, Sign In to add comment