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.
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.
GPIO 2; Katot (-) → 220Ω direnç → GND.GPIO 4; Karşındaki bacak → GND.
Görsel 1: ESP32 Buton ve LED Fritzing Şeması
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;
}
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.
}
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.Henüz yorum yapılmamış. İlk yorumu siz yapın!