upload
BIN
PorjectImages/20240111_095122.jpg
Normal file
After Width: | Height: | Size: 3.4 MiB |
BIN
PorjectImages/20240111_095132.jpg
Normal file
After Width: | Height: | Size: 3.2 MiB |
BIN
PorjectImages/20240111_095157.jpg
Normal file
After Width: | Height: | Size: 2.7 MiB |
BIN
PorjectImages/20240111_095205.jpg
Normal file
After Width: | Height: | Size: 3.1 MiB |
BIN
PorjectImages/20240111_095212.jpg
Normal file
After Width: | Height: | Size: 3.0 MiB |
BIN
PorjectImages/20240111_095223.jpg
Normal file
After Width: | Height: | Size: 2.8 MiB |
BIN
PorjectImages/20240111_095312.jpg
Normal file
After Width: | Height: | Size: 3.4 MiB |
BIN
PorjectImages/20240111_095331.jpg
Normal file
After Width: | Height: | Size: 3.3 MiB |
BIN
PorjectImages/20240111_095351.jpg
Normal file
After Width: | Height: | Size: 2.1 MiB |
BIN
PorjectImages/20240111_095407.jpg
Normal file
After Width: | Height: | Size: 2.9 MiB |
BIN
PorjectImages/20240111_095412.jpg
Normal file
After Width: | Height: | Size: 2.6 MiB |
BIN
PorjectImages/20240111_125002.jpg
Normal file
After Width: | Height: | Size: 3.6 MiB |
BIN
Schematics/20240115_111850.jpg
Normal file
After Width: | Height: | Size: 2.8 MiB |
BIN
Schematics/20240115_111914.jpg
Normal file
After Width: | Height: | Size: 2.8 MiB |
BIN
Schematics/20240115_111934.jpg
Normal file
After Width: | Height: | Size: 2.8 MiB |
BIN
Schematics/20240115_111939.jpg
Normal file
After Width: | Height: | Size: 2.8 MiB |
BIN
Schematics/20240115_112008.jpg
Normal file
After Width: | Height: | Size: 2.9 MiB |
BIN
Schematics/20240115_112013.jpg
Normal file
After Width: | Height: | Size: 2.9 MiB |
BIN
Schematics/20240115_112026.jpg
Normal file
After Width: | Height: | Size: 2.9 MiB |
BIN
Schematics/20240115_112028.jpg
Normal file
After Width: | Height: | Size: 2.9 MiB |
BIN
Schematics/20240115_112042.jpg
Normal file
After Width: | Height: | Size: 2.9 MiB |
BIN
Schematics/20240115_112051.jpg
Normal file
After Width: | Height: | Size: 2.9 MiB |
BIN
Schematics/20240115_112101.jpg
Normal file
After Width: | Height: | Size: 2.9 MiB |
BIN
Schematics/20240115_112107.jpg
Normal file
After Width: | Height: | Size: 3.4 MiB |
27
Termisztor/Termisztor.ino
Normal 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);
|
||||
}
|
BIN
Termosztát_leirás_terv.odt
Normal file
1144
Thermostat.html
Normal file
723
Thermostat_1_4/Thermostat_1_4.ino
Normal 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;
|
||||
|
||||
}
|
||||
}
|
142
Thermostat_2_1/Thermostat_2_1.ino
Normal 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
@ -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;
|
||||
}
|
||||
|