Diese Anleitung erklärt, wie Sie das installierte LCD Display für Ihre eigene Anwendung nutzen können. Das Projekt stellt wichtige Utilities bereit, die für eine fehlerfreie Display-Ausgabe unbedingt verwendet werden müssen.
Die Datei the_programm_display_utils.py MUSS verwendet werden!
- Ohne diese Utilities: Das Display flackert, die Ausgabe ist unleserlich, Farben funktionieren nicht korrekt
- Mit diesen Utilities: Flackerfreie, stabile Ausgabe, korrekte Farbdarstellung, präzise Cursor-Positionierung
Auch wenn Sie:
- Das Projekt lange nicht genutzt haben
- Fremd im Projekt sind und es zum ersten Mal sehen
- Ein bestehendes Programm anpassen möchten
→ Die Display-Utilities MÜSSEN verwendet werden! Diese Anleitung erklärt genau, wie.
Das LCD Display benötigt spezielle Behandlung, um flackerfreie Ausgabe zu gewährleisten:
- Normale
print()-Statements führen zu Flackern und unleserlicher Ausgabe - ANSI-Escape-Codes müssen korrekt verwendet werden
- Cursor-Positionierung muss präzise sein
- Zeilenaktualisierungen müssen ohne Bildschirm-Flacker erfolgen
Die bereitgestellten the_programm_display_utils.py lösen alle diese Probleme automatisch.
/home/pi/
├── the_programm_main.py # Wrapper, der Ihr Programm startet
├── the_programm_display_utils.py # Display-Utilities (MUSS verwendet werden)
└── the_programm_display_berrybase_test.py # Testprogramm (Beispiel)
Der Service the-programm.service startet automatisch nach dem Boot:
- Startet:
/home/pi/the_programm_main.py - Ausgabe: Direkt auf
/dev/tty1(LCD Display) - Logs:
/home/pi/logs/the_programm.log
Erstellen Sie Ihr Python-Programm und stellen Sie sicher, dass es die Display-Utilities verwendet:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Ihr eigenes Programm
import sys
import os
from the_programm_display_utils import Display, Colors
def main():
# Display initialisieren (WICHTIG!)
display = Display(max_rows=30)
display.init()
try:
# Ihr Programm-Code hier
display.update_line(1, "Willkommen zu meinem Programm!")
display.update_line(2, f"{Colors.GREEN}Status: Bereit{Colors.RESET}")
# Beispiel: Endlosschleife
counter = 0
while True:
counter += 1
display.update_line(3, f"Counter: {counter}")
time.sleep(1)
except KeyboardInterrupt:
pass
finally:
# Display aufräumen (WICHTIG!)
display.cleanup()
if __name__ == "__main__":
main()Öffnen Sie /home/pi/the_programm_main.py und ändern Sie den Pfad:
# Ändern Sie diese Zeile:
script_path = os.path.join(os.path.dirname(__file__), "the_programm_display_berrybase_test.py")
# Zu Ihrem Programm:
script_path = "/pfad/zu/ihrem/programm.py"Beispiel:
script_path = "/home/pi/mein_programm.py"sudo systemctl restart the-programm.serviceWann verwenden?
- Sie möchten das Display in einem anderen Programm nutzen
- Sie möchten mehrere Projekte parallel betreiben
- Sie möchten das Original-Projekt unverändert lassen
Wichtig: Wenn Sie das Display in einem anderen Programm nutzen möchten, duplizieren Sie das Projekt und ersetzen Sie the_programm_main.py durch die Startdatei Ihrer Wunschanwendung.
Wenn Sie mehrere Projekte haben oder das Original-Projekt behalten möchten:
mkdir -p /home/pi/mein_projekt
cd /home/pi/mein_projektcp /home/pi/the_programm_display_utils.py /home/pi/mein_projekt/WICHTIG: Die the_programm_display_utils.py MUSS im gleichen Verzeichnis wie Ihr Programm sein oder im Python-Pfad verfügbar sein. Diese Datei ist essentiell für fehlerfreie Display-Ausgabe und MUSS verwendet werden!
Falls Sie ein neues Programm erstellen:
Erstellen Sie mein_programm.py in /home/pi/mein_projekt/:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Ihr Programm
import sys
import os
import time
# Display-Utils importieren (aus gleichem Verzeichnis)
from the_programm_display_utils import Display, Colors
def main():
# Display initialisieren
display = Display(max_rows=30)
display.init()
try:
# Ihr Programm-Code
display.update_line(1, f"{Colors.BOLD}Mein Programm{Colors.RESET}")
display.update_line(2, f"{Colors.GREEN}Läuft...{Colors.RESET}")
# Beispiel-Logik
for i in range(10):
display.update_line(3, f"Schritt {i+1}/10")
time.sleep(1)
except KeyboardInterrupt:
display.update_line(3, f"{Colors.YELLOW}Beendet{Colors.RESET}")
finally:
display.cleanup()
if __name__ == "__main__":
main()Falls Sie ein bestehendes Programm nutzen:
- Kopieren Sie Ihr bestehendes Programm nach
/home/pi/mein_projekt/ - WICHTIG: Passen Sie Ihr Programm an, um die Display-Utilities zu verwenden:
- Importieren Sie
from the_programm_display_utils import Display, Colors - Ersetzen Sie alle
print()-Statements durchdisplay.update_line() - Initialisieren Sie das Display mit
display.init()am Anfang - Räumen Sie mit
display.cleanup()imfinally-Block auf
- Importieren Sie
Beispiel-Anpassung:
# VORHER (normales Programm):
print("Hallo Welt!")
print(f"Status: {status}")
# NACHHER (mit Display-Utils):
from the_programm_display_utils import Display, Colors
display = Display(max_rows=30)
display.init()
try:
display.update_line(1, "Hallo Welt!")
display.update_line(2, f"Status: {status}")
finally:
display.cleanup()Option A: the_programm_main.py anpassen (einfach)
script_path = "/home/pi/mein_projekt/mein_programm.py"Option B: Service direkt anpassen (für mehrere Projekte)
Wenn Sie mehrere Projekte haben, können Sie auch den Service direkt anpassen:
sudo nano /etc/systemd/system/the-programm.serviceÄndern Sie die ExecStart-Zeile:
ExecStart=/bin/bash -c 'cd /home/pi/mein_projekt && /usr/bin/python3 -u /home/pi/mein_projekt/mein_programm.py 2>&1 | tee -a /home/pi/logs/the_programm.log'Dann:
sudo systemctl daemon-reloadsudo systemctl restart the-programm.serviceDie Display-Klasse ist das Herzstück für flackerfreie Ausgabe.
from the_programm_display_utils import Display
# Erstellen Sie ein Display-Objekt
display = Display(max_rows=30) # 30 Zeilen (Standard für 3.5" LCD)
# Initialisieren Sie das Display (löscht Bildschirm, versteckt Cursor)
display.init()Aktualisiert eine Zeile flackerfrei:
# Zeile 1 aktualisieren
display.update_line(1, "Hallo Welt!")
# Mit Farben
display.update_line(2, f"{Colors.GREEN}Status: OK{Colors.RESET}")Wichtig:
rowbeginnt bei 1 (nicht 0)- Der Text wird automatisch auf die Zeile gesetzt
- Alte Inhalte werden automatisch gelöscht
Löscht den gesamten Bildschirm:
display.clear_screen()Löscht den Bildschirm und füllt alle Zeilen mit Leerzeichen:
display.clear_full_screen()Bewegt den Cursor zu einer bestimmten Position:
display.move_cursor(5, 10) # Zeile 5, Spalte 10Zeichnet einen Rahmen um das Display:
display.print_border(width=60, char='#')Aktualisiert eine Zeile, während der Rahmen erhalten bleibt:
display.update_line_with_border(5, "Mein Text", width=60, border_char='#')Räumt das Display auf (zeigt Cursor wieder):
display.cleanup()WICHTIG: Rufen Sie cleanup() immer im finally-Block auf!
Die Colors-Klasse stellt ANSI-Farbcodes bereit.
from the_programm_display_utils import Colors
# Verfügbare Farben:
Colors.RED # Rot
Colors.GREEN # Grün
Colors.YELLOW # Gelb
Colors.BLUE # Blau
Colors.MAGENTA # Magenta
Colors.CYAN # Cyan
Colors.PURPLE # Lila
Colors.WHITE # Weiß
Colors.BLACK # Dunkelgrau
Colors.RESET # Zurücksetzen
Colors.BOLD # Fett# Text in Farbe ausgeben
text = f"{Colors.GREEN}Erfolg!{Colors.RESET}"
display.update_line(1, text)
# Kombinationen
text = f"{Colors.BOLD}{Colors.RED}FEHLER!{Colors.RESET}"
display.update_line(2, text)WICHTIG: Verwenden Sie immer Colors.RESET nach farbigem Text!
# Verfügbare Hintergrundfarben:
Colors.BG_BLACK
Colors.BG_RED
Colors.BG_GREEN
Colors.BG_YELLOW
Colors.BG_BLUE
Colors.BG_MAGENTA
Colors.BG_CYAN
Colors.BG_WHITE
# Spezielle Farben:
Colors.BG_ORANGE
Colors.BG_BROWN
Colors.BG_PINK
Colors.BG_LIME
Colors.BG_VIOLET
# Graustufen:
Colors.BG_GRAY_DARK
Colors.BG_GRAY_1
Colors.BG_GRAY_2
Colors.BG_GRAY_3
Colors.BG_GRAY_LIGHT# Gefülltes Viereck in einer Farbe
block = display.print_colored_block(width=20, bg_color=Colors.BG_RED, label="Status: ")
display.update_line(5, block)# Graustufe für einen Prozentwert (0-100)
color = display.get_grayscale_color(percent=75) # 75% = hellgrau
block = display.print_colored_block(width=50, bg_color=color)
display.update_line(6, block)Entfernt ANSI-Codes aus einem String (für Längenberechnung):
from the_programm_display_utils import strip_ansi_codes
text = f"{Colors.GREEN}Hallo{Colors.RESET}"
length_with_codes = len(text) # Länge mit ANSI-Codes
length_without_codes = len(strip_ansi_codes(text)) # Tatsächliche TextlängeHier ist ein vollständiges Beispiel, das alle wichtigen Konzepte zeigt:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Beispiel-Programm für LCD Display
import time
import sys
from the_programm_display_utils import Display, Colors
def main():
# Display initialisieren
display = Display(max_rows=30)
display.init()
try:
# Titel
display.update_line(1, f"{Colors.BOLD}{Colors.CYAN}=== Mein Programm ==={Colors.RESET}")
# Status
display.update_line(3, f"{Colors.GREEN}Status: Bereit{Colors.RESET}")
# Rahmen zeichnen
display.print_border(width=60, char='=')
# Hauptbereich
counter = 0
while True:
counter += 1
# Counter anzeigen
display.update_line(5, f"Counter: {counter}")
# Farbige Status-Bar
percent = (counter % 100)
color = display.get_grayscale_color(percent)
bar = display.print_colored_block(width=percent//2, bg_color=color, label="Fortschritt: ")
display.update_line(7, bar)
# Zeit anzeigen
from datetime import datetime
now = datetime.now().strftime("%H:%M:%S")
display.update_line(9, f"Zeit: {now}")
time.sleep(0.1)
except KeyboardInterrupt:
display.update_line(3, f"{Colors.YELLOW}Status: Beendet{Colors.RESET}")
time.sleep(2)
finally:
# WICHTIG: Display aufräumen
display.cleanup()
if __name__ == "__main__":
main()display = Display(max_rows=30)
display.init()
try:
# Ihr Code
pass
finally:
display.cleanup() # IMMER aufräumen!# RICHTIG:
text = f"{Colors.GREEN}Text{Colors.RESET}"
# FALSCH:
text = f"{Colors.GREEN}Text" # Farbe bleibt aktiv!# RICHTIG:
display.update_line(1, "Neuer Text")
# FALSCH:
print("Neuer Text") # Führt zu Flackern!text = "Sehr langer Text der nicht auf das Display passt..."
if len(text) > 60: # Display-Breite prüfen
text = text[:57] + "..."
display.update_line(1, text)from the_programm_display_utils import strip_ansi_codes
text = f"{Colors.GREEN}Hallo{Colors.RESET}"
actual_length = len(strip_ansi_codes(text)) # Korrekte LängeLösung: Verwenden Sie immer display.update_line() statt print().
Lösung: Stellen Sie sicher, dass Sie Colors.RESET nach farbigem Text verwenden.
Lösung: Rufen Sie display.init() am Anfang auf und display.cleanup() am Ende.
Lösung: Verwenden Sie display.update_line(row, text) mit korrekter Zeilennummer (1-basiert).
Lösung: Prüfen Sie die Service-Status:
sudo systemctl status the-programm.service
sudo journalctl -u the-programm.service -n 50sudo systemctl restart the-programm.servicesudo systemctl stop the-programm.servicesudo systemctl start the-programm.servicesudo systemctl status the-programm.service# Letzte 50 Zeilen
sudo journalctl -u the-programm.service -n 50
# Live-Logs
sudo journalctl -u the-programm.service -f
# Log-Datei
tail -f /home/pi/logs/the_programm.log- Display-Utilities verwenden: Die
the_programm_display_utils.pyMUSS verwendet werden für fehlerfreie Ausgabe - Display initialisieren:
display.init()am Anfang - Display aufräumen:
display.cleanup()imfinally-Block - update_line() verwenden: Nie
print()direkt, immerdisplay.update_line() - Farben zurücksetzen: Immer
Colors.RESETnach farbigem Text - the_programm_main.py anpassen: Pfad zu Ihrem Programm eintragen
- Service neu starten: Nach Änderungen
sudo systemctl restart the-programm.service
Bei Fragen oder Problemen prüfen Sie die Logs und stellen Sie sicher, dass Sie die Display-Utilities korrekt verwenden.