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

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

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: 13080
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Snakepit: Erstelle eine Übersetzungstabelle für die Zeichen die Du dann mit der `translate()`-Methode von Zeichenketten verwenden kannst.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

@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: 12
Registriert: Samstag 12. Juli 2014, 20:08

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: 4187
Registriert: Freitag 17. April 2009, 10:28

@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: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

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: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

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: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@__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: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

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: 13080
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

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: 12
Registriert: Samstag 12. Juli 2014, 20:08

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: 12
Registriert: Samstag 12. Juli 2014, 20:08

__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: 4187
Registriert: Freitag 17. April 2009, 10:28

@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: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@sparrow: Statt int("11100001", 2) kann man 0b11100001 schreiben.
Snakepit
User
Beiträge: 12
Registriert: Samstag 12. Juli 2014, 20:08

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.
Snakepit
User
Beiträge: 12
Registriert: Samstag 12. Juli 2014, 20:08

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.
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

@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().
Antworten