ESP32 ve Buton ile LED Kontrolü

👤 Yazar: ozcan 📅 Tarih: 04.06.2026 16:11 👁️ Görüntüleme: 5

ESP32 ve Buton ile LED Kontrolü (Debounce ve Kesme Yöntemleri)

Bu rehberde, ESP32 mikrodenetleyicisine bir buton bağlayarak dijital giriş okumayı ve bir LED'i kontrol etmeyi öğreneceksiniz. Konuda hem temel okuma yöntemi hem de endüstriyel standart olan Kesme (Interrupt) yöntemi ele alınmıştır.

1. Gerekli Malzemeler

2. Donanım Bağlantıları

Buton projelerinde harici direnç karmaşasını önlemek için ESP32'nin dahili pull-up dirençleri kullanılacaktır. Bu bağlantı şeklinde butona basılmadığında pin lojik 1 (3.3V), basıldığında ise lojik 0 (GND) değerini okur.

ESP32 Buton ve LED Bağlantı Şeması

Görsel 1: ESP32 Buton ve LED Fritzing Şeması

3. Yöntem A: Temel Dijital Okuma ve Debounce Filtresi

Butonlar mekanik parazit (ark) üretir. Bu kod, butona basıldığında oluşan sahte sinyalleri engellemek için yazılımsal gecikme (debounce) filtresi içerir ve her basışta LED'in durumunu değiştirir.

#define BUTTON_PIN 4
#define LED_PIN 2

int ledDurumu = LOW;
int butonSonDurumu = HIGH;
unsigned long sonDebounceZamani = 0;
unsigned long debounceGecikmesi = 50; // Milisaniye cinsinden filtre süresi

void setup() {
  pinMode(LED_PIN, OUTPUT);
  pinMode(BUTTON_PIN, INPUT_PULLUP); // Dahili Pull-Up aktif
  digitalWrite(LED_PIN, ledDurumu);
}

void loop() {
  int okuma = digitalRead(BUTTON_PIN);

  if (okuma != butonSonDurumu) {
    sonDebounceZamani = millis();
  }

  if ((millis() - sonDebounceZamani) > debounceGecikmesi) {
    if (okuma == LOW && ledDurumu == LOW) {
      ledDurumu = HIGH;
      digitalWrite(LED_PIN, ledDurumu);
      while(digitalRead(BUTTON_PIN) == LOW); // Butondan el çekilene kadar bekle
    } else if (okuma == LOW && ledDurumu == HIGH) {
      ledDurumu = LOW;
      digitalWrite(LED_PIN, ledDurumu);
      while(digitalRead(BUTTON_PIN) == LOW);
    }
  }
  butonSonDurumu = okuma;
}

4. Yöntem B: Donanımsal Kesme (Interrupt) ile Kontrol

Ana döngüyü (loop) meşgul etmeden, butona basıldığı an işlemciyi uyaran profesyonel yöntemdir. ESP32, butondaki voltaj düşüşünü (FALLING) algıladığı an RAM üzerindeki fonksiyonu tetikler.

#define BUTTON_PIN 4
#define LED_PIN 2

unsigned long sonKesmeZamani = 0;

// IRAM_ATTR makrosu fonksiyonun RAM'de çalışmasını sağlayarak hızı artırır
void IRAM_ATTR butonKesmesi() {
  unsigned long simdikiZaman = millis();
  // Sahte tetiklemeleri engellemek için 200ms yazılımsal debounce
  if (simdikiZaman - sonKesmeZamani > 200) {
    digitalWrite(LED_PIN, !digitalRead(LED_PIN));
    sonKesmeZamani = simdikiZaman;
  }
}

void setup() {
  pinMode(LED_PIN, OUTPUT);
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  
  // Kesme fonksiyonunu pine bağlıyoruz (Sinyal HIGH'dan LOW'a düştüğünde tetiklenir)
  attachInterrupt(BUTTON_PIN, butonKesmesi, FALLING);
}

void loop() {
  // loop fonksiyonu tamamen boş kalabilir veya başka işlemler yürütebilir.
  // Buton kontrolü arka planda donanımsal olarak gerçekleşir.
}
Kritik Teknik Not:
  • INPUT_PULLUP modu seçildiğinde butonun boştaki değeri her zaman HIGH (1) olur. Butona basıldığında ise akım GND'ye akacağı için değer LOW (0) olur. Kod mantığı bu ters çalışma prensibine göre kurulmalıdır.

💬 Yorumlar

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

Bir Yorum Bırakın

Güvenlik Kontrolü:

Yenidir.com
Sayfa Başı
Yenidir CMS V0.1