Proje hakkında
Şimdiye kadar Arduino'ya sadece "şunu yap" dedik; bu projede ilk kez Arduino'ya "dışarıda ne oluyor?" diye soracağız. Push buton, elektronikteki en basit giriş elemanıdır: basıldığında iki bacağı arasındaki yolu kapatır, bırakıldığında açar. Arduino bu farkı bir dijital pin üzerinden HIGH (5V) veya LOW (0V) olarak okur.
Projeyi iki aşamada yapacağız. İlk kodda LED yalnızca butona basılı tuttuğunuz sürece yanacak. İkinci kodda ise her basışta LED'in durumu değişecek; tıpkı odanızdaki ışık anahtarı gibi. İkinci aşamada mekanik butonların neden "zıpladığını" ve bunun yazılımla nasıl çözüldüğünü de öğreneceksiniz.
- Bir pini INPUT olarak ayarlamayı ve digitalRead() ile okumayı
- Pull-down direncinin neden gerekli olduğunu
- if / else ile karar veren kod yazmayı
- millis() ile bekletmeden zaman ölçmeyi ve debounce yapmayı
Malzeme listesi
Projeyi tamamlamak için aşağıdaki 8 çeşit malzemeye ihtiyacınız var. Parçaların çoğu Arduino başlangıç setlerinde hazır olarak bulunur.
Arduino Uno R3 1 adet
Projenin beyni. Nano veya Mega ile de aynı kod çalışır.
Breadboard 1 adet
Lehimsiz devre kurmak için yarım boy (400 delik) yeterlidir.
5 mm LED 1 adet
Herhangi bir renk olabilir. Uzun bacak (+) anot, kısa bacak (−) katottur.
220 Ω direnç 1 adet
LED'i aşırı akımdan korur. Renk kodu: kırmızı-kırmızı-kahverengi.
10 kΩ direnç 1 adet
Pull-down direnci olarak kullanılır. Renk kodu: kahverengi-siyah-turuncu.
Push buton (4 bacaklı) 1 adet
6×6 mm veya 12×12 mm tactile buton.
Jumper kablo (erkek-erkek) 6–8 adet
Farklı renkler bağlantıları takip etmeyi kolaylaştırır.
USB A-B kablosu 1 adet
Kodu yüklemek ve kartı bilgisayardan beslemek için.
Devre bağlantıları
Bağlantıları USB kablosu takılı değilken yapın. Her satır, bileşenin hangi bacağının Arduino'nun hangi pinine gideceğini gösterir; çizgi rengi önerilen kablo rengidir.
Adım adım kurulum
Güç hatlarını hazırlayın
Arduino'nun 5V pinini breadboard'un kırmızı (+) hattına, GND pinini mavi (−) hattına bağlayın. Bundan sonra bütün 5V ve GND ihtiyaçlarını bu hatlardan alacağız.
LED'i yerleştirin
LED'in uzun bacağını bir sütuna, kısa bacağını yan sütuna takın. Kısa bacağı doğrudan − hattına bağlayın. Uzun bacağın olduğu sütuna 220 Ω direncin bir ucunu takın, diğer ucunu D8 pinine giden kabloyla birleştirin.
Butonu orta kanala oturtun
Butonu breadboard'un ortasındaki boşluğun üzerine, bacakları iki yarıya gelecek şekilde bastırın. Sol üst bacağı + hattına bağlayın.
Pull-down direncini ekleyin
Butonun sağ alt bacağının (çapraz bacak) bulunduğu sütundan 10 kΩ direnci − hattına bağlayın. Bu direnç, buton basılı değilken pini güvenli şekilde 0V'ta tutar.
Giriş pinini bağlayın
Aynı sütundan (sağ alt bacak) bir kabloyu Arduino'nun D2 pinine götürün. Artık butona basıldığında D2 pini 5V, bırakıldığında 0V görecek.
Kodu yükleyin
Arduino IDE'yi açın, Araçlar › Kart menüsünden Arduino Uno'yu, Araçlar › Port menüsünden kartınızın bağlı olduğu portu seçin. Aşağıdaki ilk kodu yapıştırıp Yükle (→) düğmesine basın.
Test edin
Butona basılı tuttuğunuzda LED yanmalı, bıraktığınızda sönmelidir. Seri Port Ekranını (9600 baud) açarak butonun anlık durumunu da izleyebilirsiniz.
Arduino kodu
Kodları Arduino IDE'ye yapıştırıp yükleyebilirsiniz. Türkçe karakterler yalnızca yorum satırlarında kullanıldı; Seri Port Ekranına yazdırılan metinlerde bilerek kullanılmadı.
Basılı tutunca yanan LED. Projenin temel sürümü.
// Buton ile LED Kontrolü - Temel sürüm
// RobotikHocasi.com
const int butonPin = 2; // Butonun bağlı olduğu pin
const int ledPin = 8; // LED'in bağlı olduğu pin
int butonDurumu = 0; // Butondan okunan değer
void setup() {
pinMode(ledPin, OUTPUT); // LED pini çıkış
pinMode(butonPin, INPUT); // Buton pini giriş
Serial.begin(9600); // Seri haberleşmeyi başlat
}
void loop() {
butonDurumu = digitalRead(butonPin); // Butonu oku
if (butonDurumu == HIGH) { // Butona basıldı mı?
digitalWrite(ledPin, HIGH); // LED'i yak
Serial.println("Butona basildi");
} else {
digitalWrite(ledPin, LOW); // LED'i söndür
}
delay(10); // Okumalar arasında kısa bir ara
}
Her basışta LED'in durumunu değiştiren, debounce korumalı gelişmiş sürüm.
// Buton ile LED Kontrolü - Aç/Kapa (toggle) sürümü
// RobotikHocasi.com
const int butonPin = 2;
const int ledPin = 8;
bool ledDurumu = false; // LED şu an yanıyor mu?
int sonOkuma = LOW; // Bir önceki ham okuma
int kararliDurum = LOW; // Debounce sonrası güvenilir durum
unsigned long sonDegisim = 0; // Son değişimin zamanı
const unsigned long bekleme = 50; // Debounce süresi (ms)
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(butonPin, INPUT);
}
void loop() {
int okuma = digitalRead(butonPin);
// Okuma değiştiyse zamanlayıcıyı sıfırla
if (okuma != sonOkuma) {
sonDegisim = millis();
}
// Okuma 50 ms boyunca sabit kaldıysa gerçek bir değişimdir
if ((millis() - sonDegisim) > bekleme) {
if (okuma != kararliDurum) {
kararliDurum = okuma;
// Sadece basılma anında (LOW -> HIGH) LED'i ters çevir
if (kararliDurum == HIGH) {
ledDurumu = !ledDurumu;
digitalWrite(ledPin, ledDurumu);
}
}
}
sonOkuma = okuma;
}
Kod açıklaması
pinMode(butonPin, INPUT);D2 pinini giriş olarak ayarlar. Artık bu pin voltaj üretmez, üzerindeki voltajı ölçer.
digitalRead(butonPin)Pindeki voltaj yaklaşık 3V'un üzerindeyse HIGH, 1.5V'un altındaysa LOW döndürür. Buton basılıyken HIGH okuruz.
if (butonDurumu == HIGH)Karşılaştırma için çift eşittir (==) kullanılır. Tek eşittir (=) atama yapar ve en sık yapılan yazım hatasıdır.
millis()Kart açıldığından beri geçen süreyi milisaniye cinsinden verir. delay()'in aksine programı durdurmaz, bu yüzden debounce için idealdir.
ledDurumu = !ledDurumu;Ünlem (!) işareti mantıksal tersini alır: true ise false, false ise true yapar. Toggle davranışının kalbi bu satırdır.
Nasıl çalışır?
Bir dijital pin hiçbir yere bağlı değilse "havada" (floating) kalır. Bu durumda çevredeki elektriksel gürültüyü anten gibi toplar ve rastgele HIGH-LOW değerleri okursunuz. 10 kΩ pull-down direnci pini zayıf bir şekilde GND'ye çeker: buton basılı değilken pin kesin olarak LOW olur. Butona basıldığında 5V doğrudan pine ulaşır ve direncin zayıf çekişini yener, pin HIGH olur.
Mekanik butonların içindeki metal kontaklar basıldığı anda birkaç milisaniye boyunca titreşir. Arduino saniyede binlerce okuma yaptığı için tek bir basışı 5–10 basış gibi görebilir. Buna buton sıçraması (bounce) denir. Toggle kodundaki debounce mantığı, okumanın 50 ms boyunca değişmeden kalmasını bekleyerek bu titreşimleri filtreler.
Sorun giderme
LED hiç yanmıyor
LED butona basmadan kendi kendine yanıp sönüyor
LED sürekli yanıyor, buton etkisiz
Toggle sürümünde bazen iki kez değişiyor
Geliştirme fikirleri
Projeyi tamamladıysanız, aşağıdaki fikirlerle bir adım öteye taşıyabilirsiniz.
Dirençsiz bağlantı
pinMode(butonPin, INPUT_PULLUP) kullanarak Arduino'nun dahili direncini açın. Butonu D2 ile GND arasına bağlayın; bu sefer basılınca LOW okunur.
Basış sayacı
Her basışta bir sayacı artırıp Seri Port Ekranına yazdırın. 5. basışta LED'i yanıp söndürün.
İki buton, iki LED
İkinci bir buton ve LED ekleyip ikisini birbirinden bağımsız kontrol edin.
Uzun basma algılama
Buton 2 saniyeden uzun basılı tutulursa LED'i yanıp sönme moduna geçirin.