/*
Funktion to run 3-Way Motor-Valve, powered only to change Position
*/
#define APF 4 // Atmos PlugF
#define AR1 10 // Atmos R1 Error
#define Vtr 2 // Viessmann TS Sperre
#define Vein 3 // Viessmann ext. ON
#define Vs50 11 // Viessmann S50 Error
#define priorIn 12 // Switch O/P V/A 1=öil/0=Pel
#define TSup A0 // TempSensor Puffer up
#define TSdn A1 // TempSensor Puffer down
#define vlTempIn A2 // TempSensor VL Heater Input
int TPup = 0; // Temp Puffer up
int TPupOld = 0;
int TPdn = 0; // Temp Puffer down
int TPdnOld = 0;
int vlTemp = 0; // measured VL Heater temp
int vlTempOld = 0;
int aTSon; // atmos sensorValueOn, this Var = diff TempSensors, = Tmed, Tdwn
int aTSoff; // atmos sensorValueOff, this Var = diff TempSensors, = Tmed, Tdwn
int vTSon; // viess sensorValueOn, this Var = diff TempSensors, = Tmed, Tdwn
int vTSoff; // viess sensorValueOff, this Var = diff TempSensors, = Tmed, Tdwn
bool Aerr = false; // Atmos Error
bool Verr = false; // Viessmann Error
bool Prior = false; // Priority A/V, 1=Oil/0=Pel
byte aTempON = 60; // Atmos TempSwitch on ,
byte aTempOFF = 65; // Atmos TempSwitch off,
byte aTempHYS = 5; // Atmos Temp Hysterese
byte aSWon = 0;
byte aSWoff= 0;
byte vTempON = 50; // Viess TempSwitch on
byte vTempOFF = 55; // Viess TempSwitch off
byte vTempHYS = 5; // Viess Temp Hysterese
byte vSWon = 0;
byte vSWoff= 0;
byte maxPufTemp = 80; // max Puffer Temp Top
byte vlTempDIST = 5; // DiffTemp to the highest HeaterTemp
unsigned long last;
//int r;
bool apf = false; //Flag Switch Atmos
bool vtr = false; //Flag Switch Viess
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(APF, OUTPUT);
pinMode(Vtr, OUTPUT);
pinMode(Vein, OUTPUT);
pinMode(AR1, INPUT_PULLUP);
pinMode(Vs50, INPUT_PULLUP);
pinMode(priorIn, INPUT_PULLUP);
}
void loop() {
if (millis() - last > 100){
Prior= digitalRead(priorIn); // 1=Oil / 0=Pel
Aerr= !digitalRead(AR1); // Atmos Error
Verr= !digitalRead(Vs50); // Viessmann Error
TPup= analogRead(TSup)/10; // 1023/10 = 102°C
TPdn= analogRead(TSdn)/10;
vlTemp = analogRead(vlTempIn)/10;
last = millis();
}
//
aTSon = TPup; //atmos TempSensOn = TPup
aTSoff = TPdn; //atmos TempSensOn = TPdn
vTSon = TPup; // viess SensON
vTSoff = TPup; // viess SensOff
if (Prior == false){ // Pell
if (Aerr == false){ // Atmos no error
atmos();
} else { // Atmos error
viess();
}
}
if (Prior == true ){ // Oil
if (Verr == false){ // Viess no error
viess();
} else { // Viess error
atmos();
}
}
if (TPup != TPupOld){
Serial.print("TPup: ");
Serial.println(TPup);
TPupOld = TPup;
}
if (TPdn != TPdnOld){
Serial.print("TPdn: ");
Serial.println(TPdn);
TPdnOld = TPdn;
}
if (vlTemp != vlTempOld){
Serial.print("vlTemp: ");
Serial.println(vlTemp);
vlTempOld = vlTemp;
}
}
//-------Func-----
void atmos(){
if ( vtr == true){ //reset viess
digitalWrite(Vtr, LOW);
digitalWrite(Vein, LOW);
vtr = false;
}
if (vlTemp + vlTempDIST > aTempON ){ //slide Temp regulation
aSWon= vlTemp + vlTempDIST;
} else {
aSWon = aTempON;
}
if (aTSon == aTSoff){
if (vlTemp + vlTempDIST > aTempOFF ){ //slide Temp regulation
aSWoff = vlTemp + vlTempDIST + aTempHYS ;
} else {
aSWoff = aTempON + aTempHYS;
}
}
if (aTSon != aTSoff){
if( vlTemp + vlTempDIST > aTempOFF ){ //slide Temp regulation
aSWoff = vlTemp + vlTempDIST;
} else {
aSWoff = aTempOFF;
}
}
if (apf == false && aTSon < aSWon && TPup < maxPufTemp ){
digitalWrite(APF, HIGH);
apf = true;
}
if (apf == true && aTSoff > aSWoff && aTSon > aSWoff or TPup > maxPufTemp ){
digitalWrite(APF, LOW);
apf = false;
}
} //end atmos
void viess(){
if (apf == true){ //reset atmos
digitalWrite(APF, LOW); //Atmos OFF
apf = false;
}
if (vlTemp + vlTempDIST > vTempON ){ //slide Temp regulation
vSWon = vlTemp + vlTempDIST;
} else {
vSWon = vTempON;
}
if (vlTemp + vlTempDIST > vTempOFF ){ //slide Temp regulation
vSWoff = vlTemp + vlTempDIST+ vTempHYS;
} else {
vSWoff = vTempOFF;
}
if (vtr == false && vTSon < vSWon && TPup < maxPufTemp ){
digitalWrite(Vtr, HIGH);
digitalWrite(Vein, HIGH);
vtr = true;
}
if (vtr == true && vTSoff > vSWoff && vTSon > vSWoff or TPup > maxPufTemp){
digitalWrite(Vtr, LOW);
digitalWrite(Vein, LOW);
vtr = false;
}
}