#include <Keypad.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <EEPROM.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 inputPassword = "";
String correctPassword = "1234";  // Postavljanje ispravne lozinke
bool alarmActive = false;  // Status alarma
bool pinEntered = false;  // Status da li je PIN uspješno unesen
bool simulationActive = false; // Status simulacije (aktivna ili ne)

unsigned long motionDetectedTime = 0;  // Vrijeme kada je detektiran pokret

// Prototip funkcije (deklaracija) koju pozivamo u setup()
void handlePinEntry();  

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

  // Prikazivanje početnih poruka
  lcd.setCursor(0, 1);
  lcd.print("Spreman za rad");

  delay(10000);  // Pričekaj 10 sekundi prije nego što pređeš na postavljanje lozinke
  lcd.clear();
}

void loop() {
  // Ako PIN nije unesen, čekaj da korisnik unese PIN
  if (!pinEntered) {
    lcd.setCursor(0, 1);
    lcd.print("Unesite PIN:");
    lcd.print(inputPassword);
    handlePinEntry();  // Funkcija za unos PIN-a
  } else {
    // Kada je PIN pohranjen, postavi simulaciju aktivnu
    if (!simulationActive) {
      lcd.clear();
      lcd.print("Simulacija aktivna");
      simulationActive = true;  // Simulacija je sada aktivna
      delay(1000);  // Prikaz poruke 1 sekundu
    }

    // Nakon uspješnog unosa PIN-a, omogućavamo funkcionalnost
    motionDetected = digitalRead(motionSensorPin);  // Provjera pokreta
    lcd.clear();
    lcd.print("Pokret detektiran!");
      tone(buzzerPin, 783, 30000);  // Uključi buzzer (zvuk traje 30 sekundi)
      alarmActive = true;  // Alarm je sada aktivan
      motionDetectedTime = millis();  // Spremi vrijeme kada je pokret detektiran
    
      
    

    // Ako je alarm aktiviran, traži unos PIN-a za gašenje alarma
    if (alarmActive) {
      lcd.setCursor(0,1);
      lcd.print("Unesite PIN:");
      // Pozovi funkciju za unos PIN-a
      handlePinEntry();

      if (inputPassword == correctPassword) {  // Provjera PIN-a
        // Ako je PIN ispravan
        lcd.clear();
        lcd.print("Alarm iskljucen!");
        noTone(buzzerPin);  // Isključi buzzer
        alarmActive = false;  // Alarm više nije aktivan
        inputPassword = "";  // Resetiraj unos PIN-a
        pinEntered = false;  // Resetiraj status da nije unesen PIN
        simulationActive = false;  // Resetiraj simulaciju
        delay(1000);  // Prikaz poruke 1 sekundu
        lcd.clear();
      }
    }
  }
}

// Funkcija za unos PIN-a
void handlePinEntry() {
  // Čitanje unosa sa tipkovnice za unos PIN-a
  char key = keypad.getKey();

  if (key) {
    if (key == '#') {
      // Kada korisnik pritisne #, PIN se pohranjuje i omogućava simulaciju
        pinEntered = true;  // PIN je uspješno unesen
        lcd.clear();
        lcd.print("PIN pohranjen");
        delay(1000);  // Prikaz poruke 1 sekundu
        lcd.clear();
        lcd.print("Simulacija aktivna");
   }else if (key == '*') {
      // Ako je pritisnuta tipka *, resetiraj unos PIN-a
      inputPassword = "";
      lcd.clear();
      lcd.print("Unos resetiran");
      delay(1000);  // Prikaz poruke 1 sekundu
      lcd.clear();
      lcd.print("Unesite PIN:");  // Ponovno prikazivanje poruke
    } else {
      // Ako je pritisnuta bilo koja druga tipka, dodaj je u unos PIN-a
      inputPassword += key;
      lcd.clear();  // Očisti zaslon
      lcd.setCursor(0, 1);
      lcd.print("PIN: ");  // Prikazujemo poruku za unos PIN-a
      lcd.print(inputPassword); // Prikazujemo unesene brojke
    
    }
    
  }
}
uno:A5.2
uno:A4.2
uno:AREF
uno:GND.1
uno:13
uno:12
uno:11
uno:10
uno:9
uno:8
uno:7
uno:6
uno:5
uno:4
uno:3
uno:2
uno:1
uno:0
uno:IOREF
uno:RESET
uno:3.3V
uno:5V
uno:GND.2
uno:GND.3
uno:VIN
uno:A0
uno:A1
uno:A2
uno:A3
uno:A4
uno:A5
lcd1:GND
lcd1:VCC
lcd1:SDA
lcd1:SCL
pir1:VCC
pir1:OUT
pir1:GND
keypad1:R1
keypad1:R2
keypad1:R3
keypad1:R4
keypad1:C1
keypad1:C2
keypad1:C3
keypad1:C4
bz1:1
bz1:2