Sorry, Bild fehlt

IT Wissenssplitter

Sherlock und Desiderat

Sorry, Bild fehlt

Projekte mit dem Raspberry Pi Pico

Der Mikrocontroller RP2040 wurde von der Raspberry Pi Foundation entwickelt und wird unter anderem auf dem Raspberry Pi Pico eingesetzt. Auf diesem Teil unserer Webseite möchte ich ein paar Anregungen zum Arbeiten mit dem Raspberry Pi Pico geben.


Raspberry Pi Pico Schnelleinsteig - von Thomas Brühlmann
2. Auflage 2023
MITP Verlags GmbH
ISBN 9783747506400


In Thonny konnte unter Linux der Dialog zum lokalen Speichern und Öffnen von Dateien nicht geöffnet werden.

Unter https://github.com/thonny/thonny/issues/3173/ wird ein Lösungsansatz zur Behebung dieses Problems beschrieben.

Hier der Lösungsansatz:

In der Datei ui_utils.py musste die Zeile 2100 auskommentiert und darunter die Zeile

args = ["zenity"] + args

eingefügt werden.

Hinweis: Die Datei ui_utils.py ist unter

/usr/lib/python3/dist-packages/thonny

zu finden und muss mit root-Rechten bearbeitet werden.

Also:

        # args = ["zenity", "--name=Thonny", "--class=Thonny"] + args
        args = ["zenity"] + args



Micropython bringt bereits einige Module mit. Führt man den nachfolgenden Befehl in der Kommadozeile der Entwicklungsumgebung aus, wenn der Raspberry Pi Pico am Rechner / Laptop angeschlossen ist, dann werden die vorhandenen Module angezeigt.

help('modules')


Mit dem Raspberry Pi Pico, dem Sensor DHT22 und dem OLED-Display SSD1306 lässt sich einfach ein Messgerät für die Messung der Temperatur und der Luftfeuchte aufbauen.

In den neueren Versionen der MicroPython-Firmware für den Raspberry Pi Pico ist das Modul für die Ansteuerung der Sensoren der Reihe DHT schon vorhanden, jedoch müssen wir uns noch um die Bereitstellung des Modules für das OLED-Display vom Typ SSD1306 selber kümmern. Unter https://github.com/PerfecXX/MicroPython-SSD1306 habe ich dazu den Quellcode der Datei ssd1306.py kopiert und diesen in ein leeres Blatt der Entwicklungsumgebung Thonny eingefügt. Diesen Quellcode habe ich dann unter dem Namen ssd1306.py auf dem Raspberry Pi Pico abgespeichert. Der Raspberry Pi Pico muss dazu natürlich mit dem PC / Laptop verbunden sein. Damit steht dann das Modul für die Ansetuerung des OLED-Display vom Typ SSD1306 zur Verfügung und wir können es für unser Projekt verwenden.

Die notwendige Beschaltung für unser Messgerät sieht dann so aus:

Bild kann nicht geladen werden.

Hinweis:
Als Fritzing-Bauteil Raspberry Pi Pico wurde das unter https://www.raspberrypi.com/documentation/microcontrollers/pico-series.html#layout_wireless (https://pip.raspberrypi.com/documents/RP-008316-DS) zu findende verwendet.
Als Fritzing-Bauteil OLED SSD1306 wurde das unter https://forum.fritzing.org/t/oled-128x64-i2c-monochrome-display-ssd1306-created/1202/9 zu findende verwendet.

Der nachfolgende Programmcode sorgt dafür, dass die notwendigen Module eingebunden werden. Danach werden der Sensor DHT22 und das OLED-Display SSD1306 initialisert. In einer Dauerschleife wird jeweils eine Messung ausgelöst. Die ermittelten Messwerte werden gerundet ausgegeben, zudem wird die Anzahl der Messungen angezeigt. Die Rundung wurde eingebaut, da sich bei den Tests zeigte, dass ansonsten teilweise mehrstellige Messergebnisse angezeigt wurden.

# Verwendete Quellen im Internet
#
# https://www.elektronik-kompendium.de/sites/raspberry-pi/2703031.htm
#
# Treiber für das OLED vom Typ SSD1306:
# https://github.com/PerfecXX/MicroPython-SSD1306


# Module einbinden
from machine import Pin
from dht import DHT22
from ssd1306 import SSD1306_I2C
from time import sleep


