/* Bohužel se mi nepodařilo nastavit PIR čidlo tak, aby nastavení bylo optimální -> senzitivita, ... ale program by měl reagovat na pohyb na čidle jsem nedokázal nastavit okamžitou odezvu na pohyb a taky konec pohybu*/ //knihovny #include #include //led pins const int l_r=24; const int l_g=26; const int l_b=25; //rotary encoder const int e_clk=11; const int e_dt=12; const int e_sw=13; //vibracni senzor const int vib=3; //PIR cidlo const int p_sig=18; //DIP switch (cislo 1) const int dip=2; //LCD display LiquidCrystal_I2C lcd(0x27, 16, 2); //promenna rezim - den/noc false=noc boolean rezim=false; //promenna stav - den/noc false=zavreno boolean stav=false; //promenna alarm false=vypnuto boolean alarm=false; void setup() { //definice vstupu a vystupu pinMode(l_r,OUTPUT); pinMode(l_g,OUTPUT); pinMode(l_b,OUTPUT); pinMode(e_clk,INPUT); pinMode(e_dt,INPUT); pinMode(e_sw,INPUT); pinMode(vib,INPUT_PULLUP); pinMode(p_sig,INPUT); pinMode(dip,INPUT_PULLUP); // inicializace LCD lcd.begin(); // zapnutí podsvícení lcd.backlight(); //nastartovani seriove linky s rychlosti 115200 badu Serial.begin(115200); attachInterrupt(digitalPinToInterrupt(dip), zmena, CHANGE); attachInterrupt(digitalPinToInterrupt(vib), vibrace, CHANGE); attachInterrupt(digitalPinToInterrupt(p_sig), pir, RISING); Serial.println("System pro ovladani trezoru byl aktivovan"); modra(); } int i,x,z,x_o,pos,spatne,doba,interrupt,pirint=0,cas,m; int kod [4]; int s,enc_l=HIGH; void loop() { if(pirint==1){ Serial.println("Podezrely pohyb"); zluta(); delay(3000); if(digitalRead(p_sig)==1){ alarm=true; Serial.println("Spusten alarm"); } else modra(); pirint=0; } lcd.noBlink(); char znak; int cislo[4]; if(rezim==false){ if(i==1){ lcd.clear(); i=0; } lcd.setCursor(0,0); lcd.print("Nocni rezim"); } else{ if(stav==false){ if(i==1&&alarm==false){ zelena(); lcd.clear(); lcd.setCursor(4,0); lcd.print("Zavreno"); i=0; z=1; } if(alarm==true&&i==1){ cervena(); lcd.clear(); lcd.setCursor(5,0); lcd.print("Alarm"); i=0; z=1; cas=millis(); } if((millis()-cas)>=1000&&alarm==true){ m++; if(m%2==0) zhasni(); else cervena(); cas=millis(); } if(z!=0){ if(digitalRead(e_sw)==0){ lcd.blink(); lcd.setCursor(0,1); x=0; z=0; pos=0; do{ ; }while(digitalRead(e_sw)==0); } } if(z==0){ x_o=8908; x=0; do{ if(x==10) x=9; if(x==-1) x=0; if(x!=x_o){ lcd.blink(); lcd.setCursor(pos,1); lcd.print(x); lcd.setCursor(pos,1); } if(interrupt==1) break; x_o=x; x=cti(x); if(Serial.available()){break;} }while(digitalRead(e_sw)==1); kod[pos]=x; lcd.setCursor(pos,1); lcd.print("*"); pos++; do{ ; }while(digitalRead(e_sw)==0); if(pos==4) { if(kod[0]==5&&kod[1]==7&&kod[2]==0&&kod[3]==3&&alarm==false) { stav=true; i=1; spatne=0; } else if(kod[0]==6&&kod[1]==2&&kod[2]==1&&kod[3]==9&&alarm==false) { stav=true; i=1; spatne=0; } else if(kod[0]==3&&kod[1]==4&&kod[2]==9&&kod[3]==7) { i=1; alarm=false; } else { i=1; spatne++; } if(spatne==3) { alarm=true; Serial.println("Chybny kod"); } } } } else{ if(i==1){ lcd.clear(); lcd.setCursor(4,0); lcd.print("Otevreno"); i=0; cas=millis(); } if((millis()-cas)>=1000){ m++; if(m%2==0) zhasni(); else zelena(); cas=millis(); } if(digitalRead(e_sw)==0){ doba=1; for(x=0;x<300;x++){ delay(10); if(digitalRead(e_sw)!=0) doba=0; } if(doba==1){ stav=false; i=1; } } } } interrupt=0; if(Serial.available()){ znak=Serial.read(); if(znak=='R') zmena(); else if(znak=='S') vypis_stav(); else if(znak=='Q') { alarm=false; i=1; modra(); Serial.println("Alarm vypnut"); } } if(alarm==true&&rezim==false){ zluta(); } } //reakce na otresy void vibrace(){ if(stav==true) ; else{ Serial.println("Podezrele otresy"); interrupt=1; alarm=true; i=1; } } //reakce na pohyb void pir(){ if(rezim==true) ; else if(alarm!=true){ pirint=1; } } //zmena rezimu den/noc void zmena(){ if(stav==true) ; else{ rezim=!rezim; if(rezim==true) Serial.println("rezim DEN"); else { Serial.println("rezim NOC"); modra(); } i=1; spatne=0; interrupt=1; } } //vypis stavu trezoru void vypis_stav(){ Serial.print("Trezor je v "); if(rezim==true) { Serial.println("dennim rezimu"); if(stav==true) Serial.println("trezor je otevren"); else Serial.println("trezor je uzamcen"); } else Serial.println("nocnim rezimu"); } //rozsviceni zelene barvy void zelena(){ digitalWrite(l_g,1); digitalWrite(l_b,0); digitalWrite(l_r,0); } //cervene barva void cervena(){ digitalWrite(l_g,0); digitalWrite(l_b,0); digitalWrite(l_r,1); } //modra barva void modra(){ digitalWrite(l_g,0); digitalWrite(l_b,1); digitalWrite(l_r,0); } //zluta barva void zluta(){ digitalWrite(l_g,1); digitalWrite(l_b,0); digitalWrite(l_r,1); } //zhasnuti void zhasni(){ digitalWrite(l_g,0); digitalWrite(l_b,0); digitalWrite(l_r,0); } //cteni z enkoderu int cti(int value){ s = digitalRead(e_clk); if ((enc_l == HIGH) && (s == LOW)) { if (digitalRead(e_dt) == HIGH) { value--; } else { value++; } } enc_l = s; return value; }