Jump to content

Python 3.2.3 + LCD 20*4


Recommended Posts

Moin Moin,

heute kam meine neue Bestellung mit dem 20x4 LCD Display. Da habe ich mich gleich ran gesetzt und erstmal die Beispielscripte getestet.

Bei Python 3.2.3 verweigert das Script seine Tätigkeit, das Display geht an aber den write Befehl führt er nicht aus. Hier das angepasste Script:

 

 

#!/usr/bin/env python

# -*- coding: utf-8 -*- 

 

HOST = "localhost"

PORT = 4223

UID = "7Yo" # Change to your UID

 

from ip_connection import IPConnection

from bricklet_lcd_20x4 import LCD20x4

 

if __name__ == "__main__":

    ipcon = IPConnection(HOST, PORT) # Create ip connection to brickd

 

    lcd = LCD20x4(UID) # Create device object

    ipcon.add_device(lcd) # Add device to ip connection

    # Don't use device before it is added to a connection

 

    # Turn backlight on

    lcd.backlight_on()

 

    # Write "Hello World"

    lcd.write_line(0, 0, 'Hello World')

 

    input('Press key to exit\n') # Use input() in Python 3

    ipcon.destroy()

 

und der Fehler:

 

Traceback (most recent call last):

  File "C:\Users\Adrian\Desktop\tinker\example_hello_world.py", line 22, in <module>

    lcd.write_line(0, 0, 'Hello World')

  File "C:\Users\Adrian\Desktop\tinker\ip_connection.py", line 67, in func

    return f(self, *args, **kwargs)

  File "C:\Users\Adrian\Desktop\tinker\bricklet_lcd_20x4.py", line 46, in write_line

    self.ipcon.write(self, LCD20x4.TYPE_WRITE_LINE, (line, position, text), 'B B 20s', '')

  File "C:\Users\Adrian\Desktop\tinker\ip_connection.py", line 244, in write

    write_data += struct.pack('<' + f, d)

struct.error: argument for 's' must be a bytes object

 

Unter 2.7 tritt der Fehler nicht auf.

Ich kann leider mit dem Fehler nicht viel anfangen.

 

Link zu diesem Kommentar
Share on other sites

Achso. Nun gut ich habe jetzt noch mal in Java das ganze geschrieben. Da habe ich das Problem nicht mehr.

Nun stehe ich aber vor einer neuen Frage:

Welche Zeichen kann ich darstellen? Konkret: kann es nicht ° darstellen. Bei Python bekomme ich irgendeine Fehlermeldung (hab das an der Stelle nicht weiterverfolgt) und bei Java wird ein Minus angezeigt.

Link zu diesem Kommentar
Share on other sites

Wir benutzen den KS0066U LCD Controller mit dem Standard English/Japanese Zeichensatz.

 

Hier gibt es eine Tabelle mit dem Zeichensatz: http://www.display-elektronik.de/CHAR_KS0066-00(Engl-Japan).PDF

 

0b11011111 sieht aus wie ein °.

 

Also in Python z.B.

lcd.write_line(0, 0, chr(0b11011111))

(habs gerade getestet, es funktioniert so)

Link zu diesem Kommentar
Share on other sites

Ist es nicht möglich den Zeichensatz transparent mappen zu lassen? Ich müsste mir das mal anschauen, aber beispielsweise bieten ja die OutputStreamWriter an nen zeichensatz zu spezifizieren...

 

Ergänzung:

Im Moment sieht der Code zum Schreiben des Strings so aus:

for(int i = 0; i < 20; i++) {
try {
	bb.put((byte)text.charAt(i));
} catch(Exception e) {
	bb.put((byte)0);
}
}

 

Also vollkommen frei von Encoding-Gedanken.

String definiert auch die Methode public byte[] getBytes(String charsetName). Da gibt es dann ein Array von Bytes das nach einem spezifischen Zeichensatz dargestellt wird. Dieses byte-array ließe sich dann in den ByteBuffer schieben. Für den Fall, dass das CharSet schlecht unterstützt wird kann man wohl auch einen eigenen CharsetEncoder schreiben, habe ich aber noch nie gemacht ^^

 

P.S.: Habe noch nicht geprüft wie gut sich eine solche Ändeurng mit dem Code-Generator verträgt.

Link zu diesem Kommentar
Share on other sites

Ja mir ist auch schon aufgefallen, dass via BrickV Sonerzeichen wie die deutschen (ä, ö, ü, ß) und auch das °-Zeichen für 25°C sich nicht schreiben lassen. Da passiert dann einfach nichts...

 

Mit C# oder ähnlichen hab ich das LCD noch nicht traktiert, da ich das erst seit heut Vormittag am Tisch liegen hab :-)

 

ich weiß nur von PHP dass man halt eine Konvertierung in den entsprechenden Zeichensatz vornehmen muss. Wär natürlich cool, wenn die entsprechende Bricklet-Klasse standardmäßig UTF-8 entgegen nimmt und dann anschließend in den passenden Zeichensatz des KS0066U konvertiert. Entweder es gibt nen sprachspezifischen Weg zur Konvertierung oder via Mapping...

 

Gruß

Christian

Link zu diesem Kommentar
Share on other sites

  • 2 weeks later...

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Reply to this topic...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...