Formatierte Zahlendarstellung in einem LCD 1602-Display (I2C) unter MicroPython

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Ich beschäftige mich mit einer recht präzisen Messung (Periodendauermessung) niedriger Frequenzen. Das übliche Zählen der Umdrehungen in einer definierten Zeit (z.B. 1 Sekunde) ist gerade bei niedrigen Frequenzen ungenau (dies könnte nur über eine Verlängerung der Meßdauer verbessert werden)., Die Anzeige ist auf Grund der großen Meßintervalle recht träge. Möchte diese Messung zur Drehzahlanzeige einer Oberfräse nutzen.

    Im Moment hänge ich an der formatierten Darstellung auf dem LCD-Display 1602.

    Im Programmwird die Periodendauer entsprechend der 0,5 Regel gerundet. Ich möchte erreichen, daß die Periodendauer mit 4 Vorkomma- und 4 Nachkommastellen angezeigt wird, wobei keine führende Vor-Null, aber die Nachkommastellen ggfs. mit "angehängten" Nullen aufgefüllt werden (es sollen also immer 4 Nachkommastellen sichtbar sein).

    Die errechnete Drehzahl benötigt keine Formatierung, da nur Ganzzahlwerte ausgegeben werden sollen. Hierfür genügt die Rundung selbst.

    Die Formatierung über den "print"- Befehl habe ich verstanden. Das LCD wird aber mit "putstr"(....) gefüttert. Lässt sich hier auch eine entsprechende Formatierung einfügen oder muß ich den gerundeten Zahlenwert zuvor formatieren und dann in einen String umwandeln? HILFE!!!

    Fliegen heißt Landen: Wenn es gut geht, geht es gut. Wenn es aber schlecht geht, geht es richtig schlecht! :angel:

  • Formatierte Zahlendarstellung in einem LCD 1602-Display (I2C) unter MicroPython? Schau mal ob du hier fündig wirst!

  • Hallo,

    welches Modul nutzt du? Wenn ich das richtige gefunden habe, dann steckt hinter 'putstr' folgender Code:

    Code
       def putstr(self, string):
            """Write the indicated string to the LCD at the current cursor
            position and advances the cursor position appropriately.
            """
            for char in string:
                self.putchar(char)

    Das heißt, du musst deinen Wert formatiert und als String an 'putstring' übergeben.

    Eventuell können wir besser weiterhelfen, wenn du uns deinen Code zeigst, die verwendeten Bibliotheken und eventuell die Hardware.

    Grüße

    Dennis

    🎧 With the music execution and the talk of revolution, it bleeds in me and it goes 🎧

  • Hallo Dennis89, hallo Tell,

    freue mich sehr über die schnelle Antwort. Ich stelle die gewünschten Informationen zusammen. Auf den ersten Blick sieht es so aus, daß das von Dennis89 gefundene Modul das richtige ist...

    Melde mich im Laufe des Tages zurück

    Fliegen heißt Landen: Wenn es gut geht, geht es gut. Wenn es aber schlecht geht, geht es richtig schlecht! :angel:

  • Im Anhang habe ich die verwendeten Bibliotheken / Module beigefügt. In meinem Programm sieht die Ausgabe so aus:

    # Anzeige auf LCD-Display 1602 (je 16 Zeichen / 2 Zeilen) mit I2C (Chip: HD44780)

    tms_displ = int((tms*100) + 0.5) / 100 # Rundung der Periodendauer auf 2 Nachkommastellen

    rpm_displ = int(rpm + 0.5) # Rundung der Drehzahl auf ganze Zahlen für die Anzeige

    # 1. Zeile

    lcd.move_to(0,0) # Cursor-Position: 1. Stelle der 1. Zeile (Achtung: Nummerierung beginnt für Stelle und Zeile mit 0)

    lcd.putstr("Periode:"+str(tms_displ)+" ms")

    # 2. Zeile

    lcd.move_to(0,1) # Cursor-Position: 1. Stelle der 2. Zeile (Achtung: Nummerierung beginnt für Stelle und Zeile mit 0)

    lcd.putstr(str(rpm_displ) + " U/min")

    Im ersten Teil sind die Rundungen für die beiden Anzeigewerte zu sehen. Ich wende damit die übliche Rundungsregel (<0,5 = 0 / >= 0,5 = 1) an.

    Die in Python vorhandenen "Rundungen" gefallen mir überhaupt nicht!

    Bei der Ausgabe auf das LCD arbeite ich mit den "lcd.move_to"- Befehlen, weil das oft gezeigte "\n" bei meinem Display nichts bewirkt (ich vermute, daß es ein CR sein soll).

    Die Anzeige der Periodendauer wird im fertigen Projekt nicht mehr vorhanden sein, war aber für den Test der Periodendauermessung wichtig und hat mich auf das Formatierungsproblem gestoßen.

    Welche Bibliotheken könnten alternativ verwendet werden? Mich verwundert neben dem nicht funktionierenden "\n", daß ich scheinbar keine Real- oder Integerwerte direkt ausgeben kann, sondern diese immer erst in einen String wandeln muß.

    Hardware: Raspberry Pi Pico und LCD 1602 mit I2C

    Programmiersoftware: Thonny

  • Hallo,

    ich bin gerade nicht an meinem PC und kann deswegen deine Dateien erst heute Abend herunter laden.

    Alternativ kannst du alle Module verwenden, die du im Internet findest. Ich habe so ein Display selbst nicht im Einsatz und kann deswegen keine Erfahrungen mit dir teilen.

    daß ich scheinbar keine Real- oder Integerwerte direkt ausgeben kann, sondern diese immer erst in einen String wandeln muß.

    Weil in 'putstr' über das was du an das Display sendest iteriert wird. Über Integerwerte kann man nicht iterieren.

    Das ist notwendig, weil jedes einzelne Zeichen nach einander auf das Display geschrieben wird. Also entweder musst du einen String übergeben.

    Du siehst in 'putstr' dass jedes Zeichen (dort als char bezeichnet) an 'putchar' übergeben wird. Diese Funktion überprüft die Zeichen und eigentlich sollte sie das '\n' auch erkennen, siehe:

    Je nach Bedingung wird dann pro Zeichen eine Aktion ausgeführt, also Zeilensprung, Zeichen im Display darstellen etc.

    Das geht eben nur, wenn Zeichen für Zeichen eingelesen wird. Du müsstest die Logik des Moduls teilweise ändern, wenn du keinen String übergeben willst, aber ob das Sinn macht?

    Um sicher zu sein, das wir bei dem gleichen Modul sind, ich habe den Code von hier:

    python_lcd/lcd at master · dhylands/python_lcd · GitHub

    Grüße

    Dennis

    Edit: Es scheint sich um das gleiche Modul zu handeln.

    🎧 With the music execution and the talk of revolution, it bleeds in me and it goes 🎧

    Einmal editiert, zuletzt von Dennis89 (9. August 2021 um 23:17)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!