ESP8266 (NodeMCU) ile KY-040 Döner Enkoder (Rotary Encoder) Kullanımı

👤 Yazar: Admin 📅 Tarih: 28.09.2026 06:09 👁️ Görüntüleme: 51

ESP8266 (NodeMCU) ve KY-040 Döner Enkoder (Rotary Encoder) Bağlantı Rehberi

KY-040 Döner Enkoder, milinin dönme yönünü (sağ/sol) ve adım sayısını tespit eden, aynı zamanda miline basıldığında dahili buton işlevi gören mekanik bir algılayıcıdır. ESP8266 (NodeMCU) ile quadrature (dikey fazlı) sinyal çıkışları üzerinden haberleşerek hassas menü navigasyonu ve değer artırma/azaltma işlemlerinde kullanılır.

ESP8266 NodeMCU ve KY-040 Rotary Encoder Bağlantı Şeması


1. Donanım Pin Eşleşme Tablosu

Görseldeki devre şemasına göre ESP8266 (NodeMCU) ile KY-040 Döner Enkoder modülü arasındaki pin bağlantı haritası şu şekildedir[:

KY-040 Pin NodeMCU Pin GPIO Karşılığı İşlev / Kablo Rengi
GND GND Ground Toprak Hattı (Siyah Kablo)
+ (VCC) 3V3 3.3V Power 3.3V Besleme Hat (Kırmızı Kablo)
SW D5 GPIO14 Dahili Push-Button Sinyali (Mavi Kablo)
DT D6 GPIO12 Data / Phase B Sinyali (Pembe Kablo)
CLK D7 GPIO13 Clock / Phase A Sinyali (Yeşil Kablo)

 Rotary Encoder Sinyal Görünümü


Donanım ve Kesme (Interrupt) Notu:
KY-040 modülünün dönme yönü tespitinde herhangi bir adımı kaçırmamak için CLK (D7 / GPIO13) pini harici kesme (Interrupt) olarak yapılandırılmalıdır. ESP8266 üzerinde GPIO16 hariç tüm pinler (GPIO0–GPIO15) donanımsal kesme destekler.

2. C++ Arduino Kodu (Interrupt Tabanlı Yön ve Buton Algılama)

Aşağıdaki C++ kodu, enkoder mili döndürüldüğünde kesme servisi (ISR) kullanarak yönü hesaplar, sayacı günceller ve mil üzerine basıldığında buton durumunu seri porta yansıtır:

C++ / ESP8266 KY-040 Rotary Encoder Example

#include <Arduino.h>

// Şemadaki Pin Tanımlamaları
const int ENCODER_SW  = D5; // GPIO14 (Mavi Kablo)
const int ENCODER_DT  = D6; // GPIO12 (Pembe Kablo)
const int ENCODER_CLK = D7; // GPIO13 (Yeşil Kablo)

// Sayaç ve Durum Değişkenleri
volatile int encoderCounter = 0;
volatile unsigned long lastInterruptTime = 0;

int lastCounterValue = 0;
bool lastButtonState = HIGH;
unsigned long lastDebounceTime = 0;

// Enkoder Dönüş Yönü Kesme Fonksiyonu (ISR - RAM'de Çalışır)
void IRAM_ATTR readEncoderISR() {
  unsigned long interruptTime = millis();
  // Sinyal arkını (bounce) engellemek için 5ms filtre
  if (interruptTime - lastInterruptTime > 5) {
    int clkState = digitalRead(ENCODER_CLK);
    int dtState  = digitalRead(ENCODER_DT);

    if (dtState != clkState) {
      encoderCounter++; // Saat yönü (CW)
    } else {
      encoderCounter--; // Saat yönünün tersi (CCW)
    }
    lastInterruptTime = interruptTime;
  }
}

void setup() {
  Serial.begin(115200);
  delay(10);

  pinMode(ENCODER_CLK, INPUT_PULLUP);
  pinMode(ENCODER_DT, INPUT_PULLUP);
  pinMode(ENCODER_SW, INPUT_PULLUP);

  // CLK pinine FALLING (Düşen Kenar) kesmesi bağla
  attachInterrupt(digitalPinToInterrupt(ENCODER_CLK), readEncoderISR, FALLING);

  Serial.println("\nESP8266 KY-040 Enkoder Testi Başlatıldı.");
}

void loop() {
  // Sayaç Değişikliği Var ise Ekrana Yaz
  if (lastCounterValue != encoderCounter) {
    Serial.print("Enkoder Pozisyonu: ");
    Serial.println(encoderCounter);
    lastCounterValue = encoderCounter;
  }

  // Buton Durumu Okuma (Debounce Filtreli)
  bool currentButtonState = digitalRead(ENCODER_SW);
  if (currentButtonState != lastButtonState) {
    if (millis() - lastDebounceTime > 50) {
      if (currentButtonState == LOW) {
        Serial.println("-> Enkoder Butonuna Basıldı!");
      }
      lastButtonState = currentButtonState;
      lastDebounceTime = millis();
    }
  }
}

💬 Yorumlar

Henüz yorum yapılmamış. İlk yorumu siz yapın!

Bir Yorum Bırakın

Güvenlik Kontrolü:

Yenidir.com
↑ Sayfa Başı
📞 İletişim ✉ E-Posta Gönder 🟥 YouTube
© 2026 Yenidir.com
Yenidir CMS V0.1