Ist sicher nicht optimal strukturiert, aber für den zweiten Versuch bin ich zumindest ganz zufrieden. Ich habe gesehen, dass es einige Beispiele für Poolsteuerung gibt, aber alle passten nicht optimal und ich wollte das selbst mal probieren und auch einigermaßen verstehen. Es geht im Wesentlichen um "click lang schwarz" Es sind noch click-Verzweigungen und Serial.print() Zeilen drin, die ich löschen muß.
#include <ArduinoOTA.h>
#include "LiquidCrystal_I2C.h"
#include <ESP8266WiFi.h>
#include <ESP8266WiFiScan.h>
#include <PubSubClient.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include "OneButton.h"
#define ONE_WIRE_BUS D1
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
const char* ssid = "XXX";
const char* password = "XXX";
const char* mqtt_server = "xxx.xxx.xxx.xxx";
int TempPin = 5;
int SwEin = 13;
int SwAus = 12;
int LedPin = 14;
int Hyst = 3;
int MinDiff = 1;
float solar = 0;
float pool = 0;
float diff = 0;
OneButton e_button(13, true);
OneButton a_button(12, true);
LiquidCrystal_I2C lcd(0x27, 20, 4);
WiFiClient espClient;
PubSubClient client(espClient);
void setup() {
Serial.begin(115200);
sensors.begin();
lcd.init();
lcd.backlight();
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
}
ArduinoOTA.setHostname("xy");
ArduinoOTA.setPassword("0");
ArduinoOTA.begin();
client.setServer(mqtt_server, 1883);
e_button.attachClick(click1);
e_button.attachDoubleClick(doubleclick1);
e_button.attachLongPressStart(longPressStart1);
e_button.attachLongPressStop(longPressStop1);
e_button.attachDuringLongPress(longPress1);
a_button.attachClick(click2);
a_button.attachDoubleClick(doubleclick2);
a_button.attachLongPressStart(longPressStart2);
a_button.attachLongPressStop(longPressStop2);
a_button.attachDuringLongPress(longPress2);
pinMode(TempPin, OUTPUT);
pinMode(LedPin, OUTPUT);
pinMode(SwEin, INPUT);
pinMode(SwAus, INPUT);
Automatik();
} // setup
void loop() {
e_button.tick();
a_button.tick();
ArduinoOTA.handle();
if (!client.connected()) {
reconnect();
}
client.loop();
sensors.setWaitForConversion(false); // makes it async
sensors.requestTemperatures();
sensors.setWaitForConversion(true);
solar = sensors.getTempCByIndex(0);
pool = sensors.getTempCByIndex(1);
char PoolTemp[TempPin];
char SolarTemp[TempPin];
char DiffTemp [10];
char minddiff [1];
char hysterese [1];
diff = solar-pool;
dtostrf(pool, 4, 1, PoolTemp);
dtostrf(solar, 4, 1, SolarTemp);
dtostrf(diff, 4, 1, DiffTemp);
dtostrf(Hyst, 1, 0, hysterese);
lcd.setCursor(0, 0);
lcd.print("POOL : ");
lcd.setCursor(14, 0);
lcd.print(PoolTemp);
client.publish("Pool", PoolTemp);
client.publish("Solar", SolarTemp);
client.publish("Diff", DiffTemp);
client.publish("Hyst", hysterese);
lcd.print("\337C");
lcd.setCursor(0, 1);
lcd.print("SOLAR : ");
lcd.setCursor(14, 1);
lcd.print(SolarTemp);
lcd.print("\337C");
lcd.setCursor(0, 2);
lcd.print("DIFFERENZ : ");
if (diff <= -10) {
lcd.setCursor(12, 2);
} else if (diff <= 0) {
lcd.setCursor(12, 2);
lcd.print(" ");
lcd.setCursor(14, 2);
} else if (diff >= 10) {
lcd.setCursor(13, 2);
lcd.print(" ");
lcd.setCursor(14, 2);
} else {
lcd.setCursor(13, 2);
lcd.print(" ");
lcd.setCursor(14, 2);
}
lcd.print(DiffTemp);
lcd.print("\337C");
e_button.tick();
a_button.tick();
} // Ende loop
//Tastendruck auswerten
// click schwarz 1x
void click1() {
digitalWrite(LedPin, HIGH);
Serial.println("schwarz ein");
lcd.setCursor(0, 3);
lcd.print("DAUER : EIN");
client.publish("Led", "true");
client.publish("Modus", "ein");
}
// click schwarz 2x
void doubleclick1() {
Automatik();
}
// click schwarz lang Start
void longPressStart1() {
}
// click schwarz lang
void longPress1() {
Serial.println("e_button longPress start");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Einschaltdifferenz ");
static uint8_t counter = 0;
counter ++;
if (counter > 5) counter = 0;
Serial.println(counter);
}
// click schwarz lang Stop
void longPressStop1() {
Serial.println("e_button longPress stop");
}
// Taste rot
void click2() {
Serial.println("rot ein");
digitalWrite(LedPin, LOW);
lcd.setCursor(0, 3);
lcd.print("PUMPE : AUS");
client.publish("Led", "false");
client.publish("Modus", "aus");
}
// Taste rot 2x
void doubleclick2() {
Automatik();
}
// Taste rot lang Start
void longPressStart2() {
Serial.println("a_button longPress start");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Ausschaltdifferenz ");
lcd.setCursor(0, 1);
lcd.print("Taster rot drücken");
}
// Taste rot lang
void longPress2() {
Serial.println("a_button longPress...");
}
// Taste rot lang Stop
void longPressStop2() {
Serial.println("a_button longPress stop");
lcd.setCursor(0, 1);
lcd.print("Taster schwarz lang stop ");
}
void Automatik() {
lcd.setCursor(0, 3);
Serial.println("Auto ");
if (diff >= Hyst) {
lcd.print("Automatik : EIN");
digitalWrite(LedPin, HIGH);
client.publish("Led", "true");
client.publish("Modus", "auto_ein");
}
else if (diff <= MinDiff) {
digitalWrite(LedPin, LOW);
lcd.print("Automatik : AUS");
client.publish("Led", "false");
client.publish("Modus", "auto_aus");
if (solar <= 0) {
lcd.setCursor(0, 3);
lcd.print("Frostschutz : EIN");
digitalWrite(LedPin, HIGH);
client.publish("frost", "true");
client.publish("Led", "true");
} else {
client.publish("frost", "false");
client.publish("Led", "false");
}
}
}
void reconnect() {
while (!client.connected()) {
String clientId = "ESP8266_DS18b20";
if (client.connect(clientId.c_str())) {
} else {
delay(6000);
}
}
}