#include <WiFi.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C LCD = LiquidCrystal_I2C(0x27, 16, 2);

#define NTP_SERVER "pool.ntp.org"
#define UTC -3  //Informar Fuso UTC

//Criação de caracteres personalizado
byte SIMB1[] = {B00000,B00000,B00000,B00100,B00000,B00000,B00000,B00000};
byte SIMB2[] = {B00000,B00000,B00100,B01010,B00100,B00000,B00000,B00000};
byte SIMB3[] = {B00000,B00100,B01010,B10001,B01010,B00100,B00000,B00000};
byte SIMB4[] = {B00000,B01010,B10001,B00000,B10001,B01010,B00000,B00000};
byte SIMB5[] = {B01010,B10001,B00000,B00000,B00000,B10001,B01010,B00000};

int db = 0;

//Função para animação utilizando os caracteres personalizado
void Animacao() {
  static int8_t counter = 0;
  const char* char_byte = "\x01\x02\x03\x04\x05\x04\x03\x02";
  LCD.setCursor(15, 1);
  LCD.write(char_byte[counter++]);
  if (counter == strlen(char_byte)) {
    counter = 0;
  }
 }

//Função para atualizar a data e hora no Display
void printLocalTime() {
  struct tm timeinfo;
  if (!getLocalTime(&timeinfo)) {
    LCD.setCursor(0, 1);
    LCD.print("Connection Err");
    return;
  }
  LCD.setCursor(8, 0);
  LCD.print(&timeinfo, "%H:%M:%S");

  LCD.setCursor(0, 1);
  LCD.print(&timeinfo, "      %d/%m/%Y");

  Serial.print(&timeinfo, "%H:%M:%S");
  Serial.print(&timeinfo, "%d/%m/%Y");

  }
//Função de configuração e inicialização dos dispositivos
void setup() {
  Serial.begin(115200);
  LCD.init();
  LCD.createChar(1,SIMB1);
  LCD.createChar(2,SIMB2);
  LCD.createChar(3,SIMB3);
  LCD.createChar(4,SIMB4);
  LCD.createChar(5,SIMB5);
  LCD.backlight();
  LCD.setCursor(0, 0);
  LCD.print("Conectando no");
  LCD.setCursor(0, 1);
  LCD.print("WiFi ");

  WiFi.begin("Wokwi-GUEST", "", 6);
  while (WiFi.status() != WL_CONNECTED) {
    delay(100);
    Animacao();
  }
  Serial.println("");
  Serial.print(" Conectando WIFI");
  Serial.println("IP Dispositivo: ");
  Serial.print(WiFi.localIP());

  LCD.clear();
  delay(1000);
  LCD.setCursor(0, 0);
  LCD.print("Online");
  delay(1000);
  LCD.setCursor(0, 1);
  LCD.print("Carregando Dados");
  delay(1000);
  configTime((UTC*3600), 0, NTP_SERVER);
  delay(1000);
  LCD.setCursor(0, 0);
  LCD.print("      ");
}
//Função principal de repetição
void loop() {
  printLocalTime();
  db = db + 1;
  LCD.setCursor(0,0);
  LCD.print(db+"");
  if (db > 10){
    configTime((UTC*60*60), 0, NTP_SERVER);
    db = 1;
  }
  int i;
  for (i=0;i<7; i++){
   static int8_t counter = 0;
   const char* char_byte = "\x01\x02\x03\x04\x05\x04\x03\x02";
   LCD.setCursor(0, 1);
   LCD.write(char_byte[counter++]);
   if (counter == strlen(char_byte)) {
     counter = 0;}
    delay(80);
  }
}