// Learn about the ESP32 WiFi simulation in
// https://docs.wokwi.com/guides/esp32-wifi
/*
#include <WiFi.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C LCD = LiquidCrystal_I2C(0x27, 16, 2);
#define NTP_SERVER     "pool.ntp.br"
#define UTC_OFFSET     0
#define UTC_OFFSET_DST 0
void spinner() {
  static int8_t counter = 0;
  const char* glyphs = "\xa1\xa5\xdb";
  LCD.setCursor(15, 1);
  LCD.print(glyphs[counter++]);
  if (counter == strlen(glyphs)) {
    counter = 0;
  }
}
void printLocalTime() {
  struct tm timeinfo;
  if (!getLocalTime(&timeinfo)) {
    LCD.setCursor(0, 1);
    LCD.println("Connection Err");
    return;
  }
  LCD.setCursor(8, 0);
  LCD.println(&timeinfo, "%H:%M:%S");
  LCD.setCursor(0, 1);
  LCD.println(&timeinfo, "%d/%m/%Y   %Z");
}
void setup() {
  Serial.begin(115200);
  LCD.init();
  LCD.backlight();
  LCD.setCursor(0, 0);
  LCD.print("Connecting to ");
  LCD.setCursor(0, 1);
  LCD.print("WiFi ");
  WiFi.begin("Wokwi-GUEST", "", 6);
  while (WiFi.status() != WL_CONNECTED) {
    delay(250);
    spinner();
  }
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
  LCD.clear();
  LCD.setCursor(0, 0);
  LCD.println("Online");
  LCD.setCursor(0, 1);
  LCD.println("Updating time...");
  configTime(UTC_OFFSET, UTC_OFFSET_DST, NTP_SERVER);
}
void loop() {
  printLocalTime();
  delay(250);
}
*/
#include <WiFi.h>
#include "time.h"
/*************************************/
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C LCD = LiquidCrystal_I2C(0x27, 16, 2);
/*************************************/
const char* ssid     = "Wokwi-GUEST";
const char* password = "";
const char* ntpServer = "pool.ntp.br";
const long  gmtOffset_sec = -14400;//hora Brasília
const int   daylightOffset_sec = 3600;
/********************************************/
void spinner() {
  static int8_t counter = 0;
  const char* glyphs = "\xa1\xa5\xdb";
  LCD.setCursor(15, 1);
  LCD.print(glyphs[counter++]);
  if (counter == strlen(glyphs)) {
    counter = 0;
  }
}
void printLocalTimeLCD() {
  struct tm timeinfo;
  if (!getLocalTime(&timeinfo)) {
    LCD.setCursor(0, 1);
    LCD.println("Connection Err");
    return;
  }
  LCD.clear();
  LCD.setCursor(8, 0);
  LCD.println(&timeinfo, "%H:%M:%S");
  LCD.setCursor(0, 1);
  LCD.println(&timeinfo, "%d/%m/%Y   %Z");
}
/*******************************************/
void setup(){
  Serial.begin(115200);
  // Connect to Wi-Fi
  Serial.print("Conectando a ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  /**********************************************/
  LCD.init();
  LCD.backlight();
  LCD.setCursor(0, 0);
  LCD.print("Connecting to ");
  LCD.setCursor(0, 1);
  LCD.print("WiFi ");
  Serial.println("");
  Serial.println("WiFi conectado.");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
  
 /**************************************/
  // Init and get the time
  configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
  printLocalTime();
  //disconnect WiFi as it's no longer needed
  WiFi.disconnect(true);
  WiFi.mode(WIFI_OFF);
  
  /***********************************************/
  spinner();
  /****************************************/
}
void loop(){
  delay(1000);
  printLocalTime();
  printLocalTimeLCD();
}
void printLocalTime(){
  struct tm timeinfo;
  if(!getLocalTime(&timeinfo)){
    Serial.println("Falha para obter o tempo");
    return;
  }
  Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");
  Serial.print("Dia da semana: ");
  Serial.println(&timeinfo, "%A");
  Serial.print("Mês: ");
  Serial.println(&timeinfo, "%B");
  Serial.print("Dia do mês: ");
  Serial.println(&timeinfo, "%d");
  Serial.print("Ano: ");
  Serial.println(&timeinfo, "%Y");
  Serial.print("Horas: ");
  Serial.println(&timeinfo, "%H");
  Serial.print("Horas (Formato de 12 horas): ");
  Serial.println(&timeinfo, "%I");
  Serial.print("Minutos: ");
  Serial.println(&timeinfo, "%M");
  Serial.print("Segundos: ");
  Serial.println(&timeinfo, "%S");
  Serial.println("Variáveis de tempo");
  char timeHour[3];
  strftime(timeHour,3, "%H", &timeinfo);
  Serial.println(timeHour);
  char timeWeekDay[10];
  strftime(timeWeekDay,10, "%A", &timeinfo);
  Serial.println(timeWeekDay);
  Serial.println();
}