Python, Rasbperry Pi und LCD 2004 mit PCF8574 I2C und Umlaute

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Snakepit
User
Beiträge: 8
Registriert: Samstag 12. Juli 2014, 20:08

Montag 22. Februar 2021, 21:07

Hallo liebe Boardmitglieder,

ich habe aktuell ein kleines nerviges "Problem".

Ich greife aus dem Netz über eine API eine Seite ab (Openweather), was auch soweit ganz gut klappt.
Die Seite gibt mir ein JSON Objekt mit deutschen Begriffen beim Wetter und auch Metric zurück.

Das ganze lasse ich mir per Telegram schicken, auf dem PI per RDP anzeigen, oder per SSH Aufruf und dort wird es richtig angezeigt.
Jedoch auf dem angeschlossenen LCD 20x4 werden die Umlaute leider nicht kodiert.
Google wurde mittlerweile schon rauf und runter gesucht und ein paar Ideen habe ich auch schon gefunden. Leider sind diese aber eher für statische Ausgaben gedacht.
Sprich ich weiß, wann und wie ein ü/ä/ö/ usw. kommt.

Das Display steuere ich so an:

Code: Alles auswählen

import drivers
.
.
display = drivers.Lcd()
display.lcd_display_string("Temperatur:     " +str(temp) +"C", 1)
display.lcd_display_string(str(himmel) , 2)
.
.
Bei (himmel) oder auch (windrichtung) kann es jetzt Süd oder Südsüdwest, Bewölkt usw. heißen.
Leider verwirft mir die LCD Biblio die deutschen Umlaute oder auch das "s-zet" und ersetzt diese mit alternativen Symbolen.

Für den Arduino habe ich auch schon eine geänderte Bibliothek gefunden, jedoch noch nicht für den PI mit Python.

Evtl. suche ich ja auch einfach nur an der falschen Stelle. Es würde evtl. auch noch mit einer IF Abfrage laufen, dass ich her gehe alle möglichen Kombinationen händisch abfange und umschreibe. Jedoch würde ich dies ungern machen, da ich auch noch andere API nutzen würde, und nicht jedes mal aufs Neue von vorne anfangen will.

Über den ein oder anderen "Schubs" in die richtige Richtung würde ich mich freuen, oder es hat ja gleich jemand die richtige Idee dazu.
Ich würde gerne alle Umlaute/Sonderzeichen aus dem JSON gleich richtig am LCD darstellen! Wie gesagt, alle andere Möglichkeiten stellen es richtig dar. Nur das LCD nervt!


Im Einsatz hier :

Raspberry Pi 2/4 - 2 (nur für die Darstellung am Display) 4 (Telegram Bot/zukünftig Whatsapp Bot)
Aktuelles Raspberry PI OS
Python 3
Biblio - drivers
Benutzeravatar
__blackjack__
User
Beiträge: 8155
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Montag 22. Februar 2021, 21:41

@Snakepit: Erstelle eine Übersetzungstabelle für die Zeichen die Du dann mit der `translate()`-Methode von Zeichenketten verwenden kannst.
Das Internet ist dazu da, um "Punkt, Punkt, Komma, Strich" durch "Doppelpunkt, Bindestrich, runde Klammer" zu ersetzen.
Benutzeravatar
sparrow
User
Beiträge: 2604
Registriert: Freitag 17. April 2009, 10:28

Montag 22. Februar 2021, 22:09

@Snakepit: Handelt es sich bei dem Arduino um das gleiche LCD-Display? Die haben nicht selten ein vorgegebenes Charset - und ob da Umlaute drin sind ist nicht unbedngt gesagt.
Snakepit
User
Beiträge: 8
Registriert: Samstag 12. Juli 2014, 20:08

Dienstag 23. Februar 2021, 07:37

sparrow hat geschrieben:
Montag 22. Februar 2021, 22:09
@Snakepit: Handelt es sich bei dem Arduino um das gleiche LCD-Display? Die haben nicht selten ein vorgegebenes Charset - und ob da Umlaute drin sind ist nicht unbedngt gesagt.
Das Display und, was wichtiger ist, der Chip welcher I2C umwandelt sind identisch. Wenn ich meinen Arduino/ESP verwende, dann kann ich die Buchstaben/Zeichen richtig darstellen.
Benutzeravatar
sparrow
User
Beiträge: 2604
Registriert: Freitag 17. April 2009, 10:28

Dienstag 23. Februar 2021, 07:49

@Snakepit: Dann musst du schauen, welches Charset angewendet wird - entweder steht das in der technischen Dokumentation oder du musst es auf die harte Weise Wert für Wert ausprobieren. Und dann, wie von __blackjack__ bereits angemerkt, mit translate eine Übersetzungstabelle erstellen, um die Zeichen entsprechend zu ersetzen.
Sirius3
User
Beiträge: 13951
Registriert: Sonntag 21. Oktober 2012, 17:20

Dienstag 23. Februar 2021, 07:54

