Fisch´s Projekte-Seite

Project start: October 2020

Sensor ESP




Automatisierung funktioniert nur mit einer guten Grundlage an Daten. Im einfachsten Fall ist das die Uhrzeit. Mehr lässt sich machen mit Schaltern. Noch spannender wird es bei Einbringung von Umweltsensoren. Temperatur, Luftdruck, Luftfeuchtigkeit, Helligkeit, Bewegung, CO2 Konzentration oder Feinstaub, um nur ein paar zu nennen.
Nicht für jede Kombination solcher Sensoren gibt es ein fertiges Produkt auf dem Markt, wesshalb ich oft zum ESP8266 Microcontroller mit WLan als Interface zwischen Sensorhardware und IoT Netzwerk greife. Nachdem ich den Code für die dritte Messstation neu geschrieben hatte wegen einer leicht unterschiedlichen Auswahl an Sensoren musste wenigstens eine gemeinsame Codebasis her.
Ich stelle vor: Projekt Sensoresp.
Warum nicht Tasmota? Weil ich gerne das Rad neu erfinden möchte. In der Einleitung habe ich bereits erwähnt, dass ich das Thema Heimautomatisierung hauptsächlich aus Interesse an der Technik verfolge. Ein sehr großer Teil davon ist das ausprobieren verschiedener Sensoren und deren Einbindung.

Besonders hilfreich beim Programmieren in C sind hierbei Präprozessoranweisungen wie defines und dazugehörige ifdefs zur selektion von Codeteilen. Mit Platformio kommen noch Environments dazu. Für jede Messstation erstelle ich ein Environment in dem die verwendeten Sensoren zusammen mit ausgewählten Parametern definiert werden.

Als Beispiel dazu ein Auszug aus der platformio.ini (Link zum Repo am Ende der Seite):


[env:sensoresp1]
platform = espressif8266
board = d1_mini
framework = arduino

build_flags =
-D SENSOR_DHT22
-D DHTPIN=D7
-D dataDHT22_temperature_minchange=0.2
-D dataDHT22_humidity_minchange=2.0

-D SENSOR_BMP180
-D dataBMP180_temperature_minchange=0.2
-D dataBMP180_pressure_minchange=0.5

-D SENSOR_PIR
-D PIRPIN=D6
-D dataPIR_readdelay=100
-D dataPIR_senddelaymax=1000*60*10

-D SENSOR_LDR
-D SENSOR_LDR_CALIB1
-D LDR_PIN=A0
-D dataLDR_minchange=10.0
-D dataLDR_readdelay=1000*2
-D dataBH1750_senddelaymax=1000*60*1


Neben dem GPIO Pin fallen hier die Begriffe dataX_minchange, dataX_readdelay und dataX_senddelaymax auf.
Üblicherweise werden Messwerte in einem definierten Zeitintervall erfasst und gesendet. Hier stellt sich jedoch die Frage, welches Zeitintervall optimal ist. Es ist also eine Balance zwischen Datenaufkommen und Latenz nötig. Bei trägen Messwerten wie Luftdruck oder Temperatur ist das noch leicht zu lösen. Problematisch wird es bei Beleuchtungsmessung in Räumen, wo es Nachts beispielsweise Stundenlang dunkel ist jedoch plötzlich das Licht eingeschaltet werden kann und dann auch nur für wenige Sekunden an ist.
Meine Lösung war es häufig Sensoren abzufragen "readdelay", die Werte jedoch nur per MQTT zu senden wenn es eine starke Änderung "minchange" zum zuletzt gesendeten Wert gab oder der letzte Wert vor "senddelaymax" Millisekunden gesendet wurde.

Die Hardware ist relativ simpel. Sensoren werden meist direkt mit dem ESP8266 verbunden. Die Lochrasterplatine dient hier nur als Powerdistribution für GND, 5V und 3.3V. Als Spannungsversorung dient meist ein USB Steckernetzteil. Bei vielen Geräten habe ich einen XT30 Stecker verwendet, da der Micro USB Anschluss zu flimsy schien.
Bei dieser Messstation ist beispielsweise ein HC501-SR PIR Bewegungssensor, ein MH19-B CO2 Sensor, ein AM2302/DHT11 Luftfeuchtigkeit und Temperatursensor sowei ein BH1750 Helligkeitssensor angeschlossen.


Hier ein kleineres Gerät mit BH1750 Luxmeter, AM2302 und Bewegungssensor.