Zum Inhalt springen →

3 analoge Bodenfeuchtigkeits-Sensoren am esp8266 – Update

20151017_112942

Nachdem mein Artikel über die 3 analoge Bodenfeuchtigkeits-Sensoren am esp8266 sehr viel Aufmerksamkeit erregt haben, möchte ich nun nach den ersten 4 Monaten im Einsatz ein Update posten.

Im wesentlichen haben sich seit der ursprünglichen Version folgende Dinge geändert.

1. Dar Gehäuse
Das Gehäuse ist nun ein „Industrie Aufputz Gehäuse IP65 Modell G212“ das ich für 5.95 EUR bei Ebay ersteigert habe.
Das Gehäuse hat folgende Eigenschaften:

Gehäusetyp: Universal
Modell: G212
Abm.-Außen (B x H x T): ca.115 x 90 x 55 mm
Abm.-Innen (B x H x T): ca.108 x 83 x 50 mm
Material: ABS-Kunststoff
Farbe: Hellgrau
IP Schutzgrad: 65

Schutzklasse IP65 beduetet:
Vollständiger Berührungsschutz, Schutz gegen Eindringen von Staub
Geschützt gegen Strahlwasser (aus allen Richtungen)

Beim Öffnen habe ich aber festgestellt, dass sich im Gehäuse schon Kondenswasser gebildet hat und dass einige der metallischen Komponenten schon anfangen zu korrodieren. Es ist möglich, dass die Flüssigkeit durch die verschiedenen Öffnungen in das Gehäuse eingedrungen ist. Ich habe zwar versucht, alles so gut wie möglich mit Silicon zu verschließen, aber man weiß ja nie so ganz genau. Die Öffnungen sind nötig, da ich die Kabel für die Sensoren und die Solarzelle in das Gehäuse führen muss.

2. Die Solarzelle
Um nicht permanent den Akku austauschen/aufladen zu müssen habe ich auf das Gehäuse eine Solarzelle geklebt.
Die von mir ausgewählte hat folgende Eigenschaften:

5V 240mA 1.2W Solar Panel Module DIY for Cell Charger Toy
High conversion rate
High efficiency output.
Excellent weak light effect.
Power: 1.2W.
Current: 240mA
Voltage: 5V.
Size: 11cm x 6.9cm x 0.3cm.

Die Solarzelle zum Laden des Akkus habe ich bei Aliexpress für US $2.39 bezogen. Ob die Werte stimmen weiß ich nicht ganz genau. Aber das ist auch nicht Wichtig. Entscheidend ist, dass der Akku immer geladen ist und nach jetzt 3 Monaten im Einsatz habe ich immer noch einen voll geladenen Akku. Glücklicherweise benötigt die Schaltung auch nur sehr wenig Power. Die meiste Zeit ist der ESP8266 im deep sleep mode und verbraucht nur ein paar Mikroampere. Nut 2 mal pro Stunde wird er für ein paar Sekunden aktiviert, misst die Bodenfeuchtigkeit, übermittelt die Daten an den Server und legt sich weider schlafen. Dafür ist immer mehr als genug Energie vorhanden.

2x-DIY-5V-1-2W-240mA-Solar-Panel-Module-Solar-System-Cells-Charger-69410.jpg_220x220

3. Akku Ladegerät

Da der LiPo Akku nicht direkt an eine 5 Volt Spannungsquelle angeschlossen werden kann, habe ich eine kleine Akku Ladeschaltung hinzugefügt, die für das Laden von LiPos optimiert ist und die speziellen Bedürfnisse dieser sensiblen Akku-Typen berücksichtigt. Hier verwende ich den „TP4056 1A Lipo Battery Charging Board Charger Module lithium battery DIY MICRO Port Mike USB“. Diese kann sowohl an ein USB Kabel ans auch direkt an eine 5 Volt Spannungsquelle angeschlossen werden. Auch diese Schaltung habe ich bei Aliexpress bestellt. Die Kosten dafür sind zu vernachlässigen. Ein 5er Pack kostet nur einen Euro incl. Versandkosten aus China (WIRKLICH).

