//Eingaben
unsigned long tmin = 300; // Sekunden, die die Heizung mindestens eingeschaltet sein soll
unsigned long wunschaus = 2; //Sekunden, die es dauert, bis die HZG über Fernbedienung ausgeschaltet wird
int wassertemp = 30; // Wassertemperatur, bei der Gebläse an geht
int umgebungtemp = 10; // Umgebungstemperatur, bei der das Gebläse an geht
int anzahl = 2; // häufigkeit drücken, damit Ausschaltwunsch in gleich vielen Sekunden deaktiviert wird
//***I2C verbindung
#include <Wire.h>
//***Uhrzeit Real Time CLock
#include "RTClib.h"
//***DS18 Temperatursensor
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS A0
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
//***Mindesteinschaltzeit
unsigned long ausschalt=tmin*1000;
unsigned long verz=0;
unsigned long count=0;
unsigned long countRelais=0;
unsigned long verzRelais=wunschaus*1000;
unsigned long timeranzahl=anzahl*1000;
unsigned long counteranzahl=0;
//***Inputs
const int s1 = 10; //Schalterstellung 1 :
const int s2 = 11; //Schalterstellung 2 :
const int s3 = 12; //Schalterstellung 3 :
const int haupt = 9; //Hauptschalter
const int dplus = 8; //D+ Zuleitung durch Optokoppler
const int vorwahl = 4; //Vorwahluhr durch Optokoppler
const int fernbed = 3; //Fernbedienung von Relais (5V)
//***Outputs
const int hzg = 5; //Relais Start Zuheizer
const int gebl = 6; //MOSFET Heizungsgebläse
const int wapu = 7; //MOSFET Wasserpumpe
//Hilfsvariablen
//int zh=5;
int frostschutz=1; //Hilfsvariable, damit die Ausschalt-Temp von Einschalt-Temp abweichen kann
int ausschaltwunsch=1; // Hilfsvariable für Abschaltung, wenn das Relais weniger, als "wunschaus" Sekunden an ist
int FB_count_reset=0; //2x Fernbedienung drücken, damit wunschaus deaktiviert
int schaltfernbedAlt;
int Fernstart=0;
void setup(void)
{
Serial.begin(9600);
pinMode(hzg, OUTPUT);
pinMode(gebl, OUTPUT);
pinMode(wapu, OUTPUT);
pinMode(s1, INPUT_PULLUP);
pinMode(s2, INPUT_PULLUP);
pinMode(s3, INPUT_PULLUP);
pinMode(haupt, INPUT_PULLUP);
pinMode(dplus, INPUT_PULLUP);
pinMode(vorwahl, INPUT_PULLUP);
pinMode(fernbed, INPUT_PULLUP);
}
void loop(void)
{
//Temperatur mit Poti
//float umgebungsens = analogRead(A0);
//umgebungsens = umgebungsens / 100 * 3 - 14;
//int umgebung = umgebungsens;
//float wassersens = analogRead(A1);
//wassersens = wassersens / 100 * 5 - 14+0.01;
//int wasser = wassersens;
//float innensens = analogRead(A2);
//innensens = innensens / 100 * 3 - 14+0.01;
//int innen = innensens;
//Temperatur mit Sensor
sensors.requestTemperatures();
float umgebung = sensors.getTempCByIndex(1);
float wasser = sensors.getTempCByIndex(0);
//float innen = sensors.getTempCByIndex(2);
//Schalterstellungen
int schalter=69;
int schalt1 = digitalRead(s1);
int schalt2 = digitalRead(s2);
int schalt3 = digitalRead(s3);
int schalthaupt = digitalRead(haupt);
int schaltdplus =digitalRead(dplus);
int schaltvorwahl = digitalRead(vorwahl);
int schaltfernbed = digitalRead(fernbed);
if (schalt1 == 1 && schalt2 == 1 && schalt3 == 1 ){
schalter=0;
}
else if (schalt1 == 0 && schalt2 == 1 && schalt3 == 1){
schalter=1;
}
else if (schalt1 == 1 && schalt2 == 0 && schalt3 == 1){
schalter=2;
}
else if (schalt1 == 1 && schalt2 == 1 && schalt3 == 0){
schalter=3;
}
Serial.print(" U:");
Serial.print(umgebung);
Serial.print(" W:");
Serial.print(wasser);
//Serial.print(" I:");
//Serial.print(innen);
//Serial.print(" hzg:");
//Serial.print(digitalRead(hzg));
//Serial.print(" gebl:");
//Serial.print(digitalRead(gebl));
//Serial.print(" wapu:");
//Serial.print(digitalRead(wapu));
////Serial.print(" zh:");
////Serial.print(zh);
//Serial.print(" D+: ");
//Serial.print(schaltdplus);
//Serial.print(" schalter:");
//Serial.print(schalter);
//Serial.print(" S1: ");
//Serial.print(schalt1);
//Serial.print(" S2: ");
//Serial.print(schalt2);
//Serial.print(" S3: ");
//Serial.print(schalt3);
//Serial.print(" Haupts:");
//Serial.print(schalthaupt);
Serial.print(" Vorwahl:");
Serial.print(schaltvorwahl);
//Serial.print(" Frosts: ");
//Serial.print(frostschutz);
//Serial.print(" count: ");
//Serial.print(count/100);
//Serial.print(" verz:");
//Serial.print(verz);
//Serial.print(" millis:");
//Serial.print(millis()/100);
// Serial.print(" c+v:");
// Serial.print((count+verz)/100);
Serial.print(" fernbed:");
Serial.print(schaltfernbed);
//Serial.print(" countRelais:");
//Serial.print(countRelais/100);
//Serial.print(" vR:");
//Serial.print(verzRelais);
// Serial.print(" cR+vR:");
// Serial.print((countRelais+verzRelais)/100);
//Serial.print(" aw:");
//Serial.print(ausschaltwunsch);
//Serial.print(" zähler:");
//Serial.print(FB_count_reset);
//Serial.print(" SFBAlt:");
//Serial.print(schaltfernbedAlt);
//Serial.print(" ca:");
//Serial.print(counteranzahl/100);
//Serial.print(" Fernstart:");
//Serial.print(Fernstart);
Serial.println();
//delay(200);
// Ausschalten, wenn Fernbedienung an
if (schaltfernbed==1){
countRelais=millis();
}
if (millis()>countRelais+verzRelais && digitalRead(wapu)==1 && (schalthaupt==0)){
ausschaltwunsch=0;
FB_count_reset=0;
}
// ausschaltwunsch deaktivieren
if (ausschaltwunsch==0 && FB_count_reset<anzahl*2){
if (schaltfernbed != schaltfernbedAlt){
FB_count_reset++;
counteranzahl=millis();
}
schaltfernbedAlt = schaltfernbed;
if (FB_count_reset>=anzahl*2){
FB_count_reset=0;
ausschaltwunsch=1;
}
if (schalthaupt == 1 && ausschaltwunsch==0){
FB_count_reset=0;
ausschaltwunsch=1;
}
if (schalthaupt == 0 && ausschaltwunsch==0 && schaltvorwahl==1 && schaltdplus==1 && schalter==0){
FB_count_reset=0;
ausschaltwunsch=1;
}
}
if (ausschaltwunsch==0 && millis()>counteranzahl+timeranzahl){
FB_count_reset=0;
}
//Definition Fernbedienung
if ( schalthaupt == 0 && schaltfernbed==0 && ausschaltwunsch==1 && digitalRead(hzg)==0) {
digitalWrite(hzg, HIGH);
// digitalWrite(gebl, LOW);
digitalWrite(wapu, HIGH);
verz=ausschalt;
Fernstart=1;
}
if (Fernstart==1 && wasser<=wassertemp){
digitalWrite(hzg, HIGH);
digitalWrite(gebl, LOW);
digitalWrite(wapu, HIGH);
verz=ausschalt;
}
if (Fernstart==1 && wasser>=wassertemp){
digitalWrite(hzg, HIGH);
digitalWrite(gebl, HIGH);
digitalWrite(wapu, HIGH);
verz=ausschalt;
}
if (Fernstart==1 && schaltfernbed==0 && millis()>count+verz){
digitalWrite(hzg, LOW);
digitalWrite(gebl, LOW);
digitalWrite(wapu, LOW);
frostschutz = 1;
Fernstart=0;
//delay(1000);
//ausschaltwunsch=1;
//int zh=0;
count=millis();
//countRelais=millis();
verz=0;
}
//Definition Vorwhluhr
if (schalthaupt == 0 && schaltvorwahl==0 && ausschaltwunsch==1) {
if (wasser<wassertemp) {
digitalWrite(hzg, HIGH);
digitalWrite(gebl, LOW);
digitalWrite(wapu, HIGH);
verz=ausschalt;
Fernstart=0;
}
else if (wasser>=wassertemp){
digitalWrite(hzg, HIGH);
digitalWrite(gebl, HIGH);
digitalWrite(wapu, HIGH);
verz=ausschalt;
Fernstart=0;
}
}
//if (ausschaltwunsch==0 && schaltfernbed==1 && (schaltvorwahl==0 || schalthaupt==0) && millis()>count+verz){
//digitalWrite(hzg, LOW);
//digitalWrite(gebl, LOW);
//digitalWrite(wapu, LOW);
//frostschutz = 1;
//ausschaltwunsch=1;
//int zh=0;
// count=millis();
//countRelais=millis();
// verz=0;
//}
//if (ausschaltwunsch==0 && schaltvorwahl==1 && schalthaupt==1 && schaltfernbed==1){
//ausschaltwunsch=1;
//}
// Definition Schaltszenarien
if (schalthaupt == 0 && ausschaltwunsch==1) {
//Stellung 0: Zuheizer/Fahren
if (schalter==0 && umgebung < umgebungtemp && schaltdplus==0 ) {
digitalWrite(hzg, HIGH);
digitalWrite(gebl, LOW);
digitalWrite(wapu, HIGH);
verz=ausschalt;
Fernstart=0;
//int zh=1;
}
//Stellung 1: Nachlauf
else if (millis()<=count+verz && schalter==1 && wasser > wassertemp && hzg==LOW) {
digitalWrite(gebl, HIGH);
digitalWrite(wapu, HIGH);
frostschutz = 1;
verz=ausschalt;
Fernstart=0;
count=millis();
//countRelais=millis();
}
else if (millis()<=count+verz && schalter==1 && wasser > wassertemp ) {
digitalWrite(gebl, HIGH);
digitalWrite(wapu, HIGH);
frostschutz = 1;
Fernstart=0;
verz=ausschalt;
}
else if (millis()<=count+verz && schalter==1 && wasser < wassertemp && hzg==LOW) {
digitalWrite(gebl, LOW);
digitalWrite(wapu, LOW);
frostschutz = 1;
verz=ausschalt;
Fernstart=0;
count=millis();
//countRelais=millis();
}
else if (millis()<=count+verz && schalter==1 && wasser < wassertemp ) {
digitalWrite(gebl, LOW);
digitalWrite(wapu, HIGH);
frostschutz = 1;
verz=ausschalt;
Fernstart=0;
}
else if (millis()>count+verz && schalter==1 && wasser > wassertemp ) {
digitalWrite(hzg, LOW);
digitalWrite(gebl, HIGH);
digitalWrite(wapu, HIGH);
frostschutz = 1;
verz=0;
Fernstart=0;
count=millis();
//countRelais=millis();
}
else if (millis()>count+verz && schalter==1 && wasser < wassertemp ) {
digitalWrite(hzg, LOW);
digitalWrite(gebl, LOW);
digitalWrite(wapu, LOW);
count=millis();
frostschutz = 1;
verz=0;
Fernstart=0;
}
//Stellung 2: Frostschutz
// else if (schalter==2 && innen<3 && frostschutz == 1 && schaltdplus==1){
// digitalWrite(hzg, HIGH);
// digitalWrite(gebl, LOW);
// digitalWrite(wapu, HIGH);
// frostschutz = 0; //Hilfsvariable, damit die Ausschalt-Temp von Einschalt-Temp abweichen kann
// verz=ausschalt;
// }
// else if (schalter==2 && frostschutz == 0 && innen<5 && wasser<10){
// digitalWrite(hzg, HIGH);
// digitalWrite(gebl, LOW);
// digitalWrite(wapu, HIGH);
// verz=ausschalt;
// }
// else if (schalter==2 && frostschutz == 0 && innen<5 && wasser>=10){
// digitalWrite(hzg, HIGH);
// digitalWrite(gebl, HIGH);
// digitalWrite(wapu, HIGH);
// verz=ausschalt;
// }
// else if (millis()>count+verz && schalter==2 && frostschutz == 0 && innen>5 ){
// digitalWrite(hzg, LOW);
// digitalWrite(gebl, LOW);
// digitalWrite(wapu, LOW);
// frostschutz = 1;
// count=millis();
// countRelais=millis();
// verz=0;
// }
//Stellung 3: Daueran
else if (schalter==3 && wasser<wassertemp){
digitalWrite(hzg, HIGH);
digitalWrite(gebl, LOW);
digitalWrite(wapu, HIGH);
verz=ausschalt;
Fernstart=0;
}
else if (schalter==3 && wasser>=wassertemp){
digitalWrite(hzg, HIGH);
digitalWrite(gebl, HIGH);
digitalWrite(wapu, HIGH);
verz=ausschalt;
Fernstart=0;
}
else if (millis()>count+verz && schaltfernbed==1 && schaltvorwahl==1 && Fernstart==0){
digitalWrite(hzg, LOW);
digitalWrite(gebl, LOW);
digitalWrite(wapu, LOW);
frostschutz = 1;
count=millis();
countRelais=millis();
verz=0;
Fernstart=0;
}
}
else if ((schalthaupt == 0 && ausschaltwunsch == 0) ||(schalthaupt == 1 && ausschaltwunsch == 1) && millis()>count+verz && Fernstart==0 ){
digitalWrite(hzg, LOW);
digitalWrite(gebl, LOW);
digitalWrite(wapu, LOW);
frostschutz = 1;
Fernstart=0;
//ausschaltwunsch=1;
//int zh=0;
count=millis();
//countRelais=millis();
verz=0;
}
else if (schalthaupt == 1){
digitalWrite(hzg, LOW);
digitalWrite(gebl, LOW);
digitalWrite(wapu, LOW);
frostschutz = 1;
Fernstart=0;
//ausschaltwunsch=1;
//int zh=0;
count=millis();
//countRelais=millis();
verz=0;
}
}
//immer wenn ausschaltwunsch==0 && wapu==HIGH && millis()>count+verz
// --> ausschalten