Arduino - Jam Digital Menggunakan TM1637 & DS3231 dengan Tombol Pengatur Waktu

 

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
DS3231 ke Arduino (I2C):
  • 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! 
Selanjutnya
« Post Selanjutnya
Sebelumnya
Post Sebelumnya »

EmoticonEmoticon

Note: Only a member of this blog may post a comment.