Waveshare ePaper Display

  • Hi Leute,

    ich verzweifle gerade ein bisschen...

    Hat von euch jemand ein Waveshare ePaper Display im Einsatz? Ich habe ein 5.83 ePaper V2 (einfarbig) im Einsatz und versuche eigentlich nur das ein .bmp dort angezeigt wird und dies später z.B. alle 5 Minuten aktualisiert wird.

    Leider schaffe ich es nicht einmal das überhaupt etwas auf dem ePaper angezeigt wird (außer die Demo, die läuft wunderbar durch ;))

    Hat von euch jemand schon sowas gemacht und könnte mir die .py zur Verfügung stellen bzw. meinen Code anpassen?

    Hier wäre das mit dem gerade probiere.

    ___________________________________________

    import os

    import time

    from lib.waveshare_epd import epd5in83_V2

    from PIL import Image, ImageDraw, ImageFont

    pic_dir = 'pic' # Points to pic directory .

    try:

    # Display init, clear

    display = epd5in83_V2.EPD()

    display.init(display.lut_full_update)

    display.Clear(0) # 0: Black, 255: White

    w = display.height

    h = display.width

    print('width:', w)

    print('height:', h)

    # Show VIS Picture

    time.sleep(3) # Pause for 3 seconds.

    ScreenshotVISWeahter = Image.open('pic/ScreenshotVISWeahter.bmp')

    image.paste(ScreenshotVISWeahter, (0, 0))

    display.display(display.getbuffer(image)) # Update display

    except IOError as e:

    print(e)

    ___________________________________________

    Hier meckert er z.B. an dem display.lut_full_update in line 10 das es dieses Attribut nicht gibt.

    Wie schon gesagt tue ich mir unglaublich schwer, da es fast keine Anleitungen etc. gibt.

  • Bitte Code immer im Codeblock, sonst gehen die Einrückungen flöten! (Ein Klick auf und den Code dort einfügen.)

    Ausgaben und oder Fehlermeldungen bitte ebenfalls in einem Codeblock und komplett zeigen.


    Was mir hier auffällt

    ScreenshotVISWeahter = Image.open('pic/ScreenshotVISWeahter.bmp')

    Verwende absolute Pfade, z.B. /home/pi/pic/ScreenshotVISWeahter.bmp, falls das der Pfad zu dem Bild sein sollte.


    //Edit: Bitte zeige uns auch mal einen Link zur Doku des Display und zum Beispielskript.

  • Oh sorry.

    Hier nochmal vernünftig

    Dokumentation wäre hier:

    5.83inch e-Paper HAT - Waveshare Wiki

    Das Beispielscript wäre:

    Vielen, Vielen Dank euch.

  • Ich würde es anhand des Beispielskriptes mal auf das Wesentliche beschränken.

    Ungetestet und hoffe ich habe nichts übersehen.

  • Hallo,

    'os' wird importiert aber nicht genutzt, ebenso wie 'ImageDraw' und 'ImageFront'

    'pic_dir' ist eine Konstante, sollte daher GROSS_GESCHRIEBEN werden und mit 'pathlib' ein absoluter Pfad erstellt werden.

    'w' und 'h' sind keine schönen Namen, es kostet nicht mehr, den Name vollständig auszuschreiben, da du die Namen aber eh nicht verwendest, kannst du die Ausgabe direkt machen

    Verwende für 'Image.open' dann den erstellten Pfad.

    'image' ist nicht definiert, da sollte wohl etwas anderes stehen? Oder zumindest 'Image'?

    Hier meckert er z.B. an dem display.lut_full_update in line 10 das es dieses Attribut nicht gibt.

    Woher weist du, dass es das gibt bzw. zu was brauchst du das?

    Ich konnte das auf die Schneller hier nicht finden.

    Habe den weiteren Code von dir nicht überprüft, sondern nur übernommen.

    Grüße

    Dennis

    Edit: da war ich wohl etwas zu langsam :sleepy:

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

    Einmal editiert, zuletzt von Dennis89 (11. September 2021 um 15:11)

  • Ich würde es anhand des Beispielskriptes mal auf das Wesentliche beschränken.

    Ungetestet und hoffe ich habe nichts übersehen.

    Danke euch zwei schonmal. Bin jetzt dazu gekommen es zu testen. Wie ihr sicher merkt habe ich vom dem phyton gar keine Ahnung. Will ja auch nur ein Bild auf ein ePaper bringen ;)

    Bei deinem Code hyle blinkt/refresht der Bildschirm zumindest schon dreimal. Keine Ahnung ob es am Bild liegt, ist auch nur 1.1MB groß und hat auch genau die Maße des ePapers. Ich habe es mal als Dateianhang angehängt. Wie schon gesagt nur ein Testbild.

    Habt ihr noch Idee?

    Wäre super glücklich wenn wir das hinbringen könnten.

    Wie schon gesagt am Ende soll alle 5 Minuten ein refresh stattfinden und das Bild neugeladen werden.

    Vielen Dank euch nochmal

  • Moin!

    Ich denke du hast einige wichtige Teile nicht in deinem Code drin.

    Hier mal ein Auszug aus dem Beispielcode, der ja bei dir funktioniert.

    Code
    HBlackimage = Image.new('1', (epd.width, epd.height), 255)  # 648*480

    Hier wird die Buffergröße für das Bild festgelegt. Fehlt bei dir komplett.

    Spoiler anzeigen

    In dem Spoiler ist der Testcode. Ist aber Text und Grafik.

    73 de Bernd

    Ich habe KEINE Ahnung und davon GANZ VIEL!!
    Bei einer Lösung freue ich mich über ein ":thumbup:"
    Vielleicht trifft man sich in der RPi-Plauderecke.
    Linux ist zum Lernen da, je mehr man lernt um so besser versteht man es.

  • Und genau da ist das Problem. Ich habe hierzu einfach viel zu wenig Ahnung was hier fehlen könnte ;(

  • Moin draexler,

    ich kann dir da leider nicht weiterhelfen. Kann kein Python!

    Habe aber ein E-Paper in C programmiert.

    Es muss Speicher für Alles was auf dem Display dargestellt werden soll, reserviert werden.

    Das dein Display blinkt, hat wahrscheinlich mit epd.display(epd.getbuffer(Himage)) zu tun. Nur das nichts dargestellt wird.

    Hoffen wir mal auf die Python-Experten... ;-))

    73 de Bernd

    Ich habe KEINE Ahnung und davon GANZ VIEL!!
    Bei einer Lösung freue ich mich über ein ":thumbup:"
    Vielleicht trifft man sich in der RPi-Plauderecke.
    Linux ist zum Lernen da, je mehr man lernt um so besser versteht man es.

  • Also von den Tests, und was der "Code" bis jetzt macht funktioniert das Initiale Clear (dreimal Wechsel Schwarz/Weiß). Vermutlich weil der Code anläuft. Es kommt dann zu einer ca. 10 Sekündigen Pause was zu dem "time.sleep(10)" passen würde, und dann nochmal ein Refresh/Clear (dreimal schwarz/weiß Wechsel) "epd.Clear()".

    Also deutet es darauf hin nur der Teil mit dem Bild einlesen und anzeigen das Problem macht.

    Das wäre der aktuelle Code mit dem dies passiert:

  • Die Zeile 12 macht keinen Sinn. Da wird ein `Image`-Objekt erstellt das nie irgendwo verwendet wird. Der Hinweis darauf ist Unsinn. Natürlich erstellt auch das laden eines Bildes aus einer Datei den Puffer in den das Bild geladen wird, in der Grösse, die das Bild braucht/belegt.

    Die Bilddatei hat aber beispielsweise schon mal nicht die Pixelabmessungen 648×480 und ist auch keine S/W-Bitmap, sondern ein RGBA-Bild:

    Python
    In [260]: from PIL import Image                                                  
    
    In [261]: image = Image.open("Downloads/ScreenshotVISWeahter.bmp")               
    
    In [262]: image.size                                                             
    Out[262]: (600, 448)
    
    In [263]: image.mode                                                             
    Out[263]: 'RGBA'

    Ich vermute mal stark, dass das wichtig ist, die richtige Menge an Daten im richtigen Format an das Display zu füttern.

    “Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”

  • Also es liegt am Bild. Ich habe es jetzt einfach mal mit dem Testbild aus der Testdemo getestet und das wird angezeigt.

    Auch habe ich die Zeile 12 rausgenommen.

    Jetzt ist die Frage wie ich ein Bild so umwandeln kann das es passt... Umwandeln tue ich mit Magick und "

    convert ScreenshotVISWeahter.png -depth 1 ScreenshotVISWeahter.bmp"

    Einmal editiert, zuletzt von draexler (13. September 2021 um 07:48)

  • So habe es jetzt hinbekommen. Problem war tatsächlich die Bildgröße das die nicht gepasst hat. Dachte eigentlich das ich ich das richtig gemacht hatte und habe es nicht mehr kontrolliert.

    Was ich auch getestet habe ist ob ich ohne Umwege direkt das PNG File nehmen kann und das ich auch möglich :)

    Also bräuchte ich jetzt nur noch die Schleife das dauert alle X Sekunden/Minuten ein Refresh stattfindet. Das wäre MEGA.

    Danke euch.

    Hätte nicht gedacht das es so eine schwere Geburt wird.

  • Für mehrere Minuten würde ich statt einer Schleife im Skript eher einen Cronjob einrichten, der das Skript alle x Minuten laufen lässt.

    Was passiert, wenn Du das Skript jetzt nach ein paar Minuten neu startest? Funktioniert es dann und bleibt das Bild erhalten, bzw. wird dann das neue Bild angezeigt?

  • Für mehrere Minuten würde ich statt einer Schleife im Skript eher einen Cronjob einrichten, der das Skript alle x Minuten laufen lässt.

    Was passiert, wenn Du das Skript jetzt nach ein paar Minuten neu startest? Funktioniert es dann und bleibt das Bild erhalten, bzw. wird dann das neue Bild angezeigt?

    Die Anzeige verschwindet für ein paar Sekunden. Ich denke mit einer Schleife habe ich halt maximal das kurze Schwarz/Weiß Refresh "blinken"

  • Also bräuchte ich jetzt nur noch die Schleife das dauert alle X Sekunden/Minuten ein Refresh stattfinde

    Wenn dabei das Bild auch neu geladen werden soll, falls sich das ändert(?), dann könntest du es so probieren. Ansonsten muss das 'image=...' nicht in die Schleife.

    Ungetestet:

    Grüße

    Dennis

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

  • Wenn dabei das Bild auch neu geladen werden soll, falls sich das ändert(?), dann könntest du es so probieren. Ansonsten muss das 'image=...' nicht in die Schleife.

    Ungetestet:

    Grüße

    Dennis

    Startet leider nur kurz an und es passiert nichts :(

    Ich mache es darüber und lasse es dann über einen Cronjob neu anlaufen.

    So funktioniert es gerade recht schön.

    Auf jeden Fall allen Beteiligten ein ganz großes Dankeschön :bravo2:

Jetzt mitmachen!

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