//thermostat for Gorenje Fridge
//3 sensors inside The fridge, 1 sensor in freezer
//and door sensor for light
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <math.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
const int relayPin2 = 2; //fridge compressor
const int relayPin3 = 3; //freezer compressor
const int relayPin4 = 4; //fridge fan compresor
const int relayPin5 = 5; //light
const int buttonPin = 6; //light switch
const int sensorPin1 = A0; //middle of the fridge sensor
const int sensorPin2 = A1; //cooling board sensor
const int sensorPin3 = A2; //drawer in the botom of the fridge sensor
const int sensorPin4 = A3; //freezer sensor
const float temperatureCorrection1 = 0.0;
const float temperatureCorrection2 = 0.0;
const float temperatureCorrection3 = 0.0;
const float temperatureCorrection4 = 0.0;
int X1 = 0, X2 = 0, X3 = 0;
float readTemperature1();
float readTemperature2();
float readTemperature3();
float readTemperature4();
float currentTemperature1 = 0.0;
float currentTemperature2 = 0.0;
float currentTemperature3 = 0.0;
float currentTemperature4 = 0.0;
float sumOfTemperatures1 = 0.0;
float sumOfTemperatures2 = 0.0;
float sumOfTemperatures3 = 0.0;
float sumOfTemperatures4 = 0.0;
int temperatureCount = 0;
unsigned long previousMillisTemp = 0;
unsigned long intervalTemp = 20000; // 20 sekúnd v milisekundách
unsigned long previousMillisPrint = 0;
unsigned long intervalPrint = 60000; // 1 minúta v milisekundách
void setup() {
Serial.begin(9600);
lcd.begin(20, 4);
lcd.backlight();
pinMode(buttonPin, INPUT);
pinMode(relayPin2, OUTPUT);
pinMode(relayPin3, OUTPUT);
pinMode(relayPin4, OUTPUT);
pinMode(relayPin5, OUTPUT);
// Vytvorenie vlastného znaku pre stupne
byte degrees[8] = {0b01110, 0b01010, 0b01110, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000};
lcd.createChar(0, degrees);
}
void loop() {
Serial.print("T1: ");
Serial.print(currentTemperature1);
Serial.println("°C");
Serial.print("T2: ");
Serial.print(currentTemperature2);
Serial.println("°C");
Serial.print("T3: ");
Serial.print(currentTemperature3);
Serial.println("°C");
Serial.print("T4: ");
Serial.print(currentTemperature4);
Serial.println("°C");
unsigned long currentMillis = millis();
// Meranie teplôt každých 20 sekúnd
if (currentMillis - previousMillisTemp >= intervalTemp) {
currentTemperature1 = readTemperature1();
currentTemperature2 = readTemperature2();
currentTemperature3 = readTemperature3();
currentTemperature4 = readTemperature4();
currentTemperature1 += temperatureCorrection1;
currentTemperature2 += temperatureCorrection2;
currentTemperature3 += temperatureCorrection3;
currentTemperature4 += temperatureCorrection4;
// Resetovanie časovača pre meranie teplôt
previousMillisTemp = currentMillis;
}
// Pridávanie teplôt pre výpočet priemeru
sumOfTemperatures1 += currentTemperature1;
sumOfTemperatures2 += currentTemperature2;
sumOfTemperatures3 += currentTemperature3;
sumOfTemperatures4 += currentTemperature4;
temperatureCount++;
// Vypíš priemer každej teploty každú minútu
if (temperatureCount >= 3 && currentMillis - previousMillisPrint >= intervalPrint) {
float averageTemperature1 = sumOfTemperatures1 / temperatureCount;
float averageTemperature2 = sumOfTemperatures2 / temperatureCount;
float averageTemperature3 = sumOfTemperatures3 / temperatureCount;
float averageTemperature4 = sumOfTemperatures4 / temperatureCount;
// Vypíš priemer (tu môžeš pridať ďalšie akcie)
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("T1 :" + String(averageTemperature1, 1) + (char)0 + "C ");
lcd.setCursor(0, 1);
lcd.print("T2 :" + String(averageTemperature2, 1) + (char)0 + "C ");
lcd.setCursor(0, 2);
lcd.print("T3 :" + String(averageTemperature3, 1) + (char)0 + "C ");
lcd.setCursor(0, 3);
lcd.print("T4 :" + String(averageTemperature4, 1) + (char)0 + "C ");
// Podmienky pre riadenie relé
//chladnicka
if (averageTemperature1 > 6) {
X1 = 1;
} else if (averageTemperature1 < 4) {
X1 = 0;
}
//chladiaca doska
if (averageTemperature2 > 2) {
X2 = 1;
} else if (averageTemperature2 < -10) {
X2 = 0;
}
//suflik
if (averageTemperature3 > 2.5) {
X3 = 1;
} else if (averageTemperature3 < 1) {
X3 = 0;
}
//spinanie kompresoru chladnicky
if ((X1 + X2 + X3) == 3) {
digitalWrite(relayPin2, HIGH);
} else if ((X1 + X2 + X3) < 3) {
digitalWrite(relayPin2, LOW);
}
//mraznička
if (averageTemperature4 > -17) {
digitalWrite(relayPin3, HIGH);
} else if (averageTemperature4 < -19) {
digitalWrite(relayPin3, LOW);
}
//ventilátor
if (averageTemperature2 > 4) {
digitalWrite(relayPin4, LOW);
} else if (averageTemperature2 < 2) {
digitalWrite(relayPin4, HIGH);
}
// Resetovanie časovača pre výpis priemeru
previousMillisPrint = currentMillis;
// Resetuj počítadlá pre nový cyklus
temperatureCount = 0;
sumOfTemperatures1 = 0.0;
sumOfTemperatures2 = 0.0;
sumOfTemperatures3 = 0.0;
sumOfTemperatures4 = 0.0;
}
// Ovládanie svetla
int buttonState = digitalRead(buttonPin);
if (buttonState == HIGH) {
digitalWrite(relayPin5, HIGH);
} else {
digitalWrite(relayPin5, LOW);
}
delay(10);
}
float readTemperature1() {
int sensorValue1 = analogRead(sensorPin1);
float temperature1 = 1 / (log(1 / (1023. / sensorValue1 - 1)) / 3950 + 1.0 / 298.15) - 273.15;
return temperature1;
}
float readTemperature2() {
int sensorValue2 = analogRead(sensorPin2);
float temperature2 = 1 / (log(1 / (1023. / sensorValue2 - 1)) / 3950 + 1.0 / 298.15) - 273.15;
return temperature2;
}
float readTemperature3() {
int sensorValue3 = analogRead(sensorPin3);
float temperature3 = 1 / (log(1 / (1023. / sensorValue3 - 1)) / 3950 + 1.0 / 298.15) - 273.15;
return temperature3;
}
float readTemperature4() {
int sensorValue4 = analogRead(sensorPin4);
float temperature4 = 1 / (log(1 / (1023. / sensorValue4 - 1)) / 3950 + 1.0 / 298.15) - 273.15;
return temperature4;
}