EDU06 Rotary Encoder

Eduingo Mainboard

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
  }
}

Tato stránka byla naposledy upravena 2025-12-30 12:53

Běží na Wiki|Docs

This page was last edited on 2025-12-30 12:53

Eduingo
info@eduingo.com

Běží na Wiki|Docs