Proyek Robotik #4: Timer/ Countdown
Proyek ini merupakan timer otomatis yang menggunakan ESP32 dan modul 4 digit display TM1637. Timer ini dapat menghitung mundur dari 5 menit atau 2 menit, yang bisa dipilih menggunakan tombol reset. Tombol lainnya digunakan untuk memulai (start) atau menghentikan (pause) hitungan waktu. Ketika waktu mencapai 0, buzzer akan menyala sebagai penanda waktu habis dan akan terus menyala hingga tombol reset ditekan.
Cara Kerja:
- Saat ESP32 menyala, display akan menampilkan waktu default (5 menit = 300 detik).
- Tombol Start/Pause (GPIO 12) digunakan untuk memulai atau menghentikan sementara countdown.
- Tombol Reset/Ganti Waktu (GPIO 14) berfungsi untuk:
- Menghentikan timer dan buzzer.
- Mengganti antara waktu 5 menit dan 2 menit.
- Menampilkan waktu yang dipilih di display.
- Buzzer (GPIO 15) akan menyala ketika waktu sudah habis (00:00) dan akan tetap menyala hingga tombol reset ditekan.
- Waktu countdown ditampilkan dalam format MM:SS di modul TM1637 4 Digit Display.
Komponen yang Digunakan:
- 1 × ESP32
- 1 x Modul TM1637 4 Digit Display
- 2 x Push Button
- 1 x Buzzer (aktif)
- 1 x Breadboard
- Kabel jumper
- 1 x Kabel USB (untuk upload dan power)

Kode:
#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() {
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
}
