guclusat

Tanınmış Üye
Süper Moderatör

Arduino 12 LED Chaser Devresi – 12 LED Işık Efekti​

Bu projede Arduino kullanılarak 12 LED ile hazırlanan hareketli LED Chaser (LED takip) devresi anlatılmaktadır. LED'ler Arduino'nun D2–D13 arasındaki 12 dijital çıkışına bağlanarak farklı ışık efektleri oluşturulur.

Devrede her LED için ayrı bir 100 ohm seri direnç kullanılması gerekir. Bu dirençler LED'lerden geçen akımı sınırlandırarak hem LED'lerin hem de Arduino çıkışlarının korunmasına yardımcı olur.

Program içerisinde LED'ler farklı sıralamalarla yakılıp söndürülerek hareketli ışık efektleri oluşturulur.

Devre bağlantısı​

12 LED için Arduino'nun aşağıdaki dijital pinleri kullanılır:

Arduino piniLEDSeri direnç
D2LED 1100 Ω
D3LED 2100 Ω
D4LED 3100 Ω
D5LED 4100 Ω
D6LED 5100 Ω
D7LED 6100 Ω
D8LED 7100 Ω
D9LED 8100 Ω
D10LED 9100 Ω
D11LED 10100 Ω
D12LED 11100 Ω
D13LED 12100 Ω

Her LED için direnç ayrı kullanılmalıdır. LED'lerin diğer uçları Arduino'nun GND bağlantısına bağlanır.

Programın çalışma mantığı​

Arduino açıldığında 12 dijital pin çıkış olarak tanımlanır. loop() içerisinde farklı LED animasyonları art arda çalıştırılır.

Programda kullanılan başlıca efektler:

  • LED'lerin tek tek yanıp sönmesi
  • LED'lerin soldan sağa ilerlemesi
  • LED'lerin sağdan sola ilerlemesi
  • Tüm LED'lerin sırayla yanması
  • Tüm LED'lerin sırayla sönmesi
  • Karşılıklı LED'lerin yanması
  • LED'lerin gruplar halinde çalışması
  • Tüm LED'lerin birlikte yanması
  • Farklı sıralama kombinasyonları

LED efekt hızının değiştirilmesi​

Kodun en üst kısmındaki:

const int speedDelay = 100;

değeri LED efektlerinin hızını belirler.

Örneğin:

speedDelay = 50;

yapılırsa efektler daha hızlı çalışır.

speedDelay = 200;

yapılırsa efektler daha yavaş çalışır.

Bu şekilde programın tamamındaki delay() sürelerini tek tek değiştirmek yerine yalnızca bir değer değiştirilerek efektlerin hızı ayarlanabilir.

Arduino kodu​

Aşağıdaki kod Arduino IDE'ye doğrudan aktarılabilir:

Kod:
const byte ledPins[] = {
2, 3, 4, 5, 6, 7,
8, 9, 10, 11, 12, 13
};

const byte LED_COUNT = 12;

// LED efekt hızı (milisaniye)
const int speedDelay = 100;

// --------------------------------------------------
// Tüm LED'leri söndür
// --------------------------------------------------
void allOff() {
for (byte i = 0; i < LED_COUNT; i++) {
digitalWrite(ledPins[i], LOW);
}
}

// --------------------------------------------------
// Tüm LED'leri yak
// --------------------------------------------------
void allOn() {
for (byte i = 0; i < LED_COUNT; i++) {
digitalWrite(ledPins[i], HIGH);
}
}

// --------------------------------------------------
// Bir LED'i yakıp söndür
// --------------------------------------------------
void blinkLED(byte index) {
digitalWrite(ledPins[index], HIGH);
delay(speedDelay);

digitalWrite(ledPins[index], LOW);
delay(speedDelay);
}

// --------------------------------------------------
// LED'leri verilen sırada tek tek çalıştır
// --------------------------------------------------
void chase(const byte order[]) {
for (byte i = 0; i < LED_COUNT; i++) {
blinkLED(order[i]);
}
}

// --------------------------------------------------
// LED'leri verilen sırada ikişer kez yakıp söndür
// --------------------------------------------------
void doubleChase(const byte order[]) {
for (byte i = 0; i < LED_COUNT; i++) {
blinkLED(order[i]);
blinkLED(order[i]);
}
}

// --------------------------------------------------
// LED'leri 2 -> 13 yönünde doldur
// --------------------------------------------------
void fillForward() {
allOff();

for (byte i = 0; i < LED_COUNT; i++) {
digitalWrite(ledPins[i], HIGH);
delay(speedDelay);
}
}

