#include <Keypad.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// ================= LCD =================
LiquidCrystal_I2C lcd(0x27, 16, 2);
// ================= PIR =================
const int pirPin = 2;
// ================= Buzzer =================
const int buzzerPin = 3;
// ================= LED-uri =================
const int greenLed = 4;
const int blueLed = 5;
const int redLed = 6;
// ================= Buton RESET =================
const int resetButton = 7;
// ================= Keypad =================
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {22, 23, 24, 25};
byte colPins[COLS] = {26, 27, 28, 29};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
// ================= Parola =================
String correctPassword = "1234";
String enteredPassword = "";
// ================= Stari =================
bool armed = false;
bool alarmTriggered = false;
void setup() {
Serial.begin(9600);
// LCD
lcd.init();
lcd.backlight();
// PIR
pinMode(pirPin, INPUT);
// Buzzer
pinMode(buzzerPin, OUTPUT);
// LED-uri
pinMode(greenLed, OUTPUT);
pinMode(blueLed, OUTPUT);
pinMode(redLed, OUTPUT);
// Buton reset
pinMode(resetButton, INPUT_PULLUP);
// Stare initiala
digitalWrite(greenLed, HIGH);
digitalWrite(blueLed, LOW);
digitalWrite(redLed, LOW);
lcd.setCursor(0, 0);
lcd.print("Sistem alarma");
lcd.setCursor(0, 1);
lcd.print("Dezactivat");
delay(3000);
lcd.clear();
}
void loop() {
readKeypad();
checkResetButton();
if (armed && !alarmTriggered) {
detectMotion();
}
}
// ================= Citire Keypad =================
void readKeypad() {
char key = keypad.getKey();
if (key) {
// Adaugare cifre
if (key != '#') {
enteredPassword += key;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("PIN: ");
lcd.print(enteredPassword);
}
// Verificare parola
if (key == '#') {
if (enteredPassword == correctPassword) {
armed = !armed;
if (armed) {
armSystem();
}
else {
disarmSystem();
}
} else {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("PIN GRESIT");
tone(buzzerPin, 1000);
delay(500);
noTone(buzzerPin);
delay(1000);
}
enteredPassword = "";
lcd.clear();
}
}
}
// ================= Activare =================
void armSystem() {
alarmTriggered = false;
digitalWrite(greenLed, LOW);
digitalWrite(blueLed, HIGH);
digitalWrite(redLed, LOW);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Sistem ACTIV");
lcd.setCursor(0, 1);
lcd.print("Monitorizare");
Serial.println("Sistem activat");
delay(1500);
lcd.clear();
}
// ================= Dezactivare =================
void disarmSystem() {
alarmTriggered = false;
noTone(buzzerPin);
digitalWrite(greenLed, HIGH);
digitalWrite(blueLed, LOW);
digitalWrite(redLed, LOW);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Sistem OFF");
lcd.setCursor(0, 1);
lcd.print("Dezactivat");
Serial.println("Sistem dezactivat");
delay(1500);
lcd.clear();
}
// ================= Detectare miscare =================
void detectMotion() {
int motion = digitalRead(pirPin);
if (motion == HIGH) {
triggerAlarm();
}
}
// ================= Buton RESET =================
void checkResetButton() {
if (digitalRead(resetButton) == LOW) {
delay(50);
if (digitalRead(resetButton) == LOW) {
alarmTriggered = false;
armed = false;
enteredPassword = "";
noTone(buzzerPin);
digitalWrite(redLed, LOW);
digitalWrite(blueLed, LOW);
digitalWrite(greenLed, HIGH);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("RESET ALARMA");
lcd.setCursor(0, 1);
lcd.print("Sistem OFF");
Serial.println("ALARMA RESETATA");
// asteapta eliberarea butonului
while (digitalRead(resetButton) == LOW);
delay(500);
lcd.clear();
}
}
}
// ================= Alarma =================
void triggerAlarm() {
alarmTriggered = true;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("INTRUS DETECTAT");
lcd.setCursor(0, 1);
lcd.print("ALERTA !!!");
Serial.println("==============================");
Serial.println("MISCARE DETECTATA!");
Serial.println("APEL CATRE PROPRIETAR...");
Serial.println("==============================");
while (alarmTriggered) {
// verificare reset
checkResetButton();
if (!alarmTriggered) {
break;
}
// alarma ON
digitalWrite(redLed, HIGH);
tone(buzzerPin, 1000);
delay(200);
// verificare reset
checkResetButton();
if (!alarmTriggered) {
break;
}
// alarma OFF
digitalWrite(redLed, LOW);
noTone(buzzerPin);
delay(200);
// verificare keypad
char key = keypad.getKey();
if (key) {
if (key != '#') {
enteredPassword += key;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("PIN: ");
lcd.print(enteredPassword);
}
if (key == '#') {
if (enteredPassword == correctPassword) {
disarmSystem();
enteredPassword = "";
break;
} else {
enteredPassword = "";
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("COD GRESIT");
delay(1000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("INTRUS DETECTAT");
lcd.setCursor(0, 1);
lcd.print("ALERTA !!!");
}
}
}
}
}