Dein erster ESP32-Sensor mit der HydroNode Arduino-Library

Vom leeren Sketch zu Live-Diagrammen: Library installieren, eine ganze Messrunde in einer signierten Anfrage senden und ein Relais mit typisierten Befehlen schalten.

HydroNode Aktualisiert 8 Min. Lesezeit
Ein HydroNode-Sensordiagramm mit Temperaturwerten von einem ESP32Ein HydroNode-Sensordiagramm mit Temperaturwerten von einem ESP32

Ein ESP32, ein BME280 und zwanzig Minuten. Am Ende dieses Artikels landen Temperatur, Luftfeuchte und Luftdruck jede Minute in HydroNode, und du schaltest ein Relais aus der App. WLAN, Uhrzeit, TLS und die Signatur jeder Anfrage übernimmt die Library.

Was du brauchst

Ein ESP32 oder ESP8266Jedes ESP32-Board geht, hier ein klassisches DevKit. Beim ESP8266 sind 4 MB Flash empfohlen.
Einen BME280Oder jeden anderen Sensor, dessen Werte du auslesen kannst.
Arduino IDE oder PlatformIOMit installiertem ESP32-Boardpaket von Espressif.
Einen HydroNode-SensorWie du ihn anlegst, steht in der Willkommens-Tour.

Sensor ID und Secret holen

  1. Sensor öffnenUnter Sensors auf deinen Sensor klicken.
  2. Einstellungen öffnenOben rechts auf Settings, dann links Connection.
  3. Beides kopierenUnter Direct connection stehen Sensor ID und Secret, jeweils mit Kopierknopf. Das Secret gehört nur auf dein Gerät, nie in ein öffentliches Repository.
Verbindungseinstellungen eines Sensors mit Sensor ID und verdecktem SecretVerbindungseinstellungen eines Sensors mit Sensor ID und verdecktem Secret
Settings, Connection: Sensor ID und Secret für die direkte Verbindung. Falls das Secret je in falsche Hände gerät, ersetzt du es hier.

Library installieren

  1. Bibliotheksverwalter öffnenToolsManage Libraries
  2. Suchen und installierenNach HydroNode-Library suchen und installieren. Die IDE fragt, ob sie ArduinoJson und ArduinoHttpClient mitinstallieren soll: ja.
  3. Sensor-Library dazuFür den BME280 zusätzlich Adafruit BME280 Library installieren.

Den BME280 anschließen

Vier Kabel: VIN an 3,3 V, GND an GND, SDA an GPIO 21 und SCL an GPIO 22. Das sind die I²C-Standardpins eines klassischen ESP32. Liegt SDO auf GND, hat der Sensor die Adresse 0x76, auf 3,3 V 0x77.

Der Sketch

Trag oben deine vier Werte ein und lade den Sketch hoch. sendValues() schickt alle drei Werte einer Runde in einer einzigen signierten Anfrage, mit dem Zeitpunkt der Messung. Das spart pro Wert einen Verbindungsaufbau, was auf einem ESP8266 schnell mehrere Sekunden sind.

HydroNodeBME280.inoC++
#include <Wire.h>
#include <Adafruit_BME280.h>
#include <HydroNode.h>

const char* WIFI_SSID     = "YOUR_WIFI_SSID";
const char* WIFI_PASSWORD = "YOUR_WIFI_PASSWORD";
const char* SENSOR_ID     = "your-sensor-id";   // Settings > Connection
const char* SECRET_KEY    = "your-secret-key";  // Settings > Connection

HydroNode hydro(SENSOR_ID, SECRET_KEY);
Adafruit_BME280 bme;

void setup() {
  Serial.begin(115200);
  hydro.setDebug(Serial);  // prints every request and answer

  if (!bme.begin(0x76)) {
    Serial.println("BME280 not found, check the wiring");
  }
  while (!hydro.connectWiFi(WIFI_SSID, WIFI_PASSWORD)) {
    Serial.println("WiFi failed, retrying");
  }
  hydro.begin();
}

