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