|
Linux-Projekte
für den Raspberry Pi,
die
mit Python realisiert wurden
Ansteuerung
LCD-Display [EADOGXL240-7]
|
Grafiksprache
Wie
gesagt, das Display ist ziemlich 'dumm' (aber immer noch sehr
preiswert). Also mußte im Anschluß eine eigene Sprache mit
einfachen Grafikbefehlen entwickelt werden.
Um
die Verarbeitung zu beschleunigen werden die Grafikdaten nicht
sofort in den Speicher des LCD-Displays geschrieben, sondern in
einem programminternen Pufferspeicher zwischengespeichert. Dies
erfolgt auch deswegen, da der Speicher des LCD-Displays per
SPI-Interface nicht ausgelesen werden kann, die meisten der
selbst entwickelten Befehle aber auf die Rasterdaten zugreifen
müssen. Im Pufferspeicher erfolgen zunächst alle Eingaben /
Änderungen.
Diese Daten werden dann mit dem Befehl
'LCD1.display()' komplett an das LCD-Display gesendet und dort
direkt angezeigt.
Die
folgende Tabelle zeigt die vorhandenen Möglichkeiten:
|
Befehl
|
Beschreibung
|
|
get_XY()
|
Zeigt/
holt die aktuelle X/ Y-Position des virtuellen Cursors
|
|
get_maxXY()
|
Zeigt/
holt die physikalische LCD-Anzeigengröße X/ Y in Pixel
|
|
LCD_close()
|
Schließt
die LCD-Anzeige.
|
|
LCD_init()
|
Initiiert
die LCD-Anzeige
|
|
LCD_clear()
|
Löscht
die LCD-Anzeige
|
|
display()
|
Schreibt
den kompletten Inhalt des programminternen Grafikpuffers in
den Speicher der LCD-Anzeige (gleichbedeutend mit 'Anzeigen')
|
|
plot(data,
Zeile=0, Spalte=0)
|
schreibt
Text (data) an Grafikposition Zeile/ Spalte
|
|
mem_clear()
|
Löscht
den programminternen Grafikpuffer (die LCD-Anzeige bleibt aber
noch bestehen)
|
|
point(Xpos,
Ypos [, flag])
|
Versetzt
den virtuellen Kursor an die Koordinaten Xpos, Ypos.
Ist
flag != 0, wird dort auch ein Punkt gesetzt, sonst nicht
|
|
pen(farbe)
|
Setzt
die Stiftfarbe auf 'farbe' (wert von -1 und 0 bis 3)
Das
LCD Display kann bis zu 16 Grautöne darstellen. In diesem
Programm wurde aber der Modus mit 4 Grautönen
verwendet.
Daher steht pen(0) für weiß (nicht gesetzt)
und pen(3) für schwarz (gesetzt).
Die 'Farben' 1 und 2
sind Zwischenschattierungen.
Wert -1 ist ein Sonderfall.
Ist -1 eingestellt, wird der aktuelle Pixelwert im internen
Grafikpuffer invertiert.
|
|
get_pen()
|
Holt/
zeigt den aktuellen pen (=Zeichenfarbe) Wert
|
|
get_Screen(
Xstart=0, Ystart=0, Xende=79, Yende=127):
|
Holt
den internen Pufferspeicher beginnend bei Position Xstart/
Ystart bis zur Position Xende/ Yende und gibt diesen in mehr
oder weniger hellen ASCII-Zeichen am PC-Bildschirm aus.
(Kontrollfunktion)
|
|
line(startX,
startY, endX, endY)
|
Zeichnet
eine Linie von Position startX/ startY bis endX/ endY
|
|
lineR(endX,
endY)
|
Zeichnet
eine Linie von der aktuellen Kursorposition bis zu der
absoluten Endposition endX, endY
|
|
box(startX,
startX, endX, endY [, flag])
|
Zeichnet
ein Rechteck zwischen Position startX/ startY und endX/
endY.
Ist das flag gesetzt (!= 0) wird das Rechteck mit
der 'Stiftfarbe' ausgefüllt, sonst nicht
|
|
circle(startX,
startY, radius [, flag])
|
Zeichnet
einen Kreis von 'radius' um den Mittelpunkt (startX/
startY).
Ist flag gesetzt (!= 0), wird der Kreis mit der
'Stiftfarbe' ausgefüllt, sonst nicht.
|
|
TextG(Text,
Zeile=1, Spalte=1)
|
Überbleibsel
aus einem Vorgängerprojekt:
schreibt Text im pseudo
Textmodus an Kursorposition Zeile, Spalte
ohne Umweg über
den Grafikpuffer direkt in die Anzeige
|
|
char(text)
|
Schreibt
Grafik(text) an der aktuellen Kursorposition
|
|
dirT(dir)
|
Setzt
die Text Schreibrichtung 'dir'.
0= wagerecht links/
rechts | 2= wagerecht rechts/ links
1= senkrecht
oben/unten | 3 senkrecht unten/ oben
|
|
get_Tdir()
|
Zeigt/
holt die aktuelle Textrichtung (0-3. siehe oben)
|
Vielleicht
sollte ich DOCH noch ein Wort zum Koordinatensystem des Displays
verlieren?
|
|
Der
Ursprung des Koordinatensystem ist die linke, obere
Ecke.
Die
X-Richtung geht von links (0) nach rechts (239)
Die
Y-Richtung von oben (0) nach unten (127)
Mit
größer werdendem Y geht es also immer weiter zum UNTEREN
Rand. Umgekehrt wie bei einem 'richtigen' Plotter!
|
Programm
Sowohl
die Zeichensätze, als auch die LCD-Befehle wurden als Klassen
implementiert. Von diesen Klassen werden im Hauptprogramm
Instanzen mit den Namen LCD1 und FONT abgeleitet, auf die im
Hauptprogramm zugegriffen werden kann. Daher können alle
beschriebenen Befehl der Zeichensätze, sowie der Grafikbefehle
mittels Voranstellen des Instanznamens und einem folgenden Punkt
aufgerufen werden.
z.B.:
FONT.get_list()
oder LCD1.line(50,60, 70,80)
Im
Hauptprogramm sind zum Test zwei Funktionstest für das
Grafikdisplay eingebaut. Diese werden mit folgenden Befehlen
aufgerufen:
|
LCD_test()
|
zeichnet
einige Figuren auf die LCD-Anzeige. Leider ist hier die
Füllroutine von Kreisen noch nicht korrekt.
|
|
UHR1.zeit()
|
gibt
jede Minute die aktuelle Uhrzeit aus und wird durch einen
langen Tastendruck ( > 1,0 Sekunde) auf Taste 1 beendet.
|
Beim
Start des Hauptprogrammes
wird die Hintergrundbeleuchtung des Displays eingeschaltet. Die
Zeichensatzdatei
muß sich zusätzlich im gleichen Verzeichnis befinden.
Die
Beleuchtung kann über die Befehle
LCD1.Licht(True)
eingeschaltet und mit
LCD1.Licht(False)
ausgeschaltet werden.
Am
Ende aller Tests sollte das Programm korrekt beendet und die
GPIO-Ports zurückgesetzt und damit wieder freigegeben
werden.
Die geschieht mit dem Befehl 'LCD1.LCD_ende()'.
EINES
sollte ich vielleicht auch noch erwähnen:
Das Display, bzw
der darauf enthaltene Controller hat noch viele weitere
Möglichkeiten zu bieten, als die hier verwendeten.
Da gibt
es zum Beispiel
das
Invertieren der Anzeige
das
setzen/ Rücksetzen aller Pixel
das
Rollen des Bildes
das
Setzen von Fenstern
das
Fixieren von Bereichen
und,
und, und
Wen
es interesiert, der kann sich ja mal die Befehlsliste
ansehen. Diese ist allerdings in Englisch.
Im
Vorgriff auf Projekte die mit diesem Display realisiert wurden
hier schon mal eine Auswahl an Grafiken. Es werden allerdings
nicht alle auf den Projektseiten vorgestellt.
|
Temperaturverlauf eines Home-Matic Sensors
|
Temperaturdifferenz
Innen zu Außen als Balkengrafik (HomeMatic)
|
|
Tageswetter Wetter BR
|
BR Wettervorschau 5 Tage
|
|
Wetter.com Vorhersage für 14 (16)
Tage
|
Wetter.com
Regenvorhersage 14(16) Tage
|
|
Statusanzeige von HomeMatic Komponenten
|
Uhrzeit
(wird jede Minute aktualisiert)
|
|
Luftdruckanzeigen
NICHT auf NN umgerechnet!
|
Zyklische
E-Mail Abfrage (noch in Arbeit)
|
|
Auswertung
der Zählimpulse eines 2-Wege Zählers per Homematic-Sensor
X=
Zeit / Y= kW/h
|
Auswertung
der optischen Schnittstelle (EDL21/ SML) des 2-Wege Zählers
|
|
Daten
des Akku-Speichers der Solaranlage
|
Daten
des Wechselrichters der Solaranlage
|
Alle
gezeigten Grafiken wurden mit einem selbst erstellten 'LCDcopy'
Programm aus dem internen Bildschirmspeicher des
entsprechenden Python-Programms erzeugt.
Und
NEIN, das LCD kann KEINE Farben darstellen. Diese wurden bei der
GIF-Kodierung aus den originalen Graustufen in der Farbtabelle
'umkodiert'.
Unterschiedliche Grafikgrößen? Aber ja.
Dem 'LCDcopy'-Programm können 'Multiplikatoren', getrennt für
die X und Y-Richtung, übergeben werden. Die originale Bildgröße
eines 240 x 128 Pixel Displays würde ausgedruckt
ziemlich klein aussehen