EDU06 Rotary Encoder
|
Použití: ovládací kolečko, nastavení hodnot Mikrokontrolér: ESP32 S3 mini |
Popis
Rotační enkodér je součástka, které převádí otáčení na digitální signály. Používá se k detekci směru a počtu otáček. Může se využít k ovládání pozice, například u ovladačů hlasitosti, u automatických dveří nebo při navigaci v menu na displeji.
Značka
Ukázkový kód
#include <Arduino.h>
// Definování pinů pro signály rotačního enkodéru a tlačítka
#define CLK_PIN 7 // GPIO_7 – signál A (otáčení)
#define DT_PIN 8 // GPIO_8 – signál B (otáčení)
#define BTN_PIN 13 // GPIO_13 – tlačítko
volatile int encoderPos = 0; // Aktuální pozice enkodéru
volatile bool rotated = false; // Flag pro detekci změny pozice
int lastClkState; // Poslední stav signálu CLK
// Funkce, která se spustí při změně stavu na pinu CLK
void IRAM_ATTR handleEncoder() {
int clkState = digitalRead(CLK_PIN); // Čteme aktuální stav CLK pin
int dtState = digitalRead(DT_PIN); // Čteme aktuální stav DT pin
// Když se změní stav CLK signálu (otáčení)
if (clkState != lastClkState && clkState == 1) {
// Zkontrolujeme, jaký je stav DT pin pro určení směru otáčení
if (dtState != clkState) {
encoderPos++; // Otočili jsme doprava (pozice roste)
} else {
encoderPos--; // Otočili jsme doleva (pozice klesá)
}
rotated = true; // Nastavíme flag, že došlo k otočení
}
lastClkState = clkState; // Aktualizujeme poslední stav CLK
}
void setup() {
Serial.begin(115200); // Inicializujeme sériovou komunikaci pro ladění
pinMode(CLK_PIN, INPUT); // Nastavíme CLK pin jako vstup
pinMode(DT_PIN, INPUT); // Nastavíme DT pin jako vstup
pinMode(BTN_PIN, INPUT_PULLUP); // Nastavíme tlačítko s interním pull-up odporem
lastClkState = digitalRead(CLK_PIN); // Uložíme počáteční stav CLK
// Připojíme přerušení na změnu stavu CLK pinu (otáčení enkodéru)
attachInterrupt(digitalPinToInterrupt(CLK_PIN), handleEncoder, CHANGE);
}
void loop() {
// Pokud došlo k otočení enkodéru, vypíšeme novou pozici
if (rotated) {
Serial.print("Encoder Position: ");
Serial.println(encoderPos); // Vytiskneme aktuální pozici
rotated = false; // Resetujeme flag, že došlo k otočení
}
// Kontrola, jestli bylo tlačítko stisknuto
if (digitalRead(BTN_PIN) == LOW) {
Serial.println("Button Pressed!"); // Pokud je tlačítko stisknuto, vypíšeme zprávu
delay(300); // Debounce – malá prodleva pro odstranění šumu při stisku
}
}