Wie finden Sie diesen Artikel? Helfen Sie uns, bessere Inhalte für Sie bereitzustellen.
Vielen Dank! Ihr Feedback ist eingegangen.
There was a problem submitting your feedback, please try again later.
Was denken Sie über diesen Artikel?
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
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
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.
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:
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
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
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.