void loop() {
  HydroNodeValue reading[] = {
    {"TEMPERATURE", bme.readTemperature()},
    {"HUMIDITY",    bme.readHumidity()},
    {"PRESSURE",    bme.readPressure() / 100.0f},
  };
  int codes[3];
  int status = hydro.sendValues(reading, 3, codes);
  Serial.printf("HydroNode answered %d\n", status);

  delay(60000);  // one round per minute
}
  1. MessenBME280 über I²C
  2. sendValues()Eine signierte HTTPS-Anfrage
  3. 202Gespeichert und im Diagramm
  4. BefehleKommen mit der Antwort
Was in jeder Runde passiert. Die Uhrzeit holt die Library selbst, alle 30 Minuten neu.

Prüfen, ob die Werte ankommen

Öffne den Seriellen Monitor mit 115200 Baud. HydroNode answered 202 heißt: angenommen. Dann die Sensorseite in HydroNode aufrufen und mit ` die Console öffnen. Dort erscheint jede Anfrage, sobald sie ankommt, mit hmac ok und der Abweichung der Geräteuhr.

Live-Tab der Console mit angenommenen HTTP-AnfragenLive-Tab der Console mit angenommenen HTTP-Anfragen
Jede Zeile eine Anfrage: Zeit, Weg, Status, Werte, Signaturprüfung und Uhrabweichung.
AntwortBedeutungWas tun
202AngenommenNichts, alles gut.
401Signatur oder Zeit falschSensor ID und Secret prüfen. Die Console zeigt den genauen Grund.
429Zu schnellPro Messgröße höchstens ein Wert alle 10 Sekunden.
-2Keine UhrzeitUDP-Port 123 (NTP) im Netz erlauben.
-4Typname ungültigGroßbuchstaben verwenden: TEMPERATURE, nicht temperature.

Bleibt es hängen, hilft Fehlersuche mit der Console.

Ein Relais aus der App schalten

Befehle haben in HydroNode einen Namen, einen Typ und einen Wert. Dein Gerät meldet für jeden Befehl zurück, ob es ihn angenommen hat oder warum nicht. Ein Name kann mehrere Typen haben: relay1 true schaltet dauerhaft, relay1 1400 nur für 1,4 Sekunden.

Commands.inoC++
const int RELAY_PIN = 5;  // most relay modules switch on at LOW

void setup() {
  // WiFi and hydro.begin() as in the sketch above
  pinMode(RELAY_PIN, OUTPUT);
  digitalWrite(RELAY_PIN, HIGH);  // off after power-up

  // relay1 true / relay1 false
  hydro.onBool("relay1", [](bool on) {
    digitalWrite(RELAY_PIN, on ? LOW : HIGH);
  });

  // relay1 1400: on for 1400 ms, then off again
  hydro.onUInt32("relay1", [](uint32_t ms) {
    ms = min(ms, (uint32_t)10000);  // local safety limit
    digitalWrite(RELAY_PIN, LOW);
    delay(ms);
    digitalWrite(RELAY_PIN, HIGH);
  });
}
  1. Befehl sendenAuf der Sensorseite oben auf Send command, Name relay1, Typ BOOL, Wert true. Oder in der Console im Tab Commands einfach relay1:bool true tippen.
  2. Auf die nächste Runde wartenBefehle kommen mit der Antwort auf den nächsten gesendeten Wert. Bei einer Runde pro Minute dauert es also bis zu einer Minute.
  3. Status ansehenAcknowledged heißt angenommen. Declined nennt den Grund, zum Beispiel NO_HANDLER, wenn es auf dem Gerät keinen Callback für diesen Namen und Typ gibt.
Sicherheit Eine Bestätigung heißt, dass das Gerät den Befehl erhalten hat, nicht dass die Pumpe wirklich lief. Für Pumpen, Heizungen und Dosierer gehören Zeitgrenzen und Verriegelungen auf das Gerät selbst, wie die 10-Sekunden-Grenze im Beispiel.

Wie es weitergeht