Sensor anschliessen - PicoBoy Color
technische Daten wie beim RPi Pico
MC RP2040 - 1,69 Zoll Farbdisplay mit 240 x 280 Pixeln
Projekte und Anleitung in CircuitPython 9.x.x
Bildbox 1 (klick hier)
Sensor anschliessen - PicoBoy Color
technische Daten wie beim RPi Pico
MC RP2040 - 1,69 Zoll Farbdisplay mit 240 x 280 Pixeln
Projekte und Anleitung in CircuitPython 9.x.x




Bildbox 1 (klick hier)
Beim PicoBoy - Color sind zwei GPIO's nach außen gelegt worden. Außerdem 3.3 Volt und Masse. Die Lötpads
sieht man auf dem oberen Foto.
Hardware
- PicoBoy-Color
- BME280 Sensor
(z.B. hier)
Los gehts
GPIO's:
SDA - GPIO 20
SCL - GPIO 21
Die Entscheidung zu den verfügbaren Pins, hätte auch für GPIO 16 und GPIO 17 fallen können. Dann wären neben
I2C-Sensoren auch UART-Sensoren möglich.
Ich verwende als erstes einen Temperatur-Luftdruck-Sensor (BME280) um die Temperatur zu bestimmen und am Display anzuzeigen. Dazu habe ich
vier kurze Kabel von den Lötpads auf dem PicoBoy-Color mit den beschrifteten Anschlüssen am Sensor verbunden (vergl. Bild 1 Bildbox 1).
Schnell war klar, dass diese Lösung nicht von langer Dauer sein kann. Bei Versuchen mit anderen Sensoren müsste man jedes Mal direkt
neben dem Display löten. Also habe ich eine 4-polige Kupplung mit Stecker genommen, die Kupplung am PicoBoy-Color angelötet und den Stecker
am Sensor. So bekommt jeder Sensor seinen eigenen Stecker und kann einfach angesteckt werden. Vielleicht bringt das den Hersteller bei einem
Nachfolgemodell auf die Idee, am Board gleich eine solche Kupplung vorzusehen. Das wäre auch ein Argument für die Arbeit von Schülern
mit dem PicoBoy-Color.

