#include <PID_v1.h>
#include <Servo.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define CaseFan_PIN 9
#define Stop_Pump_Servo_PIN 10
#define SERVO_PIN 11
#define CircPump_PIN 12
#define Boiler_Flame_PIN 8
#define Boiler_PIN 13
#define ONE_WIRE_BUS 23
#define Boiler_Hys 5 //---------------------------------------------Hysteresis Boiler
#define CircPump_Set 20 //------------------------------------------CircPump Setpoint
#define CircPump_Hys 5 //-------------------------------------------Hysteresis CircPump
double FlowF_Set = 55; //-------------------------------------------will be overwritten later in map fuction
double FlowF_Temp, output;
double Kp = 2.0; //-------------------------------------------------proportional gain
double Ki = 5.0; //-------------------------------------------------integral gain
double Kd = 1.0; //-------------------------------------------------derivative gain
PID myPID(&FlowF_Temp, &output, &FlowF_Set, Kp, Ki, Kd, DIRECT);
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
Servo servo;
float Boiler_Temp;
float Out_Temp;
float Oil_Temp;
float Case_Temp;
//Driftstæller variabler
bool lastState_Boiler_Flame = false;
bool lastState_CircPump = false;
unsigned int timeBufferTimer_Boiler_Flame = 0;
unsigned int timeBufferTimer_CircPump = 0;
byte timeBufferMinutter_Boiler_Flame = 0;
byte timeBufferMinutter_CircPump = 0;
byte timeBufferSekunder_Boiler_Flame = 0;
byte timeBufferSekunder_CircPump = 0;
unsigned long timerStart_Boiler_Flame = 0;
unsigned long timerStart_CircPump= 0;
unsigned int CounterTurnOnTimes_Boiler_Flame = 0;
unsigned int CounterTurnOnTimes_CircPump = 0;
//Driftstæller printer
unsigned long lastPrintUpdate = 0;
unsigned long IntervalPrintUpdate = 1000;//Print besked hver 2s
void setup() {
Serial.begin(115200);
pinMode(CaseFan_PIN, OUTPUT);
pinMode(Stop_Pump_Servo_PIN, INPUT);
pinMode(CircPump_PIN, OUTPUT);
pinMode(Boiler_Flame_PIN, INPUT);
pinMode(Boiler_PIN, OUTPUT);
servo.attach(SERVO_PIN);
myPID.SetMode(AUTOMATIC);
myPID.SetOutputLimits(10, 80); //--------------------------------Max/Min output Shunt_Set(Servo)
sensors.begin();
}
void loop() {
sensors.requestTemperatures();
Boiler_Temp = sensors.getTempCByIndex(2);
Out_Temp = sensors.getTempCByIndex(0);
FlowF_Temp = sensors.getTempCByIndex(1);
Oil_Temp = sensors.getTempCByIndex(3);
Case_Temp = sensors.getTempCByIndex(4);
myPID.Compute();
if(digitalRead(Stop_Pump_Servo_PIN)){ //-------------------------Stop Pump/servo function
output = 10; //-----------------------------------------------Output what Shunt/servo close to
}
else{
myPID.Compute();
}
servo.write(output);
float Case_Set = map(Case_Temp, 40, 50, 30, 255); //------------Setpoint Case_Set map/remember limits!
float Boiler_Set = map(Out_Temp, -5, 20, 67, 60); //-----------Setpoint Boiler_Set map/remember limits!
FlowF_Set = map(Out_Temp, -5, 20, 65, 50); //------------------Setpoint Flow_Set map to PID/remember limits!
if(Boiler_Set > 67){ //----------------------------------------Boiler_Set upper limit
Boiler_Set = 67;
}else if(Boiler_Set < 60){ //----------------------------------Boiler_Set lower limit
Boiler_Set = 60;
}
if(Boiler_Temp < (Boiler_Set - Boiler_Hys)){
digitalWrite(Boiler_PIN, HIGH);
}
else if(Boiler_Temp > (Boiler_Set)){
digitalWrite(Boiler_PIN, LOW);
}
if(FlowF_Set > 65){ //-------------------------------------------FlowF_Set upper limit
FlowF_Set = 65;
}else if(FlowF_Set < 50){ //-----------------------------------FlowF_Set lower limit
FlowF_Set = 50;
}
if(digitalRead(Stop_Pump_Servo_PIN)){//Bloker opstart af pumpe
digitalWrite(CircPump_PIN, LOW);//Stop pumpe
}else{//Normal drift
if(Out_Temp < (CircPump_Set - CircPump_Hys)){
digitalWrite(CircPump_PIN, HIGH);
}
else if(Out_Temp > (CircPump_Set)){
digitalWrite(CircPump_PIN, LOW);
}
}
analogWrite(CaseFan_PIN, Case_Set);
if(Case_Set > 255){ //-----------------------------------------CaseFan_Set upper limit(Fan_Speed)
Case_Set = 255;
}else if(Case_Set < 30){ //-------------------------------------CaseFan_Set lower limit(Fam_Speed)
Case_Set = 0;
}// if Case__Set output comes under 60 then Output goes to 0, to be sure fan starts up
//Driftstæller
if(digitalRead(Boiler_Flame_PIN) != lastState_Boiler_Flame){//LEDen har ændret tilstand
if(lastState_Boiler_Flame){//Den er gået fra tændt til slukket
timeBufferSekunder_Boiler_Flame += (millis() - timerStart_Boiler_Flame)/1000;//Lægger tiden som var gået siden sidste tænd, til bufferen
}else{//Den er gået fra slukket til tændt
timerStart_Boiler_Flame = millis();
CounterTurnOnTimes_Boiler_Flame++; //Læg 1 til. Samme som CounterTurnOnTimes_LED = CounterTurnOnTimes_LED + 1
}
lastState_Boiler_Flame = digitalRead(Boiler_Flame_PIN);
}
// - Tidsskifte kode s -> min -> timer
if(millis() - timerStart_Boiler_Flame > 1000 && digitalRead(Boiler_Flame_PIN)){//Tæller ref har opnået over 1s opsparet tid. Overfør til buffer.
timeBufferSekunder_Boiler_Flame++;//Læg 1s til sekund buffer
timerStart_Boiler_Flame += 1000;//Skub timer start 1s frem.
if(timeBufferSekunder_Boiler_Flame > 59){//Sekundbuffer har opnået 60s. Overfør til minut tæller.
timeBufferSekunder_Boiler_Flame -= 60;//Trækker 60 fra
timeBufferMinutter_Boiler_Flame++;
if(timeBufferMinutter_Boiler_Flame > 59){//60min = 1 time
timeBufferMinutter_Boiler_Flame -= 60;
timeBufferTimer_Boiler_Flame++;
}
}
}
//Driftstæller
if(digitalRead(CircPump_PIN) != lastState_CircPump){//LEDen har ændret tilstand
if(lastState_CircPump){//Den er gået fra tændt til slukket
timeBufferSekunder_CircPump += (millis() - timerStart_CircPump)/1000;//Lægger tiden som var gået siden sidste tænd, til bufferen
}else{//Den er gået fra slukket til tændt
timerStart_CircPump = millis();
CounterTurnOnTimes_CircPump++; //Læg 1 til. Samme som CounterTurnOnTimes_LED = CounterTurnOnTimes_LED + 1
}
lastState_CircPump = digitalRead(CircPump_PIN);
}
// - Tidsskifte kode s -> min -> timer -> dage
if(millis() - timerStart_CircPump > 1000 && digitalRead(CircPump_PIN)){//Tæller ref har opnået over 1s opsparet tid. Overfør til buffer.
timeBufferSekunder_CircPump++;//Læg 1s til sekund buffer
timerStart_CircPump += 1000;//Skub timer start 1s frem.
if(timeBufferSekunder_CircPump > 59){//Sekundbuffer har opnået 60s. Overfør til minut tæller.
timeBufferSekunder_CircPump -= 60;//Trækker 60 fra
timeBufferMinutter_CircPump++;
if(timeBufferMinutter_CircPump > 59){//60min = 1 time
timeBufferMinutter_CircPump -= 60;
timeBufferTimer_CircPump++;
}
}
}
if(millis() - lastPrintUpdate > IntervalPrintUpdate){
Serial.print("Boiler_Temp: ");
Serial.print(Boiler_Temp);
Serial.print(" / Boiler_Set: ");
Serial.print(Boiler_Set);
Serial.print(" / FlowF_Temp: ");
Serial.print(FlowF_Temp);
Serial.print(" / FlowF_Set: ");
Serial.print(FlowF_Set);
Serial.print(" / Shunt_Pos: ");
Serial.print(output);
Serial.print(" / Oil_Temp: ");
Serial.print(Oil_Temp);
Serial.print(" / Case_Temp: ");
Serial.print(Case_Temp);
Serial.print(" / fan_out: ");
Serial.print(Case_Set);
Serial.print(" / Out_Temp: ");
Serial.println(Out_Temp);
//Printer running time/start Boiler
Serial.print("Time_Boiler_Flame: ");
Serial.print(timeBufferTimer_Boiler_Flame);
Serial.print("h ");
Serial.print(timeBufferMinutter_Boiler_Flame);
Serial.print("m ");
Serial.print(timeBufferSekunder_Boiler_Flame);
Serial.print("s ");
Serial.print("/ Start_Up: ");
Serial.print(CounterTurnOnTimes_Boiler_Flame);
Serial.println(" times");
//Printer running time/start CircPump
Serial.print("Running_Time_CircPump: ");
Serial.print(timeBufferTimer_CircPump);
Serial.print("h ");
Serial.print(timeBufferMinutter_CircPump);
Serial.print("m ");
Serial.print(timeBufferSekunder_CircPump);
Serial.print("s ");
Serial.print("/ Start_Up: ");
Serial.print(CounterTurnOnTimes_CircPump);
Serial.println(" times");
lastPrintUpdate = millis();
}
}
Boiler_Temp
FlowF_Temp
Oil_Temp
Out_Temp
Boiler_relay
Circ_Pump_relay
Shunt_Servo
Case_Temp
Stop_Pumpe_Shunt
Boiler_Flame