kelvinmaulanashofani/smartdoorV4.ino

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.");
}
}
}