#include <Wire.h>
#include <RTClib.h>
// Inisialisasi RTC
RTC_DS3231 rtc;
// Pin koneksi untuk IC 74HC595 ke ESP32
#define LATCH_PIN 15 // Pin Latch (ST_CP)
#define CLOCK_PIN 14 // Pin Clock (SH_CP)
#define DATA_PIN 13 // Pin Data (DS)
// Definisi segmen untuk angka 0-9 dalam bentuk bit pada seven-segment display
const byte numbers[10] = {
B11000000, // 0
B11111001, // 1
B10100100, // 2
B10110000, // 3
B10011001, // 4
B10010010, // 5
B10000010, // 6
B11111000, // 7
B10000000, // 8
B10010000 // 9
};
// Array untuk memilih digit display yang aktif (multiplexing)
const byte digitSelect[4] = {
0b00000001, // Digit 1
0b00000010, // Digit 2
0b00000100, // Digit 3
0b00001000 // Digit 4
};
void setup() {
// Inisialisasi pin sebagai OUTPUT
pinMode(LATCH_PIN, OUTPUT);
pinMode(CLOCK_PIN, OUTPUT);
pinMode(DATA_PIN, OUTPUT);
// Inisialisasi komunikasi RTC
Wire.begin();
if (!rtc.begin()) {
Serial.begin(9600);
Serial.println("RTC tidak terdeteksi!");
while (1);
}
if (rtc.lostPower()) {
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
}
void loop() {
// Ambil waktu saat ini dari RTC
DateTime now = rtc.now();
// Pisahkan jam dan menit ke dalam digit individual
int digits[4] = {
now.hour() / 10, // Puluhan jam
now.hour() % 10, // Satuan jam
now.minute() / 10, // Puluhan menit
now.minute() % 10 // Satuan menit
};
// Tampilkan setiap digit pada masing-masing seven-segment display
for (int i = 0; i < 4; i++) {
displayDigit(i, digits[i]);
delay(5); // Delay singkat untuk menghindari flicker
}
}
// Fungsi untuk menampilkan angka pada digit tertentu
void displayDigit(int digitIndex, int number) {
digitalWrite(LATCH_PIN, LOW);
// Kirim data segmen untuk menampilkan angka pada seven-segment
shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, numbers[number]);
// Kirim data untuk memilih digit yang aktif (multiplexing)
shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, digitSelect[digitIndex]);
digitalWrite(LATCH_PIN, HIGH);
}