# Noch etwas warten, damit der Sensor DHT22 auch bereit ist.
sleep(2)


# Initialisierung des DHT22:
# In diesem Fall wurde der Daten-Pin des Sensors an Pin 15 des 
# Raspberry Pi Pico angeschlossen.
dht22_sensor = DHT22(Pin(15, Pin.IN))


# Initialisierung des OLED SSD1306
#
# Anschlussbelegung: sda des OLED an Pin 8 und scl an Pin 9
sda = machine.Pin(8)
scl = machine.Pin(9)

i2c = machine.I2C(0, scl=scl, sda=sda, freq=1000000)

oled = SSD1306_I2C(128, 32, i2c)


# Variable für den Schleifenzähler
n = 0

# Wiederholung (Endlos-Schleife)
while True:
    try:
        # Schleifenzähler um 1 erhöhen
        n = n + 1
        # Zahl in einen String wandeln
        nString = str(n)
        
        # Die Messung durchführen
        dht22_sensor.measure()
        
        # Die Temperatur auslesen
        temp = dht22_sensor.temperature()
        # Den Messwert runden
        tempGerundet = round(temp,1)
        # Den gerundeten Messwert in einen String wandeln
        tempString = str(tempGerundet)
        
        # Die Luftfeuchte auslesen
        luftfeuchte = dht22_sensor.humidity()
        luftfeuchteGerundet = round(luftfeuchte,1)
        luftfeuchteString = str(luftfeuchteGerundet)
        
        # Nun Ausgabe auf dem OLED-Display
        # Zuerst Display löschen
        oled.fill(0)
        oled.show()
        
        # Nun die Werte auf dem Display ausgeben
        oled.text(tempString,0,0)
        oled.text(luftfeuchteString, 0, 12)
        oled.text(nString, 0, 24)
        oled.show()
        
        # Warten
        sleep(3)
        
    except OSError:
        print('Fehler: Kein Datenempfang vom Sensor!')



Als ersten Schritt wollen wir die ID des Chips auslesen. Folgende Schritte sind dazu notwendig:

  1. Den I2C-Buss initialisieren
  2. Das entsprechende Register auslesen
  3. Den Inhalt des Registers ausgeben

# Manuelles Auslesen des Sensors BMP280
# Auslesen der DCHIP-ID

# Programmiert von Sherlock19@posteo.de
# Dez. 2025 / Jan. 2026

# Verwendete Quellen im Internet
# https://forum-raspberrypi.de/forum/thread/51200-bme280-und-bmp280-mit-python3-auslesen/
# https://docs.micropython.org/en/latest/library/machine.I2C.html

# Verwendete Literatur:
# Raspberry Pi Pico Schnelleinstieg

# Die notwendige Bibliothek importieren
from machine import I2C

# Den I2C-Bus initialisieren

# Dazu anlegen eines PIN-Objektes, welcher physikalisch den PIN 8 anspricht.
# Dieses Objekt wird dann über die Variable sdaPinObj angesprochen.
sdaPinObj = machine.Pin(8)

# Zudem anlegen eines PIN-Objektes, welcher physikalisch den PIN 9 anspricht.
# Dieses Objekt wird dann über die Variable sclPinObj angesprochen.
sclPinObj = machine.Pin(9)

# Nun anlegen des I2C-Objektes über welches die Steuerung des
# I2C-Busses durchgefuehrt wird
i2cObj = machine.I2C(0, scl=sclPinObj, sda=sdaPinObj, freq=100000)


# Geraeteadresse des BMP280
deviceID = 0x77


# Auslesen der CHIP-ID
#
datenbyte = i2cObj.readfrom_mem(deviceID, 0xD0,1)

print(datenbyte)

Wenn kein Fehler aufgetreten ist, dann wird folgendes im Kommandozeilenbereich von Thonny angezeigt:

b'X'

Wenn der Sensor nicht gefunden oder er nicht angesprochen werden kann, dann kann es hingegen zur nachfolgenden Fehlermeldung kommen.

Traceback (most recent call last):
  File "", line 38, in 
OSError: [Errno 5] EIO

Solche möglichen Fehler müssen abgefangen werden! Dazu gibt es den Befehl try. Im nachfolgenden Programmbeispiel habe ich diesen verwendet um einen Fehler abzufangen.

# Manuelles Auslesen des Sensors BMP280
# Auslesen der CHIP-ID

# Programmiert von Sherlock19@posteo.de
# 13. Januar 2026 mit Abfangen eines Kommunikationsfehlers

# Verwendete Quellen im Internet
# https://forum-raspberrypi.de/forum/thread/51200-bme280-und-bmp280-mit-python3-auslesen/
# https://docs.micropython.org/en/latest/library/machine.I2C.html
# https://www.elektronik-kompendium.de/sites/raspberry-pi/2803101.htm

# Verwendete Literatur:
# Raspberry Pi Pico Schnelleinstieg

# Die notwendige Bibliothek importieren
from machine import I2C

# Den I2C-Bus initialisieren

# Dazu anlegen eines PIN-Objektes, welcher physikalisch den PIN 8 anspricht.
# Dieses Objekt wird dann über die Variable sdaPinObj angesprochen.
sdaPinObj = machine.Pin(8)

# Zudem anlegen eines PIN-Objektes, welcher physikalisch den PIN 9 anspricht.
# Dieses Objekt wird dann über die Variable sclPinObj angesprochen.
sclPinObj = machine.Pin(9)

# Nun anlegen des I2C-Objektes über welches die Steuerung des
# I2C-Busses durchgefuehrt wird.
i2cObj = machine.I2C(0, scl=sclPinObj, sda=sdaPinObj, freq=100000)

# Geraeteadresse des BMP280
deviceID = 0x77

# Auslesen der CHIP-ID

allesInOrdnung = 1
try:
    # Auslesen der CHIP-ID
    #
    datenbyte = i2cObj.readfrom_mem(deviceID, 0xD0,1)
except (OSError):
    print("FEHLER: Das Auslesen des Sensors ist gescheitert.")
    allesInOrdnung = 0

if allesInOrdnung == 1:
    print(datenbyte)

Wird fortgesetzt...



Wir hoffen, dass diese Seite gefallen hat und hilfreich war.

Achtung: Es handelt sich lediglich um Bastelvorschläge! Es wird keinerlei Haftung für den Einsatz der Schaltungen übernommen. Diese Seite ist zudem nicht kommerziell.

Trotz großer Sorgfallt können sich Fehler eingeschlichen haben. Wir bitten dann um Nachsicht und freuen uns auf einen entsprechenden Hinweis. Es wird keine Gewähr für die Vollständigkeit übernommen. Für Schäden, die durch die Anwendung z.B. einer Installationsanleitung entstehen, übernehmen wir keinerlei Haftung.
Die verwendeten externen Links auf dieser Seite werden immer wieder geprüft. Wir übernehmen jedoch keinerlei Haftung für die Verwendung der Links. Für den Inhalt der verlinkten Seiten sind die Betreiber dieser Seiten verantwortlich. Rechtsverstöße auf den verlinkten Seiten waren bei der aktuellen Überpüfung nicht erkennbar. Es gelten auf den verlinkten Seiten die Datenschutzbestimmungen des jeweiligen Betreibers.
Bevor Sie der Speicherung von Cookies zustimmen, empfehlen wir generell zuvor die Einstellungen so weit wir möglich zu beschränken und dann diese individuellen Einstellungen zu speichern. Leider werden diese Einstellungen meist versteckt und auch der richtige Button zum Bestätigen ist meist kleiner und versteckt.

Bei der Erstellung des Grundgerüstes dieser Internetseite wurde auf W3Schools.com zugegriffen W3Schools.com. Zudem waren viele Quellen im Internet bei Details hilfreich.

Grafiken

HTML, JavaScript, ...

  • https://www.mediaevent.de/css/css-einbinden.html
  • https://www.mediaevent.de/css/css-listen.html
  • https://www.w3schools.com/howto/howto_js_accordion.asp
  • https://wiki.selfhtml.org/wiki/Referenz:HTML/Attribute/target
  • http://www.ohne-css.gehts-gar.net/0004.php
  • https://developer.mozilla.org/de/docs/Web/CSS/margin
  • http://www.ich-lerne-css.de/Style/Examples/007/center.html
  • http://www.office-loesung.de/ftopic77170_0_0_asc.php
  • https://www.mediaevent.de/css/img.html
  • ...

Details



Letzte Überarbeitung am 02.04.2026