ESP Mikrocontroller 8266 mit sechs verschiedenen Sensoren Sensor

ESP | Sensordaten mit I2C auslesen mit MicroPython



Ideen: W. Kimmig, J. Schnaiter, Gewerblich-Technische Schule Offenburg, 2022
AI-unterstützte Lerninhalte

1 Was ist I2C?

I2C ist ein serieller Bus, der nur zwei Leitungen benötigt:

  • SDA (Serial Data): Hier werden die eigentlichen Daten (Bits) gesendet.
  • SCL (Serial Clock): Der Taktgeber, der das Tempo für den Datenversand vorgibt.
Shared Bus: Viele Sensoren teilen sich dieselben zwei Kabel!
Taster am Pin 17 und Poti am Pin 2
Abb. 1 Prinzipieller Aufbau von I2C-Master-und Slave.

2 Die I2C-Adresse

Da alle Geräte an der selben Leitung hängen, braucht jedes Gerät eine Adresse.

OLED Display
0x3C
ESP32
Der "Master"
Sensor für Luftfeuchte und Temperatur
0x38
Sensor für Beschleunigung
0x19
Sensor für Luftdruck
0x77

Der Controller sendet zuerst die Adresse. Nur das Gerät mit dieser Adresse antwortet.

3 Python Code für I2C

In MicroPython definieren wir den Bus über die Klasse I2C:

from machine import I2C, Pin

# 1. Bus initialisieren (Hardware I2C 0)
i2c = I2C(0, scl=Pin(22), sda=Pin(21), freq=400000)

# 2. Geräte suchen (Scan liefert Adressen in Dezimal)
geraete = i2c.scan()
print("Gefundene Adressen:", [hex(a) for a in geraete])

Man beachte bei der Verwendung von I2C-Sensoren oder -Aktoren wird dann bei der Initialisierung das I2C-Objekt mit übergeben. Hier wird dies am bereits eingeführten OLED-Display gezeigt:

oled = SSD1306_I2C(128, 64, i2c)

Erfahre mehr in der [MicroPython I2C Dokumentation](https://docs.micropython.org).

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

Temperatur und Luffeuchtigkeit über I<sup>2</sup>C-Schnittstelle
Abb. 2 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 ssd1306, dht20, time

i2c = I2C(0, scl=Pin(22), sda=Pin(21))
dht=dht20.DHT20(0x38,i2c)
oled = ssd1306.SSD1306_I2C(128, 64, i2c)

while True:
    temperature = dht.measurements["t"]
    humidity = dht.measurements["rh"]
    
    oled.fill(0) #clear display
    oled.text(f"T: {temperature:.2f} `C", 0, 0)
    oled.text(f"H: {humidity:.2f} %", 0, 10)
    oled.show()
    
    time.sleep(1)

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

Luftdruck- und Temperatursensor BMP180 sowie 3-Achsen-Beschleunigungssensor
Abb. 3 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 ssd1306, bmp280, time

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

while True:
    oled.fill(0) #clear display
    oled.text(f"Temp:  {bmp.temperature:.2f} `C", 0, 0)
    oled.text(f"Druck: {bmp.pressure:.1f} hPa", 0, 10)
    oled.text(f"Hoehe: {bmp.altitude:.1f} m", 0, 20)
    oled.show()
    
    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 ssd1306, lis3dhtr, time

i2c = I2C(0, scl=Pin(22), sda=Pin(21))
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
lis=lis3dhtr.LIS3DHTR(i2c,0x19)


while True:
    x, y, z = lis.read()
    
    oled.fill(0) #clear display
    oled.text(f"x: {x:.2f}", 0, 0)
    oled.text(f"y: {y:.2f}", 0, 10)
    oled.text(f"z: {z:.2f}", 0, 20)
    oled.show()
    
    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