Nun beginnt die eigentliche Messung. Die ersten zwei Kommandos (Zeilen 32 und 33) wecken den AM2321 aus dem Energiesparmodus. Die folgenden fünf Zeilen lassen ihn eine Messung der Temperatur und Luftfeuchtigkeit ausführen. Nun müssen wir vor dem Auslesen der Werte einen kleinen Augenblick warten (delay(3);).
Ab Zeile 40 folgt eine Reihe von Befehlen, die die Messwerte vom I2C-Bus lesen und sie formatiert in Variablen abspeichern. Besonders interessant ist hierbei die Zeile 53, die dafür sorgt, dass auch negative Zahlen richtig dargestellt werden. Um die Messwerte zu übertragen, wandeln wir sie in das JSON-Format um (ab Zeile 64), die kompakte und gut lesbare JavaScript Object Notation. Der JSON-String speichert die Variable msg.
Ab Zeile 69 baut die Software die Verbindung zum MQTT-Server auf und überträgt die Nachricht. Hierbei versucht sie, ähnlich wie beim Verbinden mit dem WLAN, in einer Schleife so lange den Kontakt herzustellen, bis die Kommunikation klappt. Das eigentliche Übertragen der Daten geschieht recht unspektakulär mit dem Befehl mqtt.publish(topic,msg); (Zeile 81). Der folgende delay(500); sorgt dafür, dass der ESP8266 nicht in den Energiesparmodus geht, ohne die Nachricht komplett zu übertragen. Falls Ihr MQTT-Server sehr langsam arbeitet, müssen Sie die Wartezeit noch etwas erhöhen. Die letzte Zeile ESP.deepSleep(intervall*1000000); in der setup()-Funktion versetzt den ESP8266 wieder in den Energiesparmodus.
Nun ist die Messung komplett übertragen und abgeschlossen. Wenn der ESP8266 nach der in der Variablen intervall definierten Zeit aufwacht, startet das Programm von Neuem. Die loop()-Funktion wird nie aufgerufen, weil das Programm den ESP8266 schon am Ende der setup()-Funktion in den Energiesparmodus schickt. Um das Programm in den ESP8266 hochzuladen, gehen Sie wie beim Testprogramm beschrieben vor.
Listing 3
#include <Wire.h>
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
// WLAN
const char* ssid = "<Your SSID>";
const char* pass = "<Your WLAN Password>";
//MQTT Server
const char* serverIp = "<Your MQTT Server>";
const char* topic ="/haus/sensor2";
const int serverPort = 1883;
// Energy Save
const int intervall = 600;//sec
WiFiClient client;
PubSubClient mqtt(client);
void setup() {
Wire.begin(4, 5);
Serial.begin(115200);
Serial.println("\r\n") ;
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected: ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
// Measurement
Wire.beginTransmission(0x5c);
Wire.endTransmission();
Wire.beginTransmission(0x5c);
Wire.write(0x03);
Wire.write(0);
Wire.write(4);
Wire.endTransmission();
delay(3);
Wire.requestFrom(0x5c, 8);
uint8_t buf[6];
for (int i = 0; i < 6; ++i)
buf[i] = Wire.read();
unsigned short crc = 0;
crc = Wire.read(); //CRC LSB
crc |= Wire.read() << 8;//CRC MSB
unsigned int humidity;
signed int temperature;
humidity = buf[2] << 8;
humidity += buf[3];
temperature = buf[4] << 8;
temperature += buf[5];
if(temperature & 0x8000) temperature = -(temperature & 0x7fff);
double temp = temperature;
double hum = humidity;
temp =temp/10;
hum=hum/10;
Serial.print("Temperature:");
Serial.println(temp);
Serial.print("Humidity: ");
Serial.println(hum);
Serial.print("CRC: ");
Serial.println(crc);
//JSON
char msg[64] ="";
sprintf (msg,"{ \"temperature\": \"%-2.2f\", \"humidity\": \"%-2.2f \"}",temp,hum);
Serial.println(msg);
// Connect to MQTT Server
mqtt.setServer(serverIp,1883 );
while (!mqtt.connected()) {
Serial.print("Connecting...");
if (!mqtt.connect("Sensor 1")) {
Serial.print("failed, rc=");
Serial.print(mqtt.state());
Serial.println(" retrying in 5 seconds");
delay(5000);
}
Serial.println();
}
mqtt.loop();
mqtt.publish(topic,msg);
delay(500); // Wait for MQTT Server
Serial.println("goSleep" );
ESP.deepSleep(intervall*1000000);
}
void loop()
{
}
Nachrichten in MQTT
Bevor Sie die Nachrichten der Sensoren in Node-RED weiterverarbeiten, sollten Sie erst einmal überprüfen, ob sie am MQTT-Server wie erwartet ankommen. Dazu verwenden Sie die eingangs beschriebene MQTT-App für Chrome [1]. Damit die Nachrichten aller drei Sensoren in einem Rutsch erscheinen, verbinden Sie sich mit den Topic /haus/+. Nun drücken Sie nacheinander die Reset-Taster der einzelnen Sensoren, damit sie einen Messwert an den MQTT-Server schicken. Die Ausgabe der MQTT-App sollte so aussehen wie in Abbildung 5.
Liefern die Sensoren unplausible Werte für die Luftfeuchtigkeit, ist vermutlich die Batteriespannung etwas zu niedrig: Die AM2321-Sensoren benötigen mindestens 2,6 Volt Betriebsspannung.
Finale
Nun gilt es, die Nachrichten des MQTT-Servers in den Node-RED-Flow zu integrieren. Das erledigen Sie direkt über die Oberfläche von Node-RED. Dazu starten Sie mit einem mqtt den Input-Node und konfigurieren ihn so, dass er Nachrichten aus dem Topic eines Sensors empfängt (/haus/sensor1). Um den Input-Node zu erstellen, benötigen Sie die Definition eines MQTT-Servers (Abbildung 6).
Die Sensoren liefern JSON-Strings, die Sie in Javascript-Objekte umwandelt müssen, damit Node-RED sie verarbeitet. Da diese Art der Umwandlung sehr oft anfällt, gibt es in Node-RED standardmäßig den JSON-Node, der das erledigt: Er erlaubt es, beliebig zwischen JSON-String und Javascript-Objekt hin und her zu wandeln.
Bevor wir nun das Javascript-Objekt an das Anzeigeinstrument Gauge weiterleiten, müssen Sie noch die Werte für Luftfeuchtigkeit und Temperatur trennen. Das erreichen Sie mithilfe zweier change-Nodes, die Sie so einrichten, dass sie die Werte für Temperatur und Luftfeuchtigkeit aus der Nachricht herauslösen und in neue Nachrichten einpacken (Listing 4). Ein entsprechendes Beispiel sehen Sie in Abbildung 7.
Listing 4
msg.payload.humidity => msg.payload, msg.payload.temperature => msg.payload
Die Gauge-Nodes müssen Sie noch so einrichten, dass die Messwerte innerhalb ihres Anzeigeintervalls liegen. Eine Beschreibung dazu finden Sie in dem bereits erwähnten Artikel aus RPG 01-02/2019 [1]. Nun verbinden Sie die einzelnen Nodes noch (Abbildung 8).

Abbildung 8: Der Node-RED-Flow für einen Sensor mit je einer Anzeige für Temperatur und Luftfeuchtigkeit.
Die beschriebenen Schritte wiederholen Sie jetzt für die beiden anderen Sensoren des Messgeräte-Trios. Passen Sie abschließend das Layout für Ihr Dashboard noch etwas an (Abbildung 9).

Abbildung 9: Das Node-RED-Dashboard zeigt in einer ansprechenden Grafik die Messwerte der verschiedenen Sensoren an.
Fazit
Das leicht zu bedienende Tool Node-RED eignet sich hervorragend, um Messwerte zu visualisieren. Auch andere Anforderungen aus dem IoT-Bereich lassen sich damit leicht umsetzen. Beim Aufbau der Sensoren kann man eine Menge über den ESP8266-Mikrocontroller lernen, der sich auch als Grundlage für eigene Anwendungen aller Art eignet.








