/* Spínač by měl fungovat, jen občas blbne, naprogramovaný je dobře*/ /* Celý kód začíná na nočním režimu, pouze se neobjevuje nápis, jelikož funkce se spínačem blbne*/ #include #include LiquidCrystal_I2C lcd(0x27, 16, 2); // deklarace proměnných int spinac = 0; int rezim = 0; int p = 0; int stav = 0; unsigned long prev_displej = 0; unsigned long mil_displej = millis(); unsigned long prev = 0; String stav_dne = ""; int zacatek = 0; int stavCLK = 0; int stavPred = 0; int rotace = 0; int bod = 0; int chybne_pocitadlo = 0; int tlacitko = 0; int over = 0; int kliknuti = 0; int vysledek[4]; String vysledny_retezec = ""; int o = 0; void setup() { // put your setup code here, to run once: Serial.begin(9600); lcd.init(); lcd.backlight(); pinMode(13, INPUT); pinMode(11, INPUT); pinMode(2, INPUT); pinMode(3, INPUT); pinMode(4, INPUT); pinMode(5, OUTPUT); pinMode(6, OUTPUT); pinMode(7, OUTPUT); pinMode(10, INPUT); terminal(); trezor(); } void loop() { // put your main code here, to run repeatedly: } void terminal() { Serial.println("Systém pro ovladani trezoru byl aktivovan"); } // hlavní funkce, která běží stále dokola a kontroluje void trezor() { zavreno(); while(true) { // sensory pohybu a vibrací if (digitalRead(10) == HIGH) { if (o == 0) { o = 1; } else { delay(1000); o = 0; } } if (digitalRead(13) == HIGH) { if (o == 0) { Serial.println("Podezrely pohyb"); o = 1; } else { delay(1000); o = 0; } } // Vše, co se týče Seriové komunikace if (Serial.available() > 0) { String k = Serial.readString(); if (k == "Q\n") { Serial.println("Alarm vypnut"); } if (k == "S\n") { if (rezim == 1) Serial.println("Pravě je režim den."); if (rezim == 0) Serial.println("Právě je režim noc."); Serial.println(stav_dne); } if (k == "R\n") { if (rezim == 0) { rezim = 1; spinac = 1; Serial.println("Režim DEN"); den(); } else { Serial.println("Režim NOC"); noc(); } } } // Rotační enkoder a věci k němu unsigned long mil = millis(); stavCLK = digitalRead(4); if(stavCLK != stavPred) { tlacitko = 1; if (rezim == 1) { if (digitalRead(3) != stavCLK) { rotace = rotace + 1; displej(bod, rotace); } else { rotace = rotace -1; displej(bod, rotace); } } else { lcd.clear(); bod = 0; rotace = 0; } } // Přepínání mezi režimi pomocí spínače, bohužel nefunguje tak jak by mělo kvůli spínači, naprogramování by mělo být dobře if (digitalRead(11) == LOW) { if (spinac == 0) { rezim = 1; spinac = 1; zacatek = 1; Serial.println("Rezim DEN"); den(); } if (digitalRead(11) == HIGH && stav == 0) { Serial.print("ted jo"); if (spinac == 1) { rezim = 0; spinac = 0; Serial.println("Rezim NOC"); noc(); } } } // při zmáčknutí tlačítko enkoderu if (digitalRead(2) == LOW) { if (mil - prev > 1000) { prev = mil; p = p + 1; } if (p == 3) { p = 0; } if (tlacitko == 1) { if (over == 0) { bod = bod + 1; displej(bod, 0); over = 1; vysledek[kliknuti] = rotace; kliknuti = kliknuti + 1; // co se stane po zadání celého kodu if (kliknuti == 4) { for (int e = 0; e < 4; e++) { vysledny_retezec = vysledny_retezec + String(vysledek[e]); } if (vysledny_retezec == "5703" || vysledny_retezec == "6219") { stav_dne = "otevreno"; if (mil-prev > 500) { prev = mil; digitalWrite(6, 255); } else { digitalWrite(6, 0); } lcd.clear(); lcd.setCursor(5,0); lcd.print(stav_dne); lcd.noBlink(); kliknuti = 0; int vysledek[4]; } else if (vysledny_retezec == "5703") { Serial.println("Alarm vypnut"); lcd.clear(); lcd.setCursor(5,0); lcd.print(stav_dne); kliknuti = 0; int vysledek[4]; } else { chybne_pocitadlo = chybne_pocitadlo + 1; if (chybne_pocitadlo == 3) { Serial.println("Chybny kod"); chybne_pocitadlo = 0; } kliknuti = 0; int vysledek[4]; lcd.clear(); lcd.setCursor(5,0); lcd.print(stav_dne); } } } else { delay(400); over = 0; } } } stavPred = stavCLK; } } // co vypíše displej v průběhu zadávání kodu void displej(int bod, int rotace) { lcd.clear(); lcd.setCursor(5,0); lcd.print(stav_dne); lcd.setCursor(bod,1); lcd.blink(); lcd.print(rotace); } // funkce zavřeno a otevřeno, které následně i spustí ufunkci režimu void zavreno() { stav = 0; stav_dne = "Zavreno"; if (rezim == 0) { noc(); } else { den(); } } void otevreno() { stav = 1; stav_dne = "Otevreno"; if (rezim == 1) { den(); } else { noc(); } } // funkce den a noc void den() { if (zacatek != 0) { lcd.setCursor(25,0); lcd.print(stav_dne); for (int a = 0; a < 20; a++) { lcd.scrollDisplayLeft(); delay(200); } } else { lcd.clear(); lcd.setCursor(4,0); lcd.print(stav_dne); } } void noc() { lcd.clear(); lcd.setCursor(5,0); lcd.print("Nocni rezim"); }