TP4056-1A-Lipo-Battery-Charging-Board-Charger-Module-lithium-battery-DIY-Mini-USB.jpg_220x220

4. Referenz Sensor

Nachdem die erste Version des Sensors im Boden war, habe ich festgestellt, dass die Werte trotz vergleichbarer Feuchtigkeit im Boden schwankend sind und ich habe versucht herauszufinden, woran dies liegen kann. Dabei habe ich 2 Gründe identifiziert.

a) Der Analog Digital Wandler des esp8266 ist nicht immer 100% genau. Er hat Schwankungen, die zwar gering, aber in der Kurve deutlich zu erkennen sind.
b) Da ich keinen Spannung Stabilisator nutze und nur eine Diode in Reihe zur Stromversorgung des ESP8266 gesetzt habe um die Versorgungsspannung auf ca. 3.3 Volt zu reduzieren und der esp8266 intern mit einer 1 Volt Spannungsreferenz arbeitet, ist der Wert des ADC auch immer von der aktuellen Ladung des Akkus abhängig.


Sensordaten (Version 1)

Auch wenn a) nur sehr geringe Störungen verursacht und sich b) mit dem Einsatz der Solarzelle deutlich verbessern sollte, habe ich nach einer Erweiterung der Schaltung gesucht um noch bessere Daten zu erhalten. Die Lösung für das Problem ist simpel. Zusätzlich zu den 3 Spannungsteilern mit den Sensoren am ADC habe ich noch einen weiteren Spannungsteiler am GPIO-5 hinzugefügt, der sich aus 2 festen Widerständen zusammensetzt und den ich als vierten Wert mit übertrage. In einer perfekten Welt würde der ADC hier immer den gleichen Wert lesen und übertragen. Aber die Welt ist nicht perfekt und der ADC des esp8266 hat schon mal einen kleinen Schluckauf und die Akku-Sapnnung ist auch nicht immer 100% stabil. Daher schwankt dieser Wert in Abhängigkeit von den 2 Faktoren.
Da ich nun die Abweichung vom Soll Wert kann, kann ich einen Faktor ermitteln und die Sensor Werte mit diesem Faktor korrigieren. Natürlich könnte ich das auch gleich im lua Code des esp8266 machen, aber ich habe mich Entschieden, diese Funktion auf dem Server durchzuführen. So bekomme ich wesentlich bessere Ergebnisse.

Screenshot_2015-10-17-11-33-37

Offene Punkte

Wie man an der Kurve erkennen kann, habe ich noch ein weiteres Problem. Der mittlere Sensor ist momentan so feucht, das er immer Werte jenseits der Skala liefert. In den Logs kann ich sehen, dass hier immer 1024 übertragen wird. Das bringt 2 Probleme mit sich.

a) Der Faktor mit dem ich die Messwert Korrektur berechne kann hier nicht angewendet werden. Denn wenn ich die 1024 mit den Faktor multipliziere, wird der Wert zwar angepasst, aber die Kurve wird nicht besser, sondern eher schlechter. In dem Bild erkennt man sehr schön diesen Effekt, den ich zwar mit ein wenig Logik beim berechnen der Daten ausbessern könnte, aber das ist ja keine Lösung für das eigentliche Problem.

b) Ich weiß zwar dass es an der Stelle in meinem Garten seeeeeeeeeehr feucht ist, aber das Sprengen der Skala war in der ursprünglichen Version nicht vorgesehen.

Eine Lösung dafür könnte sein, den Widerstand des Spannungsteilers zu ändern. Das werde ich wohl noch mal probieren.

Bis dahin „Happy Hacking“

Anhang

Hier mein aktueller lua code mit dem ich die Daten auslese und an den Server sende. Security Features habe ich hier nicht vorgesehen. Ich vertraue einfach darauf, dass schon alles gut gehen wird. 🙂


sensordelay = 1800000000; -- 30 min
emptydelay = 3600000000 * 24 -- 24h

function send_sensor_data ()
url = „/data.php?id=H13“ ..
„&v0=“ .. s0 ..
„&v1=“ .. s1 ..
„&v2=“ .. s2 ..
„&v3=“ .. s3
send_data_url ( url)
end

