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.
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 |
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.
es ist sicher von allgemeinem Interesse zu erfahren, wie lange diese Art von Sensoren für Feuchtigkeit „gesund“ bleibt, bevor er sich selbst zersetzt.
danke.
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.
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.
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.
Hallo Björn, kann man auch mehrere Sensoren anschließen?
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
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
Hallo Heiner,
benutzen bitte folgende LMIC-Library, damit sollte es keine Probleme geben:
https://github.com/mcci-catena/arduino-lmic
Grüße,
Björn
Hallo Björn
Ich habe das gleiche probem obwohl ich die LMIC-Library
https://github.com/mcci-catena/arduino-lmic
nutze ich habe ebenfalls ausprobiert ob ich es mit einer version um 2018 hinbekomme das problem bleibt bestehen
hättest du vielleicht eine idee
Hi Benedikt,
ich habe den Sketch angepasst und die Print Anweisungen gegen Serial.print ausgetauscht, damit sollte es eigentlich gehen.
Grüße,
Björn
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
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
Wie sah es denn nun aus mit der Lang Zeit Haltbarkeit des Sensors? Nach 3 Jahren… Danke
Wir bauen derzeit http://www.giessalarm.de
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