//!!!!!!! trezor se musí zavírat tlačítkem, které není na rotačním enkóderu, PIR nefunguje #include #include LiquidCrystal_I2C lcd(0x27, 16, 2); const byte zaviraciTlacitko = 6; const byte interruptPin = 2; const byte spinac = 3; const byte rotEncpin = 4; const byte tlacitko = 5; const byte red = 9; const byte green = 10; const byte blue = 11; const byte PIR = 7; bool PIRpp; long casPIRpp; const byte otres = 8; int stavTlacitko; int prevStavTlacitko; long lastStiskTlacitko; bool stiskTlacitka; int ROTENCPOZ; bool den = false; bool otevreno = false; bool alarm = false; long lastZmenaRezimu; int prevStavRezim; int pin[] = {5703, 6219}; int pinAlarmOff = 3497; int zadavanyPin = 0; bool zadPin; int pozice = 0; int spatnePokusy; long lastblikLED; bool stavLED; void setup() { Serial.begin(9600); Serial.println("System pro ovladani trezoru byl aktivovan"); lcd.begin(); lcd.backlight(); pinMode(interruptPin, INPUT); pinMode(rotEncpin, INPUT); pinMode(spinac, INPUT); pinMode(tlacitko, INPUT); pinMode(zaviraciTlacitko, INPUT); pinMode(otres, INPUT); pinMode(PIR, INPUT); attachInterrupt(digitalPinToInterrupt(interruptPin), rotEnc, RISING ); } void loop() { rezim(); SerialPrikazy(); stavTlacitko = digitalRead(tlacitko); if (!alarm) { lcd.setCursor(0, 0); if (otevreno) lcd.print(" Otevreno "); else if (den) { lcd.print(" Zavreno "); } } else { lcd.setCursor(0, 0); lcd.print(" Alarm "); } if ((stavTlacitko == HIGH) && (prevStavTlacitko == LOW) && ((lastStiskTlacitko + 100) < millis())) { zadPin = true; lastStiskTlacitko = millis(); stiskTlacitka = true; } if (zadPin) { zadavaniPinu(); } else { lcd.setCursor(0, 1); lcd.print(" "); } if (!den) { lcd.setCursor(0, 0); lcd.print("Nocni rezim"); lcd.setCursor(0, 1); lcd.print(" "); zadPin = false; } zavirani(); voidAlarm(); prevStavTlacitko = stavTlacitko; if ((den) && (!otevreno) && (!alarm)) { LED(0, 255, 0); } else if ((den) && (otevreno) && (!alarm)) { if ((lastblikLED + 300) <= millis()) { if (stavLED) { LED(0, 0, 0); stavLED = false; } else { LED(0, 255, 0); stavLED = true; } lastblikLED = millis(); } } else if ((den) && (alarm)) { if ((lastblikLED + 300) <= millis()) { if (stavLED) { LED(0, 0, 0); stavLED = false; } else { LED(255, 0, 0); stavLED = true; } lastblikLED = millis(); } } else if ((!den) && (alarm)) { if ((lastblikLED + 300) <= millis()) { if (stavLED) { LED(0, 0, 0); stavLED = false; } else { LED(255, 255, 0); stavLED = true; } lastblikLED = millis(); } } if((!den)&&(PIRpp)&&(!alarm)){ LED(255,255,0); } if ((!den) && (!alarm)&&(!PIRpp)) { LED(0, 0, 255); } } void voidAlarm() { if (!alarm) { if (!otevreno) { if (digitalRead(otres) == HIGH) { alarm = true; Serial.println("Podezdrele otresy"); } } if (spatnePokusy >= 3) { alarm = true; Serial.println("Chybny kod"); } /*if (!den) { if (digitalRead(PIR) == LOW) { if (!PIRpp) { Serial.println("Podezdrely pohyb"); PIRpp = true; casPIRpp = millis(); } if (((casPIRpp + 2700) < millis()) && ((casPIRpp + 3600) > millis())) { if (digitalRead(PIR) == LOW) { alarm = true; Serial.println("Spusten alarm"); } else { } } if((casPIRpp+3600) 0) { char j = Serial.read(); if (j == 'Q') { alarm = false; spatnePokusy = 0; Serial.println("Alarm vypnut"); } else if (j == 'R') { if (!otevreno) { if (den) { den = false; Serial.println("Rezim NOC"); } else { den = true; Serial.println("Rezim DEN"); } } } else if (j == 'S') { Serial.print("Rezim: "); if (den) { Serial.print("den"); } else { Serial.print("noc"); } Serial.print(", stav: "); if (otevreno) { Serial.println("otevreno"); } else { Serial.println("zavreno"); } } } } void zavirani() { long casZavirani = millis(); while (digitalRead(zaviraciTlacitko) == HIGH) {} if ((casZavirani + 3000) <= millis()) { otevreno = false; } } void zadavaniPinu() { if ((den) && (!otevreno)) { lcd.cursor(); lcd.setCursor(0, 1); for (int i = 0; i < String(zadavanyPin).length(); i++) { lcd.print("*"); } lcd.setCursor(pozice - 1, 1); ROTENCPOZ = rozsah(ROTENCPOZ, 0, 9); lcd.print(ROTENCPOZ); if (stiskTlacitka) { zadavanyPin = zadavanyPin * 10 + ROTENCPOZ; ROTENCPOZ = 0; pozice++; } lcd.setCursor(pozice, 1); lcd.cursor(); if (pozice > 4) { if ((zadavanyPin == pin[0]) || (zadavanyPin == pin[1])) { otevreno = true; spatnePokusy = 0; } else if (zadavanyPin == pinAlarmOff) { alarm = false; spatnePokusy = 0; Serial.println("Alarm vypnut"); } else { spatnePokusy++; pozice = 0; zadavanyPin = 0; ROTENCPOZ = 0; } zadPin = false; } lcd.noCursor(); } else { lcd.setCursor(0, 1); lcd.print(" "); pozice = 0; zadavanyPin = 0; ROTENCPOZ = 0; } stiskTlacitka = false; } int rozsah(int vstup, int imin, int imax) { if (vstup > imax) { vstup = imax; } if (vstup < imin) { vstup = imin; } return vstup; } void rezim() { int uu = digitalRead(spinac); if (((lastZmenaRezimu + 100) < millis()) && (uu != prevStavRezim)) { if ((den) && (!otevreno)) { den = false; Serial.println("Rezim NOC"); } else { den = true; Serial.println("Rezim DEN"); } lastZmenaRezimu = millis(); prevStavRezim = uu; } if (millis() < 2000) { //při zapnutí se musí nastravit noc den = false; } } void rotEnc() { if (digitalRead(rotEncpin) == HIGH) { ROTENCPOZ--;; } else { ROTENCPOZ++;; } }