#include <Keypad.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Postavke LCD zaslona
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Postavke za PIR senzor
int motionSensorPin = 10;
bool motionDetected = false;
// Postavke za tipkovnicu
const byte ROW_NUM = 4; // 4 redka
const byte COLUMN_NUM = 4; // 4 stupca
char keys[ROW_NUM][COLUMN_NUM] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte pin_rows[ROW_NUM] = {9, 8, 7, 6}; // Pinovi za redke
byte pin_column[COLUMN_NUM] = {5, 4, 3, 2}; // Pinovi za stupce
Keypad keypad = Keypad(makeKeymap(keys), pin_rows, pin_column, ROW_NUM, COLUMN_NUM);
// Postavke alarma
int buzzerPin = 12; // Pin na kojem kontroliramo aktivni buzzer
String correctPassword = "1111"; // Pin za gašenje alarma
String inputPassword = "";
bool alarmActive = false; // Status alarma
unsigned long motionDetectedTime = 0; // Vrijeme kada je detektiran pokret
const unsigned long motionDisplayTime = 2000; // Vrijeme za prikazivanje "Pokret detektiran!" (2 sekunde)
bool pinPromptDisplayed = false; // Provjera ako je poruka za unos PIN-a već prikaz
// Status za pogrešan PIN
bool wrongPin = false; // Indikator za pogrešan PIN
void setup() {
// Inicijalizacija LCD-a
lcd.begin(16, 2);
lcd.print("Sigurnosni sustav");
// Inicijalizacija pina
pinMode(motionSensorPin, INPUT);
pinMode(buzzerPin, OUTPUT); // Postavi pin za buzzer kao izlaz
// Prikaz početne poruke
lcd.setCursor(0, 1);
lcd.print("Spreman za rad");
}
void loop() {
motionDetected = digitalRead(motionSensorPin); // Provjera pokreta
// Ako je detektiran pokret i alarm nije aktiviran
if (motionDetected && !alarmActive) {
lcd.clear();
lcd.print("Pokret detektiran!");
tone(buzzerPin, 783, 30000); // Uključi buzzer (zvuk traje 1 sekundu)
alarmActive = true; // Alarm je sada aktivan
motionDetectedTime = millis(); // Spremi vrijeme kada je pokret detektiran
pinPromptDisplayed = false; // Resetiraj status za unos PIN-a
wrongPin = false; // Resetiraj pogrešan PIN status
}
// Provjeriti je li prošlo dovoljno vremena za prikazivanje poruke "Pokret detektiran!"
if (alarmActive && (millis() - motionDetectedTime) > motionDisplayTime) {
if (!wrongPin) {
lcd.setCursor(0, 1);
lcd.print("Unesite PIN:");
lcd.print(inputPassword); // Ispisivanje trenutnog unosa PIN-a
}
}
// Omogućiti unos PIN-a dok alarm traje
if (alarmActive) {
handlePinEntry();
} else {
noTone(buzzerPin); // Isključi buzzer ako alarm nije aktivan
}
}
// Funkcija za unos PIN-a
void handlePinEntry() {
// Čitanje unosa sa tipkovnice za unos PIN-a
char key = keypad.getKey();
if (key) {
if (key == '#') {
// Ako je pritisnuta tipka #, potvrdi PIN
lcd.setCursor(0, 1);
if (inputPassword == correctPassword) {
lcd.clear();
lcd.print("Alarm iskljucen!");
noTone(buzzerPin); // Isključi buzzer
alarmActive = false; // Alarm više nije aktivan
inputPassword = ""; // Resetiraj uneseni PIN
wrongPin = false; // Resetiraj pogrešan PIN status
} else {
// Ako je PIN pogrešan
lcd.clear();
lcd.print("Pogresan PIN");
wrongPin = true; // Označi da je uneseni PIN pogrešan
inputPassword = ""; // Resetiraj unos PIN-a
delay(1000); // Prikaz poruke 1 sekundu
lcd.clear(); // Očisti zaslon
lcd.print("Pogresan PIN"); // Ponovno prikazivanje poruke "Pogrešan PIN"
}
} else if (key == '*') { // Ako je pritisnuta tipka *, resetiraj unos PIN-a
if (wrongPin) { // Ova logika je omogućena samo ako je PIN bio pogrešan
inputPassword = "";
lcd.clear();
lcd.print("Unos resetiran");
delay(1000); // Prikaz poruke 1 sekundu
lcd.clear();
wrongPin = false; // Resetiraj pogrešan PIN status
}
} else { // Ako je pritisnuta neka druga tipka, dodaj je u unos PIN-a
if (!wrongPin) { // Ako PIN nije pogrešan, omogućiti unos PIN-a
inputPassword += key;
lcd.clear(); // Očisti zaslon
lcd.setCursor(0, 1);
lcd.print("PIN: "); // Prikazujemo poruku s unosom PIN-a
lcd.print(inputPassword); // Ispisujemo uneseni PIN
}
}
}
}