(e-paper) infoscherm met Python widgets

Projectje van een tijdje terug, maar wel leuk om hier te laten zien.

Ik heb een mooi 6" e-paper schermpje gekocht, en deze samen met een Pi Zero W in een custom geprintte behuizing gestopt.
Het geheel staat op mijn bureau zodat ik in een oogopslag zaken als de weersvoorspelling, buienradar, mijn kalender en MQTT sensordata kan zien. Er is ook een digitaal klokje die met partial refreshes elke seconde kan updaten.

Software

GitHub - Kartoffel/infodisplay

Aan de software kant heb ik veel tijd besteed om te proberen de widgets zo modulair en makkelijk herconfigureerbaar en uitbreidbaar te maken.
Alles is voor Python 3.7 geschreven, en voor de grafische kant wordt gebruik van de pillow package.

In een config file stel je in welke widgets je wilt gebruiken, en in welke kolommen/rijen van een grid systeem die terecht moeten komen. Hier pas je ook de widget-specifieke instellingen aan, en er zijn een aantal globale instellingen zoals het type display (of een PNG output voor development) en lijnen of kaders om de widgets te scheiden.

Het hoofdproces leest de config in en deelt het scherm in stukjes op aan de hand van de config file. De widgets zijn individuele classes, en worden één voor één geïmporteerd en geïnitialiseerd. De widgets krijgen allemaal een stukje PIL Image canvas mee die ze volleidg mogen vullen.

Het hoofdproces draait een service loop waarin die in de gaten houdt wanneer bepaalde widgets opnieuw getekend moeten worden. De widgets die opnieuw getekend moeten worden krijgen een seintje om dat te doen, en krijgen een datetime mee van het tijdstip in de toekomst dat ze op het display zullen verschijnen. Het tekenproces gebeurt in threads zodat de service loop door kan gaan, en het display niet vast komt te hangen op één trage of kapotte widget.
Wanneer een widget klaar is met tekenen plakt het hoofdproces de kleine widget-canvas op een globale canvas voor het hele display. De globale canvas wordt op het juiste moment naar het display gestuurd om getoond te worden.

Er wordt onderscheid gemaakt tussen ‘snelle’ en normale widgets. De normale widgets hebben een instelbare update rate die tot eens per minuut gaat, snelle widgets worden in beginsel elke seconde geüpdatet.
Als je een display hebt dat het bij kan houden is dit handig voor bijvoorbeeld een klok met secondewijzer. Let met e-paper wel op dat je het advies om na elke x snelle refreshes een volledige refresh moet doen echt moet volgen. Ik deed dat niet, en heb nu een permanente grijze vlek in de hoek waar de secondes van mijn digitale klok stonden :\

Ik heb een iets technischere uitleg in de README op GitHub staan, met specifieke pointers waar je kunt kijken als je zelf een widget wilt bouwen. Je vindt daar ook de installatie-instructies.

Build log

TODO: WIP foto’s toevoegen

Toekomstplannen

Widgets

Het idee is natuurlijk dat iedereen met relatief gemak een widget kan schrijven, maar ik ben zelf in ieder geval nog met een OV widget bezig. Die werkt met de vertrektijd.info API om live vertrektijden van tram-, metro- en bushaltes te laten zien.

Daarnaast is @jelle voor zijn (kuch ongedocumenteerde) e-paper infoschermpje volgens mij nog bezig om een ‘binding’ aan de kalender widget toe te voegen voor koppeling met andere kalenders dan Google Calendar.

Display

Het specifieke display dat ik gebruik wordt helaas niet meer door Waveshare verkocht. Jammer, want de meeste andere displays voldoen niet aan mijn wensen voor grijstinten en snelle partial refreshes.

TODO: plan voor USB (ESP32) displays - vraag naar libraries voor framebuffer over USB-serial

4 Likes

Ohja hier had ik ook ooit nog toffe ideeen voor die maar niet van de grond komen :frowning: