#include #include #include "WifiManager.h" #define VERSION "v1.0" bool allow; bool error = false; /** pin config */ static const uint8_t WasserSensorPin = 14; static const uint8_t DruckSensorPin = 12; static const uint8_t SchuetzPin = 13; /** time config */ static const int abschaltzeit = 7200; //sek static const int maxpumpdauer = 600; //sek // ticker fuer kein-wasser abschaltung Ticker status; //pumpendauer maximum ticker Ticker pumpendauer; int turnontime = -1; void pumpeSchalten(bool on) { // digitalWrite(4,on); if (on) { Serial.println("versuche Pumpe EIN zuschalten"); } else { Serial.println("versuche Pumpe AUS zuschalten"); } if (allow && !error) { if (on) { pumpendauer.once(maxpumpdauer + 1, []() { //erlaube keine einschaltung von mehr als 60 sek if (millis() - turnontime >= maxpumpdauer * 1000 && turnontime != -1) { //error zu lange Serial.println("\n\npumpe lief mehr als 10 Minuten durchgaengig"); pumpeSchalten(false); error = true; } }); } turnontime = millis(); digitalWrite(SchuetzPin, on); Serial.println("[Erfolg] pumpe wird geschalten"); } else { Serial.println("[FEHLGESCHLAGEN] Schalten des Schütz gesperrt durch Timeout oder Fehler-- sofortiges ausschalten der pumpe\n"); turnontime = -1; digitalWrite(SchuetzPin, LOW); } } ICACHE_RAM_ATTR void DruckschalterInt() { if (digitalRead(DruckSensorPin) == HIGH) { //pumpe einschalten Serial.println("\n\nDruck Sensor EIN"); if (digitalRead(WasserSensorPin)) { Serial.println("Wasser Sensor EIN"); pumpeSchalten(true); } else { Serial.println("Wasser Sensor aus irgent einem Grund doch nicht ein -- sofort abschalten!"); pumpeSchalten(false); } } else { //pumpe ausschalten Serial.println("\n\nDruck Sensor AUS"); pumpeSchalten(false); } } int i = abschaltzeit; //todo better void WasserSensorCheck() { if (digitalRead(WasserSensorPin) == LOW) { Serial.println("Wasser Sensor AUS"); //kein Wasser dh timer auf 10min stellen allow = false; Serial.println("Schalte pumpe aus"); pumpeSchalten(false); Serial.println("warte 30min"); status.detach(); i = abschaltzeit; status.attach(5, []() { i -= 5; Serial.print("noch "); Serial.print(i); Serial.println(" Sekunden verbleibend"); if (i <= 0) { if (digitalRead(WasserSensorPin)) { allow = true; Serial.println("Einschalten der Pumpe wieder erlaubt."); //pruefen ob drucksensor ein DruckschalterInt(); } else { Serial.print("wassersensor immer noch kein Wasser --> verlaengern um 120min\n\n"); WasserSensorCheck(); } status.detach(); } }); } else { Serial.println("Wasser Sensor EIN"); } } ICACHE_RAM_ATTR void WasserSensorInt() { WasserSensorCheck(); } void setup() { digitalWrite(SchuetzPin, LOW); //pumpe anfangs sofort abschalten pinMode(SchuetzPin, OUTPUT); pinMode(LED_BUILTIN, OUTPUT); digitalWrite(LED_BUILTIN, LOW); pinMode(WasserSensorPin, INPUT); pinMode(DruckSensorPin, INPUT); Serial.begin(9600); Serial.println("\n\n\n\nstartup of ESP"); Serial.print("Version: "); Serial.println(VERSION); //initial measurement of water state delay(1000); //allow = digitalRead(WasserSensorPin); allow = true; WasserSensorCheck(); DruckschalterInt(); //anhängen der Pin-Interrupts attachInterrupt(digitalPinToInterrupt(DruckSensorPin), DruckschalterInt, CHANGE); attachInterrupt(digitalPinToInterrupt(WasserSensorPin), WasserSensorInt, CHANGE); Serial.println("startup sequence complete!\n"); digitalWrite(LED_BUILTIN, HIGH); WifiManager mang = WifiManager(); mang.init(); } void loop() { }