Bildbox 1 (klick hier)
Anzeigetafel auf dem
Raspberry Pi Pico mit Pimoroni-Display.
(Mit eigenem Zeichensatz)
Bildbox 1 (klick hier)
Anzeigetafel auf dem
Raspberry Pi Pico mit Pimoroni-Display.
(Mit eigenem Zeichensatz)
Hardware
- Raspberry Pi Pico
- Pico Display
- Micro USB Kabel
Wenn Ihnen bei dem vorigen Projekt zur Anzeige von PNG Bildern das Konvertieren und Speichern der Bilddateien nicht zugesagt hat, folgt jetzt ein
Projekt, dass Ihnen bestimmt gefallen wird.
1. Wird alles, was auf dem Display dargestellt werden soll, von Ihnen selbst eingegeben (und nach Ihren Wünschen angepasst) und
2. Ist der geänderte Zeichensatz für das Pimoroni Display eine Besonderheit.
Ziel ist in diesem Fall eine kleine Anzeigetafel für Abfahrts- und Ankunftzeiten z.B. auf der Modelleisenbahn. Doch zu Beginn wieder ein paar
grundlegende Bemerkungen.
Grundlagen
Wer schon mit dem Pimoroni Display gearbeitet hat, wird sicherlich auch festgestellt haben ,dass bei der Wiedergabe von Text nur
Großbuchstaben zur Verfügung stehen. Grund ist die Verwendung des "Amerikanischen Standard-Code für den
Informationsaustausch", einer 7-Bit-Zeichenkodierung. Sie entspricht der US-Variante von ISO 646 und dient als Grundlage
für spätere, auf mehr Bits basierenden Kodierungen für Zeichensätze. Diese Zeichenkodierung definiert 128 Zeichen,
bestehend aus 33 nicht druckbaren sowie den folgenden 95 druckbaren Zeichen. Und da hat Pimoroni bei der Darstellbarkeit auf
dem Pico Display auch noch die Zeichen 97 bis 122 ausgespart,
indem alle Kleinbuchstaben, ähnlich wie bei manchen Officeanwendungen, automatisch in Großbuchstaben umgewandelt werden. Erst recht
fehlen im Deutschen die Umlaute ä, ö und ü. Um das Druckbild in dieser Hinsicht angenehmer zu machen, definieren wir unsere
eigene Zeichensatz-Map. D.h. eigentlich nehmen wir den vorhandenen, ersetzen drei wenig benötigte Zeichen ( |, {, }) durch
ä, ö und ü und lesen die Map durch eine eigene Pythonfunktion zur Textausgabe aus. Im unteren Bild wird ein Teil des
Zeichensatzes gezeigt. Um den kompletten Teil nachher in das Pythonscript zu integrieren laden Sie ihn hier als
Textdatei herunter, denn die Eingabe im Thonny
wäre doch etwas zu aufwendig.
Ich gebe noch eine kurze Erläuterung, wie die Textausgabe damit realisiert wird. Einerseits können wir den 'originalen' Befehl von
Micropython display.text("DAS IST TEXT",25,25,240,2) immer noch nutzen oder jetzt mit der angepassten Zeichensatz-Map
printstring("Das ist Text",25,25,2) ausgeben. Das erfordert aber die beiden Funtionen printstring(string,xpos,ypos,size) und
printchar(string,xpos,ypos,size) mit den übergebenen Parametern. Zur Demonstration probieren Sie doch einmal dieses erste
kleine Pythonscript aus.
Pythonscript
Zunächst wird das Display initialisiert und dann der Text ausgegeben. Achten Sie darauf, dass bei Paste&Copy in Zeile 1 und auch später
bei den Funktionsdefinitionen keine 'unerlaubten' Einrückungen entstehen.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import picodisplay as display
import time
width = display.get_width()
height = display.get_height()
display_buffer = bytearray(width * height * 2) #2-bytes per pixel (RGB565)
display.init(display_buffer)
display.set_backlight(1.0)
display.set_pen(255,0,0)
display.clear()
display.set_pen(255,255,255)
display.text("das ist text",25,25,240,2)
display.update()
An dieser Stelle kann schon einmal probiert werden. Es sollte die erste Textzeile auf rotem Hintergrund angezeigt werden. Also noch nicht
umwerfend.
Anschließend fügen Sie in Zeile 22 bis 118 die Zeichensatz-Map ein (siehe oben). Die Zeilen 15 bis 21 lassen wir frei, weil hier später
die Änderungen für die Anzeigetafel eingetragen werden. Weiter geht es mit der Eingabe der Funktion 'printchar' in Zeile 120 bis 137.
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
def printchar(letter,xpos,ypos,size):
origin = xpos
charval = ord(letter)
index = charval-32
character = cmap[index]
rows = [character[i:i+5] for i in range(0,len(character),5)]
for row in rows:
for bit in row:
if bit == '1':
display.pixel(xpos,ypos)
if size==2:
display.pixel(xpos,ypos+1)
display.pixel(xpos+1,ypos)
display.pixel(xpos+1,ypos+1)
xpos+=size
xpos=origin
ypos+=size
display.update()
Achten Sie bei der Eingabe wieder auf die 'notwendigen' Einrückungen um jeweils 4 Leerzeichen, wie sie die Python Syntax verlangt.
Es folgt jetzt noch die Funktion 'printstring' in den Zeilen 139 bis 146.
139
140
141
142
143
144
145
146
147
def printstring(string,xpos,ypos,size):
if size == 2:
spacing = 14
else:
spacing = 8
for i in string:
printchar(i,xpos,ypos,size)
xpos+=spacing
Fehlt jetzt nur noch die Schleife, welche die obigen Funktionen aufruft und den Text darstellt. Interessant ist dabei, dass der
untere Text nicht in einem 'Stück' erscheint, sondern Zeichen für Zeichen nacheinander. Dafür sorgt der Befehl
'display.update()' in Zeile 137. Dieser Effekt wirkt nachher besonders schön bei der Anzeigetafel. Wenn Sie die Zeile 137
beispielsweise auskommentieren und den Befehl als Zeile 156 eingeben, erscheint der komplette Text in einem Zug.
148
149
150
151
152
153
154
155
156
while True:
display.set_pen(0,0,0)
text1 = "Das ist jetzt"
text2 = "Text mit neuem"
text3 = "Zeichensatz."
printstring(text1,5,55,2)
printstring(text2,5,75,2)
printstring(text3,5,95,2)
Wir können unser Script jetzt zur Anzeigetafel erweitern bzw. umgestalten. Zunächst entfernen wir die Zeilen 10 bis 14
und geben die neuen Zeilen 10 bis 20 ein. Den Platz dafür hatten wir ja frei gehalten. Die Zeichensatz-Map beginnt dann wieder in Zeile 22.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import picodisplay as display
import time
width = display.get_width()
height = display.get_height()
display_buffer = bytearray(width * height * 2) #2-bytes per pixel (RGB565)
display.init(display_buffer)
display.set_backlight(1.0)
def clear():
display.set_pen(0,0,255)
display.clear()
display.set_pen(255,255,255)
display.pixel_span(0, 55, 239)
display.pixel_span(0, 80, 239)
display.pixel_span(0, 105, 239)
display.pixel_span(0, 130, 239)
display.update()
clear()
Diese Funktion 'clear()' erzeugt den blauen Hintergrund mit den waagerechten Trennlinien der Anzeigetafel und wird gleich zu
Beginn der Programmabarbeitung (Zeile 20) einmal aufgerufen. Auf dieser vorbereiteten Tafel wird nun Text angezeigt. In einer Funktion
'Abfahrt()' (Zeilen 148 bis 173) sind die auszugebenden Texte enthalten. Schauen Sie sich die Zeilen 161 und 165 an. Dort werden die
Umlaute ö und ü in 'Köln' und 'München' genutzt. Nutzen Sie den Vorschlag so oder probieren gleich noch eine Tafel
für die Ankunftzeiten.
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
def abfahrt():
display.set_pen(255,255,255)
text1 = "Abfahrt"
text11= "DB"
text0 = "1/1"
printstring(text1,0,4,2)
printstring(text0,120,6,1)
display.set_pen(255,0,0)
printstring(text11,200,10,2)
display.set_pen(255,255,255)
text2 = "Zeit Ziel Gleis"
printstring(text2,0,40,1)
text3 = "10:23 ICE"
text31= "K}ln Hbh 5"
printstring(text3,0,66,1)
printstring(text31,80,60,2)
text4 = '10:55 RB '
text41= 'M|nchen 6'
printstring(text4,0,90,1)
printstring(text41,80,85,2)
text5 = '11:23 RE'
text51= 'Hamburg 3'
printstring(text5,0,115,1)
printstring(text51,80,110,2)
time.sleep(10)
clear()
Damit das Script wiederholt wird, brauchen wir wieder eine 'while True():' Schleife. Die enthält die Zeilen 175 bis 176. Durch die Zeile
172 wird die Pause von 10 Sekunden bestimmt. Diesen Wert können Sie beliebig ändern.
175
176
177
while True():
abfahrt()
Fertig. Jetzt läuft unser Programm. Hier finden Sie wieder den Link zum
Download des Quelltextes
entsprechend der Beschreibung. Außerdem können Sie noch den Quelltext einer Anzeigetafel mit jeweils
3 Abfahrtsseiten und 3 Ankunftseiten
herunterladen.
Viel Spass und Erfolg beim Ausprobieren.
Zurück
Ich gebe noch eine kurze Erläuterung, wie die Textausgabe damit realisiert wird. Einerseits können wir den 'originalen' Befehl von Micropython display.text("DAS IST TEXT",25,25,240,2) immer noch nutzen oder jetzt mit der angepassten Zeichensatz-Map printstring("Das ist Text",25,25,2) ausgeben. Das erfordert aber die beiden Funtionen printstring(string,xpos,ypos,size) und printchar(string,xpos,ypos,size) mit den übergebenen Parametern. Zur Demonstration probieren Sie doch einmal dieses erste kleine Pythonscript aus.
Pythonscript
Zunächst wird das Display initialisiert und dann der Text ausgegeben. Achten Sie darauf, dass bei Paste&Copy in Zeile 1 und auch später
bei den Funktionsdefinitionen keine 'unerlaubten' Einrückungen entstehen.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import picodisplay as display
import time
width = display.get_width()
height = display.get_height()
display_buffer = bytearray(width * height * 2) #2-bytes per pixel (RGB565)
display.init(display_buffer)
display.set_backlight(1.0)
display.set_pen(255,0,0)
display.clear()
display.set_pen(255,255,255)
display.text("das ist text",25,25,240,2)
display.update()
An dieser Stelle kann schon einmal probiert werden. Es sollte die erste Textzeile auf rotem Hintergrund angezeigt werden. Also noch nicht
umwerfend.
Anschließend fügen Sie in Zeile 22 bis 118 die Zeichensatz-Map ein (siehe oben). Die Zeilen 15 bis 21 lassen wir frei, weil hier später
die Änderungen für die Anzeigetafel eingetragen werden. Weiter geht es mit der Eingabe der Funktion 'printchar' in Zeile 120 bis 137.
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
def printchar(letter,xpos,ypos,size):
origin = xpos
charval = ord(letter)
index = charval-32
character = cmap[index]
rows = [character[i:i+5] for i in range(0,len(character),5)]
for row in rows:
for bit in row:
if bit == '1':
display.pixel(xpos,ypos)
if size==2:
display.pixel(xpos,ypos+1)
display.pixel(xpos+1,ypos)
display.pixel(xpos+1,ypos+1)
xpos+=size
xpos=origin
ypos+=size
display.update()
Achten Sie bei der Eingabe wieder auf die 'notwendigen' Einrückungen um jeweils 4 Leerzeichen, wie sie die Python Syntax verlangt.
Es folgt jetzt noch die Funktion 'printstring' in den Zeilen 139 bis 146.
139
140
141
142
143
144
145
146
147
def printstring(string,xpos,ypos,size):
if size == 2:
spacing = 14
else:
spacing = 8
for i in string:
printchar(i,xpos,ypos,size)
xpos+=spacing
Fehlt jetzt nur noch die Schleife, welche die obigen Funktionen aufruft und den Text darstellt. Interessant ist dabei, dass der
untere Text nicht in einem 'Stück' erscheint, sondern Zeichen für Zeichen nacheinander. Dafür sorgt der Befehl
'display.update()' in Zeile 137. Dieser Effekt wirkt nachher besonders schön bei der Anzeigetafel. Wenn Sie die Zeile 137
beispielsweise auskommentieren und den Befehl als Zeile 156 eingeben, erscheint der komplette Text in einem Zug.
148
149
150
151
152
153
154
155
156
while True:
display.set_pen(0,0,0)
text1 = "Das ist jetzt"
text2 = "Text mit neuem"
text3 = "Zeichensatz."
printstring(text1,5,55,2)
printstring(text2,5,75,2)
printstring(text3,5,95,2)
Wir können unser Script jetzt zur Anzeigetafel erweitern bzw. umgestalten. Zunächst entfernen wir die Zeilen 10 bis 14
und geben die neuen Zeilen 10 bis 20 ein. Den Platz dafür hatten wir ja frei gehalten. Die Zeichensatz-Map beginnt dann wieder in Zeile 22.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import picodisplay as display
import time
width = display.get_width()
height = display.get_height()
display_buffer = bytearray(width * height * 2) #2-bytes per pixel (RGB565)
display.init(display_buffer)
display.set_backlight(1.0)
def clear():
display.set_pen(0,0,255)
display.clear()
display.set_pen(255,255,255)
display.pixel_span(0, 55, 239)
display.pixel_span(0, 80, 239)
display.pixel_span(0, 105, 239)
display.pixel_span(0, 130, 239)
display.update()
clear()
Diese Funktion 'clear()' erzeugt den blauen Hintergrund mit den waagerechten Trennlinien der Anzeigetafel und wird gleich zu
Beginn der Programmabarbeitung (Zeile 20) einmal aufgerufen. Auf dieser vorbereiteten Tafel wird nun Text angezeigt. In einer Funktion
'Abfahrt()' (Zeilen 148 bis 173) sind die auszugebenden Texte enthalten. Schauen Sie sich die Zeilen 161 und 165 an. Dort werden die
Umlaute ö und ü in 'Köln' und 'München' genutzt. Nutzen Sie den Vorschlag so oder probieren gleich noch eine Tafel
für die Ankunftzeiten.
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
def abfahrt():
display.set_pen(255,255,255)
text1 = "Abfahrt"
text11= "DB"
text0 = "1/1"
printstring(text1,0,4,2)
printstring(text0,120,6,1)
display.set_pen(255,0,0)
printstring(text11,200,10,2)
display.set_pen(255,255,255)
text2 = "Zeit Ziel Gleis"
printstring(text2,0,40,1)
text3 = "10:23 ICE"
text31= "K}ln Hbh 5"
printstring(text3,0,66,1)
printstring(text31,80,60,2)
text4 = '10:55 RB '
text41= 'M|nchen 6'
printstring(text4,0,90,1)
printstring(text41,80,85,2)
text5 = '11:23 RE'
text51= 'Hamburg 3'
printstring(text5,0,115,1)
printstring(text51,80,110,2)
time.sleep(10)
clear()
Damit das Script wiederholt wird, brauchen wir wieder eine 'while True():' Schleife. Die enthält die Zeilen 175 bis 176. Durch die Zeile
172 wird die Pause von 10 Sekunden bestimmt. Diesen Wert können Sie beliebig ändern.
175
176
177
while True():
abfahrt()
Fertig. Jetzt läuft unser Programm. Hier finden Sie wieder den Link zum
Download des Quelltextes
entsprechend der Beschreibung. Außerdem können Sie noch den Quelltext einer Anzeigetafel mit jeweils
3 Abfahrtsseiten und 3 Ankunftseiten
herunterladen.
Viel Spass und Erfolg beim Ausprobieren.
Zurück
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
import picodisplay as display
import time
width = display.get_width()
height = display.get_height()
display_buffer = bytearray(width * height * 2) #2-bytes per pixel (RGB565)
display.init(display_buffer)
display.set_backlight(1.0)
display.set_pen(255,0,0)
display.clear()
display.set_pen(255,255,255)
display.text("das ist text",25,25,240,2)
display.update()
|
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
|
def printchar(letter,xpos,ypos,size):
origin = xpos
charval = ord(letter)
index = charval-32
character = cmap[index]
rows = [character[i:i+5] for i in range(0,len(character),5)]
for row in rows:
for bit in row:
if bit == '1':
display.pixel(xpos,ypos)
if size==2:
display.pixel(xpos,ypos+1)
display.pixel(xpos+1,ypos)
display.pixel(xpos+1,ypos+1)
xpos+=size
xpos=origin
ypos+=size
display.update()
|
139
140
141
142
143
144
145
146
147
|
def printstring(string,xpos,ypos,size):
if size == 2:
spacing = 14
else:
spacing = 8
for i in string:
printchar(i,xpos,ypos,size)
xpos+=spacing
|
148
149
150
151
152
153
154
155
156
|
while True:
display.set_pen(0,0,0)
text1 = "Das ist jetzt"
text2 = "Text mit neuem"
text3 = "Zeichensatz."
printstring(text1,5,55,2)
printstring(text2,5,75,2)
printstring(text3,5,95,2)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
import picodisplay as display
import time
width = display.get_width()
height = display.get_height()
display_buffer = bytearray(width * height * 2) #2-bytes per pixel (RGB565)
display.init(display_buffer)
display.set_backlight(1.0)
def clear():
display.set_pen(0,0,255)
display.clear()
display.set_pen(255,255,255)
display.pixel_span(0, 55, 239)
display.pixel_span(0, 80, 239)
display.pixel_span(0, 105, 239)
display.pixel_span(0, 130, 239)
display.update()
clear()
|
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
|
def abfahrt():
display.set_pen(255,255,255)
text1 = "Abfahrt"
text11= "DB"
text0 = "1/1"
printstring(text1,0,4,2)
printstring(text0,120,6,1)
display.set_pen(255,0,0)
printstring(text11,200,10,2)
display.set_pen(255,255,255)
text2 = "Zeit Ziel Gleis"
printstring(text2,0,40,1)
text3 = "10:23 ICE"
text31= "K}ln Hbh 5"
printstring(text3,0,66,1)
printstring(text31,80,60,2)
text4 = '10:55 RB '
text41= 'M|nchen 6'
printstring(text4,0,90,1)
printstring(text41,80,85,2)
text5 = '11:23 RE'
text51= 'Hamburg 3'
printstring(text5,0,115,1)
printstring(text51,80,110,2)
time.sleep(10)
clear()
|
175
176
177
|
while True():
abfahrt()
|
Viel Spass und Erfolg beim Ausprobieren.
Zurück