#include <WiFi.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <WebServer.h>
#include <DNSServer.h>
#include <LittleFS.h>
//#define DEBUGGING // Einkommentieren für die Serielle Ausgabe
#ifdef DEBUGGING
#define DEBUG_B(...) Serial.begin(__VA_ARGS__)
#define DEBUG_P(...) Serial.println(__VA_ARGS__)
#define DEBUG_F(...) Serial.printf(__VA_ARGS__)
#else
#define DEBUG_B(...)
#define DEBUG_P(...)
#define DEBUG_F(...)
#endif
//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;
// --Variablen für die IST-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 START = 1, STOP = 2, UPDATE = 3, STATQUERY=0;
//Zustände der Timer
const byte STOPPED = 0, RUNNING = 1, TIMEOUT = 2;
//Fehlerzustand für Ventilstand
const byte ERROR=3;
bool pumpTrigger=0;
byte valveTrigger=0;
//Steuerung des Ventils
byte valveStatus;
const byte Pool=0, Solar=1;
const byte Travelling=3, Unnkown=4;
// Einige Flags/Merker
const bool ein = true, aus = false;
bool TempAenderung = false;
bool errorlevel=0;
bool pump_status=aus;
bool UmwaelzFlag=false; //Name noch anpassen oder von der Zeitschaltuhr übernehmen
bool AutomatikEnabled=ein; //Name noch aus der Automatik-Steuerung übernehmen
// Erzeugen der Objekte für Temperatursensoren
OneWire oneWire(One_Wire_Bus);
DallasTemperature sensors(&oneWire);
WebServer server(80);
const byte DNS_PORT = 53;
DNSServer dnsServer;
/*
// 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);
setupFS();
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());
singleTimerSwitch();
Einstellungen();
server.begin();
initSensors();
sendStatus();
PumpeVentil=Z_Init;
}
void loop()
{
server.handleClient();
dnsServer.processNextRequest();
//reStation();
/*
if (millis() < 0x2FFF || millis() > 0xFFFFF0FF) { // Die Funktion "runtime()" wird nur für den Admin Tab gebraucht.
runtime(); // Auskommentieren falls du den Admin Tab nicht nutzen möchtest.
}
*/
HoleTemperaturen();
SteuerungPumpeVentil();
UpdateTimer();
timerSwitch();
}