Bodenfeuchte-Sensor mit Arduino und LoRaWAN

Letzte Woche hatte ich ja bereits mein neues Projekt angekündigt und heute ist mein Bodenfeuchte-Sensor fertig geworden, noch rechtzeitig vor dem Frühling. Ich habe dabei wieder einiges gelernt und es hat sich auch als sinnvoll herausgestellt sich Zeit zu nehmen. Ich bin noch ein Anfänger was Arduinos angeht und lerne noch immer wieder etwas dazu.

Nun aber zurück zum Thema. Ich habe einen Bodenfeuchte-Sensor gebaut, welcher seine Daten per LoRaWAN an TheThingsNetwork übermittelt. Zum Einsatz kam dieser Sensor. Die Idee dahinter war es, der Wasserstand meiner Pflanzen im Blick zu haben um bei Bedarf gießen zu können.

Das Original des Sensors scheint von DFRobot zu stammen, weshalb ich auch mit deren Programmbeispielen angefangen habe.

Bodenfeuchte-Sensor

 

Aufbau der Hardware

Die Hardware besteht aus einem Arduino Pro Mini in der 3.3 Volt Variante, einem RFM95W, dem Bodenfeuchte-Sensor welcher über A0 gemessen wird, einem Step-Up/Step-Down Spannungswandler und einem Li-Ion Akku. Die Zellenspannung des Akkus, wird über einen Spannungsteiler mit zwei 10 KOhm Widerständen an A1 gemessen und ebenfalls an TTN gesendet. Somit habe ich ebenfalls den Ladezustand des Akkus im Blick.

Damit ich möglichst wenig Strom verbrauche, versorge ich den Sensor nicht direkt mit Strom, sondern über den Arduino. Der Sensor verbraucht maximal 5 mA und der Ausgang des Arduino kann bis zu 40 mA liefern, also kein Problem. Der Vorteil davon liegt auf der Hand. Anstelle permanent 5 mA Strom zu verbrauchen, kann ich über die Software den Sensor ein- und ausschalten. Ich beabsichtige die Werte alle 15 Minuten auszulesen und somit wird der Sensor auch nur alle 15 Minuten für unter zwei Sekunden eingeschaltet. Pro Stunde ist der Sensor also maximal acht Sekunden aktiv. Der Einsparung an Strom ist dabei enorm. Zusätzlich habe ich den Arduino vorher auch noch modifiziert. Somit sollte der  Node lange laufen. Ich befinde mich gerade im Langzeittest und werde die Werte hier später noch hinzufügen.

In der folgenden Tabelle und dem Schaubild, seht ihr wie ich die Komponenten  miteinander verbunden habe.

Arduino RFM95 Sensor Wandler Batterie
GND GND GND GND GND
VCC VCC Out
A0 Out
A1 Spannungsteiler
2 DIO0
7 DIO1
9 VCC
10 NSS
11 MSOI
12 MISO
13 SCK
In VCC

 

bodenfeuchte aufbau

 

Kalibrierung und Vorbereitungen des Bodenfeuchte-Sensor

Bevor ihr den Bodenfeuchte-Sensor verwendet, solltet ihr die Kanten der Platine mit etwas Klarlack oder Nagellack versiegeln. Es besteht die Gefahr das ansonsten Wasser seitlich in die Platine eindringt und diese Zerstört.

Damit ihr die Werte des Sensors interpretieren könnt, müsst ihr in vorher kalibrieren. Dabei messt ihr einfach die Ausgangsspannung des Sensors für trockenen und feuchten Boden. Für trockenen Boden messt ihr einfach bei trockenem Sensor an der Luft. Für feuchten Boden messt ihr den Wert, indem ihr den Sensor in ein Glas Wasser eintaucht. Dabei darf natürlich nicht der obere Teil des Sensors mit eingetaucht werden. Schaut euch einfach mal die Prozedur bei DFRobot an.

[code]
void setup() {
Serial.begin(9600); // open serial port, set the baud rate as 9600 bps
pinMode(A0, INPUT);
pinMode(9, OUTPUT);
digitalWrite(9, HIGH);
}
void loop() {
int val;
val = analogRead(A0); //connect sensor to Analog 0
Serial.print(val); //print the value to serial port
delay(100);
}
[/code]

Damit habt ihr die Grenzwerte des Sensors ermittelt, die ihr später in eurem Backend auswerten könnt. Ich sammel die Daten mit Node-RED, speicher sie in InfluxDB und visualisiere sie in Grafana. Aber da es unzählige Möglichkeiten gibt, bleibt euch das überlassen.

 

Aufbau der Software

