Schaltung
Für die Schaltung aus Abbildung 3 kommt das Programm aus Listing 5 zum Einsatz. Die Zeilen 14 bis 20 erstellen die Objekte für den Sensor (BME280 für Luftdruck, Temperatur und Feuchtigkeit) und das OLED-Display. Dank des Export-Befehls aus Listing 4 weiß Blinka, um was für ein Board es sich handelt, und Zeile 15 liefert das passende I2C-Objekt zurück. Auf einem RasPi ohne Export-Befehl verweist board auf den RasPi selbst, und das I2C-Objekt bezieht sich auf die normale I2C-Schnittstelle (physische Pins 3 und 5).
Listing 5
#!/usr/bin/python3
import time
import locale
from PIL import Image, ImageDraw, ImageFont
import board
import adafruit_ssd1306
import busio
import adafruit_bme280
locale.setlocale(locale.LC_ALL, 'de_DE')
# Objekte erstellen
i2c = board.I2C()
oled = adafruit_ssd1306.SSD1306_I2C(128,64,i2c,addr=0x3C,reset=None)
# BME280-Sensor erstellen und konfigurieren
bme280 = adafruit_bme280.Adafruit_BME280_I2C(i2c,address=0x76)
bme280.sea_level_pressure = 996.1
altitude_at_location = 520
alt_fac = pow(1.0-altitude_at_location/44330.0, 5.255)
# Zwei Fonts
font_k = ImageFont.truetype("/usr/share/fonts/truetype/DejaVuSans.ttf", 15)
font_g = ImageFont.truetype("/usr/share/fonts/truetype/DejaVuSans.ttf", 22)
delta_k = 14
delta_g = 22
# Bildschirm löschen
oled.fill(0)
oled.show()
# Bildschirmoberfläche erzeugen
image = Image.new("1", (oled.width, oled.height))
draw = ImageDraw.Draw(image)
# Endlosschleife
while True:
draw.rectangle((0,0,oled.width,oled.height),outline=0,fill=0)
datum = time.strftime(" %a, %x")
zeit = time.strftime(" %X")
werte = "%0.1fGradC %0.1f%%" % (bme280.temperature,bme280.humidity)
druck = " %1.0fhPa" % (bme280.pressure/alt_fac)
y = 0
draw.text((0,y),datum,font=font_k,fill=255)
y += delta_k
draw.text((0,y), zeit,font=font_g,fill=255)
y += delta_g
draw.text((0,y),werte,font=font_k,fill=255)
y += delta_k
draw.text((0,y),druck,font=font_k,fill=255)
oled.image(image)
oled.show()
time.sleep(1)
Der weitere Code ist nicht schwer zu verstehen: In einer Endlosschleife aktualisiert die Software das Display, indem es ein Bild lädt und anzeigt. Das Bild erzeugt es einmalig vor der Schleife in Zeile 35, die nächste Zeile stellt die Fläche als ImageDraw-Objekt bereit.
Innerhalb der Schleife füllt die Methode rectangle() die Fläche mit der Hintergrundfarbe (Zeile 40). Anschließend schreibt das Skript über die Methode text() Datum, Uhrzeit und die Messwerte ins Bild. Die Grafik dient quasi als Puffer, sodass das Aktualisieren auf einen Schlag erfolgt. Auf diese Weise flackert das Display nicht.
Da das Programm nur die I2C-Pins nutzt, ist es beinahe unabhängig von der Plattform. Dank CircuitPython läuft es auf Mini-PCs wie dem RasPi oder auf Mikrocontrollern mit ausreichend Speicher für die Font-Dateien. Einzig den Pfad zu den Fonts müssen Sie jeweils anpassen.
Weitere Funktionen
Der MCP2221 kann aber nicht nur via I2C kommunizieren. Daneben stehen vier GPIOs bereit, die nicht nur als In- oder Output-Pins fungieren, sondern darüber hinaus weitere Funktionen haben. Besonders interessant sind drei Analog-Digital-Konverter mit 10 Bit sowie ein DAC. Letzterer steht bei Bedarf an den Pins GP2 oder GP3 bereit. Er hat nur eine Auflösung von 5 Bit, was für einfache Sounds aber völlig ausreicht.
Die Referenzspannung der ADCs beträgt je nach Stromversorgung 3,3 oder 5 Volt. Bei Bedarf konfigurieren Sie sie aber auch explizit auf 1,024 Volt, 2,048 Volt oder 4,096 Volt (Letzteres aber nur mit 5 Volt Versorgungsspannung).
Fazit
Mit dem MCP2221 erweitern Sie kostengünstig Rechner ohne Pin-Leiste um grundlegende I/O- und Bus-Funktionen. Dank des Supports von Adafruit in Form der passenden CircuitPython-Version ist der Aufwand für die Programmierung minimal.
Zum MCP2221 gibt es diverse Alternativen. So bietet Hardkernel [5] ein USB-I/O-Modul an, das theoretisch in Bezug auf die Möglichkeiten viel mehr bietet, aber dafür teurer ist. Letzteres wäre zu verkraften, würde nicht die Software abschrecken: Sie ist zwar quelloffen, erfordert aber viel Aufwand beim Einarbeiten, schon allein wegen einer fehlenden einfachen Anleitung für die Installation.
Bei einer weiteren Alternative [6] sitzt wie bei der Variante von Hardkernel ein PIC-Mikrocontroller auf der Platine, passende Software gibt es auf Github [7]. Das entsprechende Board gab es früher auf Tindie [8], aber der Maker hat den Vertrieb anscheinend eingestellt. Für Bastler, die einen eigenen Weg gehen wollen, ist das aber ein lohnenswerter Ausgangspunkt. (agr)
Der Autor
Bernhard Bablok arbeitet bei der Allianz Technology SE als SAP-HR-Entwickler. Wenn er nicht Musik hört oder mit dem Rad respektive zu Fuß unterwegs ist, beschäftigt er sich mit Themen rund um Linux, Programmierung und SBCs. Sie erreichen ihn unter mailto:[email protected].
Infos
- RasPi2Go: Bernhard Bablok, “Multitool”, RPG 04/2020, S. 52, https://www.raspi-geek.de/43805
- MCP2221-Breakout: https://www.microchip.com/DevelopmentTools/ProductDetails/adm00559
- MCP2221-Tutorial: https://learn.adafruit.com/circuitpython-libraries-on-any-computer-with-mcp2221
- CircuitPython: Bernhard Bablok, “Einer für alle(s)”, RPG 04/2020, S. 80, https://www.raspi-geek.de/43118
- USB-I/O-Modul: https://www.hardkernel.com/shop/usb-io-board/
- Usbio-Homepage: http://jap.hu/electronic/usbio.html
- Usbio-Repository: https://github.com/PeterJakab/usbio
- USB-GPIO-Modul auf Tindie: https://www.tindie.com/products/jap/usb-gpio-interface-for-raspberry-piopenwrtpc/





