Hardware
- PicoBoy
- USB-A zu USB-C Kabel
Im ersten Teil haben wir eine einfache Uhrfunktion unter CircuitPython auf dem Pico-Boy programmiert. Diese soll jetzt, wie angekündigt,
erweitert werden.
Los gehts
Um Eingaben vorzunehmen, soll der 5-Wege Joystick benutzt werden. Er belegt beim PicoBoy folgende GPIO's:
* nach oben - GPIO 1
* nach unten - GPIO 3
* nach links - GPIO 4
* nach rechts - GPIO 2
* Mitte pressed - GPIO 0
Die Syntax lautet dann so:
up = digitalio.DigitalInOut(board.GP1)
up.direction = digitalio.Direction.INPUT
up.pull = digitalio.Pull.UP
Ob der Joystick betätigt wurde, kann dann z.B. so abgefragt werden:
if up.value == False:
print("Stick nach oben")
Wir fügen in das Programm aus dem Teil 1 jetzt die Zeilen 60 bis 80 ein und in der while-Schleife die Zeilen 108 bis 119. Dazwischen
verschieben sich die Zeilennummern entsprechend. Der komplette Code ist im unteren Kasten abgebildet und kann in die Thonny-IDE kopiert
werden.
1 import time
2 import board
3 import busio
4 import rtc
5 import displayio
6 import fourwire
7 import digitalio
8 import terminalio
9 from adafruit_display_text import label
10 from adafruit_display_shapes.rect import Rect
11 from adafruit_display_shapes.circle import Circle
12 import adafruit_displayio_sh1106
13 import pwmio
14
15 # Compatibility with both CircuitPython 8.x.x and 9.x.x.
16 # Remove after 8.x.x is no longer a supported release.
17 try:
18 from fourwire import FourWire
19 except ImportError:
20 from displayio import FourWire
21
22 #DC = board.GP8
23 #Reset = board.GP9
24 #CS = board.GP10
25 #SCK = board.GP18
26 #MOSI = board.GP19
27
28 # built-in a display
29 displayio.release_displays()
30 # Make the displayio SPI bus and the sh1106 display
31 spi = busio.SPI(board.GP18, board.GP19)
32#
33 # Circuit 8.x.x
34 #display_bus = displayio.FourWire(spi, command=board.GP8, chip_select=board.GP10, reset=board.GP9, baudrate=1000000)
35 #display =adafruit_displayio_sh1106.SH1106(display_bus, width=132, height=64, rotation=0, brightness = 1)
36 #
37 # Circuit 9.x.x
38 display_bus = FourWire(spi, command=board.GP8, chip_select=board.GP10, reset=board.GP9, baudrate=1000000)
39 display =adafruit_displayio_sh1106.SH1106(display_bus, width=132, height=64, rotation=0, brightness = 1)
40
41 # Make the display contexts
42 splash = displayio.Group()
43 display.root_group = splash
44
45 # create the label
46 updating_text = label.Label(font=terminalio.FONT, text="it works", scale=2, color=0xffffff, line_spacing=1)
47 # set label position on the display
48 updating_text.anchor_point = (0, 0)
49 updating_text.anchored_position = (15, 20)
50 # add label to group that is showing on display
51 splash.append(updating_text)
52
53 updating_datum = label.Label(font=terminalio.FONT, text="", scale=1, color=0xffffff, line_spacing=1)
54 updating_datum.anchor_point = (0, 0)
55 updating_datum.anchored_position = (45, 3)
56 splash.append(updating_datum)
57
58 wotage = ["Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag"]
59
60 ## Joystick
61 #JOY_UP = GP1
62 up = digitalio.DigitalInOut(board.GP1)
63 up.direction = digitalio.Direction.INPUT
64 up.pull = digitalio.Pull.UP
65 #JOY_DOWN = GP3
66 down = digitalio.DigitalInOut(board.GP3)
67 down.direction = digitalio.Direction.INPUT
68 down.pull = digitalio.Pull.UP
69 #JOY_LEFT = GP4
70 left = digitalio.DigitalInOut(board.GP4)
71 left.direction = digitalio.Direction.INPUT
72 left.pull = digitalio.Pull.UP
73 #JOY_RIGHT = GP2
74 right = digitalio.DigitalInOut(board.GP2)
75 right.direction = digitalio.Direction.INPUT
76 right.pull = digitalio.Pull.UP
77 #JOY_CENTER = GP0
78 center = digitalio.DigitalInOut(board.GP0)
79 center.direction = digitalio.Direction.INPUT
80 center.pull = digitalio.Pull.UP
81
82 while True:
83 current_time = time.localtime()
84 hour = current_time.tm_hour
85 minute = current_time.tm_min
86 second = current_time.tm_sec
87 year = current_time.tm_year
88 month = current_time.tm_mon
89 day = current_time.tm_mday
90 tag = current_time.tm_wday
91 datum = str(day) + "." + str(month) + "." + str(year)
92 if hour < 10:
93 zeit = "0" + str(hour)
94 else:
95 zeit = str(hour)
96 if minute < 10:
97 zeit = zeit + ":0" + str(minute)
98 else:
99 zeit = zeit + ":" + str(minute)
100 if second < 10:
101 zeit = zeit + ":0" + str(second)
102 else:
103 zeit = zeit + ":" + str(second)
104 ## Datum und Zeit anzeigen
105 updating_text.text = zeit
106 updating_datum.text = wotage[tag] + "\n\n\n\n" + datum
107
108 ## Joystick abfragen
109 if up.value == False:
110 print("nach oben gedrückt")
111 if down.value == False:
112 print("nach unten gedrückt")
113 if right.value == False:
114 print("nach rechts gedrückt")
115 if left.value == False:
116 print("nach links gedrückt")
117 if center.value == False:
118 print("Center gepresst z.B. o.k.")
119 time.sleep(0.3)
Die Erläuterungen:
Die Zeilen 1 bis 59 bleiben unverändert. Neu sind jetzt die Zeilen 60 bis 80 mit den Definitionen der GPIO's für den Joystick.
Der Anfang der while-Schleife verschiebt sich dadurch auf Zeile 82. Die Zeilen 82 bis 106 stimmen mit dem ehemaligen Quellcode überein.
In den Zeilen 108 bis 119 wird bei jedem Schleifendurchlauf, wie oben erklärt, der Joystick abgefragt und wenn zutreffend in der Thonny-IDE
gedruckt. Vielleicht wundern Sie sich über die 'Pause' von 0.3 s in der Zeile 119. Die ist notwendig, um den Joystick zu entprellen. Bei einer
Betätigung würde er nämlich sonst mehrfach ansprechen, denn der Prozessor 'rast' ja doch schneller durch die Schleife, als wir
mit dem Finger sind. Wegen der Uhrzeit brauchen Sie sich dabei keine Sorgen machen, denn der 'Timer' läuft ja in der Pause weiter
und wird beim nächsten Schleifendurchlauf aktuell abgerufen. Auch bei einer längeren Pause würde unsere Uhr nicht nachgehen.
In dieser Zeit wäre nur keine Joystickaktion möglich.
Ich habe mich entschlossen hier auch gleich noch die Funktionsweise der drei SMD-LED's zu erklären. Sie belegen beim PicoBoy folgende
GPIO's:
* rot - GPIO 5
* gelb - GPIO 6
* grün - GPIO 7
Die Syntax für die Definition geht z.B. so:
led_yellow = digitalio.DigitalInOut(board.GP6)
led_yellow.direction = digitalio.Direction.OUTPUT
Ein- bzw. ausgeschaltet wird mit:
led_yellow.value = True bzw. led_yellow.value = False
Um sich das anzusehen, löschen Sie im bisherigen Programm die Zeilen 60 bis 80 und ersetzen sie durch die Zeilen 60 bis 70 aus dem
unteren Kasten.
60 #rote LED 61 led_red = digitalio.DigitalInOut(board.GP5) 62 led_red.direction = digitalio.Direction.OUTPUT 63 #gelbe LED 64 led_yellow = digitalio.DigitalInOut(board.GP6) 65 led_yellow.direction = digitalio.Direction.OUTPUT 66 #grüne LED 67 led_green = digitalio.DigitalInOut(board.GP7) 68 led_green.direction = digitalio.Direction.OUTPUT 69 70 zahl= 0
Sowie in der while-Schleife die Zeilen ab der Joystickabfrage in Zeile 108 durch die Zeilen 97 bis 109. Wenn das Programm jetzt gestartet wird, leuchten die LED's der Reihe nach für eine knappe Sekunde und die Uhr zählt die Zeit weiter.
97 zahl += 1 98 if zahl == 1: 99 led_red.value = True 100 if zahl == 2: 101 led_yellow.value = True 102 if zahl == 3: 103 led_green.value = True 104 time.sleep(0.9) 105 led_red.value = False 106 led_yellow.value = False 107 led_green.value = False 108 if zahl == 3: 109 zahl = 0
Viel Spass und Erfolg beim Ausprobieren.
Viel Spass und Erfolg beim Ausprobieren.
