|

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:

  1. Saat ESP32 dinyalakan, ia akan membaca waktu dari modul RTC (DS1307).
  2. Waktu (jam dan menit) akan ditampilkan di layar 4 digit TM1637, misalnya 1325 untuk pukul 13:25.
  3. Tombol yang terhubung ke pin GPIO 14 digunakan untuk menambahkan jam, dan tombol di GPIO 27 untuk menambahkan menit.
  4. Setiap penekanan tombol akan mengatur waktu secara real-time ke modul RTC.
  5. RTC menjaga waktu tetap berjalan meski ESP32 dimatikan, selama baterai kancing pada RTC masih aktif.
  6. 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
}

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *