#include <WiFi.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <WebServer.h>
#include <DNSServer.h>
#include <LittleFS.h>
//Pin für Pumpen-Relais: D8
//Pin für Ventil-Relais 'Pool': D2
//Pin für Ventil-Relais 'Solar': D3
//Pin für End-Schalter 'Pool': D5
//Pin für End-Schalter 'Solar': D6
//Pin für Sensoren: D7
// Pin-Definitionen
const byte One_Wire_Bus = 4; // Pin für die Temperatursensoren
const byte valve_drive_pool_pin = 42; // Pins für das Ventil-Relais
const byte valve_drive_solar_pin = 41; // Pins für das Ventil-Relais
const byte PumpeRelaisPin = 45; // Pin für das Pumpen-Relais
const byte ValveSwitchPoolPin = 40; // Pin für den Ventilpositionsschalter in Postion "Pool"
const byte ValveSwitchSolarPin = 39; // Pin für den Ventilpositionsschalter in Postion "Solar"
// --Betriebszustände--
// Definition der Zustände
const byte Z_Aus = 1;
const byte Z_Umwaelzen = 2;
const byte Z_Solarbetrieb = 3;
const byte Z_SolarbetriebEin = 4;
const byte Z_StelleVentilPool = 5;
const byte Z_SolarbetriebAus = 6;
const byte Z_Manuell = 7;
const byte Z_Init = 99;
const byte Z_Error = 111;
// Zustandsvaiablen
byte PumpeVentil = Z_Init; //Initialisierung von Ventilstand
byte Z_Merker = 0;
//Struktur mit allen veränderbaren Daten als "Speicherblock"
struct SaveData {
// SOLL, SOLLMAX und SOLLMIN-Werte für die Pooltemperatur
float PoolSoll, PoolSollMax, PoolSollMin;
// Ein- bzw. Ausschalthysterese für Solarbetrieb
byte HystereseEin, HystereseEinMin, HystereseEinMax;
byte HystereseAus, HystereseAusMin, HystereseAusMax;
// Wartezeit für Ein-/Ausschalten des Solatbetriebs
byte SolarEinWartezeit, SolarAusWartezeit;
//Tauschen der Sensoren für Pool-/Solartemperatur
bool sensortausch;
};
//Initialieren der Variablen der Stuktur
struct SaveData settings = { 29.5, 32.0, 20.0, 6, 0, 9, 2, 0, 9, 5, 5, false};
// --Variablen für die Temperaturen--
float PoolIst = 0, SolarIst = 0; // Sensortemperaturen
const byte AbleseFrequenz = 3; // Intervall der Ablesung der Temperatursensoren in Sekunden
// Fahrzeit des 3-Wege-Ventils
const byte VentilStellZeit = 6; // maximal Stellzeit des Ventils in Sekunden
// --Variablen für die Timer--
//Abfrage und Steuerung der Timer
const byte STOP = 1, START = 2, UPDATE = 3, STATQUERY=0;
//Zustände der Timer
const byte STOPPED = 0, RUNNING = 1, TIMEOUT = 2;
// Einige Flags/Merker
bool TempAenderung = false;
const bool ein = true, aus = false;
const bool Pool=0, Solar=1;
bool errorlevel=0;
bool UmwelzFlag=false; //Name noch anpassen oder von der Zeitschaltuhr übernehmen
bool AutomatikEnabled=true; //Name noch aus der Automatik-Steuerung übernehmen
// Erzeugen der Objekte für Temperatursensoren
OneWire oneWire(One_Wire_Bus);
DallasTemperature sensors(&oneWire);
/*
// Prüft ob min<=wert>=max
bool imBereich(float wert, float min, float max){
if((wert-min)*(wert-max) <= 0) return true;
return false;
}
*/
void setup() {
Serial.begin(115200);
Serial.println(F("Start..."));
delay(100);
//Pin-Definitionen
pinMode(valve_drive_pool_pin, OUTPUT); // Pins für die Steuerrelais für die
pinMode(valve_drive_solar_pin, OUTPUT); // Pumpe und den Ventilantrieb
pinMode(PumpeRelaisPin, OUTPUT); // als Ausgänge definieren
pinMode(ValveSwitchPoolPin, INPUT); // Pins für die Endschalter der Ventil-
pinMode(ValveSwitchSolarPin, INPUT); // antriebs als Eingänge
digitalWrite(PumpeRelaisPin, LOW); // Zum Start alle Relais
digitalWrite(valve_drive_pool_pin, LOW); // ausschalten
digitalWrite(valve_drive_solar_pin, LOW);
Serial.print("Connecting to WiFi");
WiFi.begin("Wokwi-GUEST", "", 6);
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
Serial.println(" Connected!");
setupTime();
Serial.println((String)"Programmstart: " + localTime());
initSensors();
PumpeVentil=Z_Init;
}
void loop() {
HoleTemperaturen();
SteuerungPumpeVentil();
UpdateTimer();
timerSwitch();
}