Steuerung Pumpenvorlage mittels Füllstandskontrolle
Moderator: Co-Administratoren
Re: Steuerung Pumpenvorlage mittels Füllstandskontrolle
Hi,
genau dies wollte ich nicht tun, die Logik sollte immer in HPCL sein, der Wemos sollte immer ein Befehlsempfänger und Melder sein. Klar kann ich mich durchringen diese Teillogik im Wemos zu realisieren und die Befüllung aus HPCL mit einem Befehl zu starten, bei der Gartenbeleuchtung wird dies nicht gehen, da ich die BW aus HPCL benötige zur Einschaltung des Lichtes und zur Detektierung ob das Licht brennt. Dies bedeutet ich werde Schaltbefehle aus HPCL an Wemos senden müssen.
Kannst Du bitte etwas konkreter werden mit Shell-Aufruf und wget, dass ist wieder komplettes Neuland für mich.
Gruß Axel
genau dies wollte ich nicht tun, die Logik sollte immer in HPCL sein, der Wemos sollte immer ein Befehlsempfänger und Melder sein. Klar kann ich mich durchringen diese Teillogik im Wemos zu realisieren und die Befüllung aus HPCL mit einem Befehl zu starten, bei der Gartenbeleuchtung wird dies nicht gehen, da ich die BW aus HPCL benötige zur Einschaltung des Lichtes und zur Detektierung ob das Licht brennt. Dies bedeutet ich werde Schaltbefehle aus HPCL an Wemos senden müssen.
Kannst Du bitte etwas konkreter werden mit Shell-Aufruf und wget, dass ist wieder komplettes Neuland für mich.
Gruß Axel
-
- Beiträge: 7151
- Registriert: 31.12.2006, 15:18
- System: Alternative CCU (auf Basis OCCU)
- Wohnort: Rhein-Main
- Danksagung erhalten: 34 Mal
Re: Steuerung Pumpenvorlage mittels Füllstandskontrolle
Hi,
wenn Du keine "Rückmeldung" bzw. das Ergebnis von dem WebAufrauf brauchst, dann würde ich ein
machen, das ist wie die URL im Browser eingeben und Enter drücken. Wenn man die Rückgabe/das Ergebnis der URL-Aufrufes braucht, ist das so keine Lösung, dann ist das einfachste, den getsite-Befehl zu nutzen (der aber aktuell Probleme bereiten kann, wenn man ihn zu schnell hintereinander/parallel einsetzt)
Der Familienvater
wenn Du keine "Rückmeldung" bzw. das Ergebnis von dem WebAufrauf brauchst, dann würde ich ein
Code: Alles auswählen
strURL := "http://die.ip.des.wemos/UrlAufDemWemos?GGfParameter"
strCommand := "/usr/bin/wget -q -O /dev/null "+strURL
startprogramm(strCommand)
Der Familienvater
Re: Steuerung Pumpenvorlage mittels Füllstandskontrolle
Hi,
der Urlaub ist vorbei, das Programm geschrieben und der Schaltschrank gebaut.
Zuerst das komplette Programm des Wemos, funktionstüchtig.
Es wird Licht, Pumpe und Magnetventile geschaltet und der Füllstand gemessen.
Die Steuerung über den Explorer funktioniert, z.B.: "//...IPWemos..../gelb_WaPumpe_an", jedoch nicht aus HPCL.
Ich habe für die Pumpe einen virtuellen Schalter angelegt und folgendes Makro dazu geschrieben:
Variablendefinition:
strURL3 = Text
strCommand = Text
Ausführen bei Änderung aktiviert
Unter Allgemein: Ausführen bei Eingabe aktiviert
Was mach ich falsch, dass es aus HPCL nicht funktioniert??
Viele Grüße
Axel
der Urlaub ist vorbei, das Programm geschrieben und der Schaltschrank gebaut.
Zuerst das komplette Programm des Wemos, funktionstüchtig.
Es wird Licht, Pumpe und Magnetventile geschaltet und der Füllstand gemessen.
Code: Alles auswählen
/*
Steuerung im Gartenhaus
==============================================================
Autor:.................: AFi
Erstellt...............: 29.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!!!!; Wemos blau - Sensor weiß
#define TRIGGER_PIN 2 //ACHTUNG D4!!!!; Wemos dunkelgrün - Sensor gelb
#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(..............); //IP-Adresse des WLAN-Gateways
IPAddress subnet(...........); //Subnetmask
IPAddress ip(...........); //feste IP-Adresse für den WeMos
const char* host = ".............."; //IP-Adresse der CCU (Haussteuerung)
ESP8266WebServer server(80); //Webserver initialisieren auf Port 80
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 = 10; //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");
}
//Sicherheitsabschaltung Pumpe / Ueberlaufschutz
void WaPumpe_aus_Max() {
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://....IPCCU2......../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();
}
//Hauptroutine
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();
}
// Sicherheitsbaschaltung Wasserpumpe
if (Level >= 605) { //max Level
WaPumpe_aus_Max();
}
}
Die Steuerung über den Explorer funktioniert, z.B.: "//...IPWemos..../gelb_WaPumpe_an", jedoch nicht aus HPCL.
Ich habe für die Pumpe einen virtuellen Schalter angelegt und folgendes Makro dazu geschrieben:
Code: Alles auswählen
//===================================================================
//Pumpe Garten per Schalter einschalten
//
//===================================================================
Wenn Virt_01_Pumpe = 1 dann
strURL3 := "http://....IPWemos.........../gelb_WaPumpe_an"
strCommand3 := "/usr/bin/wget - q -0 /dev/null "+strURL3
startprogramm(strCommand3)
endewenn
Wenn Virt_01_Pumpe = 0 dann
strURL3 := "http://........IPWemos....../gelb_WaPumpe_aus"
strCommand3 := "/usr/bin/wget - q -0 /dev/null "+strURL3
startprogramm(strCommand3)
endewenn
Variablendefinition:
strURL3 = Text
strCommand = Text
Ausführen bei Änderung aktiviert
Unter Allgemein: Ausführen bei Eingabe aktiviert
Was mach ich falsch, dass es aus HPCL nicht funktioniert??
Viele Grüße
Axel
-
- Beiträge: 7151
- Registriert: 31.12.2006, 15:18
- System: Alternative CCU (auf Basis OCCU)
- Wohnort: Rhein-Main
- Danksagung erhalten: 34 Mal
Re: Steuerung Pumpenvorlage mittels Füllstandskontrolle
Hi,
die wget-Zeile am besten komplett auf der Konsole per SSH ausprobieren, Du hast auf jeden Fall ein Leerzeichen zuviel zwischen - und q, und Asche auf mein Haupt, es muss ein kleines o sein...
Es kann evtl. noch notwendig sein, die URL in Quotes oder DoubleQuotes zu setzen, das würdest Du aber merken, wenn Du von der Konsole aus probierst, und es Fehler gäbe, Quotes sind einfach, einfach die URL in ' einpacken (das Zeichen, was man normal mit Shift+# bekommt), ansonsten müssen es doppelte Anführungszeichen sein, also " (das Shift-2), das ist aber komplizierter...
Der Familienvater
die wget-Zeile am besten komplett auf der Konsole per SSH ausprobieren, Du hast auf jeden Fall ein Leerzeichen zuviel zwischen - und q, und Asche auf mein Haupt, es muss ein kleines o sein...
Code: Alles auswählen
/usr/bin/wget -q -o /dev/null
Der Familienvater
Re: Steuerung Pumpenvorlage mittels Füllstandskontrolle
Hi,
der erste Test ist positiv, "Leerzeichen und kleines o" waren der Fehler.
Besten Dank für die tolle Unterstützung.
Viel Grüße
Axel
der erste Test ist positiv, "Leerzeichen und kleines o" waren der Fehler.
Besten Dank für die tolle Unterstützung.
Viel Grüße
Axel
Re: Steuerung Pumpenvorlage mittels Füllstandskontrolle
Hi,
habe bei der weiteren Programmierung festgestellt, dass der Wemos D1 mini ein "offenes" WLAN generiert.
Wie kann ich verhindern, dass dieses WLAN offen ist? Der von mir verwendete Code ist 3 - 4 Beiträge früher.
Gruß Axel
habe bei der weiteren Programmierung festgestellt, dass der Wemos D1 mini ein "offenes" WLAN generiert.
Wie kann ich verhindern, dass dieses WLAN offen ist? Der von mir verwendete Code ist 3 - 4 Beiträge früher.
Gruß Axel
-
- Beiträge: 7151
- Registriert: 31.12.2006, 15:18
- System: Alternative CCU (auf Basis OCCU)
- Wohnort: Rhein-Main
- Danksagung erhalten: 34 Mal
Re: Steuerung Pumpenvorlage mittels Füllstandskontrolle
Hi,
wäre mir neu, das der sowohl Client als auch Hotspot gleichzeitig sein kann, bist Du sicher, das es dieser Wemos ist, und nicht ein anderer?
Der Familienvater
wäre mir neu, das der sowohl Client als auch Hotspot gleichzeitig sein kann, bist Du sicher, das es dieser Wemos ist, und nicht ein anderer?
Der Familienvater
Re: Steuerung Pumpenvorlage mittels Füllstandskontrolle
Hi,
eigentlich ja, es erscheinen die letzten 4 Ziffern der Mac-Adresse und als ich ihn ausgeschalten haben war das Netz weg.
Werde es jedoch nochmals testen, sobald ich die Hardware und Software aktualisiert habe. Musste feststellen, dass man eine Stromwechselschaltung (Handschalter + Relais) ohne Stromdetektierung leider nicht vernünftig schalten kann. Die Bewegungsmelder schalten je nach Situation das Licht aus.
Gruß Axel
eigentlich ja, es erscheinen die letzten 4 Ziffern der Mac-Adresse und als ich ihn ausgeschalten haben war das Netz weg.
Werde es jedoch nochmals testen, sobald ich die Hardware und Software aktualisiert habe. Musste feststellen, dass man eine Stromwechselschaltung (Handschalter + Relais) ohne Stromdetektierung leider nicht vernünftig schalten kann. Die Bewegungsmelder schalten je nach Situation das Licht aus.
Gruß Axel
Re: Steuerung Pumpenvorlage mittels Füllstandskontrolle
Hi,
ich möchte den Stand des Projekts Gartenhaus aktualisieren.
Derzeit wird die komplette Steuerung über den Wemos D1 mini vor Ort durchgeführt. Die Befehle erfolgen von HPCL. Bei der Lichtsteuerung (Wechselschaltung, Relais und Handschalter) erfolgen auch Rückmeldungen an HPCL und den Zustand "Licht an" bzw. "Licht aus" festzulegen. Die Rückmeldung erfolgt mittels Strommessung, zu beachten ist, dass es hier wirklich nur darum geht ob ein Stromverbrauch vorhanden ist oder nicht, die Werte sind irrelevant. Die Schwierigkeit besteht hier darin, dass durch das Schalten von Relais (bis zu 4 Stck.) die Versorgungsspannung des Wemos in die Knie geht, dies wurde durch Konstanten, die empirisch ermittelt wurden, ausgeglichen.
Bspl. Lichtschaltung aus HPCL (Virtueller Schalter)
Code im Wemos
Natürlich alles ohne Gewähr!!
Gruß AFi
ich möchte den Stand des Projekts Gartenhaus aktualisieren.
Derzeit wird die komplette Steuerung über den Wemos D1 mini vor Ort durchgeführt. Die Befehle erfolgen von HPCL. Bei der Lichtsteuerung (Wechselschaltung, Relais und Handschalter) erfolgen auch Rückmeldungen an HPCL und den Zustand "Licht an" bzw. "Licht aus" festzulegen. Die Rückmeldung erfolgt mittels Strommessung, zu beachten ist, dass es hier wirklich nur darum geht ob ein Stromverbrauch vorhanden ist oder nicht, die Werte sind irrelevant. Die Schwierigkeit besteht hier darin, dass durch das Schalten von Relais (bis zu 4 Stck.) die Versorgungsspannung des Wemos in die Knie geht, dies wurde durch Konstanten, die empirisch ermittelt wurden, ausgeglichen.
Bspl. Lichtschaltung aus HPCL (Virtueller Schalter)
Code: Alles auswählen
//===================================================================
// Licht Garten per Schalter einschalten
//
//===================================================================
Wenn Virt_01_LichtGarten = 1 dann
strURL2 := "http://999.999.999.60/gruen_LichtGarten_an"
strCommand2 := "/usr/bin/wget -q -o /dev/null "+strURL2
startprogramm(strCommand2)
Makro_LichtGartenBewegungm.LichtGeschBewegungsmelder:=1
endewenn
Wenn Virt_01_LichtGarten = 0 dann
strURL2 := "http://999.999.999.60/gruen_LichtGarten_aus"
strCommand2 := "/usr/bin/wget -q -o /dev/null "+strURL2
startprogramm(strCommand2)
Makro_LichtGartenBewegungm.LichtGeschBewegungsmelder:=0
endewenn
Code: Alles auswählen
/*
Steuerung im Gartenhaus
==============================================================
Autor:.................: AFi
Erstellt...............: 2.10.2017
Version................: 1.5
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
Strommesser ACS712 20A
Derzeitiges Problem:
0,48 A Messung, wenn Hand an, jedoch Relais angezogen??!! -> Licht jedoch aus
0 A Messung, wenn Hand aus, jedoch Relais aus!!?? -> Licht auch aus
Lösung: konstante mit Korrektur
==============================================================
*/
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <ESP8266WebServer.h>
#define ECHO_PIN 4 //ACHTUNG D2!!!!; Wemos blau - Sensor weiß
#define TRIGGER_PIN 2 //ACHTUNG D4!!!!; Wemos dunkelgrün - Sensor gelb
#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
#define blau_StromM A0 //Analog A0 Strommessung
//Netzwerkeinstellungen und Variablen Definition
const char* ssid = "..........."; //SSID des vorhandenen WLANs
const char* password = "................."; //Passwort für das vorhandene WLAN
IPAddress gateway(.....); //IP-Adresse des WLAN-Gateways
IPAddress subnet(......); //Subnetmask
IPAddress ip(.......); //feste IP-Adresse für den WeMos
const char* host = "........."; //IP-Adresse der CCU (Haussteuerung)
ESP8266WebServer server(..); //Webserver initialisieren auf Port 80
String SendeURL = ""; //Übergabe URL an CCU (Haussteuerung)
unsigned long deltaMessungSekundenLevel = 5; //Zeitintervall (Sekunden) nachdem eine Messung erfolgt
unsigned long deltaMessungSekundenStrom = 1;
float h_Tonne = 740; //Höhe Tonne, bzw. max Abstand Sensor bis Boden
String ErgebnisMeldung; //Ergebnismeldung bei Sendung Daten an URL
unsigned long deltaMeldungSekundenLevel = 3600; //Zeitintervall (Sekunden) nachdem eine Meldung an CCU (Haussteuerung) erfolgt; 0 nie
unsigned long deltaMeldungSekundenStrom = 10; //dito Strom
float DeltaLevel = 10; //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
float amp = 0; //Messung Ampere Einzelwert
float max_amp = 0; //maximal gemessener Amperewert aus Sinuskurve über Statistik
float letzteMess_max_amp_CCU = 0; //Abweichung Strom zum letzten Wert->gemeldet
float nullpunkt = 679; //Messwertabweichung ACS712 bei 0 Ampere, ohne Formel; je nach Netzteil unterschiedlich
float Korrektur = 0.0; //gemessene Abweichung bei angezogenem Relais
float Strom_Schw = 5; //Schwellwert für Strom an und aus
float Delta_Strom = 5; //Schwellwert für Stromänderung, Meldung an CCU2
int i; //Zähler for Schleife Strommessung
int LichtGesch = 0;
unsigned long jetztMillis = 0; //Variable Zeit für Vergleichsabfragen
unsigned long deltaMessungMillisLevel = deltaMessungSekundenLevel * 1000; //Umrechnung Sekunden in Millisekunden
unsigned long letzteMessungMillisLevel = 0;
unsigned long deltaMeldungMillisLevel = deltaMeldungSekundenLevel * 1000;
unsigned long letzteMeldungMillisLevel = 0;
unsigned long letzteMessungMillisStrom = 0;
unsigned long deltaMessungMillisStrom = deltaMessungSekundenStrom * 1000;
unsigned long letzteMeldungMillisStrom = 0;
unsigned long deltaMeldungMillisStrom = deltaMeldungSekundenStrom * 1000;
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");
}
//Sicherheitsabschaltung Pumpe / Ueberlaufschutz
void WaPumpe_aus_Max() {
digitalWrite(gelb_WaPumpe, LOW);
server.send(200, "text/plain", "Wasserpumpe ist aus");
delay(100);
Serial.println(ZeitStempel() + " Wasserpumpe ist aus");
}
//Licht Garten an; If-Abfrage notwendig, da Wechselschaltung
void LichtGarten_an() {
Serial.println("Wir wollen einschalten!!!!");
LichtGesch=0;
if ((digitalRead(gruen_LichtGarten) == LOW) && (max_amp < Strom_Schw)) {
digitalWrite(gruen_LichtGarten, HIGH);
LichtGesch=1;
}
if ((digitalRead(gruen_LichtGarten) == HIGH) && (max_amp < Strom_Schw) && (LichtGesch != 1)) {
digitalWrite(gruen_LichtGarten, LOW);
Serial.println(ZeitStempel() + " Licht Garten ist an aus LOW");
}
server.send(200, "text/plain", "Licht Garten ist an");
//Serial.println(ZeitStempel() + " Licht Garten ist an");
delay(100);
}
//Licht Garten aus; If-Abfrage notwendig, da Wechselschaltung
void LichtGarten_aus() {
Serial.println("Wir wollten ausschalten!!!!!!!!!!");
LichtGesch = 0;
if ((digitalRead(gruen_LichtGarten) == LOW) && (max_amp >= Strom_Schw)) {
digitalWrite(gruen_LichtGarten, HIGH);
Serial.println(ZeitStempel() + " Licht Garten ist aus aus LOW");
LichtGesch=1;
}
if ((digitalRead(gruen_LichtGarten) == HIGH) && (max_amp >= Strom_Schw) && (LichtGesch != 1)) {
digitalWrite(gruen_LichtGarten, LOW);
}
server.send(200, "text/plain", "Licht Garten ist aus");
//Serial.println(ZeitStempel() + " Licht Garten ist aus");
delay(100);
}
//Strommessung mit ACS712 20
//wird benötigt um Schaltzustand Wechselschaltung zu ermitteln, Licht
void Strommessung() {
amp=0;
max_amp=0;
Korrektur = 0;
for(i=0;i<1000;i++) {
amp = abs(analogRead(blau_StromM));
if(amp>max_amp) {
max_amp = amp;
}
}
//Serial.print("Stromfluß ungefiltert: ");
//Serial.println(max_amp);
//Hilfskrücke, da Spannungsabfall für jedes Relais und somit Messfehler
//
if(digitalRead(gruen_LichtGarten) == HIGH) {
Korrektur = Korrektur + 11;
}
if(digitalRead(gelb_WaPumpe) == HIGH) {
Korrektur = Korrektur + 11;
}
if(digitalRead(orange_MV_ZurTonne) == HIGH) {
Korrektur = Korrektur + 11;
}
if(digitalRead(braun_MV_Ansaugstutzen) == HIGH) {
Korrektur = Korrektur + 11;
}
max_amp = (max_amp-nullpunkt) + Korrektur;
//Nur zum Abgleich aktivieren!! CCU überfordert
//melde_EXPLORER_Strom();
delay(100);
}
//Meldung Strommessung (nur Einstellungsversuch)
void melde_EXPLORER_Strom() {
HTTPClient http;
SendeURL = "http://................./addons/contronics/CLWebI.ccc?SETVARBYNAME&V_001VERSUCHSANZEIGE=";
SendeURL +=max_amp;
http.begin(SendeURL);
int httpCode = http.GET();
if (httpCode == HTTP_CODE_OK) {
ErgebnisMeldung = http.getString();
Serial.println(ZeitStempel() + " Strommessung " + ErgebnisMeldung);
}
}
//Meldung Strom an HPCL (Stromfluß oder nicht)
//Schaltet in HPCL virtueller Schalter ein bzw. aus
//Notwendigkeit aufgrund Wechselschaltung mit einem Handschalter (mechanisch)
void melde_HPCL_Strom() {
if (max_amp < Strom_Schw) {
Serial.print("Stromfluß mit Nullpunktabgleich (Licht aus): ");
Serial.println(max_amp);
HTTPClient http;
SendeURL = "http://................/addons/contronics/CLWebI.ccc?SETVARBYNAME&VIRT_01_LICHTGARTEN=0";
http.begin(SendeURL);
int httpCode = http.GET();
if (httpCode == HTTP_CODE_OK) {
ErgebnisMeldung = http.getString();
Serial.println(ZeitStempel() + " Übertragung Licht aus: " + ErgebnisMeldung);
}
else
{
Serial.println(ZeitStempel() + " Übertragung Licht aus: " + httpCode);
}
http.end();
delay(100);
}
if (max_amp >= Strom_Schw) {
Serial.print("Stromfluß mit Nullpunktabgleich, (Licht an): ");
Serial.println(max_amp);
HTTPClient http;
SendeURL = "http://.............../addons/contronics/CLWebI.ccc?SETVARBYNAME&VIRT_01_LICHTGARTEN=1";
http.begin(SendeURL);
int httpCode = http.GET();
if (httpCode == HTTP_CODE_OK) {
ErgebnisMeldung = http.getString();
Serial.println(ZeitStempel() + " Übertragung Licht an: " + ErgebnisMeldung);
}
else
{
Serial.println(ZeitStempel() + " Übertragung Licht an: " + httpCode);
}
http.end();
delay(100);
}
}
// Messung mit Level Sensor ausführen (Ultraschallsensor)
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;
}
letzteMessungMillisLevel = jetztMillis;
Level = h_Tonne - (pulsdauer*SCHALLGESCHWINDIGKEIT) / 2;
Serial.println(ZeitStempel() + " Der Füllstand beträgt: " + Level + " mmWS");
}
//Meldung an HPCL (homeputerCL/CCU absetzen für Level
void melde_HPCL_Level() {
HTTPClient http;
SendeURL = "http://.............../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 Füllstand: " + ErgebnisMeldung);
LevelCCU = Level;
}
else
{
Serial.println(ZeitStempel() + " Übertragung Füllstand: " + httpCode);
}
http.end();
}
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);
pinMode(blau_StromM, INPUT);
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: 02.10.2017 Version: 1.5");
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
letzteMessungMillisLevel = millis();
letzteMeldungMillisLevel = 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);
}
//Hauptroutine
void loop()
{
// auf HTTP-Anfragen warten
server.handleClient(); //auf HTTP-Anfragen warten
jetztMillis = millis();
// neue Messung Level falls Zeitintervall erreicht
if (jetztMillis - letzteMessungMillisLevel > deltaMessungMillisLevel)
{
letzteMessungMillisLevel = jetztMillis;
MissEntfernungMitUltraschall();
}
// neue Meldung Level an CCU falls Zeitintervall erreicht
if ((deltaMeldungMillisLevel != 0) && ((jetztMillis - letzteMeldungMillisLevel) > deltaMeldungMillisLevel))
{
Serial.println(ZeitStempel() + " Zeitintervall erreicht");
letzteMeldungMillisLevel = jetztMillis;
melde_HPCL_Level();
}
// neue Meldung Level an CCU falls Schwellwert erreicht
if ((DeltaLevel != 0) && (abs(Level - LevelCCU) >= DeltaLevel))
{
Serial.println(ZeitStempel() + " Leveländerung erreicht");
LevelCCU = Level;
melde_HPCL_Level();
}
// neue Messung Strom (Lichtschaltung) Intervall
if ((deltaMessungMillisStrom != 0) && ((jetztMillis - letzteMessungMillisStrom) > deltaMessungMillisStrom))
{
letzteMessungMillisStrom = jetztMillis;
Strommessung();
}
//neue Meldung Strom an CCU
if ((Delta_Strom != 0) && (abs(max_amp - letzteMess_max_amp_CCU)>= Delta_Strom)) {
Serial.println(ZeitStempel() + " Stromverbrauch Änderung");
letzteMess_max_amp_CCU = max_amp;
melde_HPCL_Strom();
}
// Sicherheitsabschaltung Wasserpumpe
if (Level >= 620) { //max Level
WaPumpe_aus_Max();
}
}
Natürlich alles ohne Gewähr!!
Gruß AFi