123 lines
2.9 KiB
C++
123 lines
2.9 KiB
C++
#include <ESP8266WiFi.h>
|
|
#include <ESP8266WiFiMulti.h>
|
|
#include <ESP8266Influxdb.h>
|
|
#include "settings.h"
|
|
|
|
int16_t idleValue = 0;
|
|
int16_t sensorValue = 0;
|
|
int8_t cutOffThreshold = cutOffTime;
|
|
int16_t cooldownRemaining = 0;
|
|
int16_t keepAliveRemaining = 0;
|
|
ESP8266WiFiMulti wifi;
|
|
Influxdb influxdb(INFLUXDB_HOST, INFLUXDB_PORT);
|
|
|
|
|
|
void setup() {
|
|
pinMode(D1, OUTPUT); // Relais
|
|
pinMode(D2, OUTPUT); // Status-LED
|
|
// A0 = Current sensor
|
|
|
|
digitalWrite(D1, LOW);
|
|
digitalWrite(D2, LOW);
|
|
|
|
// Connect to wifi
|
|
wifi.addAP(WIFI_SSID, WIFI_PASSWORD);
|
|
while (wifi.run() != WL_CONNECTED) {
|
|
digitalWrite(D2, !digitalRead(D2));
|
|
delay(200);
|
|
}
|
|
|
|
// Open DB connecton
|
|
digitalWrite(D2, LOW);
|
|
influxdb.opendb(INFLUXDB_DB, INFLUXDB_USER, INFLUXDB_PASS);
|
|
delay(2000);
|
|
|
|
// Open serial connection for debugging
|
|
if (DEBUG) {
|
|
Serial.begin(115200);
|
|
delay(500);
|
|
}
|
|
|
|
digitalWrite(D2, HIGH);
|
|
|
|
if (DEBUG) Serial.println("Ready for action!");
|
|
}
|
|
|
|
void loop() {
|
|
delay(loopTime*1000);
|
|
|
|
// Callibrate the idle value
|
|
if (idleValue == 0 || keepAliveRemaining == 0) {
|
|
if (DEBUG) Serial.println("Calibrate ...");
|
|
uint16_t samples = 0;
|
|
for (uint8_t i=0; i<30; i++) {
|
|
samples += analogRead(A0);
|
|
digitalWrite(D2, !digitalRead(D2));
|
|
delay(500);
|
|
}
|
|
|
|
idleValue = round(samples / 30);
|
|
keepAliveRemaining = keepAliveSignalTime;
|
|
if (DEBUG) Serial.println("Idle value: " + String(idleValue));
|
|
influxdb.write("pump-action idle_value=" + String(idleValue));
|
|
digitalWrite(D2, HIGH);
|
|
}
|
|
keepAliveRemaining -= 1;
|
|
|
|
// Need to cutoff the power to the pump?
|
|
if (cutOffThreshold <= 0) {
|
|
digitalWrite(D1, HIGH);
|
|
digitalWrite(D2, LOW);
|
|
cooldownRemaining = cooldownTime - loopTime;
|
|
cutOffThreshold = cutOffTime;
|
|
|
|
if (DEBUG) Serial.println("The pump is cutoff, because it is running to long");
|
|
|
|
return;
|
|
}
|
|
|
|
// Cooldown phase?
|
|
if (cooldownRemaining > 0) {
|
|
digitalWrite(D2, LOW);
|
|
cooldownRemaining -= loopTime;
|
|
influxdb.write("pump-action cutoff=1");
|
|
|
|
if (DEBUG) Serial.println("Cooldown phase ... " + String(cooldownRemaining) + " seconds remaining.");
|
|
|
|
return;
|
|
}
|
|
|
|
digitalWrite(D1, LOW);
|
|
digitalWrite(D2, HIGH);
|
|
|
|
// Read the sensor
|
|
sensorValue = 0;
|
|
for (uint8_t i=0; i<5; i++) {
|
|
sensorValue += analogRead(A0);
|
|
Serial.println(sensorValue);
|
|
delay(10);
|
|
}
|
|
sensorValue = round(sensorValue / 5);
|
|
|
|
|
|
if (DEBUG) Serial.println("Sensor value: " + String(sensorValue));
|
|
|
|
// The pump is on!
|
|
if (sensorValue > idleValue+10 || sensorValue < idleValue-10) {
|
|
influxdb.write("pump-action current=" + String(sensorValue));
|
|
cutOffThreshold -= loopTime;
|
|
digitalWrite(D2, !digitalRead(D2));
|
|
|
|
|
|
if (DEBUG) {
|
|
Serial.println("Write to Influxdb: " + String(sensorValue));
|
|
Serial.println(influxdb.response() == DB_SUCCESS ? "Success" : "Failed");
|
|
}
|
|
|
|
// The pump is off
|
|
} else {
|
|
cutOffThreshold = cutOffTime;
|
|
digitalWrite(D2, HIGH);
|
|
}
|
|
}
|