#include <Wire.h> // Library untuk I2C communication
#include <Adafruit_GFX.h> // Library untuk graphics
#include <Adafruit_SSD1306.h> // Library untuk SSD1306 OLED display
#include <RTClib.h> // Library untuk RTC DS3231
#define SCREEN_WIDTH 128 // Lebar layar OLED
#define SCREEN_HEIGHT 64 // Tinggi layar OLED
#define OLED_RESET -1 // Pin reset OLED, jika -1 berarti reset tidak digunakan
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); // Inisialisasi objek display
RTC_DS1307 rtc; // Inisialisasi objek RTC DS3231
bool kekiri=false;
void setup() {
Serial.begin(9600); // Memulai serial communication
if (!rtc.begin()) { // Memulai komunikasi dengan RTC
Serial.println("Couldn't find RTC");
while (1);
}
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Memulai komunikasi dengan OLED display
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
display.display(); // Menampilkan layar
delay(500);
display.clearDisplay(); // Membersihkan layar
}
void loop() {
DateTime now = rtc.now(); // Mengambil waktu sekarang dari RTC
runningJam(now.day(), now.month(), now.year(), now.hour(), now.minute(), now.second()); // Menjalankan fungsi untuk menampilkan waktu pada layar OLED
}
void runningJam(int tgl, int bln, int thn, int jam, int menit, int detik) {
char time2String[9];
char time1String[9];
sprintf(time2String, "%02d:%02d:%02d", jam, menit, detik);
sprintf(time1String, "%02d-%02d-%02d", tgl, bln, thn%100);
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
int stringLength = strlen(time1String)*12;
static int position = SCREEN_WIDTH-stringLength;
if (kekiri) {position += 1; } else {position -= 1;}
if (position<=0){kekiri=true;}
if (position>=SCREEN_WIDTH-stringLength){kekiri=false;}
display.setCursor(position, 0);
display.println(time1String);
display.setCursor(position, 16);
display.println(time2String);
display.display();
}