Hi,
melde mich zum einen um zu berichten und zum anderen fehlt mir noch eine Info zu meinem Glück. Da ich nicht zu Hause bin, fehlt mir die komplette Möglichkeit zum Test.
Nachdem ich die Füllstandsmessung mit dem Wemos D1 mini und einem Ultraschall Sensor HC-SR04 realisiert habe und die Steuerung der Pumpe, Magnetventile und Beleuchtung via Homematic Schaltarktoren bereits vorhanden waren, hab ich mir überlegt, warum nicht alles via Wemos und Relais.
Der Code im Wemos funktioniert soweit (s. unten):
- die Meldungen des Füllstands landen in HPCL
- die Befehle zum Start der Pumpe und Öffnung der Ventile (derzeit prüfbar über Relais, den Baukasten habe ich bei mir)
funktionieren via I-Explorer.
Die Befehlsfolge aus HPCL ist mir leider nicht bekannt, habe derzeit (s.unten) den URL direkt eingegeben, bei der Compilierung kam kein Fehler. Habe auch einiges über Getsite gelesen, soll aber nicht der Hit sein.
Derzeitige Programmierung HPCL (nicht getestet, nur kompiliert
Code: Alles auswählen
//===================================================================
// Tonne füllen
// Befüllen der Tonne bei min-Stand bis max-Stand
// aufgerufen von VirtSensor_LevelTonne
//===================================================================
//Füllung starten
Wenn Virt_01_BewaessGarten_MA = 1 und Virt_01_Pumpe <>1 und VirtSensor_LevelTonne <= Anz_LevelSwitchUnten und (Uhrzeit zwischen "17:00:00" und "21:00:00") dann
http://999.999.999.99/addons/contronics/CLWebI.ccc?SETVARBYNAME&BRAUN_MV_ANSAUGSTUTZEN_AUF
Virt_01_MagnetvAnsaugst:=1
http://999.999.999.99/addons/contronics/CLWebI.ccc?SETVARBYNAME&ORANGE_MV_ZURTONNE_AUF
Virt_01_MagnetvDruckst:=1
warte("00:00:10")
http://999.999.999.99/addons/contronics/CLWebI.ccc?SETVARBYNAME&GELB_WAPUMPE_AN
Virt_01_Pumpe:=1
warte("00:0010")
http://999.999.999.99/addons/contronics/CLWebI.ccc?SETVARBYNAME&BRAUN_MV_ANSAUGSTUTZEN_ZU
Virt_01_MagnetvAnsaugst:=0
endewenn
//Füllung beenden
Wenn Virt_01_BewaessGarten_MA = 1 und VirtSensor_LevelTonne >= Anz_LevelSwitchMax und (Uhrzeit zwischen "17:00:00" und "21:30:00") dann
http://999.999.999.99/addons/contronics/CLWebI.ccc?SETVARBYNAME&GELB_WAPUMPE_AUS
Virt_01_Pumpe:=0
warte("00:00:10")
http://999.999.999.99/addons/contronics/CLWebI.ccc?SETVARBYNAME&BRAUN_MV_ANSAUGSTUTZEN_ZU
Virt_01_MagnetvAnsaugst:=0
http://999.999.999.99/addons/contronics/CLWebI.ccc?SETVARBYNAME&ORANGE_MV_ZURTONNE_ZU
Virt_01_MagnetvDruckst:=0
endewenn
Derzeitiger Programmstand Wemos, getestet und funktionstüchtig
Code: Alles auswählen
/*
Steuerung im Gartenhaus
==============================================================
Autor:.................: AFi
Erstellt...............: 16.8.2017
Version................: 1
Wemos verbindet sich mit dem definierten WLAN als Server und
der Haussteuerung (EE HPCL) als Client
Hardware: WeMos D1 mini (oder Clone)
5 Relais Shield 10A 220V
Ultraschall Sensor; HC-SR04
==============================================================
*/
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <ESP8266WebServer.h>
#define ECHO_PIN 4 //ACHTUNG D2!!!!
#define TRIGGER_PIN 2 //ACHTUNG D4!!!!
#define SCHALLGESCHWINDIGKEIT 0.343 //343 m/s = 0,343 mm/µs
#define braun_MV_Ansaugstutzen 5 //ACHTUNG D1!!!!; Magnetventil Ansaugstutzen
#define orange_MV_ZurTonne 13 //ACHTUNG D7!!!!; Magnetventil zur Tonne
#define gelb_WaPumpe 12 //Achtung D6!!!!; Wasserpumpe
#define gruen_LichtGarten 14 //Achtung D5!!!!; Licht Garten
//Netzwerkeinstellungen und Variablen Definition
const char* ssid = "......."; //SSID des vorhandenen WLANs
const char* password = "........."; //Passwort für das vorhandene WLAN
IPAddress gateway(999,999,9,9); //IP-Adresse des WLAN-Gateways
IPAddress subnet(999,999,999,9); //Subnetmask
IPAddress ip(999,999,9,999); //feste IP-Adresse für den WeMos
const char* host = "999.999.9.99"; //IP-Adresse der CCU (Haussteuerung)
ESP8266WebServer server(99); //Webserver initialisieren auf Port 99
String SendeURL = ""; //Übergabe URL an CCU (Haussteuerung)
unsigned long deltaMessungSekunden = 5; //Zeitintervall (Sekunden) nachdem eine Messung erfolgt
float h_Tonne = 740; //Höhe Tonne, bzw. max Abstand Sensor bis Boden
String ErgebnisMeldung; //Ergebnismeldung bei Sendung Daten an URL
unsigned long deltaMeldungSekunden = 3600; //Zeitintervall (Sekunden) nachdem eine Meldung an CCU (Haussteuerung) erfolgt; 0 nie
float DeltaLevel = 15; //Level Änderung bei der eine Meldung an CCU erfolgt in mm; 0 nie
float LevelCCU; //Level der an CCU gesendet wird
float Level; //Level aus Messung
unsigned long jetztMillis = 0; //Variable Zeit für Vergleichsabfragen
unsigned long deltaMessungMillis = deltaMessungSekunden * 1000; //Umrechnung Sekunden in Millisekunden
unsigned long letzteMessungMillis = 0;
unsigned long deltaMeldungMillis = deltaMeldungSekunden * 1000;
unsigned long letzteMeldungMillis = 0;
char MAC_char[18]; // globale Variable mit der Mac-Adresse des WLAN-Moduls
String ZeitStempel() { //Ablaufzeit / Betriebszeit als hh:mm:ss
static char stempel[10];
int lfdStunden = millis() / 3600000;
int lfdMinuten = millis() / 60000 - lfdStunden * 60;
int lfdSekunden = millis() / 1000 - lfdStunden * 3600 - lfdMinuten * 60;
sprintf (stempel, "%02d:%02d:%02d", lfdStunden,lfdMinuten,lfdSekunden);
return stempel;
}
void MV_Ansaugstutzen_auf() {
digitalWrite(braun_MV_Ansaugstutzen, HIGH);
server.send(200, "text/plain", "Ansaugstutzen Magnetventil ist auf");
delay(100);
Serial.println(ZeitStempel() + " Ansaugstutzen Magnetventil ist auf");
}
void MV_Ansaugstutzen_zu() {
digitalWrite(braun_MV_Ansaugstutzen, LOW);
server.send(200, "text/plain", "Ansaugstutzen Magnetventil ist zu");
delay(100);
Serial.println(ZeitStempel() + " Ansaugstutzen Magnetventil ist zu");
}
void MV_ZurTonne_auf() {
digitalWrite(orange_MV_ZurTonne, HIGH);
server.send(200, "text/plain", "Zur Tonne Magnetventil ist auf");
delay(100);
Serial.println(ZeitStempel() + " Zur Tonne Magnetventil ist auf");
}
void MV_ZurTonne_zu() {
digitalWrite(orange_MV_ZurTonne, LOW);
server.send(200, "text/plain", "Zur Tonne Magnetventil ist zu");
delay(100);
Serial.println(ZeitStempel() + " Zur Tonne Magnetventil ist zu");
}
void WaPumpe_an() {
digitalWrite(gelb_WaPumpe, HIGH);
server.send(200, "text/plain", "Wasserpumpe ist an");
delay(100);
Serial.println(ZeitStempel() + " Wasserpumpe ist an");
}
void WaPumpe_aus() {
digitalWrite(gelb_WaPumpe, LOW);
server.send(200, "text/plain", "Wasserpumpe ist aus");
delay(100);
Serial.println(ZeitStempel() + " Wasserpumpe ist aus");
}
//If-Abfrage notwendig, da Wechselschaltung
void LichtGarten_an() {
if (digitalRead(gruen_LichtGarten) == HIGH) {
digitalWrite(gruen_LichtGarten, LOW);
}
else {
digitalWrite(gruen_LichtGarten, HIGH);
}
server.send(200, "text/plain", "Licht Garten ist an");
delay(100);
Serial.println(ZeitStempel() + " Licht Garten ist an");
}
//If-Abfrage notwendig, da Wechselschaltung
void LichtGarten_aus() {
if (digitalRead(gruen_LichtGarten) == LOW) {
digitalWrite(gruen_LichtGarten, HIGH);
}
else {
digitalWrite(gruen_LichtGarten, LOW);
}
server.send(200, "text/plain", "Licht Garten ist aus");
delay(100);
Serial.println(ZeitStempel() + " Licht Garten ist aus");
}
void setup() {
pinMode(ECHO_PIN, INPUT);
pinMode(TRIGGER_PIN, OUTPUT);
pinMode(braun_MV_Ansaugstutzen, OUTPUT);
pinMode(orange_MV_ZurTonne, OUTPUT);
pinMode(gelb_WaPumpe, OUTPUT);
pinMode(gruen_LichtGarten, OUTPUT);
Serial.begin(115200);
Serial.println("");
Serial.println("==================================");
Serial.println(" WeMos D1 mini Füllstandsmessung,");
Serial.println(" Bewaesserung und Lichtsteuerung");
Serial.println(" G A R T E N H A U S");
Serial.println("----------------------------------");
Serial.println("Stand: 16.08.2017 Version: 1.0");
Serial.println("==================================");
//WLAN-Verbindung aufbauen
WiFi.config(ip, gateway, subnet);
WiFi.begin(ssid, password);
Serial.print("Verbindungsaufbau....");
//Verbindungsaufbau abwarten
while (WiFi.status() != WL_CONNECTED)
{
delay(200);
Serial.print(".");
}
Serial.println(" erfolgreich!");
Serial.println("");
Serial.print("Verbunden mit: ");
Serial.println(ssid);
Serial.print("Signalstärke: ");
int rssi = WiFi.RSSI();
Serial.print(rssi);
Serial.println(" dBm");
Serial.print("IP-Adresse: ");
Serial.println(WiFi.localIP());
Serial.println("");
//HTTP-Server starten
server.begin();
Serial.println(ZeitStempel() + " HTTP-Server gestartet");
Serial.println("");
//Startwerte für Zeittrigger
letzteMessungMillis = millis();
letzteMeldungMillis = millis();
//MAC-Adresse Arduino auslesen
uint8_t MAC_array[6];
// MAC-Adresse ermitteln und ausgeben
WiFi.macAddress(MAC_array); // die 6 Byte der MAC-Adresse auselsen und in ein Array schreiben
for (int i = 0; i < sizeof(MAC_array); ++i){
sprintf(MAC_char,"%s%02x:",MAC_char,MAC_array[i]);
}
MAC_char[strlen(MAC_char)-1] = '\0'; // letztes Zeichen ":" kürzen
// MAC-Adresse steht in der globalen Variable: MAC_char
Serial.print("MAC-Adresse: ");
Serial.print(MAC_char);
Serial.println(" ");
//HTTP-Anfragen bearbeiten
server.on("/braun_MV_Ansaugstutzen_auf", MV_Ansaugstutzen_auf);
server.on("/braun_MV_Ansaugstutzen_zu", MV_Ansaugstutzen_zu);
server.on("/orange_MV_ZurTonne_auf", MV_ZurTonne_auf);
server.on("/orange_MV_ZurTonne_zu", MV_ZurTonne_zu);
server.on("/gelb_WaPumpe_an", WaPumpe_an);
server.on("/gelb_WaPumpe_aus", WaPumpe_aus);
server.on("/gruen_LichtGarten_an", LichtGarten_an);
server.on("/gruen_LichtGarten_aus", LichtGarten_aus);
}
// Messung mit Sensor ausführen
void MissEntfernungMitUltraschall() {
digitalWrite(TRIGGER_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIGGER_PIN, LOW);
int pulsdauer = pulseIn(ECHO_PIN, HIGH);
//Abfrage ob Messung erfolgreich oder Störung auf Sensor
if (isnan(pulsdauer)) {
Serial.println (ZeitStempel() + " Fehler: Sensor konnte nicht abgefragt werden!!");
delay(100);
return;
}
letzteMessungMillis = jetztMillis;
Level = h_Tonne - (pulsdauer*SCHALLGESCHWINDIGKEIT) / 2;
Serial.println(ZeitStempel() + " Der Füllstand beträgt: " + Level + " mmWS");
}
//Meldung an HPCL (homeputerCL/CCU absetzen
void melde_HPCL() {
HTTPClient http;
SendeURL = "http://999.999.999.99/addons/contronics/CLWebI.ccc?SETVARBYNAME&VIRTSENSOR_LEVELTONNE=";
SendeURL += Level;
http.begin(SendeURL);
int httpCode = http.GET();
if (httpCode == HTTP_CODE_OK) {
ErgebnisMeldung = http.getString();
Serial.println(ZeitStempel() + " Übertragung: " + ErgebnisMeldung);
LevelCCU = Level;
}
else
{
Serial.println(ZeitStempel() + " Übertragung: " + httpCode);
}
http.end();
}
void loop()
{
// auf HTTP-Anfragen warten
server.handleClient(); //auf HTTP-Anfragen warten
jetztMillis = millis();
// neue Messung falls Zeitintervall erreicht
if (jetztMillis - letzteMessungMillis > deltaMessungMillis)
{
letzteMessungMillis = jetztMillis;
MissEntfernungMitUltraschall();
}
// neue Meldung an CCU falls Zeitintervall erreicht
if ((deltaMeldungMillis != 0) && ((jetztMillis - letzteMeldungMillis) > deltaMeldungMillis))
{
Serial.println(ZeitStempel() + " Zeitintervall erreicht");
letzteMeldungMillis = jetztMillis;
melde_HPCL();
}
// neue Meldung an CCU falls Level den Schwellwert erreicht
if ((DeltaLevel != 0) && (abs(Level - LevelCCU) >= DeltaLevel))
{
Serial.println(ZeitStempel() + " Leveländerung erreicht");
LevelCCU = Level;
melde_HPCL();
}
}