#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <RTClib.h> // Library untuk RTC DS3231
#include <WiFi.h> // Library untuk koneksi WiFi
#include <WiFiUdp.h> // Library untuk UDP
#include <NTPClient.h> // Library untuk sinkronisasi NTP
// Inisialisasi LCD I2C dengan alamat 0x27 untuk ukuran 20x4
LiquidCrystal_I2C lcd(0x27, 20, 4);
// Inisialisasi RTC DS3231
RTC_DS3231 rtc;
// Pengaturan NTP
const char* ssid = "Wokwi-GUEST"; // Ganti dengan SSID WiFi Anda
const char* password = ""; // Password WiFi, jika ada
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org", 25200, 60000); // UTC+7 untuk WIB
// Array nama hari dalam bahasa Indonesia
const char *daysOfTheWeek[] = {"Min", "Sen", "Sel", "Rab", "Kam", "Jum", "Sab"};
// Custom characters untuk tampilan angka besar (tidak diubah)
byte x10[8] = {0x07, 0x07, 0x07, 0x00, 0x00, 0x07, 0x00, 0x00};
byte x11[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x1C, 0x1C};
byte x12[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x1F, 0x1F};
byte x13[8] = {0x07, 0x07, 0x07, 0x07, 0x07, 0x1F, 0x1F, 0x1F};
byte x14[8] = {0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1F, 0x1F, 0x1F};
byte x15[8] = {0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C};
byte x16[8] = {0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07};
byte x17[8] = {0x00, 0x00, 0x0E, 0x0E, 0x0E, 0x00, 0x00, 0x00};
byte row = 0, col = 0;
byte arrow[8] = {
0b00100,
0b00100,
0b00100,
0b11111,
0b01110,
0b00100,
0b00000,
0b00000
};
byte leftBracket[8] = {
0b01110,
0b01000,
0b01000,
0b01000,
0b01000,
0b01000,
0b01110,
0b00000
};
byte rightBracket[8] = {
0b01110,
0b00010,
0b00010,
0b00010,
0b00010,
0b00010,
0b01110,
0b00000
};
//*****************************************************************************************//
// Initial Setup
//*****************************************************************************************//
void setup() {
// Inisialisasi Serial Monitor
Serial.begin(115200);
// Setup I2C di ESP32-S3 pada GPIO 8 (SDA) dan GPIO 9 (SCL)
Wire.begin(21, 47); // SDA = GPIO 8, SCL = GPIO 9
// Inisialisasi LCD I2C 20x4
lcd.begin(20, 4);
lcd.backlight(); // Nyalakan backlight LCD
// Inisialisasi WiFi dan sinkronisasi NTP
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Menghubungkan ke WiFi...");
}
timeClient.begin(); // Memulai NTP Client
lcd.createChar(0, x10);
lcd.createChar(1, x11);
lcd.createChar(2, x12);
lcd.createChar(3, x13);
lcd.createChar(4, x14);
lcd.createChar(5, x15);
lcd.createChar(6, x16);
lcd.createChar(7, x17);
// Gunakan slot yang sudah ada dengan bijak
// Tampilkan anak panah menggunakan slot 6, misalnya (gantikan salah satu karakter angka besar)
lcd.createChar(8, arrow); // Gunakan slot 6 untuk panah bawah
// Tampilkan kurung di slot 5 dan 7 (gantikan karakter angka besar sementara)
// lcd.createChar(10, leftBracket); // Simpan kurung kiri di slot 5
// lcd.createChar(9, rightBracket); // Simpan kurung kanan di slot 7
// Inisialisasi RTC DS3231
if (!rtc.begin()) {
lcd.setCursor(0, 0);
lcd.print("RTC not found");
while (1);
}
// Sinkronisasi waktu jika RTC kehilangan daya
if (rtc.lostPower()) {
lcd.setCursor(0, 1);
lcd.print("RTC lost power");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
lcd.setCursor(0, 0);
lcd.print(F("SURIOTA -- ABSEN IOT"));
delay(2000);
}
//*****************************************************************************************//
// MAIN LOOP
//*****************************************************************************************//
//*****************************************************************************************//
// MAIN LOOP
//*****************************************************************************************//
void loop() {
// Sinkronisasi waktu dari NTP
timeClient.update();
// Ambil waktu sekarang dari RTC
DateTime now = rtc.now();
// Bersihkan tampilan sebelumnya
lcd.clear();
// Tampilkan teks yang ada sebelumnya tetap
lcd.setCursor(13, 0);
lcd.print("Welcome");
lcd.setCursor(15, 1);
lcd.print("Tap");
lcd.setCursor(14, 2);
lcd.print("Below");
// Tampilkan waktu dan tanggal seperti biasa
displayTime(now.hour(), now.minute(), now.second());
displayDate(now);
// Tampilkan anak panah di baris ke-4 kolom 15, 16, 17
for (int i = 15; i <= 17; i++) {
lcd.setCursor(i, 3);
lcd.write(byte(8)); // Tampilkan karakter anak panah
}
delay(1000); // Perbarui setiap detik
}
//*****************************************************************************************//
// displayTime: Menampilkan jam, menit, dan detik dalam format besar di LCD
void displayTime(int hour, int minute, int second) {
// Tampilkan jam
doNumber(hour / 10, 0, 0); // Puluhan jam
doNumber(hour % 10, 0, 2); // Satuan jam
// Tampilkan tanda ":" di antara jam dan menit
doNumber(11, 0, 4); // Tanda ":"
// Tampilkan menit
doNumber(minute / 10, 0, 5); // Puluhan menit
doNumber(minute % 10, 0, 7); // Satuan menit
// Tampilkan tanda ":" setelah menit dalam format biasa
lcd.setCursor(9, 0); // Set posisi kursor untuk tanda ":"
lcd.print(":"); // Tampilkan tanda ":"
// Tampilkan detik setelah tanda ":"
lcd.setCursor(10, 4); // Set posisi untuk detik
if (second < 10) {
lcd.print("0"); // Tambahkan 0 di depan jika detik kurang dari 10
}
lcd.print(second); // Tampilkan detik
}
//*****************************************************************************************//
// displayDate: Menampilkan hari dan tanggal dalam format "Hari, DD/MM/YY" di baris 4
void displayDate(DateTime now) {
// Ambil hari dari waktu sekarang
int dayOfWeek = now.dayOfTheWeek();
// Tampilkan hari, tanggal, bulan, dan tahun
lcd.setCursor(0, 3);
lcd.print(daysOfTheWeek[dayOfWeek]); // Tampilkan hari dalam bahasa Indonesia
lcd.print(",");
if (now.day() < 10) {
lcd.print("0"); // Tambahkan 0 jika hari kurang dari 10
}
lcd.print(now.day());
lcd.print("/");
if (now.month() < 10) {
lcd.print("0"); // Tambahkan 0 jika bulan kurang dari 10
}
lcd.print(now.month());
lcd.print("/");
lcd.print(now.year() % 100); // Tampilkan dua digit terakhir dari tahun
}
//*****************************************************************************************//
// doNumber: Fungsi untuk menampilkan angka di posisi (row, column) dengan format besar
void doNumber(byte num, byte r, byte c) {
lcd.setCursor(c, r);
switch (num) {
case 0:
lcd.write(byte(2)); lcd.write(byte(2));
lcd.setCursor(c, r + 1); lcd.write(byte(5)); lcd.write(byte(6));
lcd.setCursor(c, r + 2); lcd.write(byte(4)); lcd.write(byte(3));
break;
case 1:
lcd.write(byte(0)); lcd.write(byte(1));
lcd.setCursor(c, r + 1); lcd.print(" "); lcd.write(byte(5));
lcd.setCursor(c, r + 2); lcd.write(byte(0)); lcd.write(byte(4));
break;
case 2:
lcd.write(byte(2)); lcd.write(byte(2));
lcd.setCursor(c, r + 1); lcd.write(byte(2)); lcd.write(byte(3));
lcd.setCursor(c, r + 2); lcd.write(byte(4)); lcd.write(byte(2));
break;
case 3:
lcd.write(byte(2)); lcd.write(byte(2));
lcd.setCursor(c, r + 1); lcd.write(byte(0)); lcd.write(byte(3));
lcd.setCursor(c, r + 2); lcd.write(byte(2)); lcd.write(byte(3));
break;
case 4:
lcd.write(byte(1)); lcd.write(byte(0));
lcd.setCursor(c, r + 1); lcd.write(byte(4)); lcd.write(byte(3));
lcd.setCursor(c, r + 2); lcd.print(" "); lcd.write(byte(6));
break;
case 5:
lcd.write(byte(2)); lcd.write(byte(2));
lcd.setCursor(c, r + 1); lcd.write(byte(4)); lcd.write(byte(2));
lcd.setCursor(c, r + 2); lcd.write(byte(2)); lcd.write(byte(3));
break;
case 6:
lcd.write(byte(1)); lcd.print(" ");
lcd.setCursor(c, r + 1); lcd.write(byte(4)); lcd.write(byte(2));
lcd.setCursor(c, r + 2); lcd.write(byte(4)); lcd.write(byte(3));
break;
case 7:
lcd.write(byte(2)); lcd.write(byte(2));
lcd.setCursor(c, r + 1); lcd.print(" "); lcd.write(byte(6));
lcd.setCursor(c, r + 2); lcd.print(" "); lcd.write(byte(6));
break;
case 8:
lcd.write(byte(2)); lcd.write(byte(2));
lcd.setCursor(c, r + 1); lcd.write(byte(4)); lcd.write(byte(3));
lcd.setCursor(c, r + 2); lcd.write(byte(4)); lcd.write(byte(3));
break;
case 9:
lcd.write(byte(2)); lcd.write(byte(2));
lcd.setCursor(c, r + 1); lcd.write(byte(4)); lcd.write(byte(3));
lcd.setCursor(c, r + 2); lcd.print(" "); lcd.write(byte(6));
break;
case 11:
lcd.setCursor(c, r + 1); lcd.write(byte(7));
lcd.setCursor(c, r + 2); lcd.write(byte(7));
break;
}
}Loading
esp32-s3-devkitc-1
esp32-s3-devkitc-1