This commit is contained in:
2024-09-12 16:14:00 +02:00
commit 21a7ec26e4
30 changed files with 2223 additions and 0 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 MiB

27
Termisztor/Termisztor.ino Normal file
View File

@ -0,0 +1,27 @@
int ThermistorPin = 5;
int Vo;
float R1 = 10000;
float logR2, R2, T, Tc, Tf;
float c1 = 1.1384e-03, c2 = 2.3245e-04, c3 = 9.489e-08;
void setup() {
Serial.begin(9600);
}
void loop() {
Vo = analogRead(ThermistorPin);
R2 = R1 * (1023.0 / (float)Vo - 1.0);
logR2 = log(R2);
T = (1.0 / (c1 + c2*logR2 + c3*logR2*logR2*logR2));
Tc = T - 273.15;
Tf = (Tc * 9.0)/ 5.0 + 32.0;
Serial.print("Temperature: ");
Serial.print(Tf);
Serial.print(" F; ");
Serial.print(Tc);
Serial.println(" C");
delay(500);
}

Binary file not shown.

1144
Thermostat.html Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,723 @@
#include <EEPROM.h>
#include "LedControl.h"
#include <Adafruit_AHTX0.h>
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;
}
}

View File

@ -0,0 +1,142 @@
int autoLed = 2, woodBurnerLed = 3, gasBurnerLed = 4;
int autoButton = 5, woodburnerButton = 6, gasBurnerButton = 7;
int woodBurnerRelay = 8, gasBurnerRelay = 9;
int blinker = 0;
bool owerride = false;
int manual = 0;
int connectionActivity = 0;
int timer = 0;
int turnedOn = 0;
bool heating = false;
int burnTemp = 0, pufferTemp = 0;
int ThermistorPin = 5;
int ThermistorPin2 = 3;
int Vo;
float R1 = 10000;
float logR2, R2, T, Tc, Tf;
float c1 = 1.1384e-03, c2 = 2.3245e-04, c3 = 9.489e-08;
void setup() {
// put your setup code here, to run once:
pinMode(autoLed, OUTPUT);
pinMode(woodBurnerLed, OUTPUT);
pinMode(gasBurnerLed, OUTPUT);
pinMode(autoButton, INPUT_PULLUP);
pinMode(woodburnerButton, INPUT_PULLUP);
pinMode(gasBurnerButton, INPUT_PULLUP);
pinMode(woodBurnerRelay, OUTPUT);
digitalWrite(woodBurnerRelay, HIGH);
delay(1);
pinMode(gasBurnerRelay, OUTPUT);
digitalWrite(gasBurnerRelay, HIGH);
Serial.begin(9600);
}
void burnersonoff(){
if(heating){
if(turnedOn == 0){
digitalWrite(woodBurnerLed, LOW);
digitalWrite(gasBurnerLed, LOW);
digitalWrite(woodBurnerRelay, HIGH);
digitalWrite(gasBurnerRelay, HIGH);
}else if(turnedOn == 1){
digitalWrite(woodBurnerLed, HIGH);
digitalWrite(woodBurnerRelay, LOW);
digitalWrite(gasBurnerLed, LOW);
digitalWrite(gasBurnerRelay, HIGH);
}else if(turnedOn == 2){
digitalWrite(gasBurnerLed, HIGH);
digitalWrite(gasBurnerRelay, LOW);
digitalWrite(woodBurnerLed, LOW);
digitalWrite(woodBurnerRelay, HIGH);
}
}
}
void loop() {
if (Serial.available()) {
String message = Serial.readString();
if(message[0] == 'A'){
connectionActivity = 0;
if(owerride == false){
if(message[1] == '0'){
turnedOn = 0;
}else if(message[1] == '1'){
turnedOn = 1;
}else if(message[1] == '2'){
turnedOn = 2;
}
if(message[2] == '0'){
manual = 0;
}else if (message[2] == '1'){
manual = 1;
}else if(message[2] == '2'){
manual = 2;
}
if(message[3] == '1'){
heating = true;
}else heating = false;
}else owerride = false;
String Message = "B";
Message += manual;
if(heating) Message += "1";
else Message += "0";
String a = "";
for(int i = 0; i < 4-String(burnTemp).length(); i++){
a += "0";
}
a += String(burnTemp);
Message += a;
a = "";
for(int i = 0; i < 4-String(pufferTemp).length(); i++){
a += "0";
}
a += String(pufferTemp);
Message += a;
Serial.println(Message);
}else{
if(connectionActivity < 200) connectionActivity++;
}
burnersonoff();
}else{
if(connectionActivity < 200) connectionActivity++;
}
if(connectionActivity > 30){
if(blinker >= 1 && blinker < 2){analogWrite(autoLed, 255);}
if(blinker >= 1 && blinker > 2){analogWrite(autoLed, 0); blinker = 0;};
blinker++;
turnedOn = 0;
burnersonoff();
}
for(int i = 0; i < 500; i++){
if(connectionActivity < 30){
if(digitalRead(autoButton) == LOW) { while(digitalRead(autoButton) == LOW); if(manual > 0) manual = 0; else heating = !heating; turnedOn = 0; burnersonoff(); owerride = true;}
if(digitalRead(woodburnerButton) == LOW) { while(digitalRead(woodburnerButton) == LOW); if(manual == 1 && turnedOn == 1){manual = 0; turnedOn = 0;}else { manual = 1; turnedOn = 1;} heating = true; burnersonoff(); owerride = true;}
if(digitalRead(gasBurnerButton) == LOW) { while(digitalRead(gasBurnerButton) == LOW); if(manual == 2 && turnedOn == 2){manual = 0; turnedOn = 0;}else { manual = 2; turnedOn = 2;}heating = true; burnersonoff(); owerride = true;}
if(manual == 0 && heating){ analogWrite(autoLed, 255); }else analogWrite(autoLed, 0);
}
delay(1);
}
Vo = analogRead(ThermistorPin);
if(Vo <= 0) Vo = 0;
R2 = R1 * (1023.0 / (float)Vo - 1.0);
logR2 = log(R2);
T = (1.0 / (c1 + c2*logR2 + c3*logR2*logR2*logR2));
Tc = T - 273.15;
burnTemp = int(Tc*100);
Vo = analogRead(ThermistorPin2);
if(Vo <= 0) Vo = 0;
R2 = R1 * (1023.0 / (float)Vo - 1.0);
logR2 = log(R2);
T = (1.0 / (c1 + c2*logR2 + c3*logR2*logR2*logR2));
Tc = T - 273.15;
pufferTemp = int(Tc*100);
}

