RP2040-GEEK
SD-Karte lesen



Anleitung für die Firmware CircuitPython



Bildbox 1 (klick hier)


Im vorhergehenden Beispiel wurde das Display in Betrieb genommen und die SD-Karte eingebunden. In diesem Beispiel wollen wir das Programm erweitern und den Inhalt der SD-Karte auslesen und auf dem Display anzeigen.

Los gehts

Zunächst öffnen Sie das vorige Programm in der Thonny IDE, markieren den gesamten Inhalt - gehen auf kopieren und fügen ihn in einem neuen Fenster ein. Jetzt speichern Sie unter einem neuen Namen wie z.B. "sd-karte-lesen.py". Im unteren Kasten ist der Programmcode noch einmal zu sehen.

  
  

1  import os
2  import time
3  import board
4  import busio
5  import sdcardio
6  import digitalio
7  import storage
8  from fourwire import FourWire
9  from adafruit_display_text import label
10 import terminalio
11 import displayio
12 from adafruit_st7789 import ST7789
13
14 # Display initialisieren
15 lcd_cs=board.GP9
16 lcd_dc=board.GP8
17 lcd_reset=board.GP12
18 # Release any resources currently in use for the displays
19 displayio.release_displays()
20 spi = busio.SPI(board.GP10, board.GP11)
21 display_bus = FourWire(spi, command=lcd_dc, chip_select=lcd_cs, reset=lcd_reset)
22 display = ST7789(display_bus, rotation=90, width=240, height=135, rowstart=40, colstart=53)
23 # Make the display context
24 splash = displayio.Group()
25 display.root_group = splash
26
27 # Make a background color fill
28 color_bitmap = displayio.Bitmap(display.width, display.height, 3)
29 color_palette = displayio.Palette(3)
30 color_palette[0] = 0x660088
31 color_palette[1] = 0x000000
32 color_palette[2] = 0xffffff
33 bg_sprite = displayio.TileGrid(color_bitmap, pixel_shader=color_palette, x=0, y=0)
34 splash.append(bg_sprite)
35
36 # Draw a label
37 text_area = label.Label(font=terminalio.FONT, text="\n   RP2040 GEEK\n\n    it work's" , color=0xFFFF00, scale=2, line_spacing=1 )
38 text_group = displayio.Group(x=15, y=10)
39 text_group.append(text_area)  # Subgroup for text scaling
40 splash.append(text_group)
41
42 # SD Karte mounten
43 SD_SCK = board.GP18
44 SD_MOSI = board.GP19
45 SD_MISO = board.GP20
46 cs = board.GP23
47
48 try:
49     card = busio.SPI(SD_SCK, SD_MOSI, SD_MISO)
50     sdcard = sdcardio.SDCard(card, cs)
51     vfs = storage.VfsFat(sdcard)
52     storage.mount(vfs, "/sd")
53     text_area.text = "\n    SD-Karte\n   erfolgreich\n    gemountet."
54     start = 1
55 except OSError as exc:
56     error = exc.errno
57     print(error)
58     text_area.text = "\n\n  keine SD-Karte\n\n    vorhanden."
59     start = 0
60
  

Hinzugefügt sind hier bisher nur die Werte für eine Variable 'start' in den neuen Zeilen 54 und 59, die in der nachfolgenden Funktion genutzt werden.


Bildbox 1 (klick hier)

Diese Funktion nenne ich 'print_directory' und füge sie ab Zeile 61 ein. Aufgerufen wird sie dann aus der 'while-Schleife ab Zeile 88.

  
  

61 def print_directory(path, tabs=0):
62     for file in os.listdir(path):
63         stats = os.stat(path + "/" + file)
64         filesize = stats[6]
65         isdir = stats[0] & 0x4000
66         if filesize < 1000:
67             sizestr = str(filesize) + " Byte"
68         elif filesize < 1000000:
69             sizestr = "%0.1f KB" % (filesize / 1000)
70         else:
71             sizestr = "%0.1f MB" % (filesize / 1000000)
72         prettyprintname = ""
73         for _ in range(tabs):
74             prettyprintname += ""
75         #if (file[len(file)-4:len(file)]) == ".txt":
76         print(file)
77         prettyprintname += file
78         if isdir:
79             prettyprintname += "/"
80         text_area.text =  'Inhalt SD-Karte:\n------------------\n{0:<40}\n\nSIZE: {1:>10}'.format(prettyprintname, sizestr)
81         # recursively print directory contents
82         if isdir:
82             print_directory(path + "/" + file, tabs + 1)
84         time.sleep(1)
  
  
  

85
86  time.sleep(2)
87
88  while True:
89      if start == 0:
90          color_bitmap.fill(1)
91          text_area.text = "\nSD-Karte einsetzen\n\n und neu starten."
92          time.sleep(1)
93      if start == 1:
94          text_area.text = ""
95          color_bitmap.fill(1)
96          print_directory("/sd")
97          start = 2
98      else:
99          color_bitmap.fill(0)
100         text_area.text = "\n\n     Fertig"
101         start = 1
102         time.sleep(3)
  

Die Variable 'start' wird benutzt, um eine entsprechende Meldung per Display anzuzeigen, wenn keine SD-Karte vorhanden ist. Bei 'start = 1' wird die Funktion 'print_directory' aufgerufen. Während im Fall 'start = 2' der Vorgang beendet ist und nach einer kuzen Pause (3 s) wiederholt wird. In den Zeilen 90 und 95 können Sie die Zuweisung der verschiedenen Hintergründe, welche weiter oben (28 bis 34) definiert wurden, sehen.
Damit ist dieses Beispiel abgeschlossen.



Viel Spass und Erfolg beim Ausprobieren.