#include #include /* Program by Tadeáš Kozub, 22/6/2019 ústřední kolo v programování 2019 */ // proměnné pro nastavení propojovacích pinů int pinCLK = 3; int pinDT = 4; int pinSW = 5; LiquidCrystal_I2C lcd(0x27, 16, 2); // proměnné pro uložení pozice a stavů pro určení směru // a stavu tlačítka int poziceEnkod = 0; int stavPred; int stavCLK; int stavSW; int poziceKurzoruHesla = 0; int heslo = 0; int strike = 0; bool rezimDen = false; bool odemceno = false; bool alarm = false; unsigned long startMillis; unsigned long currentMillis; //deklarace ledek int modraLedka = 8; int zelenaLedka = 9; int cervenaLedka = 10; int prepinac = 12; const int cidloPin = 2; void odemykani(){ stavCLK = digitalRead(pinCLK); if (stavCLK != stavPred) { if (digitalRead(pinDT) != stavCLK) { if (poziceEnkod > 1) { //pouzivam dvojnasobne hodnoty, aby spravne sedely otacky na enkoderu poziceEnkod -= 2; } } else { if (poziceEnkod < 17) { poziceEnkod += 2; } } stavPred = stavCLK; } } void zapisHesla(){ if (odemceno == false){ odemykani(); lcd.setCursor(1,0); lcd.print("zadejte heslo"); lcd.setCursor(poziceKurzoruHesla, 1); lcd.print(poziceEnkod/2); // načtení stavu pinu SW - tlačítko stavSW = digitalRead(pinSW); if (stavSW == 0) { //stisknutí tlačítka heslo += (poziceEnkod/2); poziceKurzoruHesla++; delay(500); if (poziceKurzoruHesla == 4){//vyresetuj pozici na 0, checkni, jestli je heslo spravne a vyhodnot odemceni/alarm if(strike >= 2){ //v pripade tří striků se zapne alarm lcd.clear(); lcd.print("spusten alarm"); alarm = true; delay(700); } if(heslo == 15){ lcd.clear(); lcd.print("spravne heslo"); delay(700); lcd.clear(); odemceno = true; } else if(heslo != 15) { lcd.clear(); lcd.print("spatne"); delay(700); lcd.clear(); strike++; poziceKurzoruHesla = 0; } } } } } void detekce() { // pokud je aktivován digitální vstup, // vypiš informaci po sériové lince Serial.println("Detekce pohybu pomoci HC-SR501!"); } void setup() { //po zapnutí automaticky skočí do nočního a zamčeného režimu // komunikace přes sériovou linku rychlostí 9600 baud Serial.begin(9600); Serial.println("System pro ovladani trezoru byl aktivovan"); Serial.println("Rezim NOC"); lcd.begin(); lcd.backlight(); // nastavení propojovacích pinů jako vstupních pinMode(pinCLK, INPUT); pinMode(pinDT, INPUT); pinMode(modraLedka, OUTPUT); pinMode(zelenaLedka, OUTPUT); pinMode(cervenaLedka, OUTPUT); pinMode(prepinac, INPUT); pinMode(cidloPin, INPUT); attachInterrupt(0, detekce, RISING); // nastavení propojovacího pinu pro tlačítko // jako vstupní s pull up odporem pinMode(pinSW, INPUT_PULLUP); // načtení aktuálního stavu pinu CLK pro porovnávání stavPred = digitalRead(pinCLK); lcd.setCursor(0, 0); lcd.print("nocni rezim"); delay(1200); lcd.clear(); lcd.home(); startMillis = millis(); } void loop() { if(rezimDen){ zapisHesla(); } /* if(digitalRead(prepinac) == HIGH){ rezimDen = false; } else if(digitalRead(prepinac) == LOW){ rezimDen = true; }*/ if(alarm && (rezimDen == false)){ //v pripade, ze je noc a alarm je zapnut sviti zluta barva digitalWrite(cervenaLedka, HIGH); digitalWrite(zelenaLedka, HIGH); digitalWrite(modraLedka, LOW); } else if(alarm && rezimDen){ //alarm ve dne digitalWrite(cervenaLedka, HIGH); digitalWrite(zelenaLedka, LOW); digitalWrite(modraLedka, LOW); } else if(!alarm && rezimDen && odemceno){ //den bez alarmu, otevreno //nutne pridat blikani digitalWrite(cervenaLedka, LOW); digitalWrite(zelenaLedka, HIGH); digitalWrite(modraLedka, LOW); currentMillis = millis(); if (currentMillis - startMillis >= 1000){ //blikani pres millis digitalWrite(cervenaLedka, LOW); digitalWrite(zelenaLedka, LOW); digitalWrite(modraLedka, LOW); delay(300); startMillis = currentMillis; } } else if(!alarm && rezimDen && !odemceno){ //den bez alarmu, zamceno, sviti zelena digitalWrite(cervenaLedka, LOW); digitalWrite(zelenaLedka, HIGH); digitalWrite(modraLedka, LOW); } else if(!alarm && !rezimDen){ //noc bez alarmu digitalWrite(cervenaLedka, LOW); digitalWrite(zelenaLedka, LOW); digitalWrite(modraLedka, HIGH); } if (Serial.available() > 0) { //cteni z terminalu, informace o stavu atd. // read the incoming byte: char incomingByte = Serial.read(); if (incomingByte == 'Q'){ alarm = false; Serial.println("Alarm vypnut"); } if (incomingByte == 'S'){ Serial.print("aktuální režim: "); if (rezimDen == true){ Serial.println("Režim DEN"); } else { Serial.println("Režim NOC"); } Serial.print("aktuální stav: "); if (odemceno == true){ Serial.println("Odemčeno"); } else { Serial.println("Zamčeno"); } } if (incomingByte == 'R'){ if (rezimDen == true){ rezimDen = false; odemceno = false; //s nocnim rezimem zavre trezor Serial.println("režim přepnut"); } else if(rezimDen == false){ rezimDen = true; Serial.println("režim přepnut"); } } } }