ESP32 - Rotary Encoder
In deze handleiding leert u hoe u een rotary encoder gebruikt met een ESP32. Dit is wat we zullen behandelen:
- Wat zijn de verschillen tussen een rotary encoder en een potentiometer
- Hoe de rotary encoder werkt
- Hoe u de rotary encoder aansluit op de ESP32
- Hoe u code schrijft voor de ESP32 om richting en positie van de rotary encoder uit te lezen ZONDER interrupt.
- Hoe u code schrijft voor de ESP32 om richting en positie van de rotary encoder uit te lezen MET interrupt.
Hardware Benodigdheden
Of u kunt de volgende kits kopen:
| 1 | × | DIYables Sensorkit (30 sensoren/displays) | |
| 1 | × | DIYables Sensorkit (18 sensoren/displays) |
Over Rotary Encoder
Een draai-knop, zoals op een radio, kan signalen uitsturen die omgezet worden in elektrische signalen. Dit helpt ons te weten hoeveel hij gedraaid is en waar hij staat. Er zijn twee hoofdtypen:
- Incrementele encoder: deze gebruikt snelle pulsen om te meten hoeveel een positie veranderd is.
- Absolute encoder: dit type geeft een unieke code voor elke positie, wat helpt om exact te weten waar iets is, ook als de stroom uitvalt.
Deze les gaat vooral over het eerste type, de incrementele encoder.
Rotary Encoder Module Pinout

Een rotary encoder module heeft 4 pins:
- CLK pin (Output A): is de hoofd-puls die ons vertelt hoeveel rotatie heeft plaatsgevonden. Elke keer dat u de knop met een klik (detent) draait in welke richting dan ook, geeft de CLK pin een signaal dat een volledige cyclus voltooit (LOW → HIGH → LOW).
- DT pin (Output B): werkt vergelijkbaar met de CLK pin maar het signaal loopt 90 graden achter op het CLK signaal. Dit helpt ons om te bepalen in welke richting (met de klok mee of tegen de klok in) gedraaid wordt.
- SW pin: komt van de knop in de encoder. Deze is normaal open. Als we een pull-up weerstand aan deze pin toevoegen, is de SW pin HIGH als de knop niet ingedrukt is en LOW als hij wel ingedrukt is.
- VCC pin (+): moet aangesloten worden op VCC (tussen 3.3 en 5 volt)
- GND pin: moet aangesloten worden op GND (0V)
Rotary Encoder vs Potentiometer
U kunt een rotary encoder verwarren met een potentiometer, maar het zijn verschillende componenten. Hier een vergelijking:
- Een rotary encoder is als een moderne versie van een potentiometer maar kan meer.
- Een rotary encoder kan een volledige cirkel ronddraaien zonder te stoppen, terwijl een potentiometer ongeveer drie kwart van een cirkel kan draaien.
- Een rotary encoder levert pulsen (digital signals), een potentiometer levert analoge spanning.
- Een rotary encoder is handig als u alleen wilt weten hoeveel de knop is verplaatst, niet exact waar hij staat. Een potentiometer is nuttig als u precies wilt weten waar een knop staat.
Hoe werkt een Rotary Encoder

Binnenin de encoder zit een schijfje met uitsparingen dat verbonden is met een pin genaamd C, die functioneert als een gedeelde massa (ground). Verder zijn er twee pins, A en B.
- Wanneer u de knop draait, maken pinnen A en B contact met die gedeelde grondpin C, maar in welke volgorde ze dat doen hangt af van de draairichting (met de klok mee of tegen de klok in).
- Deze contacten creëren twee signalen die iets in timing verschillen omdat de ene pin eerder dan de andere contact maakt. Deze signalen lopen 90 graden uit fase ten opzichte van elkaar, dit heet quadratuur codering.
- Als u de knop met de klok mee draait, maakt pin A als eerste contact met de grond, daarna pin B. Draait u tegen de klok in, dan maakt pin B eerst contact voordat pin A dat doet.
- Door te controleren wanneer elke pin contact maakt of verbreekt, kunnen we bepalen in welke richting de knop draait. Dit doen we door te kijken wat er gebeurt met pin B als pin A verandert.

