#include <Servo.h> // Knjižnica za upravljanje servo motorja
#include <SevSeg.h> // Knjižnica za 7-segmentni prikazovalnik
#include <Keypad.h> // Knjižnica za matricno tipkovnico
#include <pitches.h> // Knjižnica z definicijami tonov za zvočnik
#include <Adafruit_GFX.h> // Grafična knjižnica za TFT zaslon
#include <Adafruit_ILI9341.h> // Knjižnica za ILI9341 TFT zaslon
#include <Adafruit_NeoPixel.h> // Knjižnica za upravljanje NeoPixel LED traku
#define PHOTORESISTOR_PIN A0 // Analogni pin za fotoupornost
#define NEOPIXEL_PIN 2 // Digitalni pin za podatke za NeoPixel
#define NUM_PIXELS 16 // Število NeoPixel LED-ic
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_PIXELS, NEOPIXEL_PIN, NEO_GRB + NEO_KHZ800);
#define ser 13 // Pin za servo motor
#define sen 7 // Pin za senzor gibanja
const int pinR = 19; // Pin za rdečo LED
const int pinG = 20; // Pin za zeleno LED
#define TFT_CS 14 // Pin za Chip Select TFT zaslona
#define TFT_RST 15 // Pin za reset TFT zaslona
#define TFT_DC 16 // Pin za Data/Command TFT zaslona
#define buzzer 6 // Pin za zvočnik (buzzer)
Adafruit_ILI9341 TFT = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST); // Inicializacija TFT zaslona
const byte row_num = 4; // Število vrstic na tipkovnici
const byte col_num = 4; // Število stolpcev na tipkovnici
// Mapa tipk na tipkovnici
char keys[row_num][col_num] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'},
};
// Povezave vrstic in stolpcev tipkovnice na pine Arduino
byte row_pin[row_num] = {31, 33, 35, 37};
byte col_pin[col_num] = {39, 41, 43, 45};
Keypad keypad = Keypad(makeKeymap(keys), row_pin, col_pin, row_num, col_num);
Servo servo;
SevSeg sevseg;
String password = "1234"; // Geslo za izklop alarma
String poskus = ""; // Trenutni vnos uporabnika
int count = 0; // Število napačnih poskusov
int count2 = 0; // Prejšnje št. napačnih poskusov (za TFT osvežitev)
int ctry = 3; // Dovoljeno število poskusov
int entry = 0; // Ali je že bil vpis (0 pomeni še ne)
int lastLightLevel = -1; // Zadnja izmerjena svetlost (za primerjavo)
void setup() {
pinMode(pinR, OUTPUT);
pinMode(pinG, OUTPUT);
analogWrite(pinR, 255); // Vklopi rdečo LED na začetku
analogWrite(pinG, 0); // Zelena LED ugasnjena na začetku
strip.begin(); // Inicializacija NeoPixel LED traku
strip.show(); // Posodobi stanje traku
servo.attach(ser); // Poveži servo motor na določen pin
servo.write(90); // Servo nastavi v začetni položaj
TFT.begin(); // Inicializacija TFT zaslona
TFT.setRotation(1); // Nastavi orientacijo zaslona
TFT.fillScreen(ILI9341_BLACK); // Počisti zaslon
TFT.setTextColor(ILI9341_WHITE);
TFT.setTextSize(2);
TFT.setCursor(10, 10);
TFT.print("Po detekciji gibanja imas 30s in 3 poskuse za izklop alarma.");
// Nastavitve 7-segmentnega prikazovalnika
byte digits = 4;
byte digit[] = {22, 24, 26, 28};
byte segment[] = {30, 32, 34, 36, 38, 40, 42, 44};
bool resistorsOnSegments = false;
byte hardwareConfig = COMMON_ANODE;
bool updateWithDelays = false;
bool leadingZeros = false;
bool disableDecPoint = false;
sevseg.begin(hardwareConfig, digits, digit, segment, resistorsOnSegments,
updateWithDelays, leadingZeros, disableDecPoint);
sevseg.setBrightness(90);
}
void loop() {
int stanje = digitalRead(sen); // Preveri, če je zaznano gibanje
while (stanje == HIGH) { // Če je gibanje zaznano, zaženi alarmni sistem
int lightLevel = analogRead(PHOTORESISTOR_PIN); // Preberi svetlobno vrednost
// Posodobi LED trak samo, če je sprememba svetlobe
if (lightLevel != lastLightLevel) {
lastLightLevel = lightLevel;
updateLighting(lightLevel); // Osveži osvetlitev glede na svetlobo
}
if (entry == 0) { // Prvi vnos po zagonu alarma
TFT.fillScreen(ILI9341_BLACK);
TFT.setCursor(10, 10);
TFT.print("Preostali poskusi: ");
TFT.print(ctry);
delay(20);
}
if (count != count2) { // Če se število napačnih poskusov spremeni
TFT.fillScreen(ILI9341_BLACK);
TFT.setCursor(10, 10);
TFT.print("Preostali poskusi: ");
TFT.print(ctry);
delay(20);
count2 = count;
}
char key = keypad.getKey(); // Preberi pritisnjeno tipko
if (key) {
poskus += key;
if (poskus.length() == password.length()) {
if (poskus == password) { // Če je geslo pravilno
sevseg.refreshDisplay();
TFT.fillScreen(ILI9341_BLACK);
TFT.setCursor(10, 10);
TFT.print("Alarm izklopljen");
delay(20);
servo.write(180); // Odpri vrata ali sproži sprostitev
analogWrite(pinG, 0);
analogWrite(pinR, 255);
// Predvajaj melodijo ob uspehu
tone(buzzer, NOTE_C4); delay(300); noTone(buzzer);
tone(buzzer, NOTE_D4); delay(300); noTone(buzzer);
tone(buzzer, NOTE_E4); delay(300); noTone(buzzer);
tone(buzzer, NOTE_F4); delay(300); noTone(buzzer);
tone(buzzer, NOTE_G4); delay(300); noTone(buzzer);
exit(0); // Končaj program
} else {
count++; // Napačen poskus
ctry--;
tone(buzzer, NOTE_C4); delay(300); noTone(buzzer);
poskus = "";
}
poskus = "";
}
}
analogWrite(pinR, 0);
analogWrite(pinG, 0);
static unsigned long time = millis();
static int deci = 300; // 30 sekund (300 decisekund)
if (millis() - time >= 100) { // Posodobi vsakih 100 ms
time += 100;
deci--;
if (deci == 0 || count == 3) { // Če čas poteče ali uporabnik porabi vse poskuse
servo.write(0); // Zakleni vrata
analogWrite(pinR, 0);
analogWrite(pinG, 255); // Vklopi zeleno LED (alarm sprožen)
sevseg.refreshDisplay();
TFT.fillScreen(ILI9341_BLACK);
TFT.setCursor(10, 10);
TFT.print("Zgradba zaklenjena");
delay(20);
tone(buzzer, NOTE_C5);
delay(5000);
noTone(buzzer);
exit(0); // Končaj program
}
sevseg.setNumber(deci, 1); // Prikaži preostali čas
}
sevseg.refreshDisplay(); // Osveži prikazovalnik
}
entry = 1; // Ko gibanje ni več zaznano
}
// Funkcija za osvežitev osvetlitve glede na svetlobo
void updateLighting(int lightLevel) {
int numPixelsToLight = map(lightLevel, 0, 1023, 0, NUM_PIXELS + 1);
// Ugasni vse LED-ice
for (int i = 0; i < NUM_PIXELS; i++) {
strip.setPixelColor(i, strip.Color(0, 0, 0));
}
// Prižgi LED-ice glede na nivo svetlobe
for (int i = 0; i < numPixelsToLight; i++) {
strip.setPixelColor(i, strip.Color(255, 255, 255)); // bela svetloba
}
strip.show(); // Posodobi LED trak
}