Dachfenster-Sensor mit Alarm auf dem Handy
Zu tun, Stand 14.März 2021:
- Installation ESP auf Breadboard. Stabilisieren.
- Handy-App für die Anzeige des Dachfensterstatus (oder zuerst mal eine PC-App, weil das einfacher ist?)
- Feuchtigkeitssensor integrieren/Status übermitteln –> Alarm in Handy-App ermöglichen
- Motor integrieren, der Dachfenster zu zieht, sobald Feuchte festgestellt wird
- Akku-Betrieb ermöglichen
- Schlafmodus ermöglichen
Hauptgrundlage:
Beschrieben in CT-Artikel 1/2. ct.de/yg7t (Libraries), Beispiel-Code
MQTT:
Leit-Artikel: https://www.heise.de/developer/artikel/Kommunikation-ueber-MQTT-3238975.html
MQTT Client
Anstatt die vom CT Heft speziell angefertigte Bootcamp library ist es besser die besser dokumentierte EspMQTTClient zu benutzen.
(Mit bootcamp ist es mir nicht gelungen auf den MQTT-Broker zu verbinden und auch nicht, irgendwelche Logs anzuzeigen.)
EspMQTTClient lässt sich in der Arduino IDE einfach mit 1,2 klicks über Tools > „Manage libraries …“ installieren. Danach kann der Sketch (Programm) SimpleMqttClient benutzt werden um die Interaktion des ESP mit dem MQTT broker auszutesten. Das Programm kann über „File“ > „Examples“ > „Examples from custiom libraries“ geholt werden.
MQTT Broker
Mosquitto-MQTT-Broker auf lokalem Rechner. Benötigte nur Download von Mosquitto-Download-Site. Nach Ausführen der Windows-Installation-Prozedur wird der Server gestartet mit Kommando:
mosquitto -c C:\tmp\mosquitto.conf -v
Damit der broker auch von aussen sichtbar ist, muss das mitgegebene mosquitto.conf file die Zeile
listener 1883 0.0.0.0
enthalten.
Zugreifbarkeit des MQTT Brokers prüfen:
Um die vom ESP32 an den MQTT-Broker gesendeten Messges anzusehen habe ich mit MQTT.fx einen lokalen standalone MQTT-Client installiert.
Einfacher ist es (wie im README.md) der Mosqitto-Installation vorgeschlagen
Den server laufen zu lassen:
mosquitto -c C:\tmp\mosquitto.conf -v
Dann auf ein (anwartschaftliches) Topic zu registrieren:
mosquitto_sub -t 'test/topic' -v
Diese Konsole geöffnet lassen.
Dann da auch was rein zu schreiben:
mosquitto_pub -t 'test/topic' -m 'hello world'
Die geschriebene Message sollte nun in der Konsole wo man das Abonnent definiert hat ausgelistet werden.
Remote-Zugreifbarkeit testen
Mit von aussen sichtbarer IP:
mosquitto_sub -h 192.168.178.50 -t 'test/topic' -v
Respektive:
mosquitto_pub -h 192.168.178.50 -t 'test/topic' -m 'hello world'
Eventuell muss die Windows Firewall für 1883 geöffnet werden. Zuvor testen!
Probleme mit der MQTT Interaktion – Broker ist nicht (für den ESP) erreichbar
Per Default werden durch den Mosquitto start zwei Netzwerk-Zugriffs-Definitionen erzeugt, welche duch netstat -an dann so angezeigt werden.
C:\Program Files\mosquitto>netstat -an | find /I "1883" TCP 127.0.0.1:1883 0.0.0.0:0 ABHÖREN TCP [::1]:1883 [::]:0 ABHÖREN
Remotemässig kann aber nur zugegriffen werden, wenn netstat -an diese anzeigt:
C:\Program Files\mosquitto>netstat -an | find /I "1883" TCP 0.0.0.0:1883 0.0.0.0:0 ABHÖREN TCP 192.168.178.46:1883 192.168.178.35:59784 WARTEND
–> Erklärung des outputs von netstat -an.
Wenn der MQTT-Broker über diese „öffentliche“ addresse angesprochen wird, so wird von Mosquitto automatisch auch Zugriff mit Passwort verlangt.
Wie man ein Passwortfile anlegt um dann zeight dieser Artikel: http://www.steves-internet-guide.com/mqtt-username-password-example/
Das Passwortfile wird im mosquitto.conf file als
password_file C:\tmp\mosquitto.pw
referenziert. Selbstredend muss mosqitto dann mit der Option -c <pfad_zum_conf_file> gestartet werden.
1. Sketch
Ein erster sehr simpler Sketch, der die Schalterwerte aus 3V und Pin33 ausliest und an den MQTT-Broker sendet.
#include "EspMQTTClient.h" static const int SensorPin = 33; int sensorValue = 0; uint16_t statusPacketIdSub = 0; EspMQTTClient client( "FRITZ!Box 7490", "Schlaraffenland46", "192.168.178.50", // MQTT Broker server ip "esp", // Can be omitted if not needed "geheim", // Can be omitted if not needed "ESP32HPS", // Client name that uniquely identify your device 1883 // The MQTT port, default to 1883. this line can be omitted ); void setup() { Serial.begin(115200); pinMode(SensorPin, INPUT); sensorValue = digitalRead(SensorPin); // Optionnal functionnalities of EspMQTTClient : client.enableDebuggingMessages(); // Enable debugging messages sent to serial output // client.enableHTTPWebUpdater(); // Enable the web updater. User and password default to values of MQTTUsername and MQTTPassword. // These can be overrited with enableHTTPWebUpdater("user", "password"). client.enableLastWillMessage("TestClient/lastwill", "I am going offline"); // You can activate the retain flag by setting the third parameter to true } // This function is called once everything is connected (Wifi and MQTT) // WARNING : YOU MUST IMPLEMENT IT IF YOU USE EspMQTTClient void onConnectionEstablished() { do { delay(1000); int sensorValue = digitalRead(SensorPin); if (sensorValue == 0) { Serial.println("Sending: Dachfenster is offen!"); client.publish("dachfenster", "offen"); // You can activate the retain flag by setting the third parameter to true } else { Serial.println("Sending: Dachfenster ist zu"); client.publish("dachfenster", "closed"); // You can activate the retain flag by setting the third parameter to true } } while (true); } void loop() { client.loop(); }
Ist das Programm mal auf den ESP geladen kann dessen USB-Kabel vom PC ausgesteckt werden und z.B. an einen USB-Ladestecker angeschlossen werden.
Das Programm sollte dabei neu gestartet werden und neu beginnen Meldungen an den MQTT-Server zu senden.
Diese Version verbraucht noch ziemlich viel Strom, das das das Schlafengehen (nicht wie im CT Heft beispielcode) implementiert ist.
2. MQTT Client starten
c:\Programme\mosquitto>mosquitto -c c:\tmp\mosquitto.conf -v 1616246619: mosquitto version 2.0.9 starting 1616246619: Config loaded from c:\tmp\mosquitto.conf. 1616246619: Opening ipv4 listen socket on port 1883. 1616246619: mosquitto version 2.0.9 running 1616246631: New connection from 192.168.178.35:54203 on port 1883. 1616246631: New client connected from 192.168.178.35:54203 as ESP32HPS (p2, c1, k15, u'esp'). 1616246631: Will message specified (18 bytes) (r0, q0). 1616246631: TestClient/lastwill 1616246631: Sending CONNACK to ESP32HPS (0, 0) 1616246632: Received PUBLISH from ESP32HPS (d0, q0, r0, m0, 'dachfenster', ... (5 bytes)) 1616246633: Received PUBLISH from ESP32HPS (d0, q0, r0, m0, 'dachfenster', ... (5 bytes)) 1616246634: Received PUBLISH from ESP32HPS (d0, q0, r0, m0, 'dachfenster', ... (5 bytes))
Für Erklärungen siehe oben!
3. Den Abonnenten auf die ‚Dachfenster‘-Meldugen starten:
c:\Programme\mosquitto>mosquitto_sub -h 192.168.178.50 -t dachfenster -u esp -P geheim -v dachfenster offen dachfenster offen dachfenster offen dachfenster offen dachfenster offen
Nervige Probleme beim Experimentieren mit Arduino/ESP32
- Spannung ist nicht zwischen allen 3V und GRD pins vorhanden.
- Wackelkontakte (betrifft nur ESP32)
Die Stromleitung vom IC über die Steckstifte über das Breadboard und die verwendeten Kabel hatten ständig Wackelkontakt. (Eventuell liegt das am Breadboard, oder auch am ESP. Ich kann mich nämlich nicht erinnern, dieses Problem mit dem Arduino-Starterkit auch gehabt zu haben. - Serial Console zeigt nur unlesbare Zeichen an. –> Lag oft an der eingestellten Übertragungsrate. Muss oft mit der Rate, die im Sketch eingestellt ist überein stimmen. Bei meinen letzten Experimenten mit dem LOLIN ESP32 musste ich aber stets 115200 Bauds/s einstellen, damit der Text lesbar war (auch wenn im Scetch Serial.begin(9600) stand). Vielleicht hängt dies mit dem Bord zusammen, oder auch damit, dass ich auch die Programm-Übertragung mit 115200 Bauds machte.
- Übertragungsfehler des Sketches auf den IC. Könnte an zu hoher Übertragungsrate liegen.
- Übertragungsfehler des Scetches auf den ESP32: Verifiziere im Gerätemanager (devmgmr.msc) ob unter „Anschlüsse (COM & LPT)“ die „Silicon Labs CP210 USB to UART Bridge“ vorhanden ist. Ich hatte das Problem eines Wackelkontakts: Wenn ich den USB-Anschluss am ESP aktiv andrückte, dann ploppte im Gerätemanager der Anschluss auf. Kann auch am USB-Kabel liegen.
Potentiometer anschliessen
pinMode(A9, INPUT);
int gelesenerWert = analogRead(A0);
Wemos LOLIN ESP32 analogRead Probleme
Problem:
Analog Read lieferte ständig dieselben Werte, egal welche Spannung am Pin anlag.
Lösung:
Neu herunter laden der letzten SW für die Arduino IDE. Erst danach war es möglich das Board „Wemos LOLIN32“ innerhalb der Arduino IDE auszuwählen.