Hey! Sie scheinen aus United States zu kommen, möchten Sie auf die Englisch Webseite wechseln?
Switch to Englisch site
Skip to main content

Mit dem Arduino MKR WAN 1300 und einem Grove-Feuchtesensor einen LoRaWAN-Wasserdetektor bauen

top2_e7b188f06c2bb32030c3af21b228acfc06b9d10b.jpg

Einen an ein Arduino MKR WAN 1300 angeschlossenen Feuchtesensor zur Feuchtigkeitsmessung und Übermittlung der Daten an The Things Network verwenden.

Nachdem ich bereits das Grove-Starterkit für Arduino und das Grove-Spracherkennungsmodul verwendet habe, besitze ich inzwischen eine ganze Sammlung von Grove-Modulen. Außerdem habe ich mir vor Kurzem das Arduino MKR WAN 1300 angeschaut und bin sehr gespannt, welche Möglichkeiten es noch bietet. Deshalb freute ich mich, als ich erfuhr, dass sich die Grove-Sensoren mit einem MKR Connector Carrier (176-3646) ganz einfach mit dem MKR WAN 1300 kombinieren lassen.

Die Grove-Sensoren an das MKR WAN 133 anschließen

connector_carrier1_c628aa540917d03deb97ba2d2acdb6cb7c94424c.jpg

Zuerst verband ich das MKR Arduino MKR WAN 1300 mit dem Connector Carrier und schloss dann einen Grove-Näherungssensor an. Ich habe den Beispiel-Sketch auf den Arduino hochgeladen und meine Hand über den Sensor geführt – das Ergebnis wurde im seriellen Monitor des Arduino IDE angezeigt.

Dann probierte ich eine Reihe anderer Sensoren aus und entschied mich für eine nähere Beschäftigung mit dem Feuchtesensor (174-3236) . Dies schien angemessen, da es bei uns in Yorkshire viel Feuchtigkeit gibt und das Gerät mich auf Wasser an unerwünschten Orten hinweisen würde.

Die Verbindung zu The Things Network herstellen

Water_detector_-_screen_shot-1_2d5798165b05fcd08249968f4549ef73a543fb41.jpg

Ich hatte mein MKR WAN 1300 bereits mit The Things Network (TTN) verbunden und darüber in einem früheren Blogbeitrag berichtet. Die Versendung der Daten vom Sensor an TTN war unkompliziert – aber dass dies in einem sinnvollen Format geschehen musste, stand auf einem anderen Blatt. Als Grundlage für meinen ersten Sketch verwendete ich den einfachen „Hello World“-Sketch für das MKR WAN 1300 von Gonzalo Casas GitHub und das Beispiel des Grove-Feuchtesensors, das Werte an den seriellen Monitor sendet.

water_detector_hex1_dd5a302a417a8c75a0ef444697434a54c7e2e7c2.jpg

Ich konnte sehen, dass die Daten an TTN gesendet wurden, aber sie ergaben kaum einen Sinn. Ich versuchte, eine Lösung für dieses Problem zu finden.

Daten als Bytes senden

The Things Network verwendet LoRaWAN, einen drahtlosen Kommunikationsstandard wie WLAN oder Bluetooth, bei dem es sich um ein Low Power Wide Area Network (LPWAN) handelt. Es ist wichtig, dass Daten so effizient wie möglich gesendet und empfangen werden, um Bandbreite und Sendezeit zu sparen. Dies hat den zusätzlichen Vorteil, dass auch Strom gespart wird, was besonders bei batteriebetriebenen Geräten nützlich ist. Daher müssen die Daten so codiert werden, dass ihre Versendung möglichst wenig Zeit beansprucht. Beispielsweise sollten sie nicht als ASCII-Zeichen versendet, sondern vor der Übertragung in Bytes konvertiert werden – und zwar in so wenig Bytes wie möglich. Ich musste die von meinem Sensor generierten Daten also vor der Übertragung in Bytes konvertieren.

Zu diesem Zweck musste ich in meinem Sketch zunächst die Zeile modem.print in „modem.write“ ändern. Beim Lesen des Referenzmaterials für das MKR Wan wurde deutlich, dass modem.write Daten als Byte oder Reihe von Bytes sendet, während die von mir versehentlich verwendete Druckfunktion Zeichen sendet, die die Ziffern einer Zahl repräsentieren.

Nach der Änderung von modem.print in modem.write konnte ich sehen, dass Bytes gesendet wurden, aber es war eine weitere Verbesserung möglich, indem ich die Daten in einem einzelnen Byte komprimierte. Der Maximalwert eines Bytes ist 255, aber laut Datenblatt generiert der Grove-Sensor die Ausgabewerte folgendermaßen:

  Min. Max.
Ausgabewert    
Sensor in trockenem Boden 0 300
Sensor in feuchtem Boden 300 700
Sensor in Wasser 700 950

 

water_test_d2e6931b22d47519709e114a7118ee1924763884.jpg


