#include #include //načtení knihoven nastavení komunikace snímače #include #include #define ONE_WIRE_BUS 52 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); LiquidCrystal lcd(8, 9, 4, 5, 6, 7); //SCLK -> 6, I/O -> 7, CE -> 8 virtuabotixRTC myRTC(42, 44, 46); // Promenne float merenaTeplota = 0; // jakoby merena teplota int nastavenaTeplota = 24; // teplota sepnuti termostatu int aktualniObrazovka = 0; // cislo prave sledovane obrazovky int pocetObrazovek = 5; // cislo posledni obrazovky + 0-tá obrazovka int minimum = 0; // doraz minimalni hodnoty - nasatvuje se pro kazdou obrazovku zvlast int maximum = 0; // doraz maximalni hodnoty - nasatvuje se pro kazdou obrazovku zvlast int krok = 0; // o kolik se bude zvysovat/snizovat hodnota int podsviceni = 80; // intenzita podsviceni v % boolean termostat1 = 22; boolean termostat2 = 24;// stav termostatu 0 - vypnut / 1 - zapnut const int Ter1 = 22; const int Ter2 = 24; const int CerP = 23; const int CerK = 25; const int VenP = 27; const int VenR = 29; const int Kot = 31; const int Rez1 = 33; const int Rez2 = 35; const int Rez3 = 37; const int Rez4 = 26; const int Rez5 = 28; const int Rez6 = 30; const int Rez7 = 32; const int Rez8 = 34; const int Rez9 = 36; const int Rez10 = 38; const int piezo = 39; float podsvicenipin = 10; float temp = 0; boolean stavCerP; boolean stavCerK; boolean stavVenP; boolean stavVenR; boolean stavKot; boolean stavter1 = 0; boolean stavter2 = 0; DeviceAddress teplomer1 = {0x28, 0xFF, 0xD0, 0x2D, 0x60, 0x14, 0x04, 0xE8}; DeviceAddress teplomer2 = {0x28, 0xB5, 0x10, 0x56, 0x06, 0x00, 0x00, 0x8E}; void setup() { pinMode(Rez1, OUTPUT); pinMode(Rez2, OUTPUT); pinMode(Rez3, OUTPUT); pinMode(Rez4, INPUT); pinMode(Rez5, INPUT); pinMode(Rez6, INPUT); pinMode(Rez7, INPUT); pinMode(Rez8, INPUT); pinMode(Rez9, INPUT); pinMode(Rez10, INPUT); pinMode(Ter1, INPUT); pinMode(Ter2, INPUT); pinMode(CerP, OUTPUT); pinMode(CerK, OUTPUT); pinMode(VenP, OUTPUT); pinMode(VenR, OUTPUT); pinMode(Kot, OUTPUT); pinMode(piezo, OUTPUT); pinMode(podsvicenipin, OUTPUT); digitalWrite(Rez1, HIGH); digitalWrite(Rez2, HIGH); digitalWrite(Rez3, HIGH); digitalWrite(CerP, HIGH); digitalWrite(CerK, HIGH); digitalWrite(VenP, HIGH); digitalWrite(VenR, HIGH); digitalWrite(Kot, HIGH); analogWrite(podsvicenipin, 255); sensors.begin(); lcd.begin(16, 2); Serial.begin(9600); myRTC.setDS1302Time(00,05, 16, 6, 20, 3, 2016); lcd.setCursor(0, 0); lcd.print("SPOUSTIM AUTOMAT"); lcd.setCursor(3, 1); lcd.print("verze 1.0"); delay(5000); lcd.begin(16, 2); lcd.clear(); aktualniObrazovka = 0; } void loop() { stavCerP = digitalRead(CerP); //termostat stavCerK = digitalRead(CerK); stavVenP = digitalRead(VenP); stavVenR = digitalRead(VenR); stavKot = digitalRead(Kot); sensors.requestTemperatures(); merenaTeplota = sensors.getTempC(teplomer2); if (merenaTeplota == -127) { tone(piezo, 500, 200); } stavter2 = digitalRead(Ter2); stavter1 = digitalRead(Ter1); if (merenaTeplota == -127) { digitalWrite(CerK, LOW); } if (stavter1 == HIGH ) //termostat prizemi { digitalWrite(Kot, LOW); digitalWrite(VenP, LOW); digitalWrite(CerP, LOW) ; } else { digitalWrite(Kot, HIGH); digitalWrite(VenP, HIGH); digitalWrite(CerP, HIGH); } if (stavter2 == HIGH) // temrostat patro { digitalWrite(Kot, LOW); digitalWrite(VenR, LOW); } else { digitalWrite(Kot, HIGH); digitalWrite(VenR, HIGH); } if ((stavter1 == HIGH) || (stavter2 == HIGH)) { digitalWrite(Kot, LOW); } else { digitalWrite(Kot, HIGH); } if (((merenaTeplota >= nastavenaTeplota) && (stavter1 == HIGH)) || (merenaTeplota == -127)) { digitalWrite(CerK, LOW); } else { digitalWrite(CerK, HIGH); } lcd.clear(); // mazani lcd switch (aktualniObrazovka) // rozdeluje funkce a text jednotlivych obrazovek { case 0 : { // prehledova obrazovka lcd.setCursor(0, 0); // nastav kurzor na zacatek prvniho radku lcd.print("T krb:"); // perfix lcd.print(merenaTeplota); // hodnota "merene" teploty lcd.print((char)223); lcd.print("C"); // jednotky if (merenaTeplota == -127) { lcd.setCursor(0,1); lcd.print("Chyba snimace"); } readkey(); // cteni klaves break; } case 1 : { // nastaveni tremostatu minimum = 0; // doraz minimalni hodnoty maximum = 50; // doraz maximalni hodnoty krok = 1; // o kolik se bude zvysovat/snizovat hodnota lcd.setCursor(0, 0); // nastav kurzor na zacatek prvniho radku lcd.print("Nast.T vody krb"); lcd.setCursor(0, 1); // nastav kurzor na zacatek druheho radku lcd.print(nastavenaTeplota); // teplota sepnuti termostatu lcd.print((char)223); lcd.print("C"); // jednotky nastavenaTeplota = readkey(nastavenaTeplota); // cteni klaves a uprava promenne break; } case 2 : { // nastaveni podsviceni minimum = 0; // doraz minimalni hodnoty maximum = 100; // doraz maximalni hodnoty krok = 5; // o kolik se bude zvysovat/snizovat hodnota lcd.setCursor(0, 0); // nastav kurzor na zacatek prvniho radku lcd.print("Podsviceni LCD"); lcd.setCursor(0, 1); // nastav kurzor na zacatek druheho radku lcd.print(podsviceni); // teplota sepnuti termostatu lcd.print("%"); // jednotky podsviceni = readkey(podsviceni); // cteni klaves a uprava promenne break; } case 3 : { // about lcd.clear(); lcd.setCursor(0, 0); lcd.print("Prehled I/O"); lcd.setCursor(1, 1); if (stavCerP == HIGH) { lcd.print("0"); } else { lcd.print("1"); } lcd.setCursor(2, 1); if (stavCerK == HIGH) { lcd.print("0"); } else { lcd.print("1"); } lcd.setCursor(3, 1); if (stavVenP == HIGH) { lcd.print("0"); } else { lcd.print("1"); } lcd.setCursor(4, 1); if (stavVenR == HIGH) { lcd.print("0"); } else { lcd.print("1"); } lcd.setCursor(5, 1); if (stavKot == HIGH) { lcd.print("0"); } else { lcd.print("1"); } lcd.setCursor(12, 0); lcd.print("T1"); lcd.setCursor(14, 0); lcd.print("T2"); lcd.setCursor(12, 1); lcd.print(stavter1); lcd.setCursor(14, 1); lcd.print(stavter2); Serial.print(stavVenR); readkey(); // cteni klaves break; } case 4 : { lcd.clear(); lcd.setCursor(0, 0); lcd.print("Prazdna"); readkey(); break; } case 5 : { lcd.clear(); myRTC.updateTime(); lcd.begin(16,2); lcd.setCursor(0,0); lcd.print(myRTC.dayofmonth); lcd.setCursor(2,0); lcd.print("."); lcd.print(myRTC.month); lcd.setCursor(5,0); lcd.print("."); lcd.setCursor(6,0); lcd.print(myRTC.year); lcd.setCursor(0,1); lcd.print(myRTC.hours); lcd.setCursor(2,1); lcd.print(":"); lcd.setCursor(3,1); lcd.print(myRTC.minutes); lcd.setCursor(5,1); lcd.print(":"); lcd.setCursor(6,1); lcd.print(myRTC.seconds); readkey(); break; } default : { // pro pripad kolize cisla obrazovek aktualniObrazovka = 0; // nulovani cisla obrazovky break; } } analogWrite(podsvicenipin, podsviceni * 2.5); // intenzita podsviceni delay(250); // zabranuje kmitani obrazovky a vytvari zpozdeni mezi stisky klaves } int readkey(int hodnota) { // cteni klaves a reakce na jejich stisk if (analogRead(0) < 555 && analogRead(0) > 380) { // sipka vlevo if (hodnota > minimum) { hodnota = hodnota - krok; // zmensi o krok } } if (analogRead(0) < 380 && analogRead(0) > 195) { // sipka dolu if (aktualniObrazovka < pocetObrazovek) { aktualniObrazovka++; //prejdi na na dalsi obrazovku } else { aktualniObrazovka = 0; // prejdi na obrazovku 0 } } if (analogRead(0) < 195 && analogRead(0) > 50) { // sipka nahoru if (aktualniObrazovka > 0) { aktualniObrazovka--; //prejdi na na dalsi obrazovku } else { aktualniObrazovka = pocetObrazovek; // prejdi na obrazovku 0 } } if (analogRead(0) < 50) { // sipka vpravo if (hodnota < maximum) { hodnota = hodnota + krok; // zvetsi o krok } } return hodnota; // navrat upravene hodnoty } void readkey() { // cteni klaves a reakce na jejich stisk - bez editace if (analogRead(0) < 380 && analogRead(0) > 195) { // sipka dolu if (aktualniObrazovka < pocetObrazovek) { aktualniObrazovka++; //prejdi na na dalsi obrazovku } else { aktualniObrazovka = 0; // prejdi na obrazovku 0 } } if (analogRead(0) < 195 && analogRead(0) > 50) { // sipka nahoru if (aktualniObrazovka > 0) { aktualniObrazovka--; //prejdi na na dalsi obrazovku } else { aktualniObrazovka = pocetObrazovek; // prejdi na obrazovku 0 } } }