Mit einem Luftdrucksensor lässt sich ein Tief- oder Hochdruckgebiet vorhersagen, aber ggf. auch die Höhe bestimmen. Der Bosch-BMP180-Sensor misst sowohl die Temperatur als auch den Druck. Die Auflösung ist dabei so gut, dass damit auch die Höhe berechnet werden kann.
Die Kommunikation läuft über die integrierte I2C-Schnittstelle.
Um die Klasse BMP180
verwenden zu können muss die Bibliothek bmp180.py
auf dem ESP-Controller kopiert werden.
Beim Erzeugen des BMP-Objekts wird zur Berechnung der Höhe der aktuelle Luftdruck in hPa übergeben.
Auf die Sensorwerte Luftdruck, Temperatur und Höhe kann dann über die drei Objektattribute bmp.pressure
, bmp.temperature
und bmp.altitude
zugegriffen werden.
from bmp180 import BMP180
from machine import I2C, Pin
import time
i2c = I2C(scl=Pin(5), sda=Pin(4))
bmp = BMP180(i2c, 102100.0) #aktueller Luftdruck in Pascal
while True:
#Werte auslesen und anzeigen
print("p: {} hPa".format(bmp.pressure / 100.0))
print("T: {} °C".format(bmp.temperature))
print("h: {} m\n".format(bmp.altitude))
#Wartezeit
time.sleep(5)
Zur Vermeidung von Schimmel sollte die Luftfeuchtigkeit in Innenräumen unter 60 % bleiben. Hierzu werden Luftfeuchtigkeitssensoren eingesetzt.
Die DHT-Sensoren (Digital Humidity & Temperature) sind kostengünstige digitale Sensoren mit einem kapazitiven Feuchtigkeitssensor und einem NTC-Temperatursensor zur Messung der Umgebungsluft. Sie haben einen Analog-Digital-Wandler und einer 1-Draht-Schnittstelle integriert. Neuere Sensoren verfügen auch über eine I2C-Schnittstelle.
Die Sensoren DHT11 (blau) und DHT22 (weiß) arbeiten beide über die gleiche 1-Draht-Schnittstelle. Der DHT22 verfügt über eine Auflösung von 1 Dezimalstelle, der DHT11 über eine Ganzzahlt für Feuchtigkeits- und Temperaturmesswerte.
Micropython bietet eine DHT-Bibliothek, welche direkt importiert wird. Einmal eingebunden kann ein Objekt der entsprechenden DHT-Klasse erzeugt werden.
Man beachte, dass die 1-Draht-Schnittstelle über den identischen Pin wie die LED funktioniert. Aus diesem Grund lässt sich diese im weiteren Verlauf nicht als Anzeige verwenden.
Bevor nun die Messwerte ausgelesen werden können muss eine Messung durchgeführt werden. In diesem Fall wird die Messung und Ausgabe alle 5 s zyklisch wiederholt.
import dht
import machine
import time
sensor = dht.DHT22(machine.Pin(2))
while True:
sensor.measure()
print("T: {} °C".format(sensor.temperature()))
print("H: {} %\n".format(sensor.humidity()))
time.sleep(5)
Umgebungslichtsensoren (english: ambient light) dienen der Tagerkennung oder können ermitteln, ob das Licht in Räumen ausgeschaltet ist.
Der Beleuchtungssensor BH1750 liefert einen Wert von 1 - 65535 lx für die Beleuchtungsstärke und ist mit einer I2C-Schnittstelle ausgestattet.
Um die Klasse BH1750
verwenden zu können muss die Bibliothek bh1750.py auf dem ESP-Controller kopiert werden.
Nach dem das I2C-Objekt erzeugt wurde, kann das BH1750-Objekt erstellt. werden.
Der Zugriff auf den aktuellen Beleuchtungswert erfolgt über die Funktion ambientLight.luminance(BH1750.ONCE_HIRES_1)
. Das Attribut BH1750.ONCE_HIRES_1
gibt einen von fünf verschiedenen Modi an, welche in der Pythonbibliothek hinterlegt sind.
from bh1750 import BH1750
import machine
import time
i2c = I2C(scl=Pin(5), sda=Pin(4))
ambientLight = BH1750(i2c)
while True:
print(ambientLight.luminance(BH1750.ONCE_HIRES_1))
time.sleep(2)
Infrarotsensoren (englisch: infrared) werden als Bewegungsmelder eingesetzt. Da sie Wärmestrahlung detektieren funktionieren sie auch in dunklen Räumen.
Der passiver Infrarotsensor PIR ist ein digitaler Sensor. D.h. bei erkannter Bewegung gibt er am am Pin 0 den digitalen Wert 1, ansonsten den Wert 0 aus.
Es wird keine zusätzliche Pythonbibliothek benötigt. Nur der Pin 0 wird als digitaler Eingang deklariert.
Alle paar Sekunden wird nun der Bewegungsmelder ausgewertet. Man beachte, dass für eine lückenlose Bewegungserkennung sehr kurze Zeitabstände notwendig sind.
from machine import Pin
import time
pir = Pin(0, Pin.IN)
while True:
if pir.value():
print("Motion detected!", pir.value())
else:
print("No Motion detected!", pir.value())
time.sleep(2)
Mit Hilfe eines CO2-Sensors lässt sich die Luftqualität von Innenräumen bestimmen. Der SGP30 misst zwei Luftqualitätswerte: TVOC und eCO2 und wird über die I2C-Schnittstelle eingebunden.
Der TVOC-Wert (total volatile organic compounds) erkennt Stoffe wie Kohlenwasserstoffe, Alkohole, Aldehyde oder organische Säuren. Viele Lösungsmittel, Flüssigbrennstoffe oder weitere synthetische Substanzen beinhalten VOCs. Er hat einen Wert zwichen 0-60000 ppb.
Der eCO2 (equivalent CO2) misst die CO2-Konzentration in der Luft. Der Wert liegt in einem Bereich 400-60000 ppm. Während an der frischen Luft der Wert bei etwa 400 ppm liegt, kann er bei geschlossenem Fenster in einem Schlafzimmer auf über 2000 ppm ansteigen.
Die Firma Adafruit hat eine Bibliothek für den SGP30 geschrieben Um die Klasse Adafruit_SGP30
verwenden zu können muss die Bibliothek sgp30.py
auf dem ESP-Controller kopiert werden.
Nach dem Erzeugen des I2C-Objekts, kann das SGP30-Objekt erstellt. werden. Für die Initialisierung wird die Funktion sgp30.iaq_init()
aufgerufen und eine Wartezeit von 15 s eingehalten.
Die beiden Messwerte werden in einer Variable gespeichert und anschließend ausgegeben. Man beachte entsprechende Vorgaben aus dem Datenblatt des Sensors.
import sgp30
from machine import I2C, Pin
import time
i2c = I2C(scl=Pin(5), sda=Pin(4))
sgp30 = sgp30.Adafruit_SGP30(i2c)
# Initialize SGP-30 internal drift compensation algorithm.
sgp30.iaq_init()
# Wait 15 seconds for the SGP30 to properly initialize
print("Waiting 15 seconds for SGP30 initialization.")
time.sleep(15)
while True:
co2eq, tvoc = sgp30.iaq_measure()
print("co2eq: ", co2eq, "ppm")
print("tvoc: ", tvoc, "ppb")
time.sleep(5)
Luftdruck und Temperatur BMP180
DHT22 Luftfeuchte und Temperaturmessung
Mit dieser Vorgehensweise lassen sich weitere Sensoren einfach integrieren.
All in one Luftfeuchte und Temperaturmessung
messwerte={
"pressure": bmp.pressure,
"temperatureBMP": bmp.temperature,
...
}
from bh1750 import BH1750 |
importieren der Klasse BH1750 aus der Datei bh1750.py |
i2c = I2C(scl=Pin(5), sda=Pin(4)) |
I2C-Objekt am Pin 4 und 5 erzeugen |
print("T: {} °C".format(sensor.
temperature())) |
Formatierte Ausgabe von Sensorwerten |
co2eq, tvoc= sgp30.iaq_measure() |
Funktionsaufruf mit zwei Rückgabewerten |
messwerte={"wert1": 20.1, "wert2": 36.2} |
Aufbau eines Dictionaries |