#include //I2C knihovna - komunikace s prevodnikem pro lcd displej (I2C adresa 39 - 0x27) #include //knihovna pro lcd displej //definice pinu #define prepinac 7 //prepinac rezimu #define cidlo 2 #define LED_red A3 #define LED_green A2 #define LED_blue A1 //piny rotacniho encoderu #define rotary_CLK 4 #define rotary_DT 5 #define rotary_SW 6 LiquidCrystal_I2C lcd(0x27, 16, 2); //deklarace objektu pro ovladani lcd disleje bool stav_prepinace = 0; bool rezim = 0; //0 = noc; 1 = den; int stav = 0; //0 = zavreno; 1 = otevreno; 2 = alarm; //promene pro zadavani cisla int wrong_heslo_counter = 0; bool start_zadavani = 0; int hesla[3] = {5703, 6219, 3497}; int zadavane_heslo = 0; int pozice_kurzoru = 0; int zadavane_cislo = 0; //cislo ktere vydime na displeji bool stav_pred; bool stav_CLK; char vstup_terminalu = ""; void zadavani_hesla(); void setup() { pinMode(cidlo, INPUT); pinMode(LED_red, OUTPUT); pinMode(LED_green, OUTPUT); pinMode(LED_blue, OUTPUT); pinMode(rotary_CLK, INPUT); pinMode(rotary_DT, INPUT); pinMode(rotary_SW, INPUT_PULLUP); pinMode(prepinac, INPUT_PULLUP); lcd.begin(); //lcd inicializace lcd.backlight(); //zapnuti podsviceni lcd.clear(); //vyresetuje displej Serial.begin(9600); Serial.println("System pro ovladani trezoru byl aktivovan"); rezim = digitalRead(prepinac); stav_pred = digitalRead(rotary_CLK); } void loop() { vstup_terminalu = (char)Serial.read(); if((vstup_terminalu == 'Q') && (stav == 2)){ //vypinani alarmu terminalem stav = 0; Serial.println("Alarm vypnut"); lcd.begin(); } if(vstup_terminalu == 'S'){ //vypsani stavu trezoru if(rezim){ Serial.print("DEN, "); }else{ Serial.print("NOC, "); } if(stav == 0){ Serial.println("Zavreno"); }else if(stav == 1){ Serial.println("Otevreno"); }else if(stav == 2){ Serial.println("Alarm"); } } if((digitalRead(prepinac)!= stav_prepinace) || (vstup_terminalu == 'R')){ //zmena rezimu DEN/NOC stav_prepinace = digitalRead(prepinac); if(rezim){ rezim = 0; start_zadavani = 0; lcd.begin(); Serial.println("Rezim NOC"); }else{ rezim = 1; lcd.begin(); Serial.println("Rezim DEN"); } } if(rezim){ if(stav == 0){ lcd.setCursor (4, 0); lcd.print("Zavreno"); digitalWrite(LED_green, HIGH); digitalWrite(LED_red, LOW); digitalWrite(LED_blue, LOW); zadavani_hesla(0); }else if(stav == 1){ lcd.setCursor (4, 0); lcd.print("Otevreno"); }else if(stav == 2){ lcd.setCursor (5, 0); lcd.print("Alarm"); } }else{ lcd.begin(); lcd.print("Nocni rezim"); if(stav != 2){ digitalWrite(LED_blue, HIGH); digitalWrite(LED_red, LOW); digitalWrite(LED_green, LOW); } } } void zadavani_hesla(bool mode){ //mode 0 = normalni zadavani; mode 1 = alarm zadavani if((start_zadavani == 0) && (!digitalRead(rotary_SW))){ start_zadavani = 1; lcd.setCursor(0, 1); lcd.print("0"); zadavane_heslo = 0; pozice_kurzoru = 0; zadavane_cislo = 0; delay(200); }else if(start_zadavani == 1){ lcd.blink(); lcd.setCursor(0, 1); while((digitalRead(prepinac)== stav_prepinace) && (vstup_terminalu != 'R')){ Serial.println(zadavane_cislo); vstup_terminalu = (char)Serial.read(); stav_CLK = digitalRead(rotary_CLK); if((!digitalRead(rotary_SW)) && (pozice_kurzoru != 4)){ zadavane_heslo += zadavane_cislo * pow(10, abs(pozice_kurzoru - 3)); zadavane_cislo = 0; lcd.setCursor(pozice_kurzoru, 1); lcd.print("*"); lcd.print("0"); pozice_kurzoru ++; lcd.setCursor(pozice_kurzoru, 1); delay(300); Serial.println(zadavane_heslo); //DEBUG ----------------------------------------------------- }else if(pozice_kurzoru == 4){ lcd.setCursor(pozice_kurzoru, 1); lcd.print("*"); lcd.begin(); if(!mode){ if((zadavane_heslo == hesla[0]) || (zadavane_heslo == hesla[1])){ stav = 1; wrong_heslo_counter = 0; break; }else if(wrong_heslo_counter == 3){ stav = 2; wrong_heslo_counter = 0; break; }else{ wrong_heslo_counter++; break; } }else if(zadavane_heslo == hesla[2]){ stav = 0; break; } }else if(stav_CLK != stav_pred){ stav_pred = stav_CLK; if(digitalRead(rotary_DT) != stav_CLK){ //rotace po smeru hodinovych rucicek Serial.println("rotace vpravo "); //DEBUG ----------------------------------------------------- zadavane_cislo = (zadavane_cislo != 9) ? (zadavane_cislo + 1) : 0; lcd.setCursor(pozice_kurzoru, 1); lcd.print(zadavane_cislo); }else{ //rotace proti smeru hodinovych rucicek Serial.println("rotace vlevo "); //DEBUG ----------------------------------------------------- zadavane_cislo = (zadavane_cislo != 0) ? (zadavane_cislo - 1) : 9; lcd.setCursor(pozice_kurzoru, 1); lcd.print(zadavane_cislo); } } } start_zadavani = 0; lcd.begin(); } }