/* * Lukas Kolacek - Ustredni kolo souteze v programovani mikroradicu - zdrojovy kod */ //ZPUSOB ZAPOJENI PERIFERII //KONTROLER: Arduino MEGA (ATmega2560) S POMOCNYM PINOVYM MODULEM //Specialne zapojene periferie //- vsechna tlacitka maji aktivovany pullUp rezistor v cipu //- LCD je pripojeno k I2C pinum SDA a SCL //- jako prepinac mezi rezimy (=spinac) je uzit PRVNI prepinac zleva mezi DPS prepinaci //- nastavena BaudRate = 115200 //POZNAMKY //-predpoklad: zadavani vzdy jedineho prikazu //-kvuli vleklemu ladeni hardwaroveho problemu se omlouvam za maly obsah moji prace //ZAHRNUTI KNIHOVEN #include "LiquidCrystal_I2C.h" //DEFINICE PINU //dva prepinace on/off #define switch1 19 #define switch2 14 //Rotacni Enkoder #define reClk 3 #define reDat 2 #define reBut 18 //PWM rgb LEDka #define rgbR 5 #define rgbG 6 #define rgbB 7 //cidlo otresu #define otrespin 9 //cidlo pohybu #define cidlopin 8 //definice konstant #define RED 1 #define GREEN 2 #define YELLOW 3 #define OFF 4 #define ZAVRENO false #define OTEVRENO true //zapojeni LCD-scl ... SCL pin // LCD-sda ... SDA pin //DEKLARACE PROMENNYCH (nektere jsou volatilni kvuli pouzitym externim prerusenim) bool rezim, lastrezim; bool noc, den, dvere, lastdvere, alarm, lastalarm; bool but, seriove = false; String kod = ""; //OBJEKT LCD 16x2 znaku //adresa LCD prevodnniku je 0x3F (A0-A2 nepropojene) LiquidCrystal_I2C lcd(0x3F, 16, 2); void setup() { //nastaveni input/output pinu pinMode(rgbR, OUTPUT); pinMode(rgbG, OUTPUT); pinMode(rgbB, OUTPUT); pinMode(reClk, INPUT); pinMode(reDat, INPUT); pinMode(reBut, INPUT); pinMode(switch1, INPUT_PULLUP); pinMode(switch2, INPUT_PULLUP); pinMode(otrespin, INPUT); pinMode(cidlopin, INPUT); //zahajeni seriove komunikace o dany Baudrate Serial.begin(115200); //inicializace LCD lcd.begin(); lcd.backlight(); lcd.clear(); //uvodni ohlaseni Serial.println("System pro ovladani trezoru byl aktivovan."); //uvodni nastaveni pro rezim = zaklad je noc rezim = digitalRead(switch1); if (rezim == true) { noc = true; den = false; } else { noc = false; den = true; } //prvotni inicializace promennych rezim = noc; dvere = ZAVRENO; lastdvere = ZAVRENO; alarm = false; lastalarm = false; seriove = false; //dvere na zacatku zavreny lcd.setCursor(0,0); lcd.print(" ZAVRENO "); } void loop() { //pokud zmenen rezim seriove, jiny proces nez pri zmene prepinacem if (seriove == true) { rezim = !rezim; seriove = false; } else { rezim = digitalRead(switch1); } //zmena rezimu if (rezim != lastrezim and dvere == ZAVRENO) { if (rezim == den) { Serial.println("Rezim DEN"); } else { Serial.println("Rezim NOC"); } } //volani ruznych rezimu: den/noc if (rezim == den) { //DEN rezimden(); } else { //NOC rezimnoc(); } lastrezim = rezim; } //JEDNOTLIVE FUNKCE void rgbWrite(int parametr) { // fce pro ovladani RGB, odpovidajici skladani barevnych slozek switch (parametr) { case 1: digitalWrite(rgbR, HIGH); case 2: digitalWrite(rgbG, HIGH); case 3: { digitalWrite(rgbB, HIGH); digitalWrite(rgbG, HIGH); digitalWrite(rgbB, HIGH); } case 4: { digitalWrite(rgbB, LOW); digitalWrite(rgbG, LOW); digitalWrite(rgbB, LOW); } } } void rezimden() { //vypis posunujicich napisu na LCD //napsani stavu if (alarm != lastalarm and alarm == true) { lcd.setCursor(0,0); for (int i=0; i<16; i++) { if (rezim != lastrezim) { break; } lcd.scrollDisplayLeft(); delay(250); } lcd.clear(); lcd.setCursor(0,0); lcd.print(" ALARM "); } else if (dvere != lastdvere and dvere == ZAVRENO) { lcd.setCursor(0,0); for (int i=0; i<16; i++) { if (rezim != lastrezim) { break; } lcd.scrollDisplayLeft(); delay(250); } lcd.clear(); lcd.setCursor(0,0); lcd.print(" ZAVRENO "); } else if (dvere != lastdvere and dvere == OTEVRENO) { lcd.setCursor(0,0); for (int i=0; i<16-5; i++) { if (rezim != lastrezim) { break; } lcd.scrollDisplayLeft(); delay(250); } lcd.clear(); lcd.setCursor(0,0); lcd.print(" OTEVRENO "); for (int i=0; i<16; i++) { if (rezim != lastrezim) { break; } lcd.scrollDisplayLeft(); delay(250); } } lastdvere = dvere; lastalarm = alarm; //prijimani hodnot if (Serial.available() > 0) { char znak = Serial.read(); if (znak == 'S') { Serial.println(); if (rezim == den) { Serial.println("Rezim: DEN"); } else { Serial.println("Rezim: NOC"); } if (dvere == ZAVRENO) { Serial.println("Stav: ZAVRENO"); } else { Serial.println("Stav: OTEVRENO"); } Serial.println(); } if (znak == 'Q') { alarm = false; Serial.println("Alarm vypnut"); } if (znak == 'R') { //rezim = !rezim; seriove = true; Serial.println("Potvrzeni zmeny rezimu"); } } } void rezimnoc() { //prijimani hodnot if (Serial.available() > 0) { char znak = Serial.read(); if (znak == 'S') { Serial.println(); if (rezim == den) { Serial.println("Rezim: DEN"); } else { Serial.println("Rezim: NOC"); } if (dvere == ZAVRENO) { Serial.println("Stav: ZAVRENO"); } else { Serial.println("Stav: OTEVRENO"); } Serial.println(); } if (znak == 'Q') { alarm = false; Serial.println("Alarm vypnut"); } if (znak == 'R') { //rezim = !rezim; seriove = true; Serial.println("Potvrzeni zmeny rezimu"); } } }