/************************************** !!!!! Pro vstup kodu neni inplenetovan prvotni stisk. Spracovani ze senzoru neni dokonceno. *************************************** Name: bankovni_trezor Version: v1.0 Libraries......................... rtOS.h ***************************************/ #include "rtOS.h" #include #include /*------------------------------------*/ rtOS TT(1); //construct rtOS tic(1ms) /************************************** dT- delay start for task tT- period for schedule of task ***************************************/ const byte dT[8]= {0, 1, 2, 3, 4, 5, 7,8}; //start delay <1;255>xtic ms const byte tT[8]= {1,250,250,100,250,250,250,0}; //period <1;256>xtic ms /************************************** User global definitions: - constants - variables *******D E C L A R A T I O N s*********/ #define moveSenzor 2 #define otres 3 #define Switch 7 #define rLED 11 #define bLED 6 #define gLED 5 bool blinkGREEN=false; bool blinkRED=false; #define pinCLK 8 #define pinDT 9 #define pinSW 10 int countLcd = 0; int lightCount = 0; LiquidCrystal_I2C lcd(0x27,16,2); bool switchStatus; bool check=false; bool night=true; int stav = 0; float poziceEnkod = 0; int stavPred; int stavCLK; int stavSW; String pass = ""; int lenPass=0; int presed=0; int badpass=0; bool senzorHit=false; /*-----------------------------------*/ void setup() { /************************************** Setup for user Tasks *************S E T U P****************/ pinMode(Switch, INPUT); pinMode(pinCLK, INPUT); pinMode(pinDT, INPUT); pinMode(pinSW, INPUT_PULLUP); pinMode(rLED, OUTPUT); pinMode(bLED, OUTPUT); pinMode(gLED, OUTPUT); Serial.begin(9600); lcd.init(); lcd.backlight(); pinMode(moveSenzor, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(moveSenzor), detect, CHANGE); stavPred = digitalRead(pinCLK); switchStatus = digitalRead(Switch); /* pinMode(otres, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(otres), detect, CHANGE); */ Serial.println("System pro ovladani treyoru bzl ativovan"); /*------------------------------------*/ TT.start(); } //start rtOS /* PROCEDURES SPACE task0 ... task7 ********U S E R C O D E**************/ //vstup z encoderu a kontrola vstupniho kodu void task0() { if(!night and stav!=1){ stavCLK = digitalRead(pinCLK); if (stavCLK != stavPred) { if (digitalRead(pinDT) != stavCLK) { poziceEnkod=poziceEnkod+0.5; if(poziceEnkod>=9){poziceEnkod=0;} }else { poziceEnkod=poziceEnkod-0.5; if(poziceEnkod<0){poziceEnkod=9;} } } stavPred = stavCLK; stavSW = digitalRead(pinSW); if (stavSW == 0) { if(presed>20){ pass=pass + (String)(int)poziceEnkod; poziceEnkod=0; lenPass++; presed=0; } presed++; } lcd.setCursor(0,1); for(int i=0;i2){ pass=""; stav=2; } lcd.clear(); } } }else{ stavSW = digitalRead(pinSW); if (stavSW == 0) { if(presed>400){ presed=0; stav=0; lenPass=0; pass=""; badpass=0; lcd.setCursor(4,0); lcd.print("Uzaviram"); delay(1000); lcd.clear(); } presed++; Serial.println(presed); }else{ presed=0; } } } //nastaveni hodnot pro nocni rezim void task1() { if(night){ if(countLcd==2){ lcd.scrollDisplayRight(); countLcd=0; lenPass=0; pass=""; badpass=0; } countLcd++; } } //kontrola zmenz stavu prepinace void task2() { if(digitalRead(Switch)!=switchStatus){ lcd.clear(); switchStatus=digitalRead(Switch); night = !night; check = !check; if (night){Serial.println("Rezim Noc");}else{Serial.println("Rezim Den");} } } //vypis na display a dalsi nastaveni pri zmenach modu void task3() { if(!night){ switch (stav) { case 0: lcd.setCursor(4,0); lcd.print("Zavreno"); analogWrite(rLED, 0); analogWrite(gLED, 255); analogWrite(bLED, 0); break; case 1: lcd.setCursor(4,0); lcd.print("Otevreno"); analogWrite(rLED, 0); analogWrite(gLED, 0); analogWrite(bLED, 0); blinkRED=false; blinkGREEN=true; break; case 2: lcd.setCursor(5,0); lcd.print("Alarm"); analogWrite(rLED, 0); analogWrite(gLED, 0); analogWrite(bLED, 0); blinkGREEN=false; blinkRED=true; break; } }else{ lcd.setCursor(0,0); lcd.print("Nocni rezim"); blinkGREEN=false; blinkRED=false; if(!senzorHit){ analogWrite(rLED, 0); analogWrite(gLED, 0); analogWrite(bLED, 255); } } } //blikani s RGB zelene void task4() { if(blinkGREEN){ if(analogRead(gLED)==255){ analogWrite(rLED, 0); analogWrite(gLED, 0); analogWrite(bLED, 0); }else{ analogWrite(rLED, 0); analogWrite(gLED, 255); analogWrite(bLED, 0); } } } //blikani s RGB cervene void task5() { if(blinkRED){ if(analogRead(rLED)==255){ analogWrite(rLED, 0); analogWrite(gLED, 0); analogWrite(bLED, 0); }else{ analogWrite(rLED, 255); analogWrite(gLED, 0); analogWrite(bLED, 0); } } } // kominikace s PC void task6() { while (Serial.available() > 0) { String data = Serial.readString(); if (data == "Q") { stav=0; analogWrite(rLED, 0); analogWrite(gLED, 0); analogWrite(bLED, 0); blinkRED=false; blinkGREEN=true; Serial.println("Alarm vypnut"); }else if (data == "R"){ lcd.clear(); switchStatus=digitalRead(Switch); night = !night; check = !check; if (night){Serial.println("Rezim Noc");}else{Serial.println("Rezim Den");} }else if (data == "S"){ Serial.print("Stav: "); switch (stav) { case 0: Serial.println("Zavreno"); break; case 1: Serial.println("Otevreno"); break; case 2: Serial.println("Alarm"); break; } Serial.print("Rezim: "); if(night){Serial.println("Noc"); }else{Serial.println("Den");} }else{ Serial.println("neznama instrukce"); } } } void task7() { } /************************************* ******User S U B R O U T I N E s******/ void detect() { Serial.println("INTERUPT BY HAC-SR501"); if(night){ analogWrite(rLED, 255); analogWrite(gLED, 211); analogWrite(bLED, 0); Serial.println("Podezdrely pohyb"); senzorHit=true; } } /************************************* SUPER LOOP (dispatcher) **** never modify(!!!) ***********/ void loop() {TT.loop();} /************************************** ISR (service Timer2 tic) ***************************************/ ISR(TIMER2_OVF_vect){ TCNT2 =TT.tcnt2; TT._overflow();}