Seite 1 von 1

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

Verfasst: Montag 22. Februar 2021, 21:07
von Snakepit
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

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

Verfasst: Montag 22. Februar 2021, 21:41
von __blackjack__
@Snakepit: Erstelle eine Übersetzungstabelle für die Zeichen die Du dann mit der `translate()`-Methode von Zeichenketten verwenden kannst.

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

Verfasst: Montag 22. Februar 2021, 22:09
von sparrow
@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.

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

Verfasst: Dienstag 23. Februar 2021, 07:37
von Snakepit
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.

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

Verfasst: Dienstag 23. Februar 2021, 07:49
von sparrow
@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.

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

Verfasst: Dienstag 23. Februar 2021, 07:54
von Sirius3
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.

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

Verfasst: Dienstag 23. Februar 2021, 09:52
von __deets__
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?

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

Verfasst: Dienstag 23. Februar 2021, 10:05
von Sirius3
@__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.

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

Verfasst: Dienstag 23. Februar 2021, 11:47
von __deets__
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.

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

Verfasst: Dienstag 23. Februar 2021, 12:57
von __blackjack__
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.

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

Verfasst: Dienstag 23. Februar 2021, 13:08
von __deets__
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.

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

Verfasst: Mittwoch 24. Februar 2021, 13:38
von Snakepit
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.

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

Verfasst: Mittwoch 24. Februar 2021, 13:40
von Snakepit
__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.

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

Verfasst: Mittwoch 24. Februar 2021, 13:54
von sparrow
@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.

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

Verfasst: Mittwoch 24. Februar 2021, 14:38
von Sirius3
@sparrow: Statt int("11100001", 2) kann man 0b11100001 schreiben.

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

Verfasst: Mittwoch 24. Februar 2021, 15:17
von Snakepit
Danke an alle Ideengeber!

Translate war die richtige Idee und zusammen mit 3 Seiten konnte ich dann meinen Code so anpassen, dass dieser jetzt auch Sinn auf dem Display gibt.

Code: Alles auswählen

.
# Benötigte Zeichen in der JSON Ausgabe / hier können noch weitere Zeichen hinzugefügt werden: ÖÄÜ usw. Wird aber bei mir nicht benötigt
umlaute = {228: chr(225), 246: chr(239), 252: chr(245), 223: chr(226)}
.
.
# Ausgabe am Display mit Änderung der Umlaute durch "translate"
display.lcd_display_string("Richtung: " + (windrichtung.translate(umlaute)),  2)
Evtl. kann es ja jemand anderes auch einmal brauchen.

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

Verfasst: Mittwoch 24. Februar 2021, 19:58
von Snakepit
sparrow hat geschrieben: 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),
    }
)


Die Bytewerte kommen aus der HD44780A00 Codepage bei [url="https://de.wikipedia.org/wiki/HD44780"]Wikipedia[/url].
[/quote]

So hatte ich es auch erst probiert, die Umlaute muss ich aber seltsamerweise als ascii übergeben und in Char dann wandeln. Nur so wird es richtig umgewandelt und auch dargestellt.

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

Verfasst: Mittwoch 24. Februar 2021, 20:00
von sparrow
@Snakepit: Bist du sicher, dass du es genau so probiert hast? Denn für das Umwandeln der Keys (in diesem Beispiel die Umlaute) ist "maketrans" da. Das ist kein "einfaches" dict, sondern eben die Rückgabe von str.maketrans().