// Penggunaan:
// 1. Tekan Singkat: Menambah durasi timer.
// 2. Tekan Lama (1 detik): Memulai atau menghentikan timer mundur.
// 3. Buzzer: Berbunyi saat timer habis
#include <TM1637TinyDisplay.h> // Library untuk TM1637 Display
#define CLK 4 // Pin CLK TM1637
#define DIO 5 // Pin DIO TM1637
#define BUTTON_PIN 2 // Pin Push Button
#define BUZZER_PIN 8 // Pin Buzzer
TM1637TinyDisplay display(CLK, DIO);
int timerDuration = 0; // Durasi timer dalam detik
bool timerRunning = false; // Status timer
unsigned long buttonPressTime = 0; // Waktu ketika tombol ditekan
void setup() {
pinMode(BUTTON_PIN, INPUT_PULLUP); // Tombol dengan pull-up resistor
pinMode(BUZZER_PIN, OUTPUT); // Pin buzzer sebagai output
display.setBrightness(0x0f); // Kecerahan display maksimum
display.showNumberDec(timerDuration); // Tampilkan durasi awal (0)
}
void loop() {
if (digitalRead(BUTTON_PIN) == LOW) { // Jika tombol ditekan
delay(50); // Delay kecil untuk debounce tombol
buttonPressTime = millis(); // Catat waktu awal tombol ditekan
while (digitalRead(BUTTON_PIN) == LOW) {
// Jika tombol ditekan lama (lebih dari 1 detik), mulai timer
if (millis() - buttonPressTime > 1000 && !timerRunning) {
timerRunning = true; // Timer aktif
startTimer(); // Mulai timer
return; // Keluar dari loop
}
}
// Jika tombol ditekan singkat, tambah 10 detik pada timer
if (!timerRunning) {
timerDuration += 10; // Tambah durasi timer
if (timerDuration > 100) { // Maksimal 100 detik
timerDuration = 0;
}
display.showNumberDec(timerDuration, true); // Tampilkan durasi baru
}
}
}
void startTimer() {
for (int i = timerDuration; i >= 0; i--) {
display.showNumberDec(i, true); // Tampilkan waktu mundur di display
delay(1000); // Tunggu 1 detik
}
// Timer habis, bunyikan buzzer sebagai alarm
for (int j = 0; j < 5; j++) { // Buzzer berbunyi 5 kali
digitalWrite(BUZZER_PIN, HIGH);
delay(500);
digitalWrite(BUZZER_PIN, LOW);
delay(500);
}
// Reset status timer dan durasi
timerRunning = false;
timerDuration = 0;
display.showNumberDec(timerDuration);
}