Bij de Raspberry Pi GPIO-pinnen en Python kun je een event-lus gebruiken om de toestand van pinnen te controleren. Als je daar asynchrone functies bij gebruikt werkt het nog beter.
Het eerdere voorbeeld in het artikel over de toestand van de GPIO-pinnen uitlezen sjoemelt een beetje, omdat het een oneindige while-lus bevat met een sleep()-commando. Je kunt dat verbeteren door asynchrone functies te gebruiken bij event-lussen.
Event-lussen met GPIO-pinnen in Python
De oneindige while-lus met sleep()-commando zoals we die in het eerdere voorbeeld gebruikten is niet optimaal. De belasting die dat oplevert is te verwaarlozen, maar een nette oplossing is om de while-lus te vervangen door de volgende constructie met asynchrone functies:
try:
loop = asyncio.get_event_loop()
loop.run_forever()
except:
loop.close()
Aan het begin van het programma, dat je in zijn geheel kunt downloaden bij de link onderaan de pagina, wordt hiervoor de bibliotheek voor asynchrone input/output geladen met import asyncio.
Die bibliotheek is erg handig voor event-lussen in je eigen Python-programma’s.
Ontvang gratis workshops over Raspberry Pi en Python, schrijf je in voor de nieuwsbrief:
De bibliotheek voor asynchronone functies gebruiken
De bibliotheek voor asynchrone functies is de sleutel tot event-driven programmeren. Daarbij kunnen functies asynchroon parallel worden uitgevoerd op bijvoorbeeld processors met meerdere kernen, zoals in de Raspberry Pi 4.
Gewoonlijk bevatten dergelijke programma’s slechts een paar regels voor initialisatie en een groot aantal functies die dienen als event-handlers.
Tijdens het initialiseren wordt de event-loop aangemaakt, bijvoorbeeld met de functie get_event_loop() en vervolgens worden, zo nodig, event-handlers geregistreerd.
Daarna zorgt de functie run_forever() ervoor dat het programma blijft lopen, ook als er op dat moment geen commando’s zijn om uit te voeren.
Als er later taken bijkomen, worden die aan de lopende event-loop toegevoegd en verwerkt zodra ze aan de beurt komen.
Voorbeeldproject downloaden
In c’t 4/2022 vind je het complete Python-voorbeeldproject beschreven, waarbij we een voetschakelaar aansluiten op de GPIO-pinnen van de Raspberry Pi om het programma OBS-studio aan te sturen.
De complete Python-code, waarin een event-lus met asychrone functies wordt gebruikt, kun je downloaden en als voorbeeld gebruiken voor je eigen code.
Meer doen met de Raspberry Pi GPIO-pinnen
De Raspberry Pi dankt zijn succes in de hobbywereld aan zijn GPIO-aansluitingen. Met de juiste Python-bibliotheek en onze instructies lukken zelfs complexe taken.
In de inleiding Raspberry Pi GPIO pinnen: een overzicht van de aansluitingen wordt de lay-out van de GPIO-pinnen beschreven.
In deze serie komen de volgende onderwerpen aan bod:
- Led schakelen met GPIO-pinnen
- Bouncetime
- Toestand van een pin uitlezen
- Asynchrone functies (deze pagina)
- Potentiaal van de pin
- Project met voetschakelaar
Meer projecten voor de Raspberry Pi vind je bij Raspberry Pi projects
(Deze informatie is afkomstig uit het artikel in c’t 4/2022, pagina 134, van Mirko Dölle en Marco den Teuling)