#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// Definisikan pin untuk tombol, relay, dan buzzer
#define UP_PIN 1
#define DOWN_PIN 2
#define SET_PIN 0
#define RELAY_PIN 3
#define BUZZER_PIN 4
// Layar OLED
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// Variabel untuk timer
int countdownTime = 0; // Timer dalam detik
int maxTime = 3600; // Waktu maksimal (misal 1 jam)
bool timerRunning = false; // Flag untuk mengatur apakah timer sedang berjalan
// Variabel untuk debounce
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50; // Delay debounce (50ms)
void setup() {
// Setup pin
pinMode(UP_PIN, INPUT_PULLUP);
pinMode(DOWN_PIN, INPUT_PULLUP);
pinMode(SET_PIN, INPUT_PULLUP);
pinMode(RELAY_PIN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
// Setup OLED dengan alamat I2C yang benar (0x3C)
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("OLED tidak terdeteksi!"));
while (true);
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
// Menampilkan tampilan awal "00:00"
display.setCursor(0, 0);
display.print("Timer: 00:00");
display.display();
delay(2000);
}
void loop() {
// Membaca tombol dengan debounce
int upState = digitalRead(UP_PIN);
int downState = digitalRead(DOWN_PIN);
int setState = digitalRead(SET_PIN);
// Menambahkan debounce untuk tombol UP
if (upState == LOW && (millis() - lastDebounceTime) > debounceDelay) {
if (!timerRunning) { // Hanya tambah menit jika timer belum berjalan
countdownTime += 60; // Menambah 1 menit
}
lastDebounceTime = millis(); // Update waktu debounce
}
// Menambahkan debounce untuk tombol SET
if (setState == LOW && (millis() - lastDebounceTime) > debounceDelay) {
if (!timerRunning && countdownTime > 0) { // Mulai hitung mundur jika timer belum berjalan
timerRunning = true;
}
lastDebounceTime = millis(); // Update waktu debounce
}
// Menampilkan countdown timer di layar OLED
display.clearDisplay();
display.setCursor(0, 0);
// Menampilkan waktu yang tersisa dalam format MM:SS
int minutes = countdownTime / 60;
int seconds = countdownTime % 60;
display.print("Timer: ");
display.print(minutes < 10 ? "0" : ""); // Menampilkan 0 jika menit kurang dari 10
display.print(minutes);
display.print(":");
display.print(seconds < 10 ? "0" : ""); // Menampilkan 0 jika detik kurang dari 10
display.print(seconds);
// Menampilkan tombol-tombol yang dapat ditekan saat timer belum berjalan
if (!timerRunning) {
display.setCursor(0, 40);
display.print("Press 'Set' to start");
}
// Kontrol relay (misalnya relay aktif jika countdown selesai)
if (countdownTime == 0 && timerRunning) {
digitalWrite(RELAY_PIN, LOW); // Matikan relay saat timer habis
digitalWrite(BUZZER_PIN, LOW); // Matikan buzzer
timerRunning = false; // Reset timer setelah selesai
} else if (timerRunning) {
// Menghitung mundur jika timer berjalan
countdownTime--;
// Bunyikan buzzer 5 detik sebelum waktu habis
if (countdownTime == 5) {
digitalWrite(BUZZER_PIN, HIGH); // Bunyikan buzzer 5 detik sebelum selesai
}
// Menyalakan relay selama countdown berjalan
digitalWrite(RELAY_PIN, HIGH);
}
display.display();
delay(1000); // Update setiap detik
}