#include <Wire.h>
#include <RTClib.h>
#include <Servo.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
// Inisialisasi RTC, Servo, dan LCD
RTC_DS3231 rtc;
Servo myServo;
LiquidCrystal_I2C lcd(0x27, 16, 2); // Ganti alamat jika berbeda (gunakan 0x3F jika 0x27 tidak berfungsi)
// Konfigurasi Keypad
const byte ROWS = 4; // Jumlah baris keypad
const byte COLS = 3; // Jumlah kolom keypad
char keys[ROWS][COLS] = {
{'1', '2', '3'},
{'4', '5', '6'},
{'7', '8', '9'},
{'*', '0', '#'}
};
byte rowPins[ROWS] = {10, 9, 8, 7}; // Pin baris keypad
byte colPins[COLS] = {6, 5, 4}; // Pin kolom keypad
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
// Variabel untuk password
String password = "1234"; // Password yang benar
String inputPassword = ""; // Password yang dimasukkan
bool isAuthorized = false; // Status otorisasi
// Pin untuk pushbutton, LED, dan buzzer
const int pushButtonPin = 13;
const int ledPin = 2;
const int buzzerPin = 2;
void setup() {
Serial.begin(9600);
// Inisialisasi RTC
if (!rtc.begin()) {
Serial.println("RTC tidak terdeteksi!");
while (1);
}
// Uncomment baris ini untuk set waktu pertama kali
// rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
// Inisialisasi Servo, LCD, LED, dan buzzer
myServo.attach(11);
myServo.write(0); // Posisi awal servo
lcd.begin(16, 2);
lcd.noBacklight(); // LCD dalam keadaan mati
pinMode(pushButtonPin, INPUT_PULLUP); // Pushbutton menggunakan pull-up internal
pinMode(ledPin, OUTPUT); // LED sebagai output
pinMode(buzzerPin, OUTPUT); // Buzzer sebagai output
digitalWrite(ledPin, LOW); // LED mati
noTone(buzzerPin); // Buzzer mati
// Tampilkan pesan awal di Serial Monitor
Serial.println("Tekan tombol untuk memulai...");
}
void loop() {
// Menunggu pushbutton ditekan
if (digitalRead(pushButtonPin) == LOW && !isAuthorized) {
lcd.backlight(); // Nyalakan backlight LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Masukkan password:");
inputPassword = ""; // Reset input password
waitForPassword();
}
// Setelah otorisasi, jalankan komponen lainnya
if (isAuthorized) {
jalankanKomponen();
isAuthorized = false; // Reset otorisasi setelah komponen selesai
lcd.noBacklight(); // Matikan backlight LCD
Serial.println("Tekan tombol untuk memulai...");
}
delay(100);
}
void waitForPassword() {
while (!isAuthorized) {
char key = keypad.getKey();
if (key) {
if (key == '#') { // Tombol '#' untuk validasi password
if (inputPassword == password) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Password Benar!");
Serial.println("Password Benar!");
isAuthorized = true; // Password benar
delay(2000);
lcd.clear();
} else {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Password Salah!");
Serial.println("Password Salah!");
delay(2000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Masukkan password:");
inputPassword = ""; // Reset input password
}
} else if (key == '*') { // Tombol '*' untuk reset input
inputPassword = "";
lcd.setCursor(0, 1);
lcd.print("Input Cleared ");
delay(1000);
lcd.setCursor(0, 1);
lcd.print(" ");
} else { // Menambahkan karakter ke input password
inputPassword += key;
lcd.setCursor(0, 1);
lcd.print("Input: ");
lcd.print(inputPassword);
}
}
}
}
void jalankanKomponen() {
// Tampilkan pesan di LCD
lcd.setCursor(0, 0);
lcd.print("Komponen Jalan!");
Serial.println("Komponen dijalankan!");
// Nyalakan LED dan buzzer
digitalWrite(ledPin, HIGH);
tone(buzzerPin, 1000); // Nyalakan buzzer dengan frekuensi 1000 Hz
// Gerakkan servo
myServo.write(90); // Gerakkan servo ke posisi 90°
delay(2000); // Tahan posisi selama 2 detik
myServo.write(0); // Kembalikan servo ke posisi 0°
// Matikan LED dan buzzer
digitalWrite(ledPin, LOW);
noTone(buzzerPin); // Matikan buzzer
// Bersihkan pesan di LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Selesai...");
delay(2000);
}