#include <Servo.h>
Servo myServo; // Membuat objek servo
// Pin untuk LED dan tombol
const int redLedPin = 11;
const int greenLedPin = 12;
const int buttonPin = 13;
const int servoPin = 10;
// Pin untuk Seven Segment
const int segmentPins[7] = {2, 3, 4, 5, 6, 7, 8}; // Array untuk pin Seven Segment
// Variabel untuk status tombol dan servo
int buttonState = 0;
int lastButtonState = 0;
bool servoPosition = false; // false = 0 derajat (terkunci), true = 180 derajat (terbuka)
// Password yang benar
const String correctPassword = "1234";
String inputPassword = ""; // Variabel untuk menyimpan input password
void setup() {
myServo.attach(servoPin); // Menghubungkan servo ke pin
pinMode(buttonPin, INPUT); // Mengatur tombol sebagai input
pinMode(redLedPin, OUTPUT); // Mengatur LED merah sebagai output
pinMode(greenLedPin, OUTPUT); // Mengatur LED hijau sebagai output
// Mengatur pin untuk Seven Segment sebagai output
for (int i = 0; i < 7; i++) {
pinMode(segmentPins[i], OUTPUT);
}
Serial.begin(9600); // Memulai komunikasi serial
myServo.write(0); // Mengatur posisi awal servo ke 0 derajat
}
void loop() {
// Membaca status tombol
buttonState = digitalRead(buttonPin);
// Memeriksa jika tombol ditekan (logika naik: dari LOW ke HIGH)
if (buttonState == HIGH && lastButtonState == LOW) {
servoPosition = !servoPosition; // Toggle posisi servo
myServo.write(servoPosition ? 180 : 0); // Pindah sesuai posisi
delay(500); // Debouncing sederhana
}
// Menyimpan status tombol sebelumnya
lastButtonState = buttonState;
// Memeriksa input password
if (Serial.available() > 0) {
char incomingChar = Serial.read(); // Membaca karakter dari Serial
if (incomingChar == '\n') { // Jika Enter ditekan, cek password
if (inputPassword == correctPassword) {
digitalWrite(greenLedPin, HIGH); // Nyalakan LED hijau
delay(5000); // Tunggu 5 detik untuk memberikan waktu
digitalWrite(greenLedPin, LOW); // Matikan LED hijau
// Memberikan waktu untuk menekan tombol
Serial.println("Tekan tombol untuk membuka kunci...");
unsigned long startTime = millis();
bool buttonPressed = false; // Flag untuk status tombol
while (millis() - startTime < 5000) { // Tunggu selama 5 detik
buttonState = digitalRead(buttonPin);
if (buttonState == HIGH) {
buttonPressed = true; // Jika tombol ditekan
break;
}
}
if (buttonPressed) {
myServo.write(180); // Membuka kunci
delay(5000); // Tunggu 5 detik
myServo.write(0); // Kunci kembali
}
digitalWrite(redLedPin, HIGH); // Nyalakan LED merah
delay(5000); // Tunggu 5 detik sebelum mengulang
digitalWrite(redLedPin, LOW); // Matikan LED merah
} else {
Serial.println("Password salah!");
digitalWrite(redLedPin, HIGH); // Nyalakan LED merah
delay(2000); // Tunggu 2 detik
digitalWrite(redLedPin, LOW); // Matikan LED merah
}
inputPassword = ""; // Reset input password
} else {
inputPassword += incomingChar; // Tambahkan karakter ke password
}
}
// Menampilkan angka pada Seven Segment
if (inputPassword.length() > 0) {
int displayNum = inputPassword.length(); // Menampilkan jumlah karakter
displayNumber(displayNum); // Menampilkan jumlah karakter yang dimasukkan
} else {
clearDisplay(); // Jika tidak ada karakter, matikan semua segmen
}
}
// Fungsi untuk menampilkan angka pada Seven Segment
void displayNumber(int num) {
bool segments[7] = {false}; // Inisialisasi semua segmen mati
// Menentukan pola untuk menampilkan angka
if (num >= 0 && num < 8) { // Hanya menampilkan 0-7
segments[0] = true; // Segmen A
if (num > 0) segments[1] = true; // Segmen B
if (num > 1) segments[2] = true; // Segmen C
if (num > 2) segments[3] = true; // Segmen D
if (num > 3) segments[4] = true; // Segmen E
if (num > 4) segments[5] = true; // Segmen F
if (num > 5) segments[6] = true; // Segmen G
}
// Mengatur pin untuk menyalakan/ mematikan segmen
for (int i = 0; i < 7; i++) {
digitalWrite(segmentPins[i], segments[i]);
}
}
// Fungsi untuk mematikan semua segmen pada Seven Segment
void clearDisplay() {
for (int i = 0; i < 7; i++) {
digitalWrite(segmentPins[i], LOW);
}
}