ich hoffe ich hab jetzt den letzten Stand (brauch mal ne Pause). Inzwischen habe ich den Strommesser ACS712 20A mangels konstanter Ergebnisse entfernt. Die Detektierung erfolgt nun durch ein Koppelrelais parallel zum Stromverbraucher ("Finder 95.95.3; 220 V"), dieser wird mit 3,3 V vom Wemos auf der Schaltseite bestückt und am Wemos D8 auf high oder low geprüft. Ich bitte um Verständnis, dass ich aufgrund der hohen Gefahr bei 220 V den Schaltplan nicht veröffentliche, wer sich auskennt wird diesen selbst erstellen können.
Anbei die geänderte Software am Wemos:
Code: Alles auswählen
/*
Steuerung im Gartenhaus
==============================================================
Autor:.................: AFi
Erstellt...............: 7.10.2017
Version................: 1.7
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
Koppelrelais "Finder 95.95.3; 220 V"; 3.3V Wemos auf Relais und von Relais Digital in D8
Alles ohne Gewähr, 220V können tödlich sein
==============================================================
*/
#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 15 //Achtung D8 Stromdetektion
//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..
String SendeURL = ""; //Übergabe URL an CCU (Haussteuerung)
unsigned long deltaMessungSekundenLevel = 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 deltaMeldungSekundenLevel = 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
int LichtGesch = 0;
float letzteMess_max_amp_CCU;
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;
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) && (digitalRead(blau_StromM) == LOW)) {
digitalWrite(gruen_LichtGarten, HIGH);
LichtGesch=1;
}
if ((digitalRead(gruen_LichtGarten) == HIGH) && (digitalRead(blau_StromM) == LOW) && (LichtGesch != 1)) {
digitalWrite(gruen_LichtGarten, LOW);
Serial.println(ZeitStempel() + " Licht Garten ist an aus LOW");
}
delay(500);
server.send(200, "text/plain", "Licht Garten ist an");
//Serial.println(ZeitStempel() + " Licht Garten ist an");
}
//Licht Garten aus; If-Abfrage notwendig, da Wechselschaltung
void LichtGarten_aus() {
Serial.println("Wir wollten ausschalten!!!!!!!!!!");
LichtGesch = 0;
if ((digitalRead(gruen_LichtGarten) == LOW) && (digitalRead(blau_StromM) == HIGH)) {
digitalWrite(gruen_LichtGarten, HIGH);
Serial.println(ZeitStempel() + " Licht Garten ist aus aus LOW");
LichtGesch=1;
}
if ((digitalRead(gruen_LichtGarten) == HIGH) && (digitalRead(blau_StromM) == HIGH) && (LichtGesch != 1)) {
digitalWrite(gruen_LichtGarten, LOW);
}
delay(500);
server.send(200, "text/plain", "Licht Garten ist aus");
//Serial.println(ZeitStempel() + " Licht Garten ist aus");
}
//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 (digitalRead(blau_StromM) == LOW) {
Serial.println("Stromfluß (Licht aus): ");
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 (digitalRead(blau_StromM) == HIGH) {
Serial.println("Stromfluß (Licht an) ");
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: 07.10.2017 Version: 1.7");
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 auslesen 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();
}
// Meldung Lichtschaltung an CCU
if (digitalRead(blau_StromM) != letzteMess_max_amp_CCU) {
Serial.println(ZeitStempel() + " Stromverbrauch Änderung");
Serial.print("Wir kommen aus: " );
Serial.println(letzteMess_max_amp_CCU);
delay(200); //wichtiges DELAY um Überlagerungen zu verhindern
letzteMess_max_amp_CCU = (digitalRead(blau_StromM));
Serial.print("und gehen auf: ");
Serial.println(letzteMess_max_amp_CCU);
melde_HPCL_Strom();
}
// Sicherheitsabschaltung Wasserpumpe
if (Level >= 620) { //max Level
WaPumpe_aus_Max();
}
}
Gruß Axel