// Learn about the ESP32 WiFi simulation in
// https://docs.wokwi.com/guides/esp32-wifi
#include <Wire.h>
#include <WiFi.h>
#include <LiquidCrystal_I2C.h>
#include <time.h>
#include <RTClib.h>
RTC_DS1307 rtc;
LiquidCrystal_I2C LCD = LiquidCrystal_I2C(0x27, 20, 4);
#define NTP_SERVER "pool.ntp.org"
#define UTC_OFFSET 3600 * 8
#define UTC_OFFSET_DST 0
#define MY_TZ "WIB-8"
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASSWD ""
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.println(&timeinfo);
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(WIFI_SSID, WIFI_PASSWD, 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);
//UNTUK RTC
if (! rtc.begin()) {
Serial.println("Tidak dapat menemukan modul RTC");
Serial.flush();
while (1) delay(10);
} else if (WiFi.status() == WL_CONNECTED) {
struct tm infoWaktu;
if (!getLocalTime(&infoWaktu)) {
Serial.println("Failed to obtain time");
return;
}
//Penyesuaian Waktu RTC
// January 21, 2014 at 13:25:10 you would call:
// rtc.adjust(DateTime(2025, 1, 21, 3, 25, 10));
// Member Type Meaning Range
// tm_sec int seconds after the minute 0-61*
// tm_min int minutes after the hour 0-59
// tm_hour int hours since midnight 0-23
// tm_mday int day of the month 1-31
// tm_mon int months since January 0-11
// tm_year int years since 1900
// tm_wday int days since Sunday 0-6
// tm_yday int days since January 1 0-365
// tm_isdst int Daylight Saving Time flag
// rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
// DateTime newDT = DateTime(infoWaktu.tm_year, (infoWaktu.tm_mon + 1), infoWaktu.tm_mday, infoWaktu.tm_hour, infoWaktu.tm_min, infoWaktu.tm_sec);
rtc.adjust(DateTime((infoWaktu.tm_year - 100), (infoWaktu.tm_mon + 1), infoWaktu.tm_mday, infoWaktu.tm_hour, infoWaktu.tm_min, infoWaktu.tm_sec));
// Tutorial Variabel Waktu
// https://raw.githubusercontent.com/RuiSantosdotme/Random-Nerd-Tutorials/master/Projects/ESP32/ESP32_Date_Time.ino
// https://randomnerdtutorials.com/esp32-date-time-ntp-client-server-arduino/
LCD.setCursor(0, 3);
LCD.print("Time variables ");
char timeHour[3];
strftime(timeHour, 3, "%H", &infoWaktu);
LCD.print(timeHour);
// char timeWeekDay[10];
// strftime(timeWeekDay, 10, "%A", &infoWaktu);
// LCD.print(timeWeekDay);
}
//==== SAMPAI DISINI RTC
// LCD.clear();
}
void loop() {
printLocalTime();
delay(250);
DateTime now = rtc.now();
Serial.print("Current time: ");
Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day());
Serial.print(" (");
Serial.print(now.dayOfTheWeek(), DEC);
Serial.print(") ");
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
// Serial.print("\t");
// Serial.print(timeHour);
// Serial.print("\t");
// Serial.print("Hour (12 hour format): ");
// Serial.print(&infoWaktu, "%I");
// Serial.print("\t");
// Serial.print("Test Jam Lagi: ");
// Serial.print(infoWaktu.tm_hour);
// Serial.print(DateTime.Minute);
// Serial.print(':');
// Serial.print(DateTime.Second);
// Serial.print(timeinfo);
Serial.println();
Serial.println();
}