TFT-Display am PICO W

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
HLOO
User
Beiträge: 4
Registriert: Montag 20. Mai 2019, 17:40

Hallo
Im aktuellen Projekt möchte ich mittels Display und Microrechner ein Zeigermessgerät darstellen.
Als Microrechner habe ich den PICO W.
Das Display ist das 1,8-Zoll-TFT Farbdisplay-Modul von AZ-delivery ohne Touch-Funktion.
Nach anfänglichen Problemen hab ich es geschafft dass beide zusammenarbeiten.
Dazu nutze ich thonny als IDE und für das Display die empfohlene Adafruit ST7735 Bibliothek.
In der Bibliothek gab es vorgefertigt Rechtecke und Pixel zum ansteuern, aber keine Linien.
Also hab ich mir eine Funktion gebaut, die aus Punkten Linien (also auch den Zeiger) macht.
(Auch das war nicht so einfach wie man denken könnte, weil ich hab wie bei einer Funktion für jeden x-wert den dazugehörigen y-wert errechnet und dann die beiden als Pixel dargestellt. Das funktioniert gut solange der zeiger flach dasteht. Aber wenn er nach oben zeigt so bei 80-100° gibt es nur wenige x-Werte also besteht der Zeiger dann nur noch aus wenigen Punkten. Und für genau 90° gab es nur einen Punkte und ich musste eine Sonderfalllösung einbauen. Ich glaube hier kann ich noch so einiges optimieren. Aber das ist nicht mein aktuelles Problem)

Das Problem ist, dass der Zeiger ja einen realen Wert darstellen soll und das relativ zeitnah.
Wenn ich ihn neu zeichne, kommt ein neuer Strich bzw Zeiger dazu, der alte bleibt aber. (irgendwann ist dann das Display voll mit Zeigern)
Ich müsste das Display löschen, den gesamten Hintergrund (die Skala) neu zeichnen und den Zeiger mit dem neuen Wert zeichnen. Das funktioniert nicht, weil Display löschen und Skala zeichnen zu lange dauert.
In einem ähnlichen Fall (aber am PC) hatte ich in Python die Grafik mit Tkinter erzeugt. Dort konnte ich quasi eine Instanz der Klasse Linie (Zeiger) erzeugen, die ich dann auch so wieder löschen konnte bevor ich den nächsten Zeiger zeichnen konnte.
Ich habe gegoogelt: auch micropython unterstützt den objektorientierten Ansatz.
Aber ich habe keine Ahnung wie ich das am PICO W umsetzen kann. Geht es überhaupt?

Danke dass ihr bis hierher schon gelesen habt :) und noch viel mehr Danke, wenn ihr mir eure Ideen mitteilen könntet.
Benutzeravatar
__blackjack__
User
Beiträge: 14136
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@HLOO: Zu Linien: Da erfindet man nichts selber sondern implementiert einfach den Bresenham-Algorithmus.

`tkinter` macht das für den Programmierer einfacher, was das hinter den Kulissen macht, wäre noch aufwändiger und langsamer. Wobei man dort die Linie auch nicht löschen und neu zeichnen würde, sondern die vorhandene Linie verändern würde. Das sich die Pixelgrafik darauf hin ändert, ist dann Aufgabe von Tk, was im Ernstfall tatsächlich alles was da gezeichnet wurde, löscht und noch mal neu zeichnet.

So wirklich etwas anderes als neu zeichnen gibt es eigentlich nicht. Man kann versuchen den Bereich der neu gezeichnet werden muss zu begrenzen. Oder man zeichnet die alte Linie mit Punkten aus der Hintergrundgrafik noch mal. Also die Koordinaten berechnen, aber dann nicht Pixel in der Zeigerfarbe setzen, sondern das Pixel aus einer Kopie des Hintergrunds an der gleichen Stelle zeichnen.

Und falls Python da zu langsam ist, müsste man vielleicht auf C oder C++ ausweichen.
“It is easier to change the specification to fit the program than vice versa.” — Alan J. Perlis
Benutzeravatar
DeaD_EyE
User
Beiträge: 1259
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Ein Ansatz wäre die blit Methode des Framebuffers: https://docs.micropython.org/en/latest/ ... uffer.blit

Den statischen Hintergrund kannst du z.B. nach dem Zeichnen kopieren und im Quellcode als bytes einfügen.
Dann brauchst du zwei Buffer. Background und Foreground. Background ist dann das ganze Display und Foreground nur der Bereich, der aktualisiert werden soll.
Auf foreground zeichnet man dann.

Mit der blit Methode des Background-Buffers kannst du dann den Foreground Buffer einfügen. Mit key kann man angeben, welche Farbe transparent ist.
Nach dem Update dann den Background-Buffer zum Update des Displays verwenden.

Danach muss man den Background-Buffer wieder mit den Daten aus den Bytes befüllen.
Ich habe nicht nachgesehen, ob es so ist, aber wenn du Glück hast, wird durch background_buffer[:] = static_background kein neuer Speicher zugewiesen.
Falls doch, dann könnte das ein Performance-Problem sein.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Antworten