// --------------------------------------------------
// LED'leri 13 -> 2 yönünde doldur
// --------------------------------------------------
void fillReverse() {
allOff();

for (int i = LED_COUNT - 1; i >= 0; i--) {
digitalWrite(ledPins[i], HIGH);
delay(speedDelay);
}
}

// --------------------------------------------------
// LED'leri 13 -> 2 yönünde söndür
// --------------------------------------------------
void emptyReverse() {
for (int i = LED_COUNT - 1; i >= 0; i--) {
digitalWrite(ledPins[i], LOW);
delay(speedDelay);
}
}

// --------------------------------------------------
// LED'leri 2 -> 13 yönünde söndür
// --------------------------------------------------
void emptyForward() {
for (byte i = 0; i < LED_COUNT; i++) {
digitalWrite(ledPins[i], LOW);
delay(speedDelay);
}
}

// --------------------------------------------------
// Karşılıklı LED efekti
// 13-2, 12-3, 11-4 ... şeklinde
// --------------------------------------------------
void oppositeEffect() {
allOff();

for (byte i = 0; i < 6; i++) {

digitalWrite(ledPins[11 - i], HIGH);
delay(speedDelay);

digitalWrite(ledPins[i], HIGH);
delay(speedDelay);

}

delay(speedDelay);
allOff();
}

// --------------------------------------------------
// Üçlü LED grupları
// --------------------------------------------------
void tripleGroups() {

allOff();

for (int start = 11; start >= 0; start -= 3) {

for (int j = 0; j < 3; j++) {

  int index = start - j;

  if (index >= 0) {
    digitalWrite(ledPins[index], HIGH);
    delay(speedDelay);
  }
}

for (int j = 0; j < 3; j++) {

  int index = start - j;

  if (index >= 0) {
    digitalWrite(ledPins[index], LOW);
    delay(speedDelay);
  }
}
}
}

// --------------------------------------------------
// SETUP
// --------------------------------------------------
void setup() {

for (byte i = 0; i < LED_COUNT; i++) {
pinMode(ledPins[i], OUTPUT);
digitalWrite(ledPins[i], LOW);
}
}

// --------------------------------------------------
// LOOP
// --------------------------------------------------
void loop() {

// Özel LED sıralaması
const byte effect1[] = {
2, 6, 0, 8, 1, 11,
5, 10, 3, 9, 4, 7
};

// Ters sıralama
const byte reverseOrder[] = {
11, 10, 9, 8, 7, 6,
5, 4, 3, 2, 1, 0
};

// Normal sıralama
const byte forwardOrder[] = {
0, 1, 2, 3, 4, 5,
6, 7, 8, 9, 10, 11
};

// 1. Efekt - LED'ler özel sırada iki kez yanıp söner
doubleChase(effect1);

// 2. Efekt - sağdan sola
chase(reverseOrder);

// 3. Efekt - soldan sağa doldurma
fillForward();

// 4. Efekt - sağdan sola söndürme
emptyReverse();

// 5. Efekt - karşılıklı LED'ler
oppositeEffect();

// 6. Efekt - soldan sağa
chase(forwardOrder);

// 7. Efekt - tüm LED'leri yak
allOn();
delay(speedDelay);

// 8. Efekt - sağdan sola söndür
emptyReverse();

// 9. Efekt - soldan sağa tekrar
chase(forwardOrder);

// 10. Efekt - ters yönde doldur
fillReverse();

// 11. Efekt - soldan sağa söndür
emptyForward();

// 12. Efekt - üçlü LED grupları
tripleGroups();

// 13. Efekt - LED'leri ters sırada iki kez yakıp söndür
doubleChase(reverseOrder);

// 14. Efekt - tüm LED'leri yakıp söndür
allOn();
delay(speedDelay);

allOff();
delay(speedDelay);
}

Önemli not​

LED'lerin Arduino çıkışlarına bağlanmasında her LED için ayrı seri direnç kullanılmalıdır. 12 LED'in tamamını tek bir direnç üzerinden bağlamak uygun değildir.

Ayrıca bazı efektlerde birden fazla LED aynı anda yandığından, kullanılan Arduino kartının pin başına ve toplam GPIO akım sınırları dikkate alınmalıdır. Daha yüksek LED akımı gerekiyorsa LED'leri doğrudan Arduino pinleri yerine uygun transistor veya sürücü devresi üzerinden kontrol etmek daha doğru olacaktır.

Bu proje; Arduino ile LED kontrolü, digitalWrite(), pinMode(), delay(), diziler ve for döngülerinin öğrenilmesi açısından güzel bir uygulamadır.
 
Geri
Yukarı