Jam digital Arduino dengan DS3231 RTC dan display TM1637 bisa ditingkatkan dengan fitur pengaturan waktu manual. Dalam proyek ini, kita akan menambahkan 4 tombol:
- 2 tombol untuk menambah dan mengurangi jam
- 2 tombol untuk menambah dan mengurangi menit
Proyek ini cocok untuk membuat jam digital yang mandiri dan mudah dioperasikan.
Alat dan Bahan
- Arduino Uno (atau lainnya)
- Modul RTC DS3231
- Modul 4-digit 7-segment TM1637
- 4 tombol push button
- 4 resistor 1K Ohm (untuk pull-down)
- Kabel jumper
- Breadboard
Library yang digunakan:
Wiring Rangkaian
TM1637 ke Arduino:- CLK → Pin 2
- DIO → Pin 3
- SDA → A4
- SCL → A5
Tombol ke Arduino:
- Tombol Tambah Jam → Pin 12
- Tombol Kurang Jam → Pin 13
- Tombol Tambah Menit → Pin 10
- Tombol Kurang Menit → Pin 11
Setiap tombol disambungkan ke GND dengan resistor 1K sebagai pull-down.
Kode Program Jam Digital + Pengatur Waktu Manual
// https://github.com/avishorp/TM1637
// https://github.com/adafruit/RTClib
#include "TM1637Display.h"
#include "RTClib.h"
// Module connection pins (Digital Pins)
#define CLK 2
#define DIO 3
// The amount of time (in milliseconds) between tests
#define DELAY 1000
TM1637Display display(CLK, DIO);
int jam, menit, detik, waktu;
RTC_DS3231 rtc;
bool statusTombol13 = LOW; // Status tombol yang digunakan
bool statusTombol12 = LOW;
bool statusTombol11 = LOW;
bool statusTombol10 = LOW;
bool terakhir13 = LOW; // Status sebelumnya
bool terakhir12 = LOW;
bool terakhir11 = LOW;
bool terakhir10 = LOW;
unsigned long waktuTerakhir13 = 0; // Waktu terakhir terjadi perubahan
unsigned long waktuTerakhir12 = 0;
unsigned long waktuTerakhir11 = 0;
unsigned long waktuTerakhir10 = 0;
unsigned long waktuTerakhirjam = 0;
const unsigned long debounceDelay = 50; // Delay debounce (ms)
const int tombolPin13 = 13;
const int tombolPin12 = 12;
const int tombolPin11 = 11;
const int tombolPin10 = 10;
void setup()
{
Serial.begin(9600);
pinMode(tombolPin13, INPUT);
pinMode(tombolPin12, INPUT);
pinMode(tombolPin11, INPUT);
pinMode(tombolPin10, INPUT);
// Inisialisasi RTC
if (! rtc.begin()) {
Serial.println("Tidak bisa menemukan RTC");
while (1);
}
// Cek jika RTC perlu diatur ulang
if (rtc.lostPower()) {
Serial.println("RTC kehilangan daya, atur ulang waktu!");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
display.setBrightness(0x0f);
}
void loop()
{
DateTime now = rtc.now();
jam = now.hour();
menit = now.minute();
detik = now.second();
// ========================== Tombol 13 (kurang jam) ============================
bool dibaca13 = digitalRead(tombolPin13);
if (dibaca13 != terakhir13) {
waktuTerakhir13 = millis(); // Reset waktu jika terjadi perubahan
}
if ((millis() - waktuTerakhir13) > debounceDelay) {
if (dibaca13 != statusTombol13) {
statusTombol13 = dibaca13;
if (statusTombol13 == HIGH) {
jam--;
Serial.println(jam);
if (jam < 0) { jam = 23; }
rtc.adjust(DateTime(now.year(), now.month(), now.day(), jam, menit, detik));
}
}
}
terakhir13 = dibaca13;
// ========================== Tombol 12 (tambah jam) ============================
bool dibaca12 = digitalRead(tombolPin12);
if (dibaca12 != terakhir12) {
waktuTerakhir12 = millis(); // Reset waktu jika terjadi perubahan
}
if ((millis() - waktuTerakhir12) > debounceDelay) {
if (dibaca12 != statusTombol12) {
statusTombol12 = dibaca12;
if (statusTombol12 == HIGH) {
jam++;
Serial.println(jam);
if (jam > 23) { jam = 0; }
rtc.adjust(DateTime(now.year(), now.month(), now.day(), jam, menit, detik));
}
}
}
terakhir12 = dibaca12;
// ========================== Tombol 11 (kurang menit) ============================
bool dibaca11 = digitalRead(tombolPin11);
if (dibaca11 != terakhir11) {
waktuTerakhir11 = millis(); // Reset waktu jika terjadi perubahan
}
if ((millis() - waktuTerakhir11) > debounceDelay) {
if (dibaca11 != statusTombol11) {
statusTombol11 = dibaca11;
if (statusTombol11 == HIGH) {
menit--;
Serial.println(menit);
if (menit < 0) { menit = 59; }
rtc.adjust(DateTime(now.year(), now.month(), now.day(), jam, menit, detik));
}
}
}
terakhir11 = dibaca11;
// ========================== Tombol 10 (tambah menit) ============================
bool dibaca10 = digitalRead(tombolPin10);
if (dibaca10 != terakhir10) {
waktuTerakhir10 = millis(); // Reset waktu jika terjadi perubahan
}
if ((millis() - waktuTerakhir10) > debounceDelay) {
if (dibaca10 != statusTombol10) {
statusTombol10 = dibaca10;
if (statusTombol10 == HIGH) {
menit++;
Serial.println(menit);
if (menit > 59) { menit = 0; }
rtc.adjust(DateTime(now.year(), now.month(), now.day(), jam, menit, detik));
}
}
}
terakhir10 = dibaca10;
// ==============================================================================
waktu = jam * 100 + menit;
if ((millis() - waktuTerakhirjam) >= 50) {
waktuTerakhirjam = millis();
if (detik % 2 == 0)
{
// 0b01000000 menyalakan ":"
display.showNumberDecEx(waktu, 0b01000000, true);
}
else
{
display.showNumberDec(waktu, true);
}
}
}
Kode diatas masih bisa di buat lebih simpel, silakan berkereasi sendiri.
Penjelasan Fitur
- Setiap tombol berfungsi untuk menambah/mengurangi jam atau menit
- millis() digunakan untuk debouncing sederhana agar tombol tidak cepat terdeteksi ganda
- millis() juga digunakan untuk menampilkan waktu di 7-segment
- rtc.adjust() menyimpan waktu baru ke modul DS3231
Wokwi project link:
Selamat mencoba!
EmoticonEmoticon
Note: Only a member of this blog may post a comment.