Ich habe getestet, wie dies in Wirklichkeit aussah, indem ich den Sensor in ein Glas Wasser tauchte. Ich habe knapp über 600 abgelesen. Ein Kurzschluss der Kontakte mit einem Schlüssel oder Schraubendreher hat einen Wert von ca. 800 ergeben. Das bedeutete, dass ich den Wert durch 3 teilen konnte und auch bei extremer Nässe einen geringeren Wert als 255 erhalten würde. In diesem Fall ging es mir nicht um Präzision, d. h. 950 Nässegrade, sondern 300 reichten für meine Zwecke völlig aus. Bei einer zukünftigen Bearbeitung konnte ich auch eine Division durch 3,5 oder 4 festlegen, um den Höchstwert von 255 für ein einzelnes Byte ganz sicher nicht zu überschreiten.

Der endgültige Sketch

Mein Sketch sieht jetzt wie folgt aus:

#include <MKRWAN.h>

LoRaModem modem;

#include "arduino_secrets.h"

// Please enter your sensitive data in the arduino_secrets.h tab

String appEui = SECRET_APP_EUI;
String appKey = SECRET_APP_KEY;
int sensorPin = A0;
int sensorValue = 0;
void setup() {

// put your setup code here, to run once:

Serial.begin(115200);
while (!Serial);

// change this to your regional band (eg. US915, AS923, ...)

if (!modem.begin(EU868)) {
Serial.println("Failed to start module");
while (1) {}

};

Serial.print("Your module version is: ");
Serial.println(modem.version());
Serial.print("Your device EUI is: ");
Serial.println(modem.deviceEUI());
int connected = modem.joinOTAA(appEui, appKey);

if (!connected) {

Serial.println("Something went wrong; are you indoors? Move near a window and retry");

while (1) {}

}

// Set poll interval to 60 secs.

modem.minPollInterval(60);

// NOTE: independently of this setting the modem will
// not send more than one message every 2 minutes,
// this is enforced by firmware and can not be changed.

}

void loop() {

// read the value from the sensor:

sensorValue = analogRead(sensorPin);

// scale the reading and fit into 1 byte

int scaledValue = sensorValue / 3;
byte payload = scaledValue;
Serial.print("Sensor reading = " );
Serial.println(sensorValue);
Serial.print("Scaled value = " );
Serial.println(scaledValue);

delay(1000);

modem.beginPacket();
modem.write(payload);
int err = modem.endPacket(false);
if (err > 0) {
Serial.println("Data Sent");
} else {
Serial.println("Error");
}
delay(100000 * 60);
}

Sie müssen die MKR WAN-Bibliothek installieren, um den Sketch auszuführen. Ich habe in meinem Blog über das MKR WAN 1300 bereits beschrieben, wie dies funktioniert.

Der Grove-Feuchtigkeitsdetektor ist ein analoger Sensor. Daher ist für den Betrieb keine Bibliothek erforderlich.

Außerdem müssen Sie im gleichen Ordner, in dem sich der eben beschriebene Sketch befindet, eine Datei namens arduino_secrets.h erstellen, die Folgendes enthält:

// Replace with keys obtained from TheThingsNetwork console

#define SECRET_APP_EUI "xxxxxxxxxxxxxxxx"

#define SECRET_APP_KEY "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Sie können diese Zeilen bearbeiten, indem Sie die x durch die App EUI und den App-Schlüssel ersetzen, den Sie auf der Geräteseite der TTN-Konsole finden.

In der Konsole von The Things Network einen Decoder hinzufügen

TTN_Payload_c26f979d95731731f9e95be223dc6e1bd9659930.png

Sobald die Daten in The Things Network eingehen, muss der Byte-Wert wieder in eine aussagekräftige Zahl umgewandelt werden. Dies erfolgt über den Decoder auf der TTN-Seite, die sich auf der Seite „Payload Formats“ („Nutzdatenformate“) im Abschnitt „Application“ („Anwendung“) der TTN-Konsole befindet. Er verwendet JavaScript, und der folgende Decoder liest das vom Sensor gesendete Byte und wandelt es wieder in eine ganze Zahl um:

function Decoder(bytes, port) {
var decoded = {};
decoded.moisture = bytes[0];
return decoded;
}

Debugging

Selection_013_863b24ec46f4e4c93781f9ec74e8fce35c1d3486.png

Der Sketch enthält die Zeilen, die auf den seriellen Monitor geschrieben werden, um das Debugging zu erleichtern. Dadurch wird die vom Sensor ausgegebene Ganzzahl angezeigt. Dieser Wert wird dann durch 3 geteilt, damit wir ihn mit dem Wert im TTN-Datenfenster vergleichen können. Auf diese Weise lässt sich leichter feststellen, ob ungewöhnliche Werte generiert werden, beispielsweise solche, die höher als 255 liegen.

Fazit

Hätte ich nur einen Überschwemmungsmelder gewollt, wäre auch der Grove-Wassersensor (174-3242) für dieses Projekt in Frage gekommen, aber der Feuchtigkeitsdetektor bietet mehr Flexibilität. Er erkennt nicht nur eine tatsächliche Überschwemmung, sondern zeigt mir auch, wie nass das Feld hinter dem Haus ist, bevor ich mit dem Hund Gassi gehe, oder wann die Pflanzen im Sommer bewässert werden müssen.

Außerdem möchte ich noch herausfinden, wie ich mir eine SMS oder Tweet-Benachrichtigung zusenden lassen kann, wenn eine zu hohe Feuchtigkeit (oder Trockenheit) gemessen wird.

I have a background in the arts, environmental conservation and IT support. In my spare time I do a bit of DJing and I like making things.