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
Pingback: BigClock - Avonturen met de Raspberry Pi