#include <Servo.h> // Library untuk servo motor
Servo myServo; // Inisialisasi servo motor
// Pin untuk button dan LED
const int buttonPin = 2;
const int greenLEDPin = 9;
const int redLEDPin = 8;
const int servoPin = 3;
// Password yang diharapkan
const String correctPassword = "6049";
// Variabel untuk status
bool buttonPressed = false;
unsigned long startTime;
const unsigned long timeoutDuration = 5000; // 5 detik dalam milidetik
void setup() {
// Set pin mode
pinMode(buttonPin, INPUT);
pinMode(greenLEDPin, OUTPUT);
pinMode(redLEDPin, OUTPUT);
// Inisialisasi servo
myServo.attach(servoPin);
myServo.write(90); // Servo mulai di posisi 90 derajat (posisi awal)
// Mulai serial monitor
Serial.begin(9600);
Serial.println("Tekan tombol untuk memulai...");
}
void loop() {
// Mengecek apakah tombol ditekan
if (digitalRead(buttonPin) == HIGH && !buttonPressed) {
buttonPressed = true;
Serial.flush(); // Membersihkan serial buffer sebelum meminta input
Serial.println("Masukkan password: ");
startTime = millis(); // Mulai menghitung waktu
// Variabel untuk countdown
int countdown = 5; // 5 detik countdown
// Tunggu input dari serial selama 5 detik
while (millis() - startTime < timeoutDuration) {
unsigned long elapsedTime = millis() - startTime;
// Hitung sisa waktu dan tampilkan di Serial Monitor
if (elapsedTime / 1000 > 5 - countdown) {
Serial.print("Sisa waktu: ");
Serial.print(countdown);
Serial.println(" detik");
countdown--;
}
// Periksa apakah ada data di serial buffer
if (Serial.available() > 0) { // Cek hanya jika ada input valid dari pengguna
String inputPassword = Serial.readStringUntil('\n');
inputPassword.trim(); // Menghapus spasi berlebih
// Pastikan input tidak kosong sebelum mengecek password
if (inputPassword.length() > 0) {
// Mengecek apakah password benar
if (inputPassword == correctPassword) {
handleCorrectPassword(); // Password benar
} else {
handleWrongPassword(); // Password salah
}
} else {
Serial.println("Input tidak valid! Silakan coba lagi.");
}
break; // Keluar dari loop setelah menerima input
}
}
// Jika waktu habis dan tidak ada input
if (millis() - startTime >= timeoutDuration) {
Serial.println("Waktu habis! Silahkan ulangi!");
}
buttonPressed = false; // Reset status tombol setelah waktu habis atau input
delay(500); // Sedikit delay untuk menghindari bouncing saat tombol ditekan ulang
}
}
// Fungsi untuk menangani password yang benar
void handleCorrectPassword() {
Serial.println("Password benar!");
// Nyalakan LED hijau
digitalWrite(greenLEDPin, HIGH);
// Gerakkan servo ke posisi bawah (0 derajat)
myServo.write(0);
delay(3000); // Tunggu 3 detik
// Kembalikan servo ke posisi awal (90 derajat)
myServo.write(90);
// Matikan LED hijau
digitalWrite(greenLEDPin, LOW);
}
// Fungsi untuk menangani password yang salah
void handleWrongPassword() {
Serial.println("Password salah!");
// Nyalakan LED merah
digitalWrite(redLEDPin, HIGH);
delay(3000); // Tunggu 3 detik
// Matikan LED merah
digitalWrite(redLEDPin, LOW);
}