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)