#include #include "LedControl.h" #include int displaytime = 300; //The overall speed of the thermostat display float calibration = 0; //Withthis variable you can calibrate the temperature sensor by adding or extracting from its value //Sensors and the hardware Adafruit_AHTX0 aht; LedControl DP = LedControl(2, 4, 3, 1); int button1 = 5, button2 = 6, button3 = 7; int YellowLed = 9, RedLed = 8; //Main containers for displaying and showing the display data int DPCurrent[7]; //Load the default values for the diplayer struct whichwill contain all the displayable data int Menu[6]; int currentLetter = 0; //The crrently displayed letter int seCurrentLetter = 0; //the currently displayed letter of the value int CurrentDisplayed = 0; //Which container is displayed at the moment int ActiveBurner = 0; //1 is wood burner 2 is gas burner char isstatic = 'n'; int scheduler = 0; bool menu = false, first = true, manual = false; float temperaturesum =0; int menuTimer = 0; int hiszterezis = 50; //Itt allithato a termosztat hiszterezise void setup() { // put your setup code here, to run once: Serial.begin(9600); DP.shutdown(0, false); DP.setIntensity(0, 0.1); DP.clearDisplay(0); aht.begin(); pinMode(button1, INPUT_PULLUP); pinMode(button2, INPUT_PULLUP); pinMode(button3, INPUT_PULLUP); pinMode(RedLed, OUTPUT); pinMode(YellowLed, OUTPUT); DPCurrent[0] = 9999; //This is PERMANENT Menu[0] = EEPROM.get(0, Menu[0]); Menu[1] = EEPROM.get(2, Menu[1]); Menu[2] = EEPROM.get(4, Menu[2]); Menu[3] = 0; Menu[4] = EEPROM.get(6, Menu[4]); Menu[5] = EEPROM.get(8, Menu[5]); } String GetDPCValue(int elem){ String Datawriteout; switch (elem) { case 0: Datawriteout = "hommerseklet..."; break; case 1: Datawriteout = "paratartalomm..."; break; case 2: Datawriteout = "celhommerseklet..."; break; case 3: Datawriteout = "kulonbseg..."; break; case 4: Datawriteout = "aktiv kazan..."; break; case 5: Datawriteout = "hofok vegyes..."; break; case 6: Datawriteout = "hofok puffer..."; } return Datawriteout; } String GetMenuValue(int elem){ String Datawriteout; switch (elem) { case 0: Datawriteout = "futes ki.be..."; break; case 1: Datawriteout = "hofok elsodleges kazanhoz..."; break; case 2: Datawriteout = "hofok mmasodlagos kazanhoz..."; break; case 3: Datawriteout = "mmanual mmode kivalasztasa..."; break; case 4: Datawriteout = "elsodleges kazan kivalasztasa..."; break; case 5: Datawriteout = "futesimmod kivalasztasa..."; } return Datawriteout; } byte segmentABC(char letter){ byte BinaryLetter; switch(letter){ case 'a': BinaryLetter = B01110111; break; case 'b': BinaryLetter = B0011111; break; case 'c': BinaryLetter = B01001110; break; case 'd': BinaryLetter = B00111101; break; case 'e': BinaryLetter = B01001111; break; case 'f': BinaryLetter = B01000111; break; case 'g': BinaryLetter = B01011110; break; case 'h': BinaryLetter = B00010111; break; case 'i': BinaryLetter = B00110000; break; case 'j': BinaryLetter = B01011000; break; case 'k': BinaryLetter = B00110111; break; case 'l': BinaryLetter = B00001110; break; case 'm': BinaryLetter = B00010101; break; case 'n': BinaryLetter = B00010101; break; case 'o': BinaryLetter = B00011101; break; case 'p': BinaryLetter = B01100111; break; case 'q': BinaryLetter = B01110011; break; case 'r': BinaryLetter = B00000101; break; case 's': BinaryLetter = B01011011; break; case 't': BinaryLetter = B00001111; break; case 'v': BinaryLetter = B00011100; break; case 'u': BinaryLetter = B00011100; break; case 'y': BinaryLetter = B00110011; break; case 'z': BinaryLetter = B01101101; break; case '.': BinaryLetter = B10000000; break; case '1': BinaryLetter = B00110000; break; case '2': BinaryLetter = B01101101; break; case '3': BinaryLetter = B01111001; break; default: BinaryLetter = B00000000; } return BinaryLetter; } byte segmentNumbers(char letter){ byte BinaryLetter; switch(letter){ case '0': BinaryLetter = B01111110; break; case '1': BinaryLetter = B00110000; break; case '2': BinaryLetter = B01101101; break; case '3': BinaryLetter = B01111001; break; case '4': BinaryLetter = B00110011; break; case '5': BinaryLetter = B01011011; break; case '6': BinaryLetter = B1011111; break; case '7': BinaryLetter = B01110000; break; case '8': BinaryLetter = B01111111; break; case '9': BinaryLetter = B01111011; break; case '-': BinaryLetter = B00000001; break; } return BinaryLetter; } void displaytimer(char skip = 'n'){ //skip could have 3 values default is n (not to skip), f is skip forward, b is skip backwards if(skip == 'f'){ if(CurrentDisplayed +1 >= sizeof(DPCurrent) / sizeof(DPCurrent[0]) ) CurrentDisplayed = 0; else CurrentDisplayed++; currentLetter = 0; seCurrentLetter = 0; } if(skip == 'b'){ if(CurrentDisplayed -1 < 0 ) CurrentDisplayed = sizeof(DPCurrent) / sizeof(DPCurrent[0]); else CurrentDisplayed--; currentLetter = 0; seCurrentLetter = 0; } String CurrentlyDisplayedText = GetDPCValue(CurrentDisplayed); if(currentLetter < CurrentlyDisplayedText.length()){ DP.clearDisplay(0); for(int j = 0; j <= currentLetter; j++){ DP.setRow(0,j,segmentABC(CurrentlyDisplayedText[currentLetter-j])); } currentLetter++; } if(CurrentDisplayed == 3) DPCurrent[3] = DPCurrent[0] - DPCurrent[2]; if(currentLetter >= CurrentlyDisplayedText.length() && seCurrentLetter > -10 && CurrentDisplayed != 4 && CurrentDisplayed < sizeof(DPCurrent) / sizeof(DPCurrent[0])){ DP.clearDisplay(0); DP.clearDisplay(0); String a; if(DPCurrent[CurrentDisplayed] < 0){ a = "-"; for(int i = 0; i < 4-String(DPCurrent[CurrentDisplayed]*-1).length(); i++){ a += "0"; } a += String(DPCurrent[CurrentDisplayed]*-1); DP.setRow(0,6,segmentNumbers(a[0])); DP.setRow(0,5,segmentNumbers(a[1])); byte modifi = segmentNumbers(a[2]); modifi |= (1 << 7);; DP.setRow(0,4, modifi); DP.setRow(0,3,segmentNumbers(a[3])); DP.setRow(0,2,segmentNumbers(a[4])); } else{ a = ""; for(int i = 0; i < 4-String(DPCurrent[CurrentDisplayed]).length(); i++){ a += "0"; } a += String(DPCurrent[CurrentDisplayed]); DP.setRow(0,5,segmentNumbers(a[0])); byte modifi = segmentNumbers(a[1]); modifi |= (1 << 7);; DP.setRow(0,4, modifi); DP.setRow(0,3,segmentNumbers(a[2])); DP.setRow(0,2,segmentNumbers(a[3])); } if(CurrentDisplayed != 1){ DP.setRow(0,1,B01100011); DP.setRow(0,0,segmentABC('c')); }else{ DP.setRow(0,1,segmentABC('r')); DP.setRow(0,0,segmentABC('h')); } seCurrentLetter--; } bool securrentready = false; if(currentLetter >= CurrentlyDisplayedText.length() && CurrentDisplayed == 4){ DP.clearDisplay(0); String securrentText = ""; switch(DPCurrent[4]){ case 0: securrentText = "nincs aktiv..."; break; case 1: securrentText = "vegyes kazan."; break; case 2: securrentText = "gaz kazan."; } if(seCurrentLetter < CurrentlyDisplayedText.length()){ for(int j = 0; j <= seCurrentLetter; j++){ DP.setRow(0,j,segmentABC(securrentText[seCurrentLetter-j])); } seCurrentLetter++; if(seCurrentLetter >= securrentText.length()) securrentready = true; } } if((currentLetter >= CurrentlyDisplayedText.length() && (securrentready || seCurrentLetter <= -10)) || CurrentDisplayed >= sizeof(DPCurrent) / sizeof(DPCurrent[0]) ){ if(skip == 'n'){ if(CurrentDisplayed +1 > sizeof(DPCurrent) / sizeof(DPCurrent[0]) ) CurrentDisplayed = 0; else CurrentDisplayed++; } currentLetter = 0; seCurrentLetter = 0; } } char BlinkYellow(char isstatic = 'n'){ digitalWrite(YellowLed, HIGH); while(digitalRead(button2) == LOW || digitalRead(button3) == LOW){ if(digitalRead(button2) == LOW && digitalRead(button3) == LOW){ digitalWrite(YellowLed, LOW); if(isstatic == 'n') isstatic = 'c'; else isstatic = 'n'; while(digitalRead(button2) == LOW || digitalRead(button3) == LOW); break; } } digitalWrite(YellowLed, LOW); return isstatic; } void displayTheTextValue(String &Writeout){ DP.clearDisplay(0); if(seCurrentLetter < Writeout.length()){ for(int j = 0; j <= seCurrentLetter; j++){ DP.setRow(0,j,segmentABC(Writeout[seCurrentLetter-j])); } seCurrentLetter++; }else{ seCurrentLetter = 0; } } void displayTheNumberValue(){ DP.clearDisplay(0); String a; if(Menu[CurrentDisplayed] < 0){ a = "-"; for(int i = 0; i < 4-String(Menu[CurrentDisplayed]*-1).length(); i++){ a += "0"; } a += String(Menu[CurrentDisplayed]*-1); DP.setRow(0,6,segmentNumbers(a[0])); DP.setRow(0,5,segmentNumbers(a[1])); byte modifi = segmentNumbers(a[2]); modifi |= (1 << 7);; DP.setRow(0,4, modifi); DP.setRow(0,3,segmentNumbers(a[3])); DP.setRow(0,2,segmentNumbers(a[4])); } else{ a = ""; for(int i = 0; i < 4-String(Menu[CurrentDisplayed]).length(); i++){ a += "0"; } a += String(Menu[CurrentDisplayed]); DP.setRow(0,5,segmentNumbers(a[0])); byte modifi = segmentNumbers(a[1]); modifi |= (1 << 7);; DP.setRow(0,4, modifi); DP.setRow(0,3,segmentNumbers(a[2])); DP.setRow(0,2,segmentNumbers(a[3])); } DP.setRow(0,1,B01100011); DP.setRow(0,0,segmentABC('c')); } void menuController(char skip = 'n', int change = 0){ while(digitalRead(button1) == LOW); if(menuTimer >= 200) CurrentDisplayed = 6; //Sets the amount of time you can spend inside a menu if(first){ DP.clearDisplay(0); DP.setRow(0,6, segmentABC('m')); DP.setRow(0,5, segmentABC('m')); DP.setRow(0,4, segmentABC('e')); DP.setRow(0,3, segmentABC('n')); DP.setRow(0,2, segmentABC('u')); delay(1500); DP.clearDisplay(0); CurrentDisplayed = 0; currentLetter = 0; seCurrentLetter = 0; first = false; } if(skip == 'f'){ CurrentDisplayed++; currentLetter = 0; seCurrentLetter = 0; } if(currentLetter < GetMenuValue(CurrentDisplayed).length() && menu != false){ DP.clearDisplay(0); for(int j = 0; j <= currentLetter; j++){ DP.setRow(0,j,segmentABC(GetMenuValue(CurrentDisplayed)[currentLetter-j])); } currentLetter++; } if(currentLetter >= GetMenuValue(CurrentDisplayed).length() && menu != false){ digitalWrite(YellowLed, HIGH); if(change != 0) seCurrentLetter = 0; String Writeout; if(CurrentDisplayed == 0){ //When the first menu is selected if(change > 0) Menu[0] = 1; Menu[0]; if(change < 0) Menu[0] = 0; Menu[0]; switch (int(Menu[0])){ case 1: Writeout = "be kapcsolva"; break; case 0: Writeout = "ki kapcsolva"; break; } displayTheTextValue(Writeout); } if(CurrentDisplayed == 1){ //When the Second menu is selected if(change > 0) { if( (Menu[1] - 50) <= 4500) Menu[1] += 50;} if(change < 0) { if( (Menu[1] - 50) >= 500) Menu[1] -= 50; if(Menu[2] > Menu[1]) Menu[2] = Menu[1]-100;} displayTheNumberValue(); } if(CurrentDisplayed == 2){ //When the third menu is selected if(change > 0) { if((Menu[1]-100) > (Menu[2])) Menu[2] += 50;} if(change < 0) { if( (Menu[2] - 50) >= 500) Menu[2] -= 50;} displayTheNumberValue(); } if(CurrentDisplayed == 3){ //Manual mode selector (fouth menu) if(change > 0 && Menu[3] < 2) { Menu[3] += 1;} if(change < 0 && Menu[3] > 0) { Menu[3] -= 1;} switch (int(Menu[3])){ case 0: Writeout = "kikapcsolva"; break; case 1: Writeout = "vegyes aktiv"; break; case 2: Writeout = "gaz aktiv"; break; } displayTheTextValue(Writeout); } if(CurrentDisplayed == 4){ //Primary burner selector (fourth menu) if(change > 0) Menu[4] = 1; if(change < 0) Menu[4] = 0; switch(Menu[4]){ case 0: Writeout = "vegyes kazan"; break; case 1: Writeout = "gaz kazan"; break; } displayTheTextValue(Writeout); } if(CurrentDisplayed == 5){ //Automation behaviour selector (fith menu) if(change > 0 && Menu[5] < 3) { Menu[5] += 1;} if(change < 0 && Menu[5] > 0) { Menu[5] -= 1;} switch (int(Menu[5])){ case 0: Writeout = "csak elsodleges"; break; case 1: Writeout = "auto 1"; break; case 2: Writeout = "auto 2"; break; case 3: Writeout = "auto 3"; break; } displayTheTextValue(Writeout); } } if(CurrentDisplayed == 6){ saveChanges(); DP.clearDisplay(0); DP.setRow(0,7, segmentABC('m')); DP.setRow(0,6, segmentABC('m')); DP.setRow(0,5, segmentABC('e')); DP.setRow(0,4, segmentABC('n')); DP.setRow(0,3, segmentABC('t')); DP.setRow(0,2, segmentABC('v')); DP.setRow(0,1, segmentABC('e')); delay(1500); DP.clearDisplay(0); menu = false; digitalWrite(YellowLed, LOW); first = true; CurrentDisplayed = 0; } } void burnerOnoff(){ DPCurrent[4] = ActiveBurner; if(ActiveBurner > 0){ digitalWrite(RedLed, HIGH); }else { digitalWrite(RedLed, LOW); } } void takeAction(){ if(Menu[0] > 0){ if(Menu[3] > 0){ //Takes action if manual mode is ON if(DPCurrent[0] >= DPCurrent[2]){ Menu[3] = 0; ActiveBurner = 0; DPCurrent[2] = 0; manual = false; }else { ActiveBurner = Menu[3]; } }else if(Menu[5] == 0){ DPCurrent[2] = Menu[1]; //Sets the target heat on the screen if((DPCurrent[0] < Menu[1] - hiszterezis) && DPCurrent[0] < Menu[1]){ ActiveBurner = Menu[4]+1; }else if(DPCurrent[0] > Menu[1]) ActiveBurner = 0; }else if(Menu[5] == 1){ DPCurrent[2] = Menu[1]; if((DPCurrent[0] < Menu[1] - hiszterezis) && (DPCurrent[0] < Menu[1]) && (DPCurrent[0] > Menu[2])){ DPCurrent[2] = Menu[1]; ActiveBurner = Menu[4]+1; }else if((DPCurrent[0] < Menu[2] - hiszterezis) && DPCurrent[0] < Menu[2]){ DPCurrent[2] = Menu[2]; switch (Menu[4]+1){ case 1: ActiveBurner = 2; break; case 2: ActiveBurner = 1; break; } } else if(DPCurrent[0] > Menu[2]){ ActiveBurner = Menu[4]+1;} else if(DPCurrent[0] > Menu[1]) {ActiveBurner = 0; } }else if(Menu[5] == 2){ DPCurrent[2] = Menu[1]; if((DPCurrent[0] < Menu[1] - hiszterezis) && DPCurrent[0] < Menu[1] && DPCurrent[0] > Menu[2]){ DPCurrent[2] = Menu[1]; if(ActiveBurner == 0) ActiveBurner = Menu[4]+1; }else if((DPCurrent[0] < Menu[2] - hiszterezis) && DPCurrent[0] < Menu[2]){ DPCurrent[2] = Menu[1]; switch (Menu[4]+1){ case 1: ActiveBurner = 2; break; case 2: ActiveBurner = 1; break; } } else if((DPCurrent[0] > Menu[1])) ActiveBurner = 0; } else if(Menu[5] == 3){ DPCurrent[2] = Menu[1]; if((DPCurrent[0] < Menu[1] - hiszterezis) && DPCurrent[0] < Menu[1] && DPCurrent[0] > Menu[1] - hiszterezis*2){ DPCurrent[2] = Menu[1]; ActiveBurner = Menu[4]+1; }else if((DPCurrent[0] < Menu[1] - hiszterezis*2) && DPCurrent[0] < Menu[1]){ DPCurrent[2] = Menu[1]; switch (Menu[4]+1){ case 1: ActiveBurner = 2; break; case 2: ActiveBurner = 1; break; } } else if(DPCurrent[0] > Menu[1]) ActiveBurner = 0; } } else{ ActiveBurner = 0; } burnerOnoff(); } void saveChanges(){ if(Menu[3] > 0 && manual == false){ //If manual mode is on if(DPCurrent[2] != DPCurrent[0]+100){ DPCurrent[2] = DPCurrent[0]+100; manual = true; } } if(Menu[3] == 0){ manual = false; } int value; // Temporary variable to store the read value EEPROM.get(0, value); if(value != Menu[0]) { EEPROM.put(0, Menu[0]); } EEPROM.get(2, value); if(value != Menu[1]) { EEPROM.put(2, Menu[1]); } EEPROM.get(4, value); if(value != Menu[2]) { EEPROM.put(4, Menu[2]); } EEPROM.get(6, value); if(value != Menu[4]) { EEPROM.put(6, Menu[4]); } EEPROM.get(8, value); if(value != Menu[5]) { EEPROM.put(8, Menu[5]); } }; int messagetimer = 0; int connectionActivity = 0; int blinker = 0; void loop() { if(messagetimer == 10 && !Serial.available()){ String SMessage = "A"; SMessage += String(ActiveBurner % 10); // Ensure ActiveBurner is a single digit SMessage += String(Menu[3] % 10); // Ensure Menu[0] is a single digit SMessage += String(Menu[0] % 10); Serial.println(SMessage); }else if(messagetimer == 14){ if(Serial.available()){ String RMessage = Serial.readString(); Serial.println(RMessage); if(RMessage[0] == 'B'){ connectionActivity = 0; digitalWrite(YellowLed, LOW); if(RMessage[1] == '0') Menu[3] = 0; if(RMessage[1] == '1') Menu[3] = 1; if(RMessage[1] == '2') Menu[3] = 2; if(RMessage[2] == '0') Menu[0] = 0; if(RMessage[2] == '1') Menu[0] = 1; String a = RMessage.substring(3, 7); DPCurrent[5] = int(a.toInt()); a = RMessage.substring(7, 11); DPCurrent[6] = int(a.toInt()); saveChanges(); }else{ if(connectionActivity < 300) connectionActivity++; } } messagetimer = 0; if(connectionActivity < 300) connectionActivity++; } if(connectionActivity > 5){ if(blinker >= 1 && blinker < 2){digitalWrite(YellowLed, HIGH);} if(blinker >= 1 && blinker > 2){digitalWrite(YellowLed, LOW); blinker = 0;}; blinker++; } if(scheduler <= 50){ sensors_event_t humidity, temp; aht.getEvent(&humidity, &temp); temperaturesum += temp.temperature + calibration; DPCurrent[1] = int((humidity.relative_humidity)*100); scheduler++; }else{ DPCurrent[0] = int((temperaturesum / scheduler)*100); temperaturesum =0; scheduler = 0; } if(menu == false){ messagetimer++; takeAction(); displaytimer(isstatic); for(int i = 0; i < displaytime; i++){ if(digitalRead(button2) == LOW){ isstatic = BlinkYellow(isstatic); if(isstatic == 'n') displaytimer('b'); delay(100); break;} if(digitalRead(button3) == LOW){ isstatic = BlinkYellow(isstatic); if(isstatic == 'n') displaytimer('f'); delay(100); delay(1); break;} if(digitalRead(button1) == LOW){ menuTimer = 0; menu = true; break; } delay(1); } } else{ menuController(); for(int i = 0; i < displaytime; i++){ if(digitalRead(button1) == LOW){ while(digitalRead(button1) == LOW) digitalWrite(YellowLed, LOW); menuTimer = 0; menuController( 'f'); break;} if(digitalRead(button2) == LOW){ while(digitalRead(button2) == LOW) digitalWrite(YellowLed, LOW); menuTimer = 0; menuController( 'n', -1); break;} if(digitalRead(button3) == LOW){ while(digitalRead(button3) == LOW) digitalWrite(YellowLed, LOW); menuTimer = 0; menuController( 'n', 1); break;} delay(1); } menuTimer += 1; } }