#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Inisialisasi alamat I2C LCD, biasanya 0x27 atau 0x3F
LiquidCrystal_I2C lcd(0x27, 20, 4);
// Definisikan pin GPIO
const int inputPin = 5;
const int outputPins[] = {16, 17, 18, 19};
const int numOutputs = 4;
int currentOutputIndex = 0; // Indeks output saat ini
int lastInputState = LOW; // Status input sebelumnya
void setup() {
// Inisialisasi LCD
lcd.init();
lcd.backlight();
lcd.clear();
// Inisialisasi pin input
pinMode(inputPin, INPUT);
// Inisialisasi pin output
for (int i = 0; i < numOutputs; i++) {
pinMode(outputPins[i], OUTPUT);
digitalWrite(outputPins[i], LOW); // Pastikan semua output mati di awal
}
// Tampilkan status awal pada LCD
updateLCD();
}
void loop() {
// Membaca status input
int inputState = digitalRead(inputPin);
// Cek apakah ada perubahan dari LOW ke HIGH pada input
if (inputState == HIGH && lastInputState == LOW) {
// Matikan output sebelumnya
digitalWrite(outputPins[currentOutputIndex], LOW);
// Pindahkan ke output berikutnya
currentOutputIndex = (currentOutputIndex + 1) % numOutputs;
// Nyalakan output saat ini
digitalWrite(outputPins[currentOutputIndex], HIGH);
// Perbarui tampilan LCD
updateLCD();
// Tunggu sampai input kembali ke LOW
while (digitalRead(inputPin) == HIGH) {
delay(10); // Tunggu sebentar untuk debounce
}
}
// Simpan status input saat ini sebagai status sebelumnya untuk iterasi berikutnya
lastInputState = inputState;
}
// Fungsi untuk memperbarui tampilan LCD
void updateLCD() {
lcd.clear();
for (int i = 0; i < numOutputs; i++) {
lcd.setCursor(0, i); // Set cursor ke baris yang sesuai
lcd.print("Spray No");
lcd.print(i+1);
lcd.print(": ");
if (digitalRead(outputPins[i]) == HIGH) {
lcd.print("ON ");
} else {
lcd.print("OFF");
}
}
}