91 lines
2.7 KiB
C++
91 lines
2.7 KiB
C++
// Deklarasi pin komponen
|
|
#define Solenoid 12
|
|
#define ldr 8
|
|
int Buzzer = 4;
|
|
int GreenLed = 6;
|
|
int RedLed = 7;
|
|
|
|
// Variabel untuk menyimpan bitstream dari cahaya
|
|
String polaPassword = "";
|
|
|
|
void setup() {
|
|
Serial.begin(9600);
|
|
|
|
pinMode(ldr, INPUT_PULLUP); // LDR membaca cahaya
|
|
pinMode(Solenoid, OUTPUT); // Kunci pintu
|
|
pinMode(GreenLed, OUTPUT); // Indikator terbuka
|
|
pinMode(RedLed, OUTPUT); // Indikator terkunci
|
|
pinMode(Buzzer, OUTPUT); // Buzzer
|
|
|
|
// Status awal: pintu terkunci
|
|
digitalWrite(RedLed, HIGH);
|
|
digitalWrite(GreenLed, LOW);
|
|
digitalWrite(Solenoid, LOW);
|
|
}
|
|
|
|
void OpenDoor() {
|
|
digitalWrite(Solenoid, HIGH); // Aktifkan solenoid (buka kunci)
|
|
tone(Buzzer, 500); // Buzzer menyala
|
|
digitalWrite(RedLed, LOW); // Matikan indikator terkunci
|
|
digitalWrite(GreenLed, HIGH); // Nyalakan indikator terbuka
|
|
|
|
delay(2000); // Biarkan pintu terbuka 2 detik
|
|
|
|
digitalWrite(Solenoid, LOW); // Kunci kembali
|
|
noTone(Buzzer); // Matikan buzzer
|
|
digitalWrite(RedLed, HIGH); // Tampilkan indikator terkunci
|
|
digitalWrite(GreenLed, LOW); // Matikan indikator terbuka
|
|
}
|
|
|
|
void loop() {
|
|
// Tunggu cahaya masuk dari flashlight
|
|
if (digitalRead(ldr) == LOW) {
|
|
Serial.println("Cahaya terdeteksi - menunggu start bit...");
|
|
|
|
// Deteksi start bit: cahaya nyala minimal 500ms
|
|
int durasiStart = 0;
|
|
while (digitalRead(ldr) == LOW) {
|
|
delay(10);
|
|
durasiStart += 10;
|
|
if (durasiStart > 1000) break; // Batas atas (jika terlalu lama)
|
|
}
|
|
|
|
// Rentang valid start bit (sekitar 500 ms)
|
|
if (durasiStart >= 400 && durasiStart <= 600) {
|
|
Serial.println("Start bit valid, mulai membaca pola...");
|
|
|
|
polaPassword = "";
|
|
delay(100); // jeda pendek setelah start bit
|
|
|
|
// Baca 4 bit, 1 bit per 200ms
|
|
for (int i = 0; i < 4; i++) {
|
|
int bitVal = (digitalRead(ldr) == LOW) ? 1 : 0; // Cahaya terang = 1, gelap = 0
|
|
polaPassword += String(bitVal);
|
|
Serial.print("Bit ke-"); Serial.print(i); Serial.print(": ");
|
|
Serial.println(bitVal);
|
|
delay(200); // Jeda antar bit
|
|
}
|
|
|
|
Serial.print("Pola diterima: ");
|
|
Serial.println(polaPassword);
|
|
|
|
// Verifikasi pola
|
|
if (polaPassword == "0001") {
|
|
Serial.println("Pola cocok: AKSES USER 1");
|
|
OpenDoor();
|
|
} else if (polaPassword == "1010") {
|
|
Serial.println("Pola cocok: AKSES USER 2");
|
|
OpenDoor();
|
|
} else {
|
|
Serial.println("Pola tidak dikenali. Akses ditolak.");
|
|
}
|
|
|
|
polaPassword = "";
|
|
delay(500); // jeda sebelum membaca pola baru
|
|
|
|
} else {
|
|
Serial.println("Start bit tidak valid. Abaikan.");
|
|
}
|
|
}
|
|
}
|