Den Code findet ihr auf GitHub, es handelt sich dabei um einen Sketch für OTAA. Ihr müsst natürlich eure Keys anpassen und eventuell noch das Sendeintervall euren Wünschen anpassen. Ich habe es auf ca. 15 Minuten gesetzt, welches ich als völlig ausreichend ansehe.

Zusätzlich müsst ihr noch den Payload Decoder anpassen:

[code]
function Decoder(b, port) {

var batt = (b[0] +250) / 100;
var soil = (b[1] <<8 | b[2]);

return {
env: {
batt: batt,
soil: soil
},
};
}
[/code]

 

Anschließend sollten die Daten in der Konsole richtig angezeigt werden.

 

ToDo

Was fehlt ist noch ein passendes Gehäuse und eine Langzeitbeobachtung des Batterieverbrauchs. Beim Gehäuse sind eurer Kreativität keine Grenzen gesetzt und ich werde mein Ergebnis auch noch nachliefern, momentan tendiere ich zu einer Abzweigdose. Den Stromverbrauch werde ich auch im Auge behalten, wobei ich mit einer Laufzeit von drei Monaten schon zufrieden wäre.

Ein Vergleich nach 42 Stunden hat folgendes Bild ergeben. Wo ich vorher einen Abfall der Spannung um 0.1V hat, sind es nun nur 0.01V gewesen. Das sind schon mal ein viel besserer Wert als vorher.

Bisher läuft der Sensor einen Monat ohne Unterbrechung. Dabei ist die Batteriespannung von anfänglich 4,16V auf 4,07V gefallen. So sollte der Sensor, optimistisch betrachtet, sicherlich sechs Monate laufen, eventuell sogar bis zu neun Monate.

soil moisture

 

14 Gedanken zu „Bodenfeuchte-Sensor mit Arduino und LoRaWAN“

  1. Es sollte möglich sein, die Versorgungsspannung über ein Relais oder einen Ausgang zu schalten, damit die Spannung nur beim tatsächlichen Messen anliegt. In den erheblich größeren Pausen findet dann keine Sekundärleitung mit Materialverlust statt. Das verschafft den Elektroden auch kein ewiges Leben, verteilt die vorgesehene Lebenszeit aber auf eine größere Nutzungszeit.

    Antworten
    • Hallo Peter,

      wird bereits so gemacht. Der Sensor wird durch den Arduino mit Strom versorgt und auch nur wenn gemessen wird. Mir ging es dabei eher darum Strom zu sparen.
      An den verminderten Materialverlust hatte ich nicht gedacht, aber das ist natürlich auch ein schöner Effekt.

      Danke für den Hinweis.

      Antworten
    • Hallo Tom,

      ja das sollte kein Problem sein. Der ProMini hat bis zu acht analoge Ports. Davon sind zwar nicht immer alle verfügbar gemacht, aber A0 bis A5 sollte es immer geben. Damit wären also 5 Sensoren möglich. Die nötigen freien digitalen PINs sind ebenfalls noch vorhanden (3 bis 6 und 8). Ich habe es nicht gebaut aber ich sehe da kein Problem. Die Software muss natürlich auch noch angepasst werden.

      Grüße,
      Björn

      Antworten
  2. Moin Björn,

    wollte mir gerade mal den Code mit meiner ARduino IDE übersetzen. Dabei bekomme ich folgenden Fehler:

    /Users/heiner/Documents/Arduino/Bodenfeuchtesensor_TTN/Bodenfeuchtesensor_TTN.ino: In function ‚void onEvent(ev_t)‘:
    Bodenfeuchtesensor_TTN:112:5: error: invalid abstract return type ‚Print‘
    Print(os_getTime());

    Was mache ich falsch ? Die Bibliotheken sind eingebunden.

    Gruß Heiner

    Antworten
  3. Hallo Björn,

    ein tolles Projekt. Eine absolute Anfängerfrage im Bereich LoRa: Wie bekomme ich heraus, ob meine Sensordaten im LoRaWAN erreichbar sind?

    Danke vorab und Grüsse Andreas

    Antworten
    • Hallo Andreas,

      ob an deinem Standort möglicherweise eine Abdeckung vorhanden ist, kannst du mittels dem TTN Mapper testen. Dort kannst du sehen ob bei dir eine Gateway vorhanden ist und Empfang eventuell möglich ist.

      Grüße,
      Björn

      Antworten
    • Hi,

      zwei Jahre hat er geschafft, nun werden anscheinend die Werte verfälscht. Muss ich mir aber erst mal anschaue, ob es am
      Sensor liegt oder an der Position im Kübel.

      Grüße,
      Björn

      Antworten

Schreibe einen Kommentar