Luma.OLED display-drivers

      Geen reacties op Luma.OLED display-drivers

Luma.OLED is een serie display-drivers voor kleine monochrome oled-schermpjes. Ik kwam Luma.OLED bij toeval op het spoor, toen ik het oled-display (SSD1306) in mijn miniweerstation 180 graden wilde draaien. Ik bedacht toen, aangezien het display exact in het midden van de behuizing zit, dat het sneller en makkelijker zou zijn om alleen de inhoud van het scherm te roteren en niet het scherm zelf.

Niets bleek minder waar, na een tijd zoeken op internet kwam ik er op het forum van Adafruit achter dat de Adafruit_SSD1306-bibliotheek voor Python die ik in het miniweerstationproject gebruikt had, geen rotatie ondersteunt. Op het forum van Raspberry Pi vond ik de oplossing: niet de Adafruit-bibliotheek, maar de displaybibliotheek van Luma.OLED  gebruiken. Deze heeft wel een rotatiefunctie en zou gemakkelijk in het gebruik zijn. Daar komt nog bij dat de pigpio-daemon dan ook niet meer nodig is.

Leren

  • Luma.OLED drivers installeren
  • I2C oled display aansturen met Luma.OLED driver
  • scherminhoud roteren

Installatie

Het installeren van Luma.OLED en zijn afhankelijkheden is onder Pi OS (in mijn geval nog Buster)  erg simpel. Om te beginnen moet je in de Pi (via sudo raspi-config) de I2C-interface vrijschakelen.
De onderstaande installatiehandleiding is ontleend aan de documentatie van luna-oled en installeert de bibliotheek en zijn afhankelijkheden:

sudo -H pip3 install --upgrade luma.oled

Als pip de afhankelijkheden niet automatisch kan installeren, moet je het met de hand doen:

sudo apt-get update
sudo apt-get install python3 python3-pip python3-pil libjpeg-dev zlib1g-dev libfreetype6-dev liblcms2-dev libopenjp2-7 libtiff5 -y
sudo -H pip3 install luma.oled

luma.oled gebruikt hardware-interfaces waar permissions op zitten. Na installatie van luma.oled moet je het account (in ons geval pi) waarmee je luma.oled wilt gebruiken toevoegen aan de groep met toegangsrechten tot deze interfaces:

sudo usermod -a -G spi,gpio,i2c pi

Het onderstaande voorbeeldprogramma komt grotendeels ook uit de documentatie:

from time import sleep
from luma.core.interface.serial import i2c, spi, pcf8574
from luma.core.interface.parallel import bitbang_6800
from luma.core.render import canvas
from luma.oled.device import ssd1306, ssd1309, ssd1325, ssd1331, sh1106, ws0010

serial = i2c(port=1, address=0x3C)
device = ssd1306(serial)

with canvas(device) as draw: 
    draw.rectangle(device.bounding_box, outline="white", fill="black")
    draw.text((30, 40), "Hello World", fill="white")
sleep (60)

Het roteren komt als aanvulling achter device:

device = ssd1306(serial, rotate=2)   # rotate=2 is 180 graden

Niet-persistent display

De laatste regel: sleep (60) verraadt al dat de displayinhoud hier niet persistent is. Als het programma afloopt, wordt automatisch door de luma.oled-driver een clean-up van het display uitgevoerd. Dit staat haaks op de code van het miniweerstation, waarbij het python-script elk kwartier door cron opnieuw wordt uitgevoerd en de inhoud op het scherm blijft staan totdat het programma opnieuw wordt gestart. Een mogelijke workaround is te vinden bij de luma.core issues op Github door de cleanup() methode in de betreffende class over te slaan:

def do_nothing(obj):
    pass

serial = i2c(port=0)
device = s1106(serial)

device.cleanup = do_nothing

Maar in onze configuratie bleek dit helaas niet te werken.
Dus moet het python-script oneindig blijven lopen met een while-lus.

Conclusie

We blijven toch maar liever bij de oude opzet met de Adafruit-bibliotheek en crontab, met dien verstande dat we het display fysiek 180 graden draaien op het breadboard. De reden is dat het hele ombouwen van de software toch wat meer werk blijkt dan het omdraaien van het display.

Overigens is luma-oled wel interessant om er verder mee te experimenteren …

Nuttige links

Luma-oled documentatie
https://luma-oled.readthedocs.io/en/latest/ 

Lees meer over de cleanup() functie
https://luma-oled.readthedocs.io/en/latest/api-documentation.html

Voorbeeldcode
https://github.com/rm-hull/luma.examples