#include <Keypad.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
// Declarații și definiții inițiale
const int ledVerdePin = A3;
const int ledRosuPin = A2;
const int butonPin = 2;
const int pirPin = 3;
const int trigPin = 12;
const int echoPin = 13;
const int buzzerPin = A1;
bool sistemPornit = false;
bool inAlert = false;
unsigned long timpStartWatchout = 0;
bool inWatchout = false;
String codArmare = "0000";
String codDezarmare = "0502";
String codIntroduse = "";
const byte numarLinii = 4;
const byte numarColoane = 4;
char chei[numarLinii][numarColoane] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte piniLinii[numarLinii] = {8, 9, 10, 11};
byte piniColoane[numarColoane] = {4, 5, 6, 7};
Keypad tastatura = Keypad(makeKeymap(chei), piniLinii, piniColoane, numarLinii, numarColoane);
LiquidCrystal_I2C lcd(0x27, 16, 2);
void verificaCod();
void actualizeazaLED();
void verificaSenzori();
void actualizeazaEcran(const char* mesaj, bool verdeAprins, bool rosuAprins);
void setup() {
pinMode(ledVerdePin, OUTPUT);
pinMode(ledRosuPin, OUTPUT);
pinMode(butonPin, INPUT_PULLUP);
pinMode(pirPin, INPUT);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(buzzerPin, OUTPUT);
lcd.begin(16, 2);
lcd.backlight();
actualizeazaEcran("System Off", LOW, HIGH);
}
void loop() {
char tasta = tastatura.getKey();
if (tasta) {
codIntroduse += tasta;
if (tasta == '#') {
codIntroduse = "";
} else if (tasta == '*') {
verificaCod();
codIntroduse = "";
}
}
if (digitalRead(butonPin) == LOW) {
delay(50); // Debouncing
while (digitalRead(butonPin) == LOW); // Așteaptă eliberarea butonului
sistemPornit = !sistemPornit;
inAlert = false;
inWatchout = false;
actualizeazaLED();
}
if (sistemPornit) {
verificaSenzori();
}
}
void verificaCod() {
if (codIntroduse == codArmare) {
sistemPornit = true;
inAlert = false;
actualizeazaLED();
} else if (codIntroduse == codDezarmare) {
sistemPornit = false;
inAlert = false;
actualizeazaLED();
}
}
void actualizeazaLED() {
if (sistemPornit) {
actualizeazaEcran("System On", HIGH, LOW);
} else {
actualizeazaEcran("System Off", LOW, HIGH);
}
}
void verificaSenzori() {
long durata, distanta;
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
durata = pulseIn(echoPin, HIGH);
distanta = (durata / 2) / 29.1;
if (digitalRead(pirPin) == HIGH && distanta < 100) {
inAlert = true;
actualizeazaEcran("ALERTA!", LOW, HIGH);
digitalWrite(buzzerPin, HIGH);
} else if (distanta < 100) {
if (!inWatchout) {
inWatchout = true;
timpStartWatchout = millis();
actualizeazaEcran("Vibration detected", HIGH, LOW);
} else if (millis() - timpStartWatchout > 10000) {
sistemPornit = false;
inWatchout = false;
actualizeazaLED();
}
} else if (digitalRead(pirPin) == HIGH) {
if (!inWatchout) {
inWatchout = true;
timpStartWatchout = millis();
actualizeazaEcran("Motion detected", HIGH, LOW);
} else if (millis() - timpStartWatchout > 10000) {
sistemPornit = false;
inWatchout = false;
actualizeazaLED();
}
} else {
inWatchout = false;
if (!inAlert) {
digitalWrite(ledVerdePin, !digitalRead(ledVerdePin));
delay(500);
}
}
}
void actualizeazaEcran(const char* mesaj, bool verdeAprins, bool rosuAprins) {
lcd.clear();
lcd.print(mesaj);
digitalWrite(ledVerdePin, verdeAprins);
digitalWrite(ledRosuPin, rosuAprins);
digitalWrite(buzzerPin, LOW);
}