Webradio - Laufschrift auf 16x2 LCD

  • Hallo und frohe Ostern,

    ich bin gerade dabei mit ein Webradio zu bauen und scheiter gerade am LCD-Display.

    Problem 1. Zeile: Künster + Titel können meistens nicht angezeigt werden da zu viele Buchstaben
    Problem 2. Zeile: Wie bekomme ich die aktuelle Uhrzeit (hh:mm) in die Zeile ?

    Aktuell sieht es so aus, dass der mpd stabil läuft. Radiosender und Mp3´s kann ich per mpdruid sehr gut ändern. An- und Ausschalter funktionieren und das Display wird angesprochen.

    Schön wäre es, wenn ich eine Laufschrift in der ersten Zeile hinbekommen könnte und diese sich alle 20 sec aktualisiert. und in der zweiten Zeile nur die Uhrzeit hätte.
    Ich habe mal gelesen, dass es nicht machbar ist die Zeilen unabhängig voneinander anzusprechen. Stimmt das ?
    Ich hätte auch kein Problem damit wenn beide Zeilen mit Laufschrift sind und wenn die Uhrzeit sich auch alle 20 sec (nur) aktualisiert.

    Kann mir jemand eventuell bei meinem Problem helfen ?

    Unten mein Script für das LCD Display. Ich hoffe, dass der Editor richtig angewendet wurde.

    Vielen Dank für eure Hilfe und einen schönen Ostermontag ![/php]

    [/code]
    #!/usr/bin/python
    #
    # Script for Raspberry Pi Internet Radio
    # Date : 10/01/2012

    import RPi.GPIO as GPIO
    import time
    import os

    # Die Zuordnung der GPIO Pins, wo die Pins des LC- Displays angeschlossen sind.
    LCD_RS = 7
    LCD_E = 8
    LCD_D4 = 25
    LCD_D5 = 24
    LCD_D6 = 23
    LCD_D7 = 18


    LCD_WIDTH = 16 # Deklarierung der Zeichen pro Zeile
    DISPLAY_LINE_1 = 0x80 # Adresse der ersten Display Zeile
    DISPLAY_LINE_2 = 0xC0 # Adresse der zweiten Display Zeile
    LCD_CHR = True
    LCD_CMD = False

    LCD_LINE_1 = 0x80 # Deklarierung der Adresse der ersten Zeile
    LCD_LINE_2 = 0xC0 # Deklarierung der Adresse der zweiten Zeile
    LCD_LINE_3 = 0x94 # Deklarierung der Adresse der dritten Zeile
    LCD_LINE_4 = 0xD4 # Deklarierung der Adresse der vierten Zeile

    # Zeitkonstanten
    E_PULSE = 0.00005
    E_DELAY = 0.00005

    def main():
    # Hauptprogrammblock

    GPIO.setmode(GPIO.BCM) # Use BCM GPIO numbers
    GPIO.setup(LCD_E, GPIO.OUT) # E
    GPIO.setup(LCD_RS, GPIO.OUT) # RS
    GPIO.setup(LCD_D4, GPIO.OUT) # DB4
    GPIO.setup(LCD_D5, GPIO.OUT) # DB5
    GPIO.setup(LCD_D6, GPIO.OUT) # DB6
    GPIO.setup(LCD_D7, GPIO.OUT) # DB7


    # Initialisieren der Anzeige
    lcd_init()
    # Ausgabe
    title = get_title()
    lcd_byte(LCD_LINE_1, LCD_CMD)
    lcd_string(title,1)
    # lcd_byte(LCD_LINE_1, LCD_CMD)
    # lcd_string("selber kleiner",2)
    lcd_byte(LCD_LINE_2, LCD_CMD)
    lcd_string("FUCKI",2)
    #lcd_byte(LCD_LINE_3, LCD_CMD)
    #lcd_string("by",2)
    #lcd_byte(LCD_LINE_4, LCD_CMD)
    #lcd_string("RPI-PROJEKT.de", 2)
    time.sleep(4)
    os.system("mpc play")

    def get_title():
    f=os.popen("mpc current")
    data = ""
    for i in f.readlines():
    data += i

    if len(data) <= 1:
    data = "N/A"

    data = data[data.find(":")+2:]
    data = data[:data.find("|")]
    data += " "

    return data


    def lcd_init():
    # Initialise display
    lcd_byte(0x33,LCD_CMD)
    lcd_byte(0x32,LCD_CMD)
    lcd_byte(0x28,LCD_CMD)
    lcd_byte(0x0C,LCD_CMD)
    lcd_byte(0x06,LCD_CMD)
    lcd_byte(0x01,LCD_CMD)

    def lcd_string(message,style):
    # Send string to display
    # style=1 Left justified
    # style=2 Centred
    # style=3 Right justified

    if style==1:
    message = message.ljust(LCD_WIDTH," ")
    elif style==2:
    message = message.center(LCD_WIDTH," ")
    elif style==3:
    message = message.rjust(LCD_WIDTH," ")

    for i in range(LCD_WIDTH):
    lcd_byte(ord(message[i]),LCD_CHR)

    def lcd_byte(bits, mode):
    # Send byte to data pins
    # bits = data
    # mode = True for character
    # False for command

    GPIO.output(LCD_RS, mode) # RS

    # High bits
    GPIO.output(LCD_D4, False)
    GPIO.output(LCD_D5, False)
    GPIO.output(LCD_D6, False)
    GPIO.output(LCD_D7, False)
    if bits&0x10==0x10:
    GPIO.output(LCD_D4, True)
    if bits&0x20==0x20:
    GPIO.output(LCD_D5, True)
    if bits&0x40==0x40:
    GPIO.output(LCD_D6, True)
    if bits&0x80==0x80:
    GPIO.output(LCD_D7, True)

    # Toggle 'Enable' pin
    time.sleep(E_DELAY)
    GPIO.output(LCD_E, True)
    time.sleep(E_PULSE)
    GPIO.output(LCD_E, False)
    time.sleep(E_DELAY)

    # Low bits
    GPIO.output(LCD_D4, False)
    GPIO.output(LCD_D5, False)
    GPIO.output(LCD_D6, False)
    GPIO.output(LCD_D7, False)
    if bits&0x01==0x01:
    GPIO.output(LCD_D4, True)
    if bits&0x02==0x02:
    GPIO.output(LCD_D5, True)
    if bits&0x04==0x04:
    GPIO.output(LCD_D6, True)
    if bits&0x08==0x08:
    GPIO.output(LCD_D7, True)

    # Toggle 'Enable' pin
    time.sleep(E_DELAY)
    GPIO.output(LCD_E, True)
    time.sleep(E_PULSE)
    GPIO.output(LCD_E, False)
    time.sleep(E_DELAY)

    if __name__ == '__main__':
    main()

  • Hallo.


    Schön wäre es, wenn ich eine Laufschrift in der ersten Zeile hinbekommen könnte und diese sich alle 20 sec aktualisiert. und in der zweiten Zeile nur die Uhrzeit hätte.
    Ich habe mal gelesen, dass es nicht machbar ist die Zeilen unabhängig voneinander anzusprechen. Stimmt das ?


    Das ist definitv falsch, du kannst jede Zelle adressieren.
    (DDRAM)= (D)isplay(D)ata(R)am(A)dress

    Das mit der Laufschift ist ebenfalls kein Problem.
    Lies mal das durch.
    Da steht es:
    Du machst entweder Cursor move oder Display shift.
    Deine Uhrzeit tickerst raus, indem du die Systemzeit liest, in nen String schreibst und den String raustickerst.
    Wenn du die Adressung mal genauer anguckst wird du feststellen dass die Zeile 3 quasi die Verängerung der Zeile 1, und die Zeile 4 die Verängerung der 2 ist..
    Die "Zeilenschaltung" liegt also bei dir.
    Aber wie gesagt... jede Zelle ist einzeln ansprechbar.

    gruß root

    Einmal editiert, zuletzt von root (6. April 2015 um 17:16)

  • root hat recht, das mit den 2 Zeilen und der Aktualisierung ist möglich. Versuch doch bitte nochmal Deinen Code in die Codeansicht zu bringen. Was für ein LCD-Display nutzt Du? Steuerst Du es direkt mit den GPIOs an oder hast Du einen Portextender (z.B. I²C) dazwischen?

  • Hey,
    vielen Dank für die schnellen Antworten.
    Also ich habe mir den Link (LCD Commands) einmal angeschaut. Ich finde das aber in meinem Script nicht wieder.

    Ich verwende ein 16x2 Display.


    [code=php]
    #!/usr/bin/python
    #
    # Script for Raspberry Pi Internet Radio
    #
    # Dateiname: lcd2.py
    #
    # Date : 06/04/2015

    import RPi.GPIO as GPIO
    import time
    import os

    # Die Zuordnung der GPIO Pins, wo die Pins des LC- Displays angeschlossen sind.
    LCD_RS = 7
    LCD_E = 8
    LCD_D4 = 25
    LCD_D5 = 24
    LCD_D6 = 23
    LCD_D7 = 18


    LCD_WIDTH = 16 # Deklarierung der Zeichen pro Zeile
    DISPLAY_LINE_1 = 0x80 # Adresse der ersten Display Zeile
    DISPLAY_LINE_2 = 0xC0 # Adresse der zweiten Display Zeile
    LCD_CHR = True
    LCD_CMD = False

    LCD_LINE_1 = 0x80 # Deklarierung der Adresse der ersten Zeile
    LCD_LINE_2 = 0xC0 # Deklarierung der Adresse der zweiten Zeile
    LCD_LINE_3 = 0x94 # Deklarierung der Adresse der dritten Zeile
    LCD_LINE_4 = 0xD4 # Deklarierung der Adresse der vierten Zeile

    # Zeitkonstanten
    E_PULSE = 0.00005
    E_DELAY = 0.00005

    def main():
    # Hauptprogrammblock

    GPIO.setmode(GPIO.BCM) # Use BCM GPIO numbers
    GPIO.setup(LCD_E, GPIO.OUT) # E
    GPIO.setup(LCD_RS, GPIO.OUT) # RS
    GPIO.setup(LCD_D4, GPIO.OUT) # DB4
    GPIO.setup(LCD_D5, GPIO.OUT) # DB5
    GPIO.setup(LCD_D6, GPIO.OUT) # DB6
    GPIO.setup(LCD_D7, GPIO.OUT) # DB7


    # Initialisieren der Anzeige
    lcd_init()
    # Ausgabe
    title = get_title()
    lcd_byte(LCD_LINE_1, LCD_CMD)
    lcd_string(title,1)
    lcd_byte(LCD_LINE_2, LCD_CMD)
    lcd_string("TEST",2)
    time.sleep(4)
    os.system("mpc play")

    def get_title():
    f=os.popen("mpc current")
    data = ""
    for i in f.readlines():
    data += i

    if len(data) <= 1:
    data = "N/A"

    data = data[data.find(":")+2:]
    data = data[:data.find("|")]
    data += " "

    return data


    def lcd_init():
    # Initialise display
    lcd_byte(0x33,LCD_CMD)
    lcd_byte(0x32,LCD_CMD)
    lcd_byte(0x28,LCD_CMD)
    lcd_byte(0x0C,LCD_CMD)
    lcd_byte(0x06,LCD_CMD)
    lcd_byte(0x01,LCD_CMD)

    def lcd_string(message,style):
    # Send string to display
    # style=1 Left justified
    # style=2 Centred
    # style=3 Right justified

    if style==1:
    message = message.ljust(LCD_WIDTH," ")
    elif style==2:
    message = message.center(LCD_WIDTH," ")
    elif style==3:
    message = message.rjust(LCD_WIDTH," ")

    for i in range(LCD_WIDTH):
    lcd_byte(ord(message[i]),LCD_CHR)

    def lcd_byte(bits, mode):
    # Send byte to data pins
    # bits = data
    # mode = True for character
    # False for command

    GPIO.output(LCD_RS, mode) # RS

    # High bits
    GPIO.output(LCD_D4, False)
    GPIO.output(LCD_D5, False)
    GPIO.output(LCD_D6, False)
    GPIO.output(LCD_D7, False)
    if bits&0x10==0x10:
    GPIO.output(LCD_D4, True)
    if bits&0x20==0x20:
    GPIO.output(LCD_D5, True)
    if bits&0x40==0x40:
    GPIO.output(LCD_D6, True)
    if bits&0x80==0x80:
    GPIO.output(LCD_D7, True)

    # Toggle 'Enable' pin
    time.sleep(E_DELAY)
    GPIO.output(LCD_E, True)
    time.sleep(E_PULSE)
    GPIO.output(LCD_E, False)
    time.sleep(E_DELAY)

    # Low bits
    GPIO.output(LCD_D4, False)
    GPIO.output(LCD_D5, False)
    GPIO.output(LCD_D6, False)
    GPIO.output(LCD_D7, False)
    if bits&0x01==0x01:
    GPIO.output(LCD_D4, True)
    if bits&0x02==0x02:
    GPIO.output(LCD_D5, True)
    if bits&0x04==0x04:
    GPIO.output(LCD_D6, True)
    if bits&0x08==0x08:
    GPIO.output(LCD_D7, True)

    # Toggle 'Enable' pin
    time.sleep(E_DELAY)
    GPIO.output(LCD_E, True)
    time.sleep(E_PULSE)
    GPIO.output(LCD_E, False)
    time.sleep(E_DELAY)

    if __name__ == '__main__':
    main()

    [/php]

    Ooooh noch was vergessen :)

    Ich steuer das display direkt an.

    Einmal editiert, zuletzt von grind666 (6. April 2015 um 18:58)

  • Hallo nochmal.


    Den code hast iwo abgekupfert oder ?:lol:

    Denn wenn du ein 16x2 Display hast sind die Zeilen "LCD_LINE_1 .... LCD_LINE_4" Unsinn
    die hast ja mit "DISPLAY_LINe_1 und 2 schon definiert da es 3 und 4 nicht gibt.

    Steuersequenzen die du in deinem Code vermisst nutzt du schon unbewusst bei der Initialisierung.

    Zu deinem Problemen.
    Wenn die Zeile 1 zu kurz ist, musst du eben den Text abkürzen.
    Für die Laufschrift wirist ohne viel Erfahrung ohne den Befehl "Display shift" nicht weit kommen.
    Es geht auch anders, aber dann musst du nach jedem Byte die komplette Zeile DDRAM nach rechts moven.(umständlich).

    Wie machst das Display wieder "leer" ?
    Lauter Blanks rauschschreiben ist eine Möglichkeit.
    CMD Commandos wie CLS und Curhome sind da eleganter.


    gruß root

    Einmal editiert, zuletzt von root (6. April 2015 um 19:53)

  • Hallo

    Root du hast recht. Das habe ich abgekupfert und soweit angepasst. Die Zeilen 3 und 4 muß ich noch raus nehmen.
    Das "Ur"-Script war nur für CPU und IP gedacht. War für mich schon ein Erlebnis das aktuelle Radioprogramm hinzubekommen.

    Also Laufschrift da zu integrieren ist also nicht so einfach... OK
    Ich werde noch ein wenig googlen und dann lasse ich mir was anderes einfallen :). Am einfachsten wäre ein längeres Display.

    Danke !

  • Hallo, ich habe das mal mit einem Hitachi kompatiblen Display HD47780 hinbekommen. Das Ganze erfolgt in 2 Teilen. Ein kleines C-Programm zur Ausgabe auf das Display und ein Shell Script für den Lauftext.


    Lauftext:


    Die passende Anleitung ist hier zu finden:

    http://blockhamster.blogspot.de/2013/10/lcd-display.html

    Einmal editiert, zuletzt von webhamster (7. April 2015 um 08:24)

  • Hallo. Ich poste dir einfach mal meinen ganzen Code. Dieser zeigt verschiedene Sachen an und es ist ganz am Ende auch eine Laufschritt dabei.

  • Hallo,
    also ich habe es aufgegeben mit der Laufschrift. Vielen dank für die Hilfe, aber ich habe schon wenig Plan von Python und dann direkt eine neue Sprache mit einbauen ist mir erstmal zuviel.
    Wenn ich mich bei Python erstmal sicherer fühle geht es bestimmt weiter. Das Internetradio soll ja nicht nur aus dem "Zugutenberg-Griff" Strg-C und Strg-V bestehen. Ich will das auch halbwegs raffen. Auch meine Fragen hier im Forum versuche ich nachzuvollziehen...
    Ich komme mal zum Punkt !
    Ich habe die Laufschrift aufgegeben und mir ein 36x2 langes Display zugelegt. Hier wird Interpret+Songtitel in der ersten Zeile angezeigt und Datum und Uhrzeit in der zweiten Zeile.
    Das klappt schon mal ganz gut.
    Jetzt möchte ich aber, dass sich jede Sekunde die Uhrzeit aktualisiert und das funktioniert irgenwie nicht. Kann mir da jemand behilflich sein ? Wo und wie mache ich eine Aktualisierung jede Sekunde ?

Jetzt mitmachen!

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