Gleich oder Identisch?
Das einfachste wäre, wie __blackjack__ schon vorgeschlagen hat, sich den Zeichensatz anzeigen zu lassen um herauszufinden, an welchen Codes die Umlaute stehen.
__deets__
User
Beiträge: 9418
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dienstag 23. Februar 2021, 09:52

So wie ich das sehe sind die LCDs pixelgetrieben. Die Verantwortung liegt also bei der “Biblio” (Thekenknappheit ausgebrochen?). Die ist unzureichend angegeben. Woher genau hast du die?
Sirius3
User
Beiträge: 13951
Registriert: Sonntag 21. Oktober 2012, 17:20

Dienstag 23. Februar 2021, 10:05

@__deets__: der Zeichensatz ist meist fest eingebaut, übertragen werden nur 8bit-Zeichencodes. Daher auch 20x4 Zeichen und nicht 160x32 Pixel.
Aber ohne dass der OP genau erzählt, welche Hardware er einsetzt und welche Bibliotheken er benutzt, ist das natürlich alles nur Raterei.
__deets__
User
Beiträge: 9418
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dienstag 23. Februar 2021, 11:47

Das wäre dann ja das hier (ganz am Ende) https://www.beta-estore.com/download/rk ... 90_410.pdf

Und da ist kein deutscher Umlaut drin. Man kann aber bitpattern benutzen, und damit alles darstellen. Wenn der Arduino das macht, dann wird das ein Software Feature sein.
Benutzeravatar
__blackjack__
User
Beiträge: 8155
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Dienstag 23. Februar 2021, 12:57

Ich sehe da kleine Umlaute und ein ß. ä,ö, und ß sind in der vorletzten Spalte und ein ü in der letzten Spalte. Die Tabelle auf der letzten Seite von dem PDF.
Das Internet ist dazu da, um "Punkt, Punkt, Komma, Strich" durch "Doppelpunkt, Bindestrich, runde Klammer" zu ersetzen.
__deets__
User
Beiträge: 9418
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dienstag 23. Februar 2021, 13:08

Oh! Dann habe ich die übersehen. Aber dann ist die Lösung ja simpel. Ich denke mal aufgrund des kleinen fonts muss man große Umlaute eh auf die kleinen abbilden.
Snakepit
User
Beiträge: 8
Registriert: Samstag 12. Juli 2014, 20:08

Mittwoch 24. Februar 2021, 13:38

sparrow hat geschrieben:
Montag 22. Februar 2021, 22:09
@Snakepit: Handelt es sich bei dem Arduino um das gleiche LCD-Display? Die haben nicht selten ein vorgegebenes Charset - und ob da Umlaute drin sind ist nicht unbedngt gesagt.
Ja, war das gleiche Display. Halt einfach mal umgesteckt.
Snakepit
User
Beiträge: 8
Registriert: Samstag 12. Juli 2014, 20:08

Mittwoch 24. Februar 2021, 13:40

__deets__ hat geschrieben:
Dienstag 23. Februar 2021, 09:52
So wie ich das sehe sind die LCDs pixelgetrieben. Die Verantwortung liegt also bei der “Biblio” (Thekenknappheit ausgebrochen?). Die ist unzureichend angegeben. Woher genau hast du die?
Das Modul "Drivers" war hier schon mit auf dem Raspberry im IOS hinterlegt. Daher musste ich nichts nachinstallieren.
Und alles was ich habe, war im Codeschnippsel drinnen. Mehr gibt es hier nicht.

Leider finde ich aber auch keine weiter Infos dazu.
Benutzeravatar
sparrow
User
Beiträge: 2604
Registriert: Freitag 17. April 2009, 10:28

Mittwoch 24. Februar 2021, 13:54

@snakepit: Woran hapert es denn noch? Das sollte doch gehen:

Code: Alles auswählen

import drivers

# Translation HD44780A00
# https://de.wikipedia.org/wiki/HD44780#/media/Datei:Charset.gif
TRANSLATION_TABLE = str.maketrans(
    {
    "Ä": int("11100001", 2),
    "ä": int("11100001", 2),
    "Ü": int("11110101", 2),
    "ü": int("11110101", 2),
    "Ö": int("11101111", 2),
    "ö": int("11101111", 2),
    "°": int("11011111", 2),
    "ß": int("11100010", 2),
    }
)


def write_to_display(display, text, line):
    text = text.translate(TRANSLATION_TABLE)
    display.lcd_display_string(text, line)


display = drivers.Lcd()
write_to_display(display, f"Temperatur:     {temp}°C", 1)
write_to_display(display, f"Umlaute: üÜ äÄ öÖ und ß", 2)
Die Bytewerte kommen aus der HD44780A00 Codepage bei Wikipedia.
Sirius3
User
Beiträge: 13951
Registriert: Sonntag 21. Oktober 2012, 17:20

Mittwoch 24. Februar 2021, 14:38

@sparrow: Statt int("11100001", 2) kann man 0b11100001 schreiben.
Antworten