PumpenSteuerung/src/main.cpp

191 lines
4.9 KiB
C++
Raw Normal View History

2020-01-26 15:37:33 +01:00
#include <Arduino.h>
#include <Ticker.h>
#include "WifiManager.h"
2020-11-10 17:38:33 +01:00
#include "Heating.h"
#include "Pins.h"
#define VERSION "v1.1.1"
2020-04-11 11:02:10 +02:00
2020-01-26 15:37:33 +01:00
bool allow;
2020-01-27 07:21:57 +01:00
bool error = false;
2020-01-26 15:37:33 +01:00
2020-11-10 17:38:33 +01:00
2020-01-26 15:37:33 +01:00
2020-03-28 13:07:22 +01:00
/** time config */
static const int maxpumpdauer = 600; //sek
2020-01-27 07:21:57 +01:00
// ticker fuer kein-wasser abschaltung
2020-01-27 07:21:57 +01:00
Ticker status;
//pumpendauer maximum ticker
Ticker pumpendauer;
2020-01-26 15:37:33 +01:00
WifiManager mang;
2020-11-10 17:38:33 +01:00
Heating mHeat;
long turnontime = -1;
2020-01-26 15:37:33 +01:00
void pumpeSchalten(bool on) {
// digitalWrite(4,on);
2020-01-27 07:21:57 +01:00
if (on) {
Serial.println("versuche Pumpe EIN zuschalten");
// refresh last pump counter
mang.setlastPumpTime(millis());
2020-01-27 07:21:57 +01:00
} 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) {
2020-01-27 07:21:57 +01:00
//error zu lange
2020-03-28 13:07:22 +01:00
Serial.println("\n\npumpe lief mehr als 10 Minuten durchgaengig");
2020-01-27 07:21:57 +01:00
pumpeSchalten(false);
error = true;
}
});
} else {
mang.setPumpDuration(millis() - turnontime);
2020-01-27 07:21:57 +01:00
}
// save pump start time
turnontime = millis();
2020-01-26 15:37:33 +01:00
digitalWrite(SchuetzPin, on);
2020-01-27 07:21:57 +01:00
Serial.println("[Erfolg] pumpe wird geschalten");
2020-01-26 15:37:33 +01:00
} else {
Serial.println("[FEHLGESCHLAGEN] Schalten des Schütz gesperrt durch Timeout oder Fehler-- sofortiges ausschalten der pumpe\n");
turnontime = -1;
2020-01-27 07:21:57 +01:00
digitalWrite(SchuetzPin, LOW);
2020-01-26 15:37:33 +01:00
}
}
ICACHE_RAM_ATTR void DruckschalterInt() {
if (digitalRead(DruckSensorPin) == HIGH) {
//pumpe einschalten
2020-01-27 07:21:57 +01:00
Serial.println("\n\nDruck Sensor EIN");
2020-03-28 13:07:22 +01:00
if (digitalRead(WasserSensorPin)) {
2020-01-27 07:21:57 +01:00
Serial.println("Wasser Sensor EIN");
pumpeSchalten(true);
2020-03-28 13:07:22 +01:00
} else {
2020-01-27 07:21:57 +01:00
Serial.println("Wasser Sensor aus irgent einem Grund doch nicht ein -- sofort abschalten!");
pumpeSchalten(false);
}
2020-01-26 15:37:33 +01:00
} else {
//pumpe ausschalten
2020-01-27 07:21:57 +01:00
Serial.println("\n\nDruck Sensor AUS");
2020-01-26 15:37:33 +01:00
pumpeSchalten(false);
}
}
2020-06-20 15:10:35 +02:00
int i = mang.getWaitTime(); //todo better
2020-01-26 15:37:33 +01:00
void WasserSensorCheck() {
if (digitalRead(WasserSensorPin) == LOW) {
Serial.println("Wasser Sensor AUS");
//kein Wasser dh timer auf 10min stellen
// refresh wateroutage counter
mang.setlastWaterOutage(millis());
2020-01-26 15:37:33 +01:00
allow = false;
Serial.println("Schalte pumpe aus");
pumpeSchalten(false);
Serial.println("warte 30min");
2020-01-27 07:21:57 +01:00
status.detach();
2020-06-20 15:10:35 +02:00
i = mang.getWaitTime();
2020-01-27 07:21:57 +01:00
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();
2020-01-26 15:37:33 +01:00
}
});
} else {
Serial.println("Wasser Sensor EIN");
}
}
ICACHE_RAM_ATTR void WasserSensorInt() {
WasserSensorCheck();
}
void setup() {
2020-11-10 15:12:47 +01:00
// set pins as output
2020-04-10 14:44:18 +02:00
pinMode(SchuetzPin, OUTPUT);
2020-01-26 15:37:33 +01:00
pinMode(LED_BUILTIN, OUTPUT);
2020-09-30 23:27:26 +02:00
pinMode(LuefterPin, OUTPUT);
2020-11-10 15:12:47 +01:00
pinMode(HeizungPin, OUTPUT);
2020-09-30 23:27:26 +02:00
2020-01-26 15:37:33 +01:00
pinMode(WasserSensorPin, INPUT);
pinMode(DruckSensorPin, INPUT);
2020-11-10 15:12:47 +01:00
// initialize pins
digitalWrite(LED_BUILTIN, LOW);
digitalWrite(SchuetzPin, LOW); //pumpe anfangs sofort abschalten
digitalWrite(LuefterPin, LOW);
digitalWrite(HeizungPin, LOW);
2020-01-26 15:37:33 +01:00
2020-11-10 15:12:47 +01:00
// initilize serial connection
2020-12-05 12:45:07 +00:00
Serial.begin(115200);
2020-01-26 15:37:33 +01:00
Serial.println("\n\n\n\nstartup of ESP");
2020-04-11 11:02:10 +02:00
Serial.print("Version: ");
Serial.println(VERSION);
2020-01-26 15:37:33 +01:00
//initial measurement of water state
delay(1000);
//allow = digitalRead(WasserSensorPin);
2020-01-27 07:21:57 +01:00
allow = true;
2020-06-20 15:10:35 +02:00
int value = mang.getWaitTime();
Serial.print("read value from eeprom: ");
Serial.println(value);
2020-01-26 15:37:33 +01:00
WasserSensorCheck();
DruckschalterInt();
2020-01-27 07:21:57 +01:00
2020-11-10 15:12:47 +01:00
2020-01-27 07:21:57 +01:00
//anhängen der Pin-Interrupts
2020-01-26 15:37:33 +01:00
attachInterrupt(digitalPinToInterrupt(DruckSensorPin), DruckschalterInt, CHANGE);
attachInterrupt(digitalPinToInterrupt(WasserSensorPin), WasserSensorInt, CHANGE);
// initialize heating control
2020-11-14 21:21:22 +01:00
Serial.println("initializing heating service");
2020-12-05 12:45:07 +00:00
mHeat.init(Heating::HUMIDITY);
// initialize wifi
Serial.println("Initializing wifi");
mang.init(mHeat.getLastHum(), mHeat.getLastTemp());
2020-11-10 15:12:47 +01:00
2020-01-26 15:37:33 +01:00
Serial.println("startup sequence complete!\n");
digitalWrite(LED_BUILTIN, HIGH);
}
void loop() {
mang.holdAlive();
2020-01-26 15:37:33 +01:00
}