void changeTimeState() { if(switcherDebounce + debounce < millis() && digitalRead(switcher) != switcherState) { if((timeState == Day && openState==Closed) || timeState == Night) { timeState = !timeState; code[0] = 0; code[1] = 0; code[2] = 0; code[3] = 0; if(timeState == Day) Serial.println("Rezim DEN"); if(timeState == Night) Serial.println("Rezim NOC"); updateLCD(true, true); } switcherState = digitalRead(switcher); switcherDebounce = millis(); } } void checkShakeSensor() { if(shakerDebounce + debounce < millis() && digitalRead(shake)) { if(openState != Open && alarmState != Alarm) { Serial.println("Podezrele otresy!"); turnAlarmOn(); } shakerDebounce = millis(); } } void changeOpenState() { codePosition = -1; code[0] = 0; code[1] = 0; code[2] = 0; code[3] = 0; updateLCD(true, true); openState = !openState; changeLCDState(4); } void turnAlarmOFF() { codePosition = -1; code[0] = 0; code[1] = 0; code[2] = 0; code[3] = 0; updateLCD(true, true); alarmState = NoAlarm; if(timeState == Day) changeLCDState(4); Serial.println("Alarm vypnut"); } void turnAlarmOn() { codePosition = -1; code[0] = 0; code[1] = 0; code[2] = 0; code[3] = 0; updateLCD(true, true); alarmState = Alarm; changeLCDState(5); } void updateRGBLed() { if(timeState == Day && alarmState == Alarm) { blinkRGBLed(HIGH, LOW, LOW); } else if(timeState == Day && openState == Closed) { writeRGBLed(LOW, HIGH, LOW); } else if(timeState == Day && openState == Open) { blinkRGBLed(LOW, HIGH, LOW); } else if(timeState == Night && alarmState == NoAlarm) { writeRGBLed(LOW, LOW, HIGH); } else if(timeState == Night && alarmState == AlarmTriggered) { writeRGBLed(HIGH, HIGH, LOW); } else if(timeState == Night && alarmState == Alarm) { blinkRGBLed(HIGH, HIGH, LOW); } } void writeRGBLed(bool R, bool G, bool B) { digitalWrite(Rpin, R); digitalWrite(Gpin, G); digitalWrite(Bpin, B); } void blinkRGBLed(bool R, bool G, bool B) { if((millis()/blinkPeriod)%2 == 0) { writeRGBLed(R, G, B); } else { writeRGBLed(0, 0, 0); } } void checkForButtonPress() { if(!digitalRead(encoderButton)) { if(closeStartTime == 0) closeStartTime = millis(); if(millis() - closeStartTime >= closeTime && openState == Open) { closeStartTime = 0; changeOpenState(); } } else if(timeState == Day && openState == Closed && closeStartTime != 0 && millis() - closeStartTime >= debounce/4) { closeStartTime = 0; if(codePosition < 3) { codePosition++; updateLCD(true, true); } else if(codePosition == 3) { codePosition=-1; if((code[0] == openCode1[0] && code[1] == openCode1[1] && code[2] == openCode1[2] && code[3] == openCode1[3]) || (code[0] == openCode2[0] && code[1] == openCode2[1] && code[2] == openCode2[2] && code[3] == openCode2[3])) { updateLCD(true, true); changeOpenState(); } else if(code[0] == turnOffAlarmCode[0] && code[1] == turnOffAlarmCode[1] && code[2] == turnOffAlarmCode[2] && code[3] == turnOffAlarmCode[3]) { updateLCD(true, true); if(alarmState == Alarm) turnAlarmOFF(); } else { badCodeCount++; if(badCodeCount==3) { updateLCD(true, true); Serial.println("Chybny kod"); turnAlarmOn(); badCodeCount=0; } } code[0] = 0; code[1] = 0; code[2] = 0; code[3] = 0; closeStartTime = 0; } } if(digitalRead(encoderButton)) closeStartTime = 0; } void updateLCD(bool updateCursor, bool change) { if(timeState == Day && change) { lcd.clear(); lcd.noBlink(); lcd.noCursor(); if(alarmState == Alarm) { if(updateCursor) lcd.setCursor(5, 0); lcd.print("Alarm"); } else if(openState == Open) { if(updateCursor) lcd.setCursor(4, 0); lcd.print("Otevreno"); } else if(openState == Closed){ if(updateCursor) lcd.setCursor(4, 0); lcd.print("Zavreno"); } if(codePosition != -1 && (openState == Closed || alarmState == Alarm)) { displayCode(codePosition); lcd.setCursor(codePosition, 1); lcd.cursor(); lcd.blink(); } } else if(timeState == Night){ if(change) { lcd.clear(); lcd.noBlink(); lcd.noCursor(); lcd.setCursor(0, 0); lcd.print("Nocni rezim"); displayScrollTime = millis()/scrollSpeed; } if(millis()/scrollSpeed != displayScrollTime) { if(displayCursorPosition <= 15){ displayCursorPosition++; lcd.scrollDisplayRight(); displayScrollTime = millis()/scrollSpeed; } else { displayCursorPosition=0; lcd.clear(); lcd.setCursor(displayCursorPosition, 0); lcd.print("Nocni rezim"); } } } } void changeLCDState(int distance) { for(int a=0; a<12; a++) { lcd.scrollDisplayRight(); delay(150); } lcd.clear(); lcd.setCursor(0, 0); updateLCD(false, true); for(int a=0; a 9) { code[codePosition] = 0; } if(code[codePosition] < 0) { code[codePosition] = 9; } updateLCD(true, true); encoderState = CLKstate; } } } void readSerial() { if(Serial.available() > 0) { char input = Serial.read(); if(input == 'Q' && alarmState == Alarm) { updateLCD(true, true); turnAlarmOFF(); } else if(input == 'S') { Serial.print("Aktualni stav trezoru: "); Serial.println(openState?"Zavreno":"Otevreno"); Serial.print("Aktualni rezim trezoru: "); Serial.println(timeState?"Noc":"Den"); } else if(input == 'R' && ((timeState == Day && openState==Closed) || timeState == Night)) { timeState = !timeState; code[0] = 0; code[1] = 0; code[2] = 0; code[3] = 0; if(timeState == Day) Serial.println("Rezim DEN"); if(timeState == Night) Serial.println("Rezim NOC"); updateLCD(true, true); } } }