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.

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

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.
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:
#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();
}
}
}
Henüz yorum yapılmamış. İlk yorumu siz yapın!