function send_data_url (url)
print („send “ .. url)
wifi.setmode(wifi.STATION)
wifi.sta.config(„WLAN SSID“, „WLAN PASSWORT“)
wifi.sta.connect()

tmr.alarm(0, 1000, 1, function()
print („WiFi“)
if wifi.sta.getip()==nil then
print(„connecting to AP…“)
else
print(‚ip: ‚,wifi.sta.getip())
tmr.stop(0)
print(’send data‘)
conn=net.createConnection(net.TCP, false)
conn:on(„receive“, function(conn, pl)
print („OK“)
print („deep sleep after sending“);
node.dsleep(sensordelay)
end)
conn:connect(80,“78.46.94.11″)
conn:send(„GET “ .. url .. “ HTTP/1.1\r\nHost: MEINHOST\r\n“ ..
„Connection: keep-alive\r\nAccept: */*\r\n\r\n“)
end
end)
end

function init_sensor_gpios()
gpio.mode(1,gpio.OUTPUT)
gpio.mode(5,gpio.OUTPUT)
gpio.mode(6,gpio.OUTPUT)
gpio.mode(7,gpio.OUTPUT)
end

function read_sensor_data ()
init_gpio (1)
init_gpio (5)
init_gpio (6)
init_gpio (7)

s0 = read_sensor (1)
s1 = read_sensor (5)
s2 = read_sensor (6)
s3 = read_sensor (7)
print („read “ .. s0 .. “ „.. s1 .. “ “ .. s2 .. “ “ .. s3);
end

function read_sensor (g)
print (“ read_sensor “ .. g)
gpio.write(g, gpio.HIGH)
tmr.delay(1000)
val = adc.read(0)
tmr.delay(1000)
gpio.write(g, gpio.LOW)
print (“ read_sensor “ .. g .. “ “ .. val)
return val
end

function init_gpio (g)
gpio.mode(g,gpio.OUTPUT)
gpio.write(g, gpio.LOW)
end

function init_fallback_deep_sleep ()
tmr.alarm(2,30000,1,function()
print („deep sleep fall back „);
node.dsleep(sensordelay)
end)
end

— init.lua —
print („start“);

tmr.alarm(3,3000,1,function()
wifi.sta.autoconnect(0)
wifi.sta.disconnect()
init_sensor_gpios()
init_fallback_deep_sleep ()
read_sensor_data ()
send_sensor_data ()
tmr.stop(3)
end)

Server Seitig setze ich ein sehr einfaches PHP Skript ein, dass die Daten in eine MySQL Datenbank schreibt. Die Darstellung der Daten erfolgt dann mittels d3.js. Auf Wunsch kann ich den Code hier auch noch veröffentlichen. Aber da muss ich vorher noch ein wenig aufräumen und ein Script zum erzeugen der Datenbank Struktur anlegen.

Bei Bedarf einfach kurz unter https://twitter.com/MichaelJentsch1 melden.

Bilder

Zum Schuss noch ein paar Bilder von dem kleinen Kasten.

Die Box mit dem esp8266, Akku und Elektronik

20151017_112942

Nach dem Aufschrauben ist vor dem Zuschrauben

20151017_113046

Die Schaltung in der Tüte

20151017_113120
Die Schaltung habe ich noch zusätzlich in eine kleine Plastiktüte gepackt. Sicher ist sicher :-). Rechts sieht man, dass sich auf der Innenseite des Gehäuses Feuchtigkeit abgesetzt hat.

Die Box von Innen ohne die Schaltung

20151017_113141
Was übrig bleibt ist der Akku (Das Rote Band hilft mir beim wechseln des Akkus und die Schalung zum Laden des Akkus.

Kleine Änderung des Widerstandes am ADC

20151017_113414

20151017_113908
Leider hat die Änderung nicht den erhofften Erfolg gebracht.

Die Sensoren sehen auch nach 4 Monaten noch gut aus

20151017_114737
20151017_114744

Veröffentlicht in IoT PHP Programmierung