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.

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);
}

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:

function Decoder(b, port) {

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


  return {
    env: {
      batt: batt,
      soil: soil
    },
  };
}

 

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

 

2 Gedanken zu “Bodenfeuchte-Sensor mit Arduino und LoRaWAN”

    • Hallo Peter,

      das sehe ich genau so. Ich bin noch optimistisch, aber nach dem Sommer wissen wir mehr.
      Ich werde meine Erfahrungen und Ergebnisse jedenfalls weiter geben.

Schreibe einen Kommentar