- Vorrausetzungen
- Software
- PlatformIO für VSC
- Libraries
- API
- Blynk Mobile App
- Hardware
- Software
- Wie der Code funktioniert
Wir haben für unser Projekt den PlatformIO Plug-In für VSC verwendet. Als erstes müsst ihr dafür in VSC PlatformIO installieren. Danach könnt ihr ein Projekt in PlatformIO anlegen. Euer Projekt-Setup wird in der platformio.ini-Datei gespeichert. Hier ist als Beispiel der Inhalt unserer Datei:
[env:nodemcu-32s]
platform = espressif32
board = nodemcu-32s
framework = arduino
lib_deps =
adafruit/Adafruit Unified Sensor@^1.1.4
adafruit/Adafruit BME680 Library@^2.0.1
boschsensortec/BSEC Software Library@^1.6.1480
blynkkk/Blynk@^1.0.1
bblanchon/ArduinoJson@^6.18.3
arduino-libraries/Arduino_JSON@^0.1.0
Als nächstes müsst Ihr die benötigten Bibliotheken installieren....
Der MQTT-Broker muss auf dem Raspberry Pi oder in der Cloud implementiert werden. Hier zeigen wir, wie ihr einen MQTT-Client auf dem ESP32 implementiert. Damit der Sensor-ESP auf ein Topic publishen kann benötigen wir folgende Bibliotheken:
-
- Ladet euch den Code als ZIP-Datei von dem GIT Repo Lokal auf euern Rechner
- Unzipt den Ordner und benennt diesen um in async_mqtt_client
- fügt den umbenannten Ordner per Drag-and-Drop in VSC unter /lib ein
- startet VSC neu
-
- Ladet euch den Code als ZIP-Datei von dem GIT Repo Lokal auf eueren Rechner
- Unzipt den Ordner und benennt diesen um in AsyncTCP
- fügt den umbenannten Ordner per Drag-and-Drop in VSC unter /lib ein
- startet VSC neu
Diese Bibliotheken müsst ihr auf allen ESP's installieren.
Damit ihr Werte von dem Sensor auslesen könnt, benötigt ihr zwei Bibliotheken
- Adafruit_BME680 library
- Adafruit_Sensor library
Sucht nach adafruit bme680 und Adafruit Unified Sensor in PlatformIO unter Libraries und fügt die Bibliotheken eurem Projekt hinzu.
In diesem Projekt arbeiten wir mit dem Air Quality Index (AQI oder IAQ). Der AQI fasst die vom BME680 gemessenen Gase zu einem Index zusammen. Der Index wird uns später helfen die Luftqualität besser einschätzen zu können und die Luftqualität drinnen und draußen vergleiche zu können. Damit wir die gemessenen Werte im AQI zusammenfassen können, benötigen wir die BSEC-Bibliothek von Bosch Sensortec Environment Cluster. Um die Bibliothek einzubinden, sucht einfach in PlatformIO unter Libraries nach BSEC und fügt sie eurem Projekt hinzu.
Wir möchten uns später die Messwerte auf einem Smartphone anzeigen lassen. Dies realisieren wir mit der Blynk-App. Um diese nutzen zu können müssen wir die dazugehörige Bibliothek in PlatformIO einbinden. Dabei geht ihr wie bereits weiter oben beschrieben vor, nur sucht ihr jetzt nach Blynk.
Mit der Blynk-App ist es auch möglich die Komponenten anzusteuern. Denkbar ist z.B. das An und Aus schalten des Diffusors oder das Öffnen und Schließen des Fensters mithilfe der App. Dies haben wir in diesem Projekt aber nicht umgesetzt.
In dem Projekt werden wir über zwei unterschiedliche API's Wetter und Luftqualitätsdaten abfragen. Auf Basis der API-Daten, welche die Bedingungen außerhalb des Zimmers repräsentieren, und der Sensordaten werden wir später unsere Anwendungslogik aufbauen.
Damit wir mit den API-Daten arbeiten können benötigen wir die Arduino_JSON-Bibliotheken. Diese bindet ihr genau wie die anderen Bibliotheken ein.
In dem Projekt arbeiten wir mit zwei API's, die uns Informationen über das Wetter und die Luftqualität in Form des bereits erwähnt AQI liefern. Wir haben uns für die Open-Weather-Map-API und die Weather-Bit-API entschieden, aber ihr könnt eine API eurer Wahl verwenden, dass vorgehen ist analog. Open-Weather-Map-API liefert uns aktuelle Daten über Temperatur, Luftfeuchtigkeit und Wind, aber ihr könnt noch einige Parameter mehr auslesen. Weather-Bit liefert uns den aktuellen AQI.
Als erstes müsst ihr euch bei beiden Anbietern einen Account anlegen, dieser ist für unseren Projektumfang kostenlos. Wenn ihr einen Account angelegt habt, könnt ihr euch einen API-Key generieren. Den Key hinterlegt ihr an entsprechender stelle in der main.cpp. Wichtig: Behaltet eure API-Key immer für euch und teilt sie mit keinem außerhalb von eurem Projekt Projekts
Zum Visualisieren der Mess- und API-Daten nutzen wir die Mobile-App von Blynk. Alternativ könnt ihr auch den Web-Client verwenden. Wir zeigen euch exemplarisch an der Mobile-App wie ihr diese mit eurem Sensor-ESP verbinden könnt. Blynk erfüllt in unserem Projekt zwei Ziele, zum einen wollen wir die Daten Visualisiert haben, um zu überprüfen ob die Anwendungslogik richtig funktioniert und zum anderen soll es perfektivisch möglich sein, die Aktoren (Window-ESP, Diffusor-ESP) mit Blynk anzusteuern. Als erstes müsst ihr euch bei Blynk einen Account anlegen. Für unsere Zwecke reicht der kostenlose Plan. In eurem Account könnt ihr ein neues Projekt anlegen, dafür Klickt ihr einfach auf das „+“-Symbol in der Übersicht. Gebt eurem Projekt einen Namen, legt euer Gerät fest, wenn Ihr eine ESP32 habt wie wir, wählt ESP23 DEV Board aus. Im Letzten Schritt legt ihr die Art der Verbindung fest, wir haben uns für WiFi entschieden. Sobald ihr euer Projekt angelegt habt, bekommt ihr eine Email mit dem Authentifizierungs-Token. Jedes Projekt hat einen eigenen Token. Mit Blynk könnt ihr eure Daten auf unterschiedlichste Weise visualisieren. Dafür stehen euch in eurem Projekt in der Widget Box unterschiedlichen Displays zur Verfügung. Wir verwenden für unser Projekt den Gauge-Display. In den Settings zu dem Gauge-Display tragt ihr einen Namen oder den Wert, den ihr mit dem Display anzeigen wollt, ein (z.B. Luftfeuchtigkeit). Als nächstes tragt ihr euren Virtuellen Input-Pin ein. Der Pin muss später zu dem Pin passen, den ihr im Code für den Wert definiert habt. Wir verwenden für dieses Beispiel den Virtuellen Input-Pin V5. Neben dem Input-Pin legt ihr den Wertbereich fest, innerhalb derer sich die Messung bewegen soll. Für die Luftfeuchtigkeit tragt ihr z.B. 0 – 100 (%) ein. Unter „Label“ legt ihr die Maßeinheit für den Input-Pin fest, also am Beispiel von Luftfeuchtigkeit „%“. Im Letzten Schritt legt ihr fest, wie die Messwerte aktualisiert werden sollen. „Push“ bedeutet, dass der ESP die neuen Messungen an die App immer dann übermittelt, wenn neue vorliegen. Das ist unsere favorisierte Variante. Alternativ werden euch Sekunden, Minuten und Stunden-Werte zur Auswahl gegeben. Wählt ihr z.B. 1 min aus, dann fragt die App beim ESP als 60 sec nach, ob neue Werte Vorliegen.
- ESP32 (Grove System)
- BME680 (Grove System)
In diesem Teil möchten wir kurz darauf eingehen, wie der Code in der main.cpp
funktioniert und welche variablen ihr ggf. noch anpassen müsst.
Nachdem du das Repository geklont hast navigiere in den Ordner Lufty/ESP-Sensor-Board/LuftyVSC/
und öffne von dort aus PlatformIO. In PlatformIO navigiere zu /src/main.cpp
. In main.cpp
musst du die hier beschrieben Änderungen vornehmen.
In REPLACE_WITH_YOUR_SSID
musst du den Name deines WiFis eintragen und in REPLACE_WITH_YOUR_PASSWORD
das dazugehörige Passwort.
const char *ssid = "REPLACE_WITH_YOUR_SSID";
const char *password = "REPLACE_WITH_YOUR_PASSWORD";
In MQTT_HOST
musst du die IP-Adresse deines Raspberry Pi eintragen.
Unter MQTT_TOPIC_XY
definierst du das ein Topic auf dem du Publishen möchtest.
In Unserem Projekt Publiziert der Sensor-ESP einen Befehl zum Fenster öffnen oder Schließen auf dem Topic MQTT_TOPIC_WINDOW
. Der Window-ESP Abonniert dieses Topic und empfängt so die Befehle die er ausführen muss.
#define MQTT_HOST IPAddress(xxx, xxx, xxx, xxx)
#define MQTT_PORT 1883
#define MQTT_TOPIC_DIFFUSOR "esp/sensorBoard/diffusor"
#define MQTT_TOPIC_WINDOW "esp/sensorBoard/window"
Unter REPLACE_WITH_YOUR_API_KEY
trägst du deinen, zu vor generierten, API-Key ein.
String openWeatherMapApiKey = "REPLACE_WITH_YOUR_API_KEY";
String weatherbitAirQualityApiKey = "REPLACE_WITH_YOUR_API_KEY";
// Replace with your country code and city
String city = "Cologne";
String countryCode = "DE";
String unitsApi = "metric";
/*lat und lon können auch aus erstem API Req. rausgeholt und verwendet werden, anstelle sie hart zu coden*/
String latitude = "50";
String longitude = "6";
Hier tragt ihr euren Authentifizierungs-Token ein, den ihr zuvor per Email bekommen habt:
39 const char auth[] = "REPLACE_WITH_YOUR_BLYNK_AUTH_TOKEN";
Wie im oberen Abschnitt bereits erwähnt, definiert ihr wie folgt die Pins, an die die Messdaten geschickt werden sollen. Die Methode Blynk.virtualWrite()
nimmt als erstes Argument den Pin und als zweites die Variable, in der ihr den Messwert gespeichert habt. In Unserem Fall heißt die Variable humidity
und der entsprechende Messwert soll auf Pin V5
angezeigt werden.
139 Blynk.virtualWrite(V5, humidity);
140 Blynk.virtualWrite(V6, temperature);