187
style.css Normal file
View File

@ -0,0 +1,187 @@
.site{
display: flex;
}
div.menu a{
text-decoration: none;
color: inherit;
}
div.menu{
width: 240px;
float: left;
background-color: rgba(196, 196, 196, 0.808);
}
div.bodyAndFooter{
width: 100%;
}
div.body{
width: 70%;
margin-left: 50px;
border-width: 0px;
box-sizing: border-box;
padding: 30px;
}
div.sideMenu{
width: 80%;
background-color:white;
border-radius: 10px;
height: 50px;
margin: 20px;
}
div.sideMenu:hover{
transform: scale(1.1);
cursor:pointer;
}
div.sideMenuImg{
width: 30%;
height: 100%;
margin: 0px;
border-width:0px;
box-sizing: border-box;
float: left;
}
div.sideMenuImg img{
height: 80%;
display: flex;
justify-content: center;
align-items: center;
padding: 5px;
}
div.sideMenu:hover img{
transform: rotate(360deg);
transition-duration: 1500ms;
}
div.sideMenuText{
width: 60%;
box-sizing: border-box;
text-align: center;
display: flex;
justify-content: center; /* aligns items horizontally */
align-items: center; /* aligns items vertically */
height: 100%; /* or any height */
}
.mainImage{
margin: 0px;
border: 0px;
padding: 0px;
width: 100%;
}
.mainImage img{
width: 100%;
}
.desc{
font-family: 'Times New Roman', Times, serif;
text-align: justify;
}
div.imageContainer{
width: 20%;
object-fit: cover;
float: left;
border: 1px solid #ddd;
border-radius: 10px;
padding: 5px;
cursor: pointer;
background-color: rgba(196, 196, 196, 0.808);
margin: 5px;
margin-top: 20px;
margin-bottom: 20px;
}
div.galleryContainer, div.imageDesc{
display: flex;
justify-content: center;
align-items: center;
height: fit-content;
}
div.imageContainer img{
width: 100%;
border-radius: 10px;
align-items: center;
}
div.descTitle{
width: 50%;
text-align: center;
float: left;
}
div.descText{
width: 50%;
vertical-align: middle;
text-align: justify;
}
div.imageContainer:hover{
transform: scale(1.1);
}
div.footer{
float:right;
background-color: rgb(97, 96, 96);
box-sizing: border-box;
height:fit-content;
width: 100%;
}
div.footer #socialMedia, #blogs, #youtubeChannels{
float: left;
width: 20%;
font-size: small;
padding: 20px;
text-align: center;
}
div.footer p{
padding: 0px;
margin: 0px;
}
div.footer #copyRight{
text-align: center;
}
div.footer #copyRight p{
margin-top: 50px;
padding-top: 20px;
}
textarea{
width: 100%;
height: 300px;
background-color: rgba(196, 196, 196, 0.808);
border-radius: 10px;
border-style: hidden;
overflow-y:scroll;
overflow-x:scroll;
word-break:keep-all;
white-space: nowrap;
resize: none;
}
.popup-image{
position: fixed;
top: 0;
left: 0;
background-color: rgba(0, 0, 0, 0.89);
height: 100%;
width: 100%;
z-index: 100;
display: none;
}
.popup-image img{
position: absolute;
height: 80%;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
border: 5px, solid, #fff;
border-radius: 5px;
object-fit: cover;
cursor: pointer;
}