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.