#include <Arduino.h>
// Vključitev globalnih spremenljivk
#include "global.variables.h"
#include "store_global.settings.h"
#include "GlobalSettings.h"
//#include "ParameterHandler.h"
#include "Communications.h"
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
// Vključitev potrebnih knjižnic za senzorje
#include <Wire.h>
#include <Servo.h>
#include <DHT.h>
#include <Wire.h>
#include <RTClib.h>
#include "aktuators_lib.h"
#include <SPI.h>
#include <SD.h>
//#include "aktuators_libSD.h" // Vključite vašo knjižnico z razredom SettingsJSON_SD
#include <ArduinoJson.h>
// Vključitev aktuatorjev in funkcij
#include "calculations.h"
#include "config.aktuators.h"
// Vključitev komunikacijske knjižnice
#include "functions.h"
const unsigned long eventInterval_3s = 3000; //millis counter 3s
unsigned long previousTime_3s = 0;
const unsigned long eventInterval_2s = 2000; //millis counter 2s
unsigned long previousTime_2s = 0;
const unsigned long eventInterval_1s = 1000; //millis counter 1s
unsigned long previousTime_1s = 0;
//const char* settingsFilename = "settingsSD.txt"; // Ime datoteke za shranjevanje parametrov
File root;
File myFile; // Ustvarimo objekt za delo z datoteko
void setup() {
// Začetne nastavitve
settings.begin();
// Inicializacija serijskega vmesnika
Serial.begin(115200);
while (!Serial) {
delay(10);
}
myRTC.begin();
// Če želite nastaviti čas in datum, odkomentirajte spodnje vrstice:
if (setDateTime == 1){
myRTC.setTime(year, month, day, hour, minute, second);
setDateTime == 0;
}
// Preveri, ali je modul RTC pravilno zaznan
if (!myRTC.isRunning()) {
Serial.println(F("RTC ni pravilno zaznan. Preverite povezave!"));
}
myServo.attach(8); // attaches the servo on pin 8 to the servo object
bool parametersStored = settings.chkParameters();
Serial.print(F("Parameters stored: "));
Serial.println(parametersStored);
settings.loadParameters();
get_Parameters();
get_StatusBytes();
// SD card
settings.beginSD(); // Inicializirajte nastavitve ob zagonu
//SD Card
//tLeveling_wStove = 68.0; // Izravnava temperatur v zalogovniku, P5 črpalka (spremenljivka tLeveling_wStove)
//dif_tLeveling_wStove = 10.0; // Diferenca med vklopom in izklopom ogrevanja zalogovnika (spremenljivka dif_tLeveling_wStove)
//settingsSD.createAndWriteDefaultSettingsSD();
//settingsSD.saveSettingsSD();
//settingsSD.loadSettingsSD();
//SD Card
}
void loop() {
comms.processCommands();
get_SensorData();
unsigned long currentTime_3s = millis();
if (currentTime_3s - previousTime_3s >= eventInterval_3s) {
previousTime_3s = currentTime_3s;
/*Serial.print(F("1: "));
Serial.println(settings.tLeveling_wStove);
Serial.print("2: ");
Serial.println(settings.dif_tLeveling_wStove);*/
// printJSON(2); // 1-Pretty JSON message, 2-JSON paket message
//settings.tLeveling_wStove = 65.0; // Spremenite vrednost parametrov
//settings.dif_tLeveling_wStove = 14.0;
//settings.loadParameters();
//get_Parameters();
//settingsSD.createAndWriteDefaultSettings();
// SD card
//settings.beginSD(); // Inicializirajte nastavitve ob zagonu
//settings.tLeveling_wStove = 65.0; // Spremenite vrednost parametrov
//settings.dif_tLeveling_wStove = 14.0;
//settings.saveSettingsSD();
//settings.updateSettingsSD();
//settings.loadSettingsSD();
//settings.printSettingsSD();
//****************************************
//get_Parameters();
//set_newParameters();
// Pošiljanje paketnih parametrov prek UART
//paramHandler.sendParameters();
// Preverimo, ali so parametri že shranjeni in v veljavnem območju
bool parametersStored = settings.chkParameters();
if (setDateTime == 1){
myRTC.setTime(year, month, day, hour, minute, second);
setDateTime = 0;
}
DateTime now = myRTC.now();
// Branje časa in datuma iz RTC
year = now.year();
month = now.month();
day = now.day();
hour = now.hour();
minute = now.minute();
second = now.second();
setDateTime = 0;
print_DateTime();
}
// Kontrola črpalke P5(Mešanje vode v zalogovniku) glede na temperaturo
wStoveNTC_P5.controlP5(tLeveling_wStove, dif_tLeveling_wStove, tT1, tT2, tT3, tT4); // Mešanje se aktivira , ko povprečna temperatura preseže 60 °C
// Kontrola Ćrpalke P3(ZLGin) glede na temperaturo
//temp_wStove = 0;
//temp_dif_wStove = (tmax_wStove - tT4) / (factor_dif_wStove + 3);
//temp_wStove = tT4 + ((tmax_wStove - tT4) / (factor_dif_wStove + 0.5)-temp_dif_wStove);
temp_dif_wStove = Solltemp_Calculations::izracunTempDif(tmax_wStove, tT4, factor_dif_wStove);
temp_wStove = Solltemp_Calculations::izracunTempWStove(tmax_wStove, tT4, factor_dif_wStove);
unsigned long currentTime_2s = millis();
if (currentTime_2s - previousTime_2s >= eventInterval_2s) {
previousTime_2s = currentTime_2s;
}
wStoveNTC_P3.controlPx(temp_wStove, temp_dif_wStove); // Črpalka se vklopi, ko temperatura preseže 60 °C
wStoveNTC_P4.controlP4(sollTemperature, temp_dif_oStove, tT1, tT2, tT3, tT4); // Črpalka se vklopi, ko temperatura preseže 60 °C
// Kontrola Ćrpalke P1(Bojler) glede na temperaturo
wStoveNTC_P1.controlPx(temp_wTank, temp_dif_wTank); // Črpalka se vklopi, ko temperatura preseže 50 °C
// Kontrola Ćrpalke P2(Stanovanje) glede na temperaturo
oStoveDHT_P21.controlPx(temp_Prtlicje, dif_Prtlicje, temp_Mansarda, dif_Mansarda, tempT2in, tempT3in); // Črpalka se vklopi, ko temperatura preseže 23.0 °C
// Ustvarjanje objekta za izračun odmika temperature glede na vlažnost
TemperatureOffsetCalculator tempOffsetCalculatorP(tempOffsetP); // Ciljna srednja vrednost vlage je 55 %
// Izračun odmika temperature glede na vlažnost
temperatureOffset = tempOffsetCalculatorP.calculateTemperatureOffset(humidityT2in, humidityT3in, temp_Prtlicje, temp_Mansarda);
// Uporaba izračunanega odmika za prilagoditev temperatur
adjustedTemp_Prtlicje = temp_Prtlicje + temperatureOffset;
// Ustvarjanje objekta za izračun odmika temperature glede na vlažnost
TemperatureOffsetCalculator tempOffsetCalculatorM(tempOffsetM); // Ciljna srednja vrednost vlage je 55 %
// Izračun odmika temperature glede na vlažnost
temperatureOffset = tempOffsetCalculatorM.calculateTemperatureOffset(humidityT2in, humidityT3in, temp_Prtlicje, temp_Mansarda);
// Uporaba izračunanega odmika za prilagoditev temperatur
adjustedTemp_Mansarda = temp_Mansarda + temperatureOffset;
// Kontrola Ćrpalke P2(Stanovanje) glede na temperaturo
oStoveNTC_M1.controlPx(sollTemperature, dif_MV1); // Črpalka se vklopi, ko temperatura preseže 23.0 °C
// Kontrola Ćrpalke P2(Stanovanje) glede na temperaturo
oStoveNTC_OB1.controlPx(sollTemperature, dif_MV1); // Črpalka se vklopi, ko temperatura preseže 23.0 °C
// Kontrola ventilatorja glede na temperaturo
wStovePT100.controlFan(temp_wStove_controlFan); // Ventilator se vklopi, ko temperatura preseže 240 °C
// Izračunamo odstotek odpiranja lopute glede na trenutno temperaturo
valveOpeningPercentage = valve.calculateValveOpening(stoveTemp_PT100);
myServo.rotateTo(valveOpeningPercentage);
//s1_Angle = myServo.getAngle();
fStat = fanpin_stat; // parameter fanpin_stat podan v "aktuators_lib.h->class WoodStovePT100"
if (fanpin_stat == 1){
// Obrni servo motor za 90 stopinj
//myServo.rotateTo(valveOpeningPercentage);
}else {
// Obrni servo motor za 90 stopinj
//myServo.rotateTo(-valveOpeningPercentage);
}
unsigned long currentTime_1s = millis();
/* This is the event */
if (currentTime_1s - previousTime_1s >= eventInterval_1s) {
// Update aktuator status bytes
get_StatusBytes();
/* Update the timing for the next time around */
previousTime_1s = currentTime_1s;
HeatingCurve heatingCurve(tCurve_Slope, tCurve_Offset); // Primer vrednosti za naklon in odmik ogrevalne krivulje
insulation = 4; // Izolativnost hiše
sollTemperature = heatingCurve.calculateSollTemperature(tempT2in, tempT3in, tempT4out, insulation);
insulation = 3;
sollTemperatureT2in = heatingCurve.calculateSollTemperatureT2in(tempT2in, tempT4out, insulation);
insulation = 2;
sollTemperatureT3in = heatingCurve.calculateSollTemperatureT3in(tempT3in, tempT4out, insulation);
}
// Preverjanje pogojev za vklop izhodov za namene testiranja izhodov preko programa!!
if (tT1 > 30.0 && tT2 < 20.0) {
output1.on();
} else {
output1.off();
}
if (tT3 > 25.0 || tT4 < 15.0) {
output2.on();
} else {
output2.off();
}
}