Proyek Robotik #6: Jam Digital
Proyek ini adalah jam digital berbasis ESP32 yang menggunakan modul RTC DS1307 untuk melacak waktu secara akurat, serta modul display 4 digit TM1637 untuk menampilkan waktu dalam format HH:MM. Terdapat dua tombol untuk mengatur jam dan menit secara manual.
Cara Kerja:
- Saat ESP32 dinyalakan, ia akan membaca waktu dari modul RTC (DS1307).
- Waktu (jam dan menit) akan ditampilkan di layar 4 digit TM1637, misalnya 1325 untuk pukul 13:25.
- Tombol yang terhubung ke pin GPIO 14 digunakan untuk menambahkan jam, dan tombol di GPIO 27 untuk menambahkan menit.
- Setiap penekanan tombol akan mengatur waktu secara real-time ke modul RTC.
- RTC menjaga waktu tetap berjalan meski ESP32 dimatikan, selama baterai kancing pada RTC masih aktif.
- Tampilan waktu akan diperbarui setiap 1 detik.
Komponen yang Digunakan:
- 1 × ESP32
- 1 x Modul RTC DS1307 (Real Time Clock)
- 1 x Modul TM1637 4 Digit Display
- 2 x Push Button
- Kabel jumper
- 1 x Breadboard
- 1 x Kabel USB (untuk upload dan power)

Kode:
#include <Wire.h>
#include <TM1637Display.h>
#include <RTClib.h>
RTC_DS1307 rtc;
TM1637Display display(18, 19);
// Pin tombol
const int buttonHourPin = 14;
const int buttonMinutePin = 27;
int hour, minute, second;
bool setMode = false;
void setup() {
Serial.begin(115200);
Wire.begin();
if (!rtc.begin()) {
Serial.println("RTC tidak terdeteksi!");
while (1);
}
if (!rtc.isrunning()) {
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
display.setBrightness(0x0f); // Set kecerahan display maksimal
pinMode(buttonHourPin, INPUT_PULLUP);
pinMode(buttonMinutePin, INPUT_PULLUP);
}
void loop() {
DateTime now = rtc.now();
hour = now.hour();
minute = now.minute();
second = now.second();
display.showNumberDecEx(hour * 100 + minute, 0b01000000, true);
// Pengaturan jam
if (digitalRead(buttonHourPin) == LOW) {
delay(200);
hour = (hour + 1) % 24;
rtc.adjust(DateTime(now.year(), now.month(), now.day(), hour, minute, 0));
}
// Pengaturan menit
if (digitalRead(buttonMinutePin) == LOW) {
delay(200);
minute = (minute + 1) % 60;
rtc.adjust(DateTime(now.year(), now.month(), now.day(), hour, minute, 0));
}
delay(1000); // Update setiap detik
}