Wanneer A van LOW naar HIGH gaat:
- Als B HIGH is, wordt de knop tegen de klok in gedraaid.
- Als B LOW is, wordt de knop met de klok mee gedraaid.
※ Notiz:
Pin A en B zijn verbonden met respectievelijk CLK en DT pins. Afhankelijk van de fabrikant kan de volgorde verschillen. De hieronder gegeven codes zijn getest met de rotary encoder van DIYables.
Hoe Programmeert u de Rotary Encoder
- ESP32 leest het signaal van de CLK pin
- Als de staat verandert van LOW naar HIGH, leest ESP32 de staat van de DT pin.
- Als de DT pin HIGH is, wordt de knop tegen de klok in gedraaid en verhoogt ESP32 de teller met 1.
- Als de DT pin LOW is, wordt de knop met de klok mee gedraaid en verlaagt ESP32 de teller met 1.
Aansluitschema

This image is created using Fritzing. Click to enlarge image
ESP32 Code – Rotary Encoder
De onderstaande ESP32 code doet het volgende:
- Detecteert de draairichting en hoeveelheid rotatie van de encoder.
- Als wordt gedetecteerd dat de knop één klik (detent) met de klok mee is gedraaid, verhoogt de teller met één.
- Als wordt gedetecteerd dat de knop één klik tegen de klok in is gedraaid, verlaagt de teller met één.
- Detecteert of de knop is ingedrukt.
Om de code voor het ontkrachten van de knop (debouncing) te vereenvoudigen, wordt de ezButton bibliotheek gebruikt.
Snelle Stappen
Als u voor het eerst werkt met ESP32, zie dan hoe u de omgeving instelt voor ESP32 in Arduino IDE.
- Installeer de ezButton bibliotheek in Arduino IDE.
- Kopieer bovenstaande code en open die in Arduino IDE.
- Klik op de Upload-knop in Arduino IDE om de code naar de ESP32 te uploaden.
- Draai de knop met de klok mee en daarna tegen de klok in.
- Druk op de knop.
- Bekijk het resultaat in de Serial Monitor.
Code Uitleg
Bekijk de commentaarregels in de code voor een regel-voor-regel uitleg.
ESP32 Code – Rotary Encoder met Interrupt
In de vorige code kan gebruik van polling om continu de status van de pin te controleren, ESP32 bronnen verspillen en tellingen missen als andere code langzaam draait.
Een effectieve oplossing is het gebruik van een interrupt, waarmee polling overbodig wordt gemaakt. Dit stelt de ESP32 in staat om andere taken uit te voeren zonder tellingen te missen. Hieronder staat de ESP32 code die interrupts gebruikt om richting en positie van de rotary encoder uit te lezen.
Terwijl u de knop draait ziet u informatie verschijnen in de Serial Monitor, vergelijkbaar met de vorige code.
※ Notiz:
- U komt misschien tutorials tegen die twee interrupts voor één encoder gebruiken, maar dat is onnodig en inefficiënt. Eén interrupt is voldoende.
- Het is belangrijk om de volatile keyword te gebruiken bij globale variabelen die in de interrupt worden gebruikt. Het nalaten hiervan kan onvoorziene problemen veroorzaken.
- Houd de code binnen de interrupt zo eenvoudig mogelijk. Vermijd het gebruik van Serial.print() of Serial.println() binnen de interrupt.
ESP32 Rotary Encoder Toepassingen
Met de Rotary Encoder kunnen de volgende toepassingen worden gerealiseerd, maar deze zijn niet beperkt tot:
- ESP32 - Rotary Encoder bestuurt positie van een Servo Motor
- ESP32 - Rotary Encoder bestuurt helderheid van een LED
- ESP32 - Rotary Encoder bestuurt snelheid van een stappenmotor
Video Tutorial
We overwegen het maken van videotutorials. Als u videotutorials belangrijk vindt, abonneer u dan op ons YouTube-kanaal om ons te motiveren de video's te maken.