const int buttonPin = 2; // Pin push button
const int relayPins[] = {3, 4, 5}; // Pin relay 1, 2, 3
int relayState[] = {LOW, LOW, LOW}; // Status relay
int buttonState; // Status push button
int lastButtonState = HIGH; // Status push button sebelumnya
long lastDebounceTime = 0; // Waktu terakhir tombol ditekan
long debounceDelay = 50; // Delay debouncing
int currentRelay = 0; // Menyimpan indeks relay saat ini
bool loopInProgress = false; // Menyimpan status apakah loop sedang berlangsung
const int buzzerPin = 7; // Pin buzzer
bool buzzerActive = false; // Status buzzer
unsigned long buzzerStartTime; // Waktu dimulainya bunyi buzzer
unsigned long buzzerDurationRelay1 = 300; // Durasi bunyi buzzer untuk relay 1 dalam milidetik
unsigned long buzzerDurationLoopReset = 1000; // Durasi bunyi buzzer untuk penandaan loopInProgress di-reset dalam milidetik
void setup() {
for (int i = 0; i < 3; i++) {
pinMode(relayPins[i], OUTPUT); // Set pin relay sebagai output
digitalWrite(relayPins[i], relayState[i]); // Matikan relay awal saat setup
}
pinMode(buttonPin, INPUT_PULLUP); // Set pin push button sebagai input
pinMode(buzzerPin, OUTPUT); // Set pin buzzer sebagai output
digitalWrite(buzzerPin, LOW); // Matikan buzzer awal saat setup
}
void loop() {
int reading = digitalRead(buttonPin); // Baca status push button
if (reading != lastButtonState) {
lastDebounceTime = millis(); // Perbarui waktu debouncing
}
if ((millis() - lastDebounceTime) > debounceDelay) {
if (reading != buttonState) {
buttonState = reading; // Perbarui status push button
if (buttonState == LOW) {
// Tombol ditekan, ubah status relay
toggleRelays();
}
}
}
lastButtonState = reading; // Perbarui status push button sebelumnya
// Matikan buzzer setelah mencapai durasi yang ditentukan
if (buzzerActive && (millis() - buzzerStartTime) > buzzerDurationRelay1 && !loopInProgress) {
digitalWrite(buzzerPin, LOW);
buzzerActive = false;
}
}
void toggleRelays() {
// Jika loop sudah selesai, matikan semua relay dan reset status loopInProgress
if (loopInProgress) {
for (int i = 0; i < 3; i++) {
relayState[i] = LOW;
digitalWrite(relayPins[i], relayState[i]);
}
loopInProgress = false;
// Aktifkan buzzer untuk memberi sinyal bahwa loopInProgress di-reset
digitalWrite(buzzerPin, HIGH);
buzzerActive = true;
buzzerStartTime = millis(); // Catat waktu dimulainya bunyi buzzer
delay(buzzerDurationLoopReset); // Tahan eksekusi untuk durasi bunyi buzzer
digitalWrite(buzzerPin, LOW);
buzzerActive = false;
} else {
// Matikan semua relay terlebih dahulu
for (int i = 0; i < 3; i++) {
relayState[i] = LOW;
digitalWrite(relayPins[i], relayState[i]);
}
// Hidupkan relay yang sesuai
relayState[currentRelay] = HIGH;
digitalWrite(relayPins[currentRelay], relayState[currentRelay]);
// Jika relay 1 dihidupkan, aktifkan buzzer untuk durasi tertentu
if (currentRelay == 0) {
digitalWrite(buzzerPin, HIGH);
buzzerActive = true;
buzzerStartTime = millis(); // Catat waktu dimulainya bunyi buzzer
delay(buzzerDurationRelay1); // Tahan eksekusi untuk durasi bunyi buzzer
digitalWrite(buzzerPin, LOW);
buzzerActive = false;
}
// Pindah ke relay berikutnya (circular)
currentRelay = (currentRelay + 1) % 3;
// Jika sudah mencapai relay 3, tandai loop sudah dimulai
if (currentRelay == 0) {
loopInProgress = true;
}
}
}