177 lines
4.5 KiB
C++
177 lines
4.5 KiB
C++
#include <Arduino.h>
|
|
#include <Ticker.h>
|
|
#include <EEPROM.h>
|
|
|
|
#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 maxpumpdauer = 600; //sek
|
|
|
|
// ticker fuer kein-wasser abschaltung
|
|
Ticker status;
|
|
|
|
//pumpendauer maximum ticker
|
|
Ticker pumpendauer;
|
|
|
|
WifiManager mang;
|
|
|
|
long turnontime = -1;
|
|
|
|
void pumpeSchalten(bool on) {
|
|
// digitalWrite(4,on);
|
|
if (on) {
|
|
Serial.println("versuche Pumpe EIN zuschalten");
|
|
// refresh last pump counter
|
|
mang.setlastPumpTime(millis());
|
|
} 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();
|
|
}else{
|
|
mang.setPumpDuration(millis() - turnontime);
|
|
}
|
|
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 = mang.getWaitTime(); //todo better
|
|
void WasserSensorCheck() {
|
|
if (digitalRead(WasserSensorPin) == LOW) {
|
|
Serial.println("Wasser Sensor AUS");
|
|
//kein Wasser dh timer auf 10min stellen
|
|
|
|
// refresh wateroutage counter
|
|
mang.setlastWaterOutage(millis());
|
|
|
|
allow = false;
|
|
Serial.println("Schalte pumpe aus");
|
|
pumpeSchalten(false);
|
|
|
|
Serial.println("warte 30min");
|
|
|
|
status.detach();
|
|
|
|
i = mang.getWaitTime();
|
|
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;
|
|
|
|
int value = mang.getWaitTime();
|
|
Serial.print("read value from eeprom: ");
|
|
Serial.println(value);
|
|
|
|
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);
|
|
|
|
|
|
mang.init();
|
|
}
|
|
|
|
|
|
void loop() {
|
|
mang.holdAlive();
|
|
} |