Proje hakkında
8 LED'i tek tek kontrol etmek için 16 satır digitalWrite yazabilirdik. Ama programlamanın gücü, tekrar eden işleri döngülere devretmektir. Pin numaralarını bir dizide tutup for döngüsüyle dolaşarak aynı işi birkaç satırda yapacağız.
Bu proje, ileride LED matrisler, adreslenebilir LED şeritler ve çoklu motor kontrolü gibi konularda kullanacağınız "dizi + döngü" düşünce kalıbını kazandırır. Bonus kodda potansiyometreyle efektin hızını da canlı olarak ayarlayacağız.
- Pin numaralarını dizide saklamayı
- İleri ve geri sayan for döngüleri yazmayı
- Uç noktalarda LED'in iki kez yanmasını önlemeyi
- Bir sensörle animasyon hızını değiştirmeyi
Malzeme listesi
Projeyi tamamlamak için aşağıdaki 7 ç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
8 LED için tam boy (830 delik) daha rahattır.
5 mm kırmızı LED 8 adet
Aynı renk LED'ler daha düzgün bir efekt verir.
220 Ω direnç 8 adet
Her LED için bir direnç.
10 kΩ potansiyometre (isteğe bağlı) 1 adet
Bonus kodda hız ayarı için.
Jumper kablo (erkek-erkek) 12 adet
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
LED'leri sıralayın
8 LED'i breadboard'a eşit aralıklarla, kısa bacakları − hattına yakın olacak şekilde yerleştirin.
Katotları bağlayın
Her LED'in kısa bacağını − hattına bağlayın. Bacakları doğrudan − hattına uzanacak şekilde bükebilirsiniz.
Dirençleri ekleyin
Her LED'in uzun bacağının sütununa birer 220 Ω direnç takın.
Pinlere bağlayın
Soldaki LED'den başlayarak dirençleri sırasıyla D2, D3, D4 ... D9 pinlerine bağlayın.
GND'yi bağlayın
Arduino'nun GND pinini breadboard'un − hattına bağlayın.
Kodu yükleyin
İlk kodu yükleyin. Işık soldan sağa, sonra sağdan sola akmalı. Sıra karışıksa kabloları değil, dizideki pin sırasını değiştirmeniz yeterli.
Hız ayarını ekleyin (isteğe bağlı)
Potansiyometreyi 5V, A0 ve GND'ye bağlayıp ikinci kodu yükleyin.
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ı.
Dizi ve döngülerle yazılmış klasik Kara Şimşek efekti.
// Kara Şimşek (Yürüyen Işık)
// RobotikHocasi.com
const int ledPinleri[] = {2, 3, 4, 5, 6, 7, 8, 9};
const int ledSayisi = 8;
const int hiz = 70; // ms; küçüldükçe ışık hızlanır
void setup() {
for (int i = 0; i < ledSayisi; i++) {
pinMode(ledPinleri[i], OUTPUT);
}
}
void loop() {
// Soldan sağa
for (int i = 0; i < ledSayisi; i++) {
digitalWrite(ledPinleri[i], HIGH);
delay(hiz);
digitalWrite(ledPinleri[i], LOW);
}
// Sağdan sola (uçlardaki LED'ler iki kez yanmasın diye 6'dan 1'e)
for (int i = ledSayisi - 2; i > 0; i--) {
digitalWrite(ledPinleri[i], HIGH);
delay(hiz);
digitalWrite(ledPinleri[i], LOW);
}
}
Bonus: Potansiyometreyle hız ayarı ve arkasında sönük bir iz bırakan ışık.
// Hız ayarlı, kuyruklu Kara Şimşek
const int ledPinleri[] = {2, 3, 4, 5, 6, 7, 8, 9};
const int ledSayisi = 8;
const int potPin = A0;
int konum = 0; // Işığın şu anki konumu
int yon = 1; // 1: sağa, -1: sola
void setup() {
for (int i = 0; i < ledSayisi; i++) {
pinMode(ledPinleri[i], OUTPUT);
}
}
void loop() {
int hiz = map(analogRead(potPin), 0, 1023, 20, 300);
// Tüm LED'leri söndür, sonra ana ışığı ve izini yak
for (int i = 0; i < ledSayisi; i++) {
digitalWrite(ledPinleri[i], LOW);
}
digitalWrite(ledPinleri[konum], HIGH);
int iz = konum - yon; // Bir önceki konum
if (iz >= 0 && iz < ledSayisi) {
digitalWrite(ledPinleri[iz], HIGH); // Kısa bir an iz bırak
delay(hiz / 4);
digitalWrite(ledPinleri[iz], LOW);
delay(hiz - hiz / 4);
} else {
delay(hiz);
}
// Bir sonraki konuma geç, uçlara gelince yön değiştir
konum += yon;
if (konum == ledSayisi - 1 || konum == 0) {
yon = -yon;
}
}
Kod açıklaması
const int ledPinleri[] = {2, 3, ... 9};Pin numaralarını sırayla tutar. ledPinleri[0] değeri 2, ledPinleri[7] değeri 9'dur. Dizilerde sayma her zaman 0'dan başlar.
for (int i = 0; i < ledSayisi; i++)i değişkeni 0'dan 7'ye kadar sayar. Her turda bir LED yanar, bekler ve söner.
for (int i = ledSayisi - 2; i > 0; i--)Geri dönüşte 6'dan 1'e sayarız. Böylece en uçtaki LED'ler (0 ve 7) arka arkaya iki kez yanmaz ve hareket akıcı görünür.
yon = -yon;Bonus koddaki yön değişkeni 1 ile -1 arasında gidip gelir. konum += yon satırı, aynı kodla hem ileri hem geri hareket sağlar.
Nasıl çalışır?
Göz, kısa aralıklarla art arda yanan ışıkları hareket eden tek bir ışık olarak algılar. Buna phi fenomeni denir ve sinemadaki hareketli görüntülerin de temelidir. 50–100 ms aralık, akıcı ama takip edilebilir bir hareket için idealdir.
Arduino Uno'nun tek bir pininden en fazla 40 mA, tüm pinlerden toplamda ise yaklaşık 200 mA akım çekilmesi önerilir. Bu projede aynı anda en fazla bir veya iki LED yandığı için güvenli sınırların çok altındayız. Tüm LED'leri aynı anda yakacağınız projelerde toplam akımı hesaplamayı unutmayın.
Sorun giderme
Bir LED hiç yanmıyor
Işık sırası karışık atlıyor
İki LED aynı anda yanıyor
Hız ayarı ters çalışıyor
Geliştirme fikirleri
Projeyi tamamladıysanız, aşağıdaki fikirlerle bir adım öteye taşıyabilirsiniz.
Çift yönlü efekt
Ortadan dışa ve dıştan ortaya doğru açılan iki ışık oluşturun.
Shift register ile genişletme
74HC595 entegresiyle sadece 3 pin kullanarak 16 LED kontrol edin.
Ses seviyesi göstergesi
Bir mikrofon modülüyle ses yükseldikçe daha fazla LED yakan bir VU metre yapın.
Reaksiyon oyunu
Işık ortadaki LED'e geldiğinde butona basmaya çalışılan bir oyun tasarlayın.