So jetzt wird der I2C-Bus gescannt, um festzustellen, ob der PicoBoy den Sensor erkennt. Wenn Sie den Quellcode aus dem unteren Kasten nach Thonny kopieren und testen, dann sollte der BME280-Sensor auf Adresse 0x77 erkannt werden. Manche Anbieter geben als Adresse auch 0x76 an. Bei mir lief er bisher immer auf ADDR 0x77.
1 import board 2 import busio 3 4 i2c = busio.I2C(board.GP21, board.GP20) 5 count = 0 6 7 # Wait for I2C lock 8 while not i2c.try_lock(): 9 pass 10 11 # Scan for devices on the I2C bus 12 print("Scanning I2C bus") 13 for x in i2c.scan(): 14 print(hex(x)) 15 count += 1 16 17 print("%d device(s) found on I2C bus" % count) 18 19 # Release the I2C bus 20 i2c.unlock()
Um die Temperatur und den Luftdruck zu lesen, braucht es jetzt noch eine Bibliothek. Die holen Sie sich aus dem Adafruit-Bundle. Der Name des Ordners ist 'adafruit_bme280'. Den kopieren Sie in den lib-Ordner auf dem PicoBoy-Color. Danach übernehmen Sie den Quellcode aus dem unteren Kasten und starten ihn. Falls Sie beim Start die Fehlermeldung: Failed to find BME280! Chip ID 0x58 bekommen, dann liegt das an einer falsch eingetragenen Chip-ID in der Datei "/lib/adafruit_bme280/basic.mpy" in Zeile 54. Ändern Sie die Zeile 54 von '_BME280_CHIPID = const(0x60)' in '_BME280_CHIPID = const(0x58)'. Wenn Sie nur die vorkompilierte mpy-Datei haben, dann können Sie sich die unkompilierte Datei 'basic.py' bei mir von hier downloaden und anstelle von 'basic.mpy' in den lib-Ordner kopieren. Damit sollte das Programm laufen.
1 import time 2 import board 3 import busio 4 from adafruit_display_text import label 5 import terminalio 6 import displayio 7 from adafruit_st7789 import ST7789 8 from adafruit_bme280 import basic as adafruit_bme280 9 10 #I2C Pin of the PicoBoy - Color 11 SDA = board.GP20 12 SCL = board.GP21 13 # Create sensor object, using the board's default I2C bus. 14 i2c = busio.I2C(SCL, SDA) 15 bme280 = adafruit_bme280.Adafruit_BME280_I2C(i2c, address=0x77) 16 17 # change this to match the location's pressure (hPa) at sea level 18 bme280.sea_level_pressure = 1030 19 20 # 1,69 Zoll 240x280 Pixel ST7789 Display 21 # SPI-Bus, in Landscape format 22 dc=board.GP8 23 reset=board.GP9 24 cs=board.GP10 25 sck=board.GP18 26 mosi=board.GP19 27 bl=board.GP26 28 # Release any resources currently in use for the displays 29 displayio.release_displays() 30 spi = busio.SPI(sck, mosi) 31 display_bus = displayio.FourWire(spi, command=dc, chip_select=cs, reset=reset) 32 display = ST7789(display_bus, rotation=90, width=280, height=240, backlight_pin=bl, rowstart=20, colstart=0) 33 display.brightness = 1 34 # Make the display context 35 splash = displayio.Group() 36 display.root_group = splash 37 38 # Make a background color fill 39 color_bitmap = displayio.Bitmap(display.width, display.height, 3) 40 color_palette = displayio.Palette(3) 41 color_palette[0] = 0x660088 42 color_palette[1] = 0x000000 43 color_palette[2] = 0xffffff 44 bg_sprite = displayio.TileGrid(color_bitmap, pixel_shader=color_palette, x=0, y=0) 45 splash.append(bg_sprite) 46 47 # Draw a label 48 text_area = label.Label(font=terminalio.FONT, text="\n PicoBoy - Color\n\n", color=0xFFFF00, scale=2, line_spacing=1 ) 49 text_group = displayio.Group(x=25, y=40) 50 text_group.append(text_area) 51 splash.append(text_group) 52 53 while True: 54 current_time = time.localtime() 55 second = current_time.tm_sec 56 if second % 5: 57 text_area.text = ("logtime: {:02}:{:02} Uhr".format(current_time.tm_hour,current_time.tm_min) 58 + "\n\nTemper.: %0.1f C" % bme280.temperature 59 + "\n\nLuftdr.: %0.1f hPa" % bme280.pressure 60 + "\nHoehe : %0.2f m" % bme280.altitude)
Sie sehen, dass in den Zeilen 1 bis 51 die Bibliotheken importiert, der i2c-Bus definiert, das Display initialisiert wird und einige
grafische Elemente zum Verschönern der Anzeige festgelegt werden.
Interessant ist die Zeile 18. Dort kann der tagesaktuelle Luftdruck auf Meeresspiegelniveau eingegeben werden, da der Sensor auf dieses
s.g. 'sea_level_pressure' geeicht ist. Dadurch stimmt auch die Anzeige der geogr. Höhe annähernd.
Mit 'bme280.temperature', 'bme280.pressure' und 'bme280.altitude'
werden Temperatur, Druck und Höhe vom Sensor erfasst. Durch die Zeilen 57 bis 60 werden diese Werte in formatierter Form auf dem
Display angezeigt.

Hier noch eine kleine Zugabe! Wenn Sie die Anleitung bis hierher erfolgreich durchgearbeitet haben, können Sie die Datei
'temp_uhr.py' mit Temperatur- und Uhrfunktion
hier herunterladen,
entpacken und auf dem PicoBoy-Color als
'code.py' speichern. Die zip-Datei enthält noch zwei weitere Hilfsdateien 'boot.py'
und 'last_time.txt', die Sie ebenfalls auf den PicoBoy-Color kopieren. Vor dem ersten Test muss der PicoBoy-Color
einmal vom USB-Anschluss getrennt werden, damit die 'boot.py' das Dateisystem für die Speicherung 'aktiviert'. Das Programm ist
für die Benutzung ohne Rechner gedacht. Dabei wird mit der letzten gespeicherten Uhrzeit gestartet. Sie können jetzt aber unter
Benutzung der Tasten A oder B in einen 'Timeset-Mode' wechseln. Dort stellen Sie die gewünschte Uhrzeit
mit dem Joystick ein und schließen mit 'ok' ab. Wenn Sie die Zugabe nicht mehr nutzen wollen, sollten Sie die 'boot.py' vom Thonny
aus löschen, damit das Dateisystem wieder vom Dateiexplorer aus erreicht wird.
Viel Spass und Erfolg beim Ausprobieren.
