#include <TM1637Display.h> // Library untuk TM1637
#define CLK 4 // Pin CLK TM1637
#define DIO 5 // Pin DIO TM1637
TM1637Display display(CLK, DIO); // Inisialisasi TM1637
unsigned long previousMillis = 0;
const long interval = 1000; // 1 detik
int countdownTime = 300; // Waktu countdown awal (5 menit)
bool isRunning = false; // Status apakah timer sedang berjalan
bool lastButtonState = HIGH; // Status terakhir tombol Start/Pause
bool currentButtonState = HIGH;
bool timeOption = true; // true = 5 menit, false = 2 menit
bool timeFinished = false; // Status apakah timer sudah mencapai 0
const int startPauseButton = 12; // Tombol untuk Start/Pause
const int resetButton = 14; // Tombol reset (juga digunakan untuk ganti waktu)
const int buzzer = 15; // Pin untuk buzzer
void setup() {
Serial.begin(115200);
Serial.println("Hello, ESP32!");
display.setBrightness(0x0f); // Set kecerahan display maksimal
pinMode(startPauseButton, INPUT_PULLUP);
pinMode(resetButton, INPUT_PULLUP);
pinMode(buzzer, OUTPUT);
display.showNumberDecEx(0, 0b01000000, true); // Tampilkan 00:00 awal
delay(1000);
showTime(countdownTime); // Tampilkan waktu awal 5 menit
}
void loop() {
currentButtonState = digitalRead(startPauseButton);
// Jika tombol Start/Pause ditekan (LOW) dan status tombol sebelumnya HIGH, maka toggling antara start/pause
if (currentButtonState == LOW && lastButtonState == HIGH && !timeFinished) {
isRunning = !isRunning; // Toggle status isRunning
delay(200); // Debounce delay
}
lastButtonState = currentButtonState; // Simpan status tombol terakhir
// Reset button handling
if (digitalRead(resetButton) == LOW) {
isRunning = false; // Hentikan timer
digitalWrite(buzzer, LOW); // Matikan buzzer jika aktif
timeFinished = false; // Reset status waktu selesai
timeOption = !timeOption; // Toggle antara 5 menit dan 2 menit
countdownTime = timeOption ? 300 : 120; // Set waktu: 5 menit = 300 detik, 2 menit = 120 detik
showTime(countdownTime); // Tampilkan waktu yang dipilih
delay(500); // Debounce delay yang lebih panjang untuk menghindari double input
}
// Timer countdown handling
if (isRunning && countdownTime > 0) {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
countdownTime--;
showTime(countdownTime);
}
}
// Saat countdown selesai
if (countdownTime == 0 && !timeFinished) {
digitalWrite(buzzer, HIGH); // Aktifkan buzzer
timeFinished = true; // Tandai bahwa waktu selesai
isRunning = false; // Hentikan timer
}
}
// Fungsi untuk menampilkan waktu dalam format MM:SS
void showTime(int seconds) {
int minutes = seconds / 60;
int secs = seconds % 60;
// Gabungkan menit dan detik ke dalam format XX:YY
int displayTime = (minutes * 100) + secs;
display.showNumberDecEx(displayTime, 0b01000000, true); // Tampilkan dalam format MM:SS
}