ESP Mikrocontroller 8266 mit sechs verschiedenen Sensoren Sensor

ESP | Sensordaten auslesen mit MicroPython



Ideen: W. Kimmig, J. Schnaiter, Gewerblich-Technische Schule Offenburg, 2022

Taster und Potentiometer

Taster am Pin 17 und Poti am Pin 2
Abb. 1 Taster am Pin 17 und Poti am Pin 2.
Taster

Mit einem Taster (s. Abb. 1) kann man bspw. ein Licht anschalten. Der Taster detektiert den Tastendruck und gibt an den angeschlossenen Pin 0 V (pull-down) oder 3,3 V (pull-up).

from machine import Pin
import time

button = Pin(17, mode=Pin.IN, pull=Pin.PULL_UP)
led = Pin(27, Pin.OUT)

while True:
    if button.value() == 1:
        led.on()
    else:
        led.off()

Man beachte, dass der Wert des Tasters entweder 0 oder 1. So kann ganz einfach der Zustand des Tasters ermittelt werden und mit Hilfer einer Entscheidung bspw. die LED ein- oder ausgeschaltet werden.

Potentiometer

Mit dem Potentiometer (auch Poti) an unserem Board (s. Abb. 1) lässt sich mit Hilfe des Analog-Digitalwandlers (auch ADC) eine Spannung zwischen 0 und 3,3 V erfassen und in einen digitalen Wert zwischn 0 und 4095 umwandeln.

from machine import Pin, ADC
import time

poti = ADC(2)

while True:
    value = poti.read()    # 0–4095
    
    print(f"Poti: {value}")

    time.sleep(0.2)

Die Klasse ADC ist bereits in dem Modul machine enthalten. Wir erstellen ein neues Objekt dieser Klasse: poti = ADC(2).

Beim Aufruf von value = poti.read()wird die anliegende Spannung in einen Wert von 0 - 4095 gewandelt.

Mit print(f"Poti: {value}") geben wir den aktuellen gewandelten Wert aus.

Helligkeit und Lärmpegel

Umgebungslichtsensor am Pin 34 und Lärmpegelsensor am Pin 35
Abb. 2 Umgebungslichtsensor am Pin 34 und Lärmpegelsensor am Pin 35.

Umgebungslichtsensoren (english: ambient light) dienen der Tagerkennung oder können ermitteln, ob das Licht in Räumen ausgeschaltet ist. Der Sensor wandelt Lichtenergie in ein elektrisches Signal

Ein Lärmpegelsensor (auch Schallpegelsensor) wird eingesetzt, um die Lautstärke bzw. den Schalldruckpegel in der Umgebung zu messen. Der Sensor wandelt Schallwellen (akustische Energie) in ein elektrisches Signal um

Beide Sensoren (s. Abb. 2) liefern einen analogen Wert zwischen 0 und 3,3 V. Da die Signale an ADC-Pins des Mikrocontrollers anliegen, können sie in einen 12-Bit-Wert umgewandelt werden. Insgesamt hat der Mikrocontroller 16 analoge Eingänge.

Die Klasse ADC ist Teil des machine-Moduls.

Es werden zwei ADC-Objekte erzeugt.

Der Zugriff auf den aktuellen Beleuchtungswert und Lärmpegelwert erfolgt über die Funktion ambientLight.read() und soundLevel.read().

Mit print(...) werden die Werte ausgegeben und die Messung wird alle 200 ms wiederholt.

from machine import Pin, ADC
import time

ambientLight = ADC(34)
soundLevel = ADC(35)

while True:
    v1 = ambientLight.read()  # 0–4095
    v2 = soundLevel.read()    # 0–4095
    
    print(f"Helligkeit: {v1:4d}")
    print(f"Laermpegel: {v2:4d}")

    time.sleep(0.2)

Luftfeuchtigkeit und Temperatur für die Luftqualität in Räumen DHT

Temperatur und Luffeuchtigkeit über I<sup>2</sup>C-Schnittstelle
Abb. 3 Temperatur und Luffeuchtigkeit über I2C-Schnittstelle.

Zur Vermeidung von Schimmel sollte die Luftfeuchtigkeit in Innenräumen unter 60 % bleiben. Hierzu werden Luftfeuchtigkeits­sensoren eingesetzt.

Die DHT-Sensoren (Digital Humidity & Temperature) sind kostengünstige digitale Sensoren mit einem kapazitiven Feuchtigkeitssensor und einem NTC-Temperatursensor zur Messung der Umgebungsluft. Der Sensor in Abb. 3 verfügt über eine I2C-Schnittstelle.

  • Add-ons for your ESP
  • DHT Temperatur- / Luftfeuchtesensor

Micropython bietet eine DHT-Bibliothek, welche importiert wird. Einmal eingebunden kann ein Objekt der entsprechenden DHT-Klasse erzeugt werden.

Mit dem Aufruf dht.measurements wird die Messung durchgeführt und die Messwerte in einem Dictonary zurückgegeben. Zum extrahieren der beiden Messwerte greifen wir über den Schlüssel auf den jeweiligen Messwert zu. In diesem Fall wird die Messung und Ausgabe jede Sekunde zyklisch wiederholt.


from machine import Pin, I2C
import dht20, time

i2c = I2C(0, scl=Pin(22), sda=Pin(21))
dht = dht20.DHT20(0x38,i2c)

while True:
    temperature = dht.measurements["t"]
    humidity = dht.measurements["rh"]
    
    print(f"T: {temperature:.2f} °C")
    print(f"H: {humidity:.2f} %")
    
    time.sleep(1)

Luftdruck, Temperatur und 3-Achsen-Beschleunigung BMP180 und LIS3DHTR

Luftdruck- und Temperatursensor BMP180 sowie 3-Achsen-Beschleunigungssensor
Abb. 4 Luftdruck- und Temperatursensor BMP180 sowie 3-Achsen-Beschleunigungssensor LIS3DHTR über I2C.

Mit einem Luftdrucksensor lässt sich ein Tief- oder Hochdruckgebiet vorhersagen, aber ggf. auch die Höhe bestimmen. Der BMP180-Sensor in Abb. 4 misst sowohl die Temperatur als auch den Druck. Die Auflösung ist dabei so gut, dass damit auch die Höhe berechnet werden kann.

Der Beschleunigunssensor in Abb. 4 misst eine Änderung der Bewegung in x-, y- und z-Richtung. So kann man erkennen ob ein Gerät gedreht wird oder fällt. Auf dieser Basis funktioniert die Sturz- und Unfallerkennung, Bild- und Flugstabilisierung als auch die Schwingungserkennung. Die Kommunikation beider Sensoren läuft über die integrierte I2C-Schnittstelle.

  • Add-ons for your ESP
  • BMP180 Luftdruck- und Temperatursensor
  • MMA7660FC 3-Achsen-Beschleunigungssensor

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 machine import Pin, I2C
import bmp280, time

i2c = I2C(0, scl=Pin(22), sda=Pin(21))
bmp = bmp280.BMP280(i2c, 0x77, 101700) #Tagesluftdruck


while True:
    print(f"Temp: {bmp.temperature:.2f} °C")
    print(f"Druck: {bmp.pressure:.1f} hPa")
    print(f"Druck: {bmp.altitude:.1f} m")
    
    time.sleep(1)

Um die Klasse LIS3DHTR verwenden zu können muss die Bibliothek lis3dhtr.py auf dem ESP-Controller kopiert werden.

Beim Erzeugen des lis-Objekts kann die I2C-Adresse optional angegeben werden.

Auf die drei Sensorwerte x,y und z kann dann über die Funktion lis.read() zugegriffen werden. Diese Funktion gibt alle drei Werte zurück.

Das Auslesen wird alle halbe Sekunde zyklisch wiederholt.


from machine import Pin, I2C
import lis3dhtr, time

i2c = I2C(0, scl=Pin(22), sda=Pin(21))
lis=lis3dhtr.LIS3DHTR(i2c,0x19)


while True:
    x, y, z = lis.read()

    print(f"x: {x:.2f}")
    print(f"y: {y:.2f}")
    print(f"z: {z:.2f}")

    time.sleep(0.5)

Arbeitsauftrag 1 reading sensor data

Taster

  1. Erstelle den Ordner 02-Button
  2. Erstelle die Datei button.py und gib den passenden Code ein, so dass bei Tastendruck die LED angeht.
  3. Kannst Du den Taster auch so programmieren, dass das Licht angeht wenn du einmal den Taster drückst und beim nächsten Mal wieder aus?

Light and Sound Umgebungslicht und Lärmpegel mit dem ADC

  1. Erstelle den Ordner 06-ADC.
  2. Erstelle die Datei light-basic.py und gib den passenden Code zur Anzeige des Unmgebungslichtwertes ein.
  3. Gib den Wert am OLED-Display und in Thonny aus.
  4. Erstelle die Datei sound-basic.py zur Ausgabe des Lärmpegels.
  5. Wird der Lärmpegel mehr als 5 s überschritten, soll die rote LED leuchten.

Mit dieser Vorgehensweise lassen sich weitere Sensoren einfach integrieren.


Arbeitsauftrag 2 reading sensor data via I2C

Luftfeuchte und Temperaturmessung

  1. Erstelle den Ordner I2C
  2. Erstelle die Datei humidity-basic.py und gib den passenden Code ein.
  3. Binde alle notwendigen Libraries ein.
  4. Übertrage die Bibliotheken auf den ESP und starte das Programm. Teste und verifiziere die Ausgabe.

Luftdruck, Temperatur und Höhe

  1. Erstelle den Ordner I2C
  2. Erstelle die Datei pressure-basic.py und gib den passenden Code ein.
  3. Binde alle notwendigen Libraries ein.
  4. Übertrage die Bibliotheken auf den ESP und starte das Programm. Teste und verifiziere die Ausgabe.
  5. Aktualisiere den Luftdruck, so dass die korrekte Höhe berechnet wird.
  6. Ergänze das Programm so, dass die Temperatur auch in Kelvin und Grad Fahrenheit angezeigt wird.
  7. Vergleiche die Temperaturwerte der beiden Sensoren (DHT und BMP). Recherchiere welcher der beiden Sensoren den exakteren Wert ermittelt und ermittle den Grund hierfür.

Wichtige Funktionen zum Ansteuern von Sensoren



from machine import Pin, I2C importieren der Klassen Pin und I2Caus dem Modul machine
i2c = I2C(0, scl=Pin(22), sda=Pin(21)) I2C-Objekt am Pin 21 und 22 erzeugen
print(f"H: {humidity:.2f} %") Formatierte Ausgabe eines Sensorwertes
x, y, z = lis.read() Funktionsaufruf mit drei Rückgabewerten
messwerte={"wert1": 20.1, "wert2": 36.2} Aufbau eines Dictionaries