[DIY]: Arduino ile Navigasyon Işık Uygulaması

Arduino ile Navigasyon Işık Uygulaması

Celalettin Yazkan' Alıntı:
Emre her şey 2 ledle başlıyor sonrasını yazmayayım [emoji9]
Abi mesele hangi hapı yutacağın. Kırmızı mı mavi mi :lollol: :lol: Videonun başına özellikle dikkat Celalettin abi özellikle sana diyor : "Nihayet, hosgeldin..."

Bu VIDEOYU görmek için izniniz yok. Giriş yap veya üye ol
 
Arduino ile Navigasyon Işık Uygulaması

Yani sonuç olarak , hangi rengi alırsan al hapı yuttuk manasına geliyor...... :lol: ister arduinonun harikalar diyarı , ister helikopter hobisinin harikalar diyarı... :evil:
 
Arduino ile Navigasyon Işık Uygulaması

Gelişmiş LED yakma :laugh: örnekleri serimize devam ediyoruz. Dün keşfettiğim ve çok kullanışlı bulduğum bir kütüphaneden bahsetmek istiyorum.



ElapsedMillis kütüphanesini kullanarak, geçen zamanı çok daha az kodla ölçebiliyoruz. Bu kütüphane, aynı ElapsedMillis nesnesine hem değer atamamızı hem de değeri okumamızı sağlıyor. Bu kütüphanenin örnek kodu şu şekilde, gayet de anlaşılır.

Kod:
#include <elapsedMillis.h>
elapsedMillis timeElapsed; //declare global if you don't want it reset every time loop runs
int led = 13; // Pin 13 has an LED connected on most Arduino boards.
unsigned int interval = 1000; // delay in milliseconds between blinks of the LED
boolean ledState = LOW; // state of the LED = LOW is off, HIGH is on

void setup() {                
  pinMode(led, OUTPUT); // initialize the digital pin as an output.
}

void loop() {
  if (timeElapsed > interval) {				
      ledState = !ledState;         // toggle the state from HIGH to LOW to HIGH to LOW ... 
      digitalWrite(led, ledState);
      timeElapsed = 0;              // reset the counter to 0 so the counting starts over...
  }
}

Bu da benim, tek LED ile, değişken bir yanıp sönme deseni oluşturmak için kullandığım kod. Aslında "Interval" aynı kalıyor ama her "Interval"de önceden belirlediğim bir desene göre LED'i açık ya da kapalı konumda tutuyorum.

Kod:
#include <elapsedMillis.h>

elapsedMillis elapsedTimeLED;  // ElapsedMilis nesnesini oluştur.

unsigned int navLED = 2;  // LED pinini belirle
unsigned int intervalLED = 100;  // LED için, bir zaman değeri belirle
boolean ptnLED[16] = {1,1,1,1,0,1,0,1,0,1,1,0,0,1,0,1};  // Bu degerler, LED'in yanıp sönme desenini belirliyor, 1 iken yaniyor, 0 iken kapali, bu ornekte 16 farkli durum belirlenmis durumda
unsigned int iCntLED = 0; // Yanip sonme deseninin, hangi sirasinda kaldigimizi hatirlamak icin kullanilacak degisken

void setup() {
  pinMode(navLED, OUTPUT); // LED pini cikis olarak ayarlaniyor
  elapsedTimeLED = 0;  // ElapsedMilis nesnesine 0 degeri verilerek kronometre baslatiliyor
}

void loop() {
  // Bir seyler yap ...
  // Bir seyler yap ...
  // Bir seyler yap ...
  // Bir seyler yap ...
  // Bir seyler yap ...
  ledControl(); //LED'in yanip sonmesini kontrol eden fonksiyon, her dongude cagrilip, gerekli zaman gecmisse islem yapiliyor.
}

void ledControl() {
  if (elapsedTimeLED > intervalLED) { // Gerekli zaman gecmismi diye kontol et
    digitalWrite(navLED, ptnLED[iCntLED]); // Gerekli zaman gecmisse, LED'e ilgili yanip sonme desenini ata, 1 iken yaniyor, 0 iken kapali
    iCntLED += 1; // Bir sonraki desene gecmek izin hazirlik yap
    if (iCntLED >= 16 ) {
      iCntLED = 0;  // Bir deseni ardisik olarak 16 fakli adimdan olusturdugumuz icin, 16 rakamina ulasinca, desen sirasini sifirla
    }
    elapsedTimeLED = 0; // ElapsedMilis nesnesine 0 degeri ver ve kronometreyi bastan baslat
  }
}

Aşağıdaki de temel olarak yukarıdaki kodun aynısı, ama led sayısını isteğe göre arttırabilmek için, bazı değişiklikler yapılmış durumda.

Kod:
#include <elapsedMillis.h>

elapsedMillis elapsedTime_1;
elapsedMillis elapsedTime_2;
elapsedMillis elapsedTime_3;
elapsedMillis elapsedTime_4;
elapsedMillis elapsedTimeLED[] = {elapsedTime_1, elapsedTime_2, elapsedTime_3, elapsedTime_4}; //Her led icin ayri bir elapsedMillis nesnesi olustur ve kolay kullanim icin ARRAY a at

unsigned int navLED[] = {2,3,4,5}; // LED pinleri
unsigned int intervalLED[] = {100,20,60,450}; // LEDlerin zaman degerleri
unsigned int iCntLED[] = {0, 0, 0, 0}; // Yanip sonme deseninin, hangi sirasinda kaldigimizi hatirlamak icin kullanilacak degisken
boolean ptnLED[][16] = { {1,1,1,1,0,1,0,1,0,1,1,0,0,1,0,1},
                         {0,1,1,0,0,1,0,1,0,1,1,0,0,1,1,0},
                         {1,0,1,0,0,1,0,1,0,1,1,0,1,1,0,0},
                         {0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1} }; // Sira ile tum LED'lerin desenleri buraya yazilir, bu ornekte, her LED icin 16 farkli durum belirlenmis durumda

void setup() {
  int i;
  for (i = 0; i<4; i++){
    pinMode(navLED[i], OUTPUT); // LED pini cikis olarak ayarlaniyor
    elapsedTimeLED[i] = 0; // ElapsedMilis nesnesine 0 degeri verilerek kronometre baslatiliyor
  }
}

void loop() {
  // Bir seyler yap ...
  // Bir seyler yap ...
  // Bir seyler yap ...
  // Bir seyler yap ...
  // Bir seyler yap ...
  ledControl(); //LED'in yanip sonmesini kontrol eden fonksiyon, her dongude cagrilip, gerekli zaman gecmisse islem yapiliyor.
}

void ledControl() {
  int i; // Sadece bu dongu icinde gecerli olan ve hangi LED'i kontrol edecegimizi gosterecek degisken
  int j; // Sadece bu dongu icinde gecerli olan ve hangi deseni gosterecegimizi kontrol eden degisken
  for (i = 0; i<4; i++){  // Tum LED'leri sıra ile cagir
    if (elapsedTimeLED[i] > intervalLED[i]) { // Gerekli zaman gecmismi diye kontol et
      j = iCntLED[i];  // Kullanilacak desen sirasini belirle
      digitalWrite(navLED[i], ptnLED[i][j]); // Gerekli zaman gecmisse, LED'e ilgili yanip sonme desenini ata, 1 iken yaniyor, 0 iken kapali
      iCntLED[i] += 1; // Bir sonraki desene gecmek izin hazirlik yap
      if (iCntLED[i] >= 16 ) {
        iCntLED[i] = 0; // Bir deseni ardisik olarak 16 fakli adimdan olusturdugumuz icin, 16 rakamina ulasinca, desen sirasini sifirla
      }
      elapsedTimeLED[i] = 0; // ElapsedMilis nesnesine 0 degeri ver ve kronometreyi bastan baslat
    }
  }
}
 
  • Beğen
Tepkiler: Ataberk SOLAK
Arduino ile Navigasyon Işık Uygulaması

Zafer abi ikinci kodda 28. satırda <= değil >= olacak ;D ;D

(Var ya şu anda kendimi apple'ı bulmuş gibi hissediyorum :laugh: )
 
Arduino ile Navigasyon Işık Uygulaması

Emre Kaman' Alıntı:
... tabi benim gordugum mars robotu gelistirmisim gibi, disardan gorunen iki kere yanan led :D

Emre, bu robotu geliştirdiğinde haberim olsun! Tavlada rakip tanımam o zaman!... :lol:
 
Arduino ile Navigasyon Işık Uygulaması

Omer Erkan' Alıntı:
Emre, bu robotu geliştirdiğinde haberim olsun! Tavlada rakip tanımam o zaman!... :lol:

İki mars kısmı tamam, şimdi "düz"le uğraşıyorum abicim :lol:
 
Arduino ile Navigasyon Işık Uygulaması

Üzüm üzüme baka baka... Emre abi beni de bulaştırdı, yakındır gece 2 de arduino kod paylaşımı yapmam ;D

Siparişler verildi, ekipmanı beklemedeyim.
 
Arduino ile Navigasyon Işık Uygulaması

Şimdi oturup Zafer Bey'in vermiş olduğu kod örneklerini inceleyip anlayabilirim diye düşünüyorum. Ondan önce kendi tasarımımı sizlerle paylaşmak istiyorum.

Şöyle düşünün:
Her iki kanat ucunda sürekli yanan birer navigasyon lambası (sol kırmızı, sağ yeşil). Bunların yanında birer tane beyaz strobe (çakar) lamba. Uçağın gövdesinin altında bir tane kırmızı strobe (çakar) lamba. Dikey stabın tepesinde ise beacon.

Sistem bir alıcı kanalından kontrol ediliyor. Bir kez açınca sadece navigasyon lambaları yanıyor. Bir kez kapatıp açınca navigasyon lambaları ve beacon yanıyor. Gerçek uçakta da böyle. Uçakta önce navigasyon lambaları açılıyor. Motor çalıştırılacağı zaman beacon yakılıyor. Piste girerken strobe'lar yakılıyor. Bende de ilgili butonu her kapatıp açmada bir sonraki de devreye girmiş oluyor. Tümü yanarken bir kez daha kapatıp açınca tümü kapanıyor. İstenirse aynı sırada geriye doğru kapatmak da mümkün tabii.

Video şu:
Videoda en sağ baştaki kırmızı LED dikey stabın tepesindeki beacon. Onun solundaki kırmızı LED sol kanat ucu navigasyon lambası. Onun hemen solunda sol kanat ucu beyaz strobe var. Daha soldaki kırmızı gövde altındaki strobe. En sol başta ise sağ kanat ucu navigasyon ve strobe lambaları var.

Bu VIDEOYU görmek için izniniz yok. Giriş yap veya üye ol

Kodu da şu:

Kod:
/* Uçak ışıklandırma sistemi projesi. Her iki kanat ucunda birer navigasyon lambası (solda kırmızı sağda yeşil).
 Kanat uçlarında birer beyaz strobe light. Gövdenin altında kırmızı strobe light. Dikey stabun tepesinde kırmızı beacon. */

int nav1 = 2; // Sol kanat ucu, kırmızı NAV light
int nav2 = 3; // Sağ kanat ucu yeşil NAV light
int strobe1 = 4; // Sol kanat ucu beyaz strobe light
int strobe2 = 5; // Sağ kanat ucu beyaz strobe light
int strobe3 = 6; // Gövde altı kırmızı strobe light
int beacon = 10; // Dikey stab ucu kırmızı beacon LED. PWM çıkışlı uç olmalı.
int rxpin = 8; // Alıcıdan gelen kontrol sinyali girişi

int rxpwm = 0;
int mode = 0; // 0: LED'ler OFF. 1: Sadece NAV. 2: NAV + Beacon. 3: NAV + Beacon + Strobe
int beaconvalue = 33; // Beacon için minimum ışık düzeyi
int beaconstep1 = 11; // Beacon adımı
int beaconstep2 = 37;
int yon = 1; // Beacon artış azalış değişkeni. 1 ya da -1
int strobetiming; // Şu an için kullanılmıyor
unsigned long timer; // Genel zamanlama değişkeni


void setup ()
{
  pinMode(nav1, OUTPUT);
  pinMode(nav2, OUTPUT);
  pinMode(strobe1, OUTPUT);
  pinMode(strobe2, OUTPUT);
  pinMode(strobe3, OUTPUT);
  pinMode(beacon, OUTPUT);
  while((pulseIn(rxpin, HIGH)) < 1500)
  {
  }
  mode = 1;
}

void loop()
{
  mode = chkrx(mode);
  if(mode == 0)
  {
    switchoff();
  }
  if(mode == 1)
  {
    digitalWrite(nav1, HIGH);
    digitalWrite(nav2, HIGH);
  }

    if(mode > 1)
    {
      beaconwrite(beaconstep1);
    }
    if(mode > 2)
    {
      strobeon();
    }
}


// Tüm LED'leri kapatan altprogram
void switchoff()
{
  digitalWrite(nav1, LOW);
  digitalWrite(nav2, LOW);
  digitalWrite(strobe1, LOW);
  digitalWrite(strobe2, LOW);
  digitalWrite(strobe3, LOW);
  digitalWrite(beacon, LOW);
}


// Alıcı sinyaline göre mode değişkenini düzenleyen altprogram
int chkrx(int x)
{
  rxpwm = pulseIn(rxpin, HIGH);
  if(rxpwm >= 1500)
  {
    return x;
  }
  while(rxpwm < 1500)
  {
    rxpwm = pulseIn(rxpin, HIGH);
  }
  x = x + 1;
  if(x > 3)
  {
    x = 0;
  }
  return x;
}


// Beacon LED2ine analog çıkış veren ve her seferinde parlaklığı bir artıran ya da azaltan altprogram
void beaconwrite(int stepping)
{
  analogWrite(beacon, beaconvalue);
  beaconvalue = beaconvalue + (yon * stepping);
  if(beaconvalue >= 255)
  {
    yon = yon * (-1);
    beaconvalue = 255;
  }
  if(beaconvalue < 10)
  {
    yon = yon * (-1);
    beaconvalue = 10;
  }

}


void strobeon()
{
  int z = 0;
          {
          timer = millis();
          digitalWrite(strobe1, HIGH);
          digitalWrite(strobe2, HIGH);
          while((millis() - timer) < 60)
          {
          }
          digitalWrite(strobe1, LOW);
          digitalWrite(strobe2, LOW);
          beaconwrite(beaconstep2);

          timer = millis();
          while((millis() - timer) < 60);
          {
          }
          beaconwrite(beaconstep2);
    
          timer = millis();
          digitalWrite(strobe1, HIGH);
          digitalWrite(strobe2, HIGH);
          beaconwrite(beaconstep2);
          while((millis() - timer) < 60)
          {
          }
          digitalWrite(strobe1, LOW);
          digitalWrite(strobe2, LOW);
          beaconwrite(beaconstep2);
          timer = millis();
          while((millis() - timer) < 60);
          {
          }
          beaconwrite(beaconstep2);
    
          timer = millis();
          digitalWrite(strobe1, HIGH);
          digitalWrite(strobe2, HIGH);
          beaconwrite(beaconstep2);
          while((millis() - timer) < 60)
          {
          }
          digitalWrite(strobe1, LOW);
          digitalWrite(strobe2, LOW);
          beaconwrite(beaconstep2);
          timer = millis();
          while((millis() - timer) < 60);
          {
          }
          beaconwrite(beaconstep2);

          timer = millis();
          digitalWrite(strobe3, HIGH);
          beaconwrite(beaconstep2);
          while((millis() - timer) < 60)
          {
          }
          digitalWrite(strobe3, LOW);
          beaconwrite(beaconstep2);
          timer = millis();
          while((millis() - timer) < 180);
          {
          }
          beaconwrite(beaconstep2);

          timer = millis();
          digitalWrite(strobe3, HIGH);
          beaconwrite(beaconstep2);
          while((millis() - timer) < 60)
          {
          }
          digitalWrite(strobe3, LOW);
          beaconwrite(beaconstep2);
          timer = millis();
          while((millis() - timer) < 380)
          {
            z = millis() - timer;
            if(z == 100)
            {
              beaconwrite(beaconstep1);
            }
            if(z == 250)
            {
              beaconwrite(beaconstep1);
            }
            
          }
          beaconwrite(beaconstep2);

        }
}

Sorun şu: Strobe'lar devreye girmediğinde beacon çok güzel yanıp sönüyor. Ama strobe'lar çalışırken zamanlama hataları nedeniyle beacon kötü görünüyor. Bu amaçla interruptarın da kullanıldığı kütüphanelere başvurmak gerekecek.

Kodda aslında here iki navigasyon lambası ve her iki kanat ucu strobe lambasıbirer kanaldan sürülebilir. Ben ileride aklıma bir şey gelir diye farklı kanallardan kontrol etmeyi tercih ettim.
 
  • Beğen
Tepkiler: Ataberk SOLAK
Arduino ile Navigasyon Işık Uygulaması

Delicesine bağımlısı oldum ben bunun! :D :D :D

Biraz araştırınca MsTimer2 adlı bir library buldum. Standart değil. Arduino IDE'ye eklemek gerekiyor. Çok basit bir iş. Zip dosyasıni indirip açıyorsunuz. Klasörü Library klasörüne atıp Arduine IDE'yi yeniden başlatıyorsunuz.

Bunu kullanarak interruptları devreye alınca sonuç (bence) mükemmel oldu. :yuppi:

Bu VIDEOYU görmek için izniniz yok. Giriş yap veya üye ol


Kod:
/* Uçak ışıklandırma sistemi projesi. Her iki kanat ucunda birer navigasyon lambası (solda kırmızı sağda yeşil).
 Kanat uçlarında birer beyaz strobe light. Gövdenin altında kırmızı strobe light. Dikey stabun tepesinde kırmızı beacon. */

#include <MsTimer2.h>

int nav1 = 2; // Sol kanat ucu, kırmızı NAV light
int nav2 = 3; // Sağ kanat ucu yeşil NAV light
int strobe1 = 4; // Sol kanat ucu beyaz strobe light
int strobe2 = 5; // Sağ kanat ucu beyaz strobe light
int strobe3 = 6; // Gövde altı kırmızı strobe light
int beacon = 10; // Dikey stab ucu kırmızı beacon LED. PWM çıkışlı uç olmalı.
int rxpin = 8; // Alıcıdan gelen kontrol sinyali girişi

int rxpwm = 0;
int mode = 0; // 0: LED'ler OFF. 1: Sadece NAV. 2: NAV + Beacon. 3: NAV + Beacon + Strobe
int beaconvalue = 10; // Beacon için minimum ışık düzeyi
int yon = 1; // Beacon artış azalış değişkeni. 1 ya da -1
int strobetiming; // Şu an için kullanılmıyor
unsigned long timer; // Genel zamanlama değişkeni


void setup ()
{
  pinMode(nav1, OUTPUT);
  pinMode(nav2, OUTPUT);
  pinMode(strobe1, OUTPUT);
  pinMode(strobe2, OUTPUT);
  pinMode(strobe3, OUTPUT);
  pinMode(beacon, OUTPUT);
  while((pulseIn(rxpin, HIGH)) < 1500)
  {
  }
  mode = 1;
  MsTimer2::set(90, beaconwrite);
  MsTimer2::start();
}

void loop()
{
  mode = chkrx(mode);
  if(mode == 0)
  {
    switchoff();
  }
  if(mode == 1)
  {
    digitalWrite(nav1, HIGH);
    digitalWrite(nav2, HIGH);
  }

    if(mode > 1)
    {
    }
    if(mode > 2)
    {
      strobeon();
    }
}


// Tüm LED'leri kapatan altprogram
void switchoff()
{
  digitalWrite(nav1, LOW);
  digitalWrite(nav2, LOW);
  digitalWrite(strobe1, LOW);
  digitalWrite(strobe2, LOW);
  digitalWrite(strobe3, LOW);
  digitalWrite(beacon, LOW);
}


// Alıcı sinyaline göre mode değişkenini düzenleyen altprogram
int chkrx(int x)
{
  rxpwm = pulseIn(rxpin, HIGH);
  if(rxpwm >= 1500)
  {
    return x;
  }
  while(rxpwm < 1500)
  {
    rxpwm = pulseIn(rxpin, HIGH);
  }
  x = x + 1;
  if(x > 3)
  {
    x = 0;
  }
  return x;
}


// Beacon LED2ine analog çıkış veren ve her seferinde parlaklığı bir artıran ya da azaltan altprogram
void beaconwrite()
{
  if(mode < 2)
  {
    return;
  }
  analogWrite(beacon, beaconvalue);
  beaconvalue = beaconvalue + (yon * 34);
  if(beaconvalue >= 255)
  {
    yon = yon * (-1);
    beaconvalue = 255;
  }
  if(beaconvalue < 10)
  {
    yon = yon * (-1);
    beaconvalue = 10;
  }

}


void strobeon()
{
  int z = 0;
          {
          timer = millis();
          digitalWrite(strobe1, HIGH);
          digitalWrite(strobe2, HIGH);
          while((millis() - timer) < 60)
          {
          }
          digitalWrite(strobe1, LOW);
          digitalWrite(strobe2, LOW);

          timer = millis();
          while((millis() - timer) < 60);
          {
          }
    
          timer = millis();
          digitalWrite(strobe1, HIGH);
          digitalWrite(strobe2, HIGH);
          while((millis() - timer) < 60)
          {
          }
          digitalWrite(strobe1, LOW);
          digitalWrite(strobe2, LOW);
          timer = millis();
          while((millis() - timer) < 60);
          {
          }
    
          timer = millis();
          digitalWrite(strobe1, HIGH);
          digitalWrite(strobe2, HIGH);
          while((millis() - timer) < 60)
          {
          }
          digitalWrite(strobe1, LOW);
          digitalWrite(strobe2, LOW);
          timer = millis();
          while((millis() - timer) < 60);
          {
          }

          timer = millis();
          digitalWrite(strobe3, HIGH);
          while((millis() - timer) < 60)
          {
          }
          digitalWrite(strobe3, LOW);
          timer = millis();
          while((millis() - timer) < 180);
          {
          }

          timer = millis();
          digitalWrite(strobe3, HIGH);
          while((millis() - timer) < 60)
          {
          }
          digitalWrite(strobe3, LOW);
          timer = millis();
          while((millis() - timer) < 380)
          {
            z = millis() - timer;
            if(z == 100)
            {
            }
            if(z == 250)
            {
            }
            
          }

        }
}
 
Arduino ile Navigasyon Işık Uygulaması

Sümer Yamaner' Alıntı:
Delicesine bağımlısı oldum ben bunun! :D :D :D

Farkindayiz Abi :laugh: :thumbup: Sahsim adima konusayim, her ne kadar artik kod olarak seni takip edemesemde paylasimlarini izlemek, o heyecanini sanal alemde de olsa paylasmak bana buyuk bir zevk veriyor :halay: :yuppi:
 
Arduino ile Navigasyon Işık Uygulaması

Abi muhteşemsiniz vallahi.Ben hala girsem mi bulaşsam mı diye düşünürken maşallah siz bitirmek üzeresiniz. :saygilar:


Bence imzanıza Rudder lobisinin yanına arduino lobisini ekleme zamanı geldi . :rolleyes:
 
Arduino ile Navigasyon Işık Uygulaması

Sümer Yamaner' Alıntı:
Delicesine bağımlısı oldum ben bunun! :D :D :D
Sümer bey, ilk ledimi yaktıktan sonra uzun süre "kıymetlimissss" ruh halinden çıkamamıştım, sizin de aynı halet'i ruhiyede olduğunuzu görüyorum :D.

Kodunuza gelirsek benim dikkatimi çeken bir kaç durum var.

- He ne kadar programcı olmasam da, K&R sitiline alıştığım için Allman sitli kod yazımını okumakta zorlanıyorum :D.
- delay kullanmıyorsunuz ama "blocking" while kullanıyorsunuz.
- analogWrite için, ilgili pini "output" olarak ayarlamaya gerek yok.

Düzenleme; "stobeon" fonsiyonunda "int z = 0;" den sonra bir parantez daha kullandığınızı, "while((millis() - timer) < 60);" ifadesini (ifade, aç-parantez ile değil, noktalı virgül ile bitiyor...) pek çözemedim. delay fonsiyonundan kaçınmanızı önermiştim ama "blocking" while yerine delay kullansanız, kod daha kısa olmaz mıydı ?
 
Arduino ile Navigasyon Işık Uygulaması

Omer Erkan' Alıntı:
Şu videoları bir de ben görebilsem!... :'(

Ömer Hocam direkt youtube linki işinize yarar mı?

Zafer Bey, öncelikle üşenmeyip kodu incelemeniz bana onur verdi, teşekkürler.
While sonrası noktalı virgüller ile Arduino IDE'ye yeni bir boyut kazandırmışım ama compiler de hiç itiraz etmeden kodu işlemiş. :)
K&R stili de ne ola ki? :)
Blocking while kullanmanın bu uygulamada bir sakıncası olmayacağını düşündüm çünkü yumuşak yanıp sönen strobe işlevini MsTimer2 kütüphanesi üzerinden interruptlarla çözdüm. Dolayısıyla büyük bir sorun kalmadı. Bu haliyle tek sorun strobe çakarken aç kapa sinyalinin okunamıyor oluşu. Pek hayati bir sorun değil ama tabii şık da değil. İleriki versiyonlarda bu konuyu da ele alırım diye düşünüyorum.
"int z = 0" sonrası gelen gereksiz parantez çifti ise kod bloğu ana loop içinden taşınırken oluşmuştur sanırım. :)

10 üzerinden 4.5 verseniz yeter! :D :D :D
 
Arduino ile Navigasyon Işık Uygulaması

MsTimer2 kütüphanesini kullanarak iki farklı zamanlamayla hem beacon'u yakıp söndüreyim hem de alıcıdan gelen sinyali kontrol edeyim dedim ama sanıyorum MsTimer2 sadece bir işi takip edebiliyor. Bu durumda rxchk() altprogramını biraz değiştirip beaconwrite() başlangıcında çağırmaya karar verdim. Bu şekilde her 90 mS'de bir alıcıdan gelen komutun değişip değişmediği kontrol edilebiliyor.
Alıcıdan gelen komut OFF ise rxflag = 1 yapılıyor. Bir sonraki gelişte rxflag = 1 ise ve ON komutu geldiyse anlıyoruz ki daha önce buton OFF yapıldı yani ARM edildi. O zaman mode değişkenini bir artırabiliriz demektir. Umarım açıklayabilmişimdir. Bunu yapmaktaki amacım ilk versiyondaki rxchk() altprogramında eğer buton bir kez OFF yapılırsa ON yapılana kadar orada kalıyordu ve bu da ışıklandırma patternini bozuyordu. Şu an ON/OFF/Mode değiştir komutları sekansta görülebilir herhangi bir değişikliğe ve bozulmaya yol açmadan çalışıyor.

Kod:
/* Uçak ışıklandırma sistemi projesi. Her iki kanat ucunda birer navigasyon lambası (solda kırmızı sağda yeşil).
 Kanat uçlarında birer beyaz strobe light. Gövdenin altında kırmızı strobe light. Dikey stabun tepesinde kırmızı beacon.
 V03'teki değişiklik, rxpwm sinyalinin interruptlar ile okunuyor oluşu. */

#include <MsTimer2.h>

int nav1 = 2; // Sol kanat ucu, kırmızı NAV light
int nav2 = 3; // Sağ kanat ucu yeşil NAV light
int strobe1 = 4; // Sol kanat ucu beyaz strobe light
int strobe2 = 5; // Sağ kanat ucu beyaz strobe light
int strobe3 = 6; // Gövde altı kırmızı strobe light
int beacon = 10; // Dikey stab ucu kırmızı beacon LED. PWM çıkışlı uç olmalı.
int rxpin = 8; // Alıcıdan gelen kontrol sinyali girişi

int rxflag = 0; // chkrx altprogramında beklemeyi engellemek için flag
int rxpwm = 0;
int mode = 0; // 0: LED'ler OFF. 1: Sadece NAV. 2: NAV + Beacon. 3: NAV + Beacon + Strobe
int beaconvalue = 33; // Beacon için minimum ışık düzeyi
int beaconstep1 = 11; // Beacon adımı
int beaconstep2 = 37;
int yon = 1; // Beacon artış azalış değişkeni. 1 ya da -1
int rxyon = 1;
int strobetiming; // Şu an için kullanılmıyor
unsigned long timer; // Genel zamanlama değişkeni


void setup ()
{
//  Serial.begin(9600);
  pinMode(nav1, OUTPUT);
  pinMode(nav2, OUTPUT);
  pinMode(strobe1, OUTPUT);
  pinMode(strobe2, OUTPUT);
  pinMode(strobe3, OUTPUT);
  pinMode(beacon, OUTPUT);
  MsTimer2::set(90, beaconwrite);
  MsTimer2::start();
}

void loop()
{
//  Serial.println(mode);
  if(mode == 0)
  {
    switchoff();
  }
  if(mode > 0)
  {
    digitalWrite(nav1, HIGH);
    digitalWrite(nav2, HIGH);
  }
  if(mode > 2)
  {
    strobeon();
  }
}


// Tüm LED'leri kapatan altprogram
void switchoff()
{
  digitalWrite(nav1, LOW);
  digitalWrite(nav2, LOW);
  digitalWrite(strobe1, LOW);
  digitalWrite(strobe2, LOW);
  digitalWrite(strobe3, LOW);
  digitalWrite(beacon, LOW);
}


// Alıcı sinyaline göre mode değişkenini düzenleyen altprogram
void chkrx()
{
  rxpwm = pulseIn(rxpin, HIGH);
  if(rxpwm >= 1500 && rxflag == 0)
  {
    return;
  }
  if(rxpwm >= 1500 && rxflag == 1)
  {
    rxflag = 0;
    mode = mode + 1;
    if(mode > 3)
    {
      mode = 0;
    }
  }
  if(rxpwm < 1500)
  {
    rxflag = 1;
  }
}



// Beacon LED2ine analog çıkış veren ve her seferinde parlaklığı bir artıran ya da azaltan altprogram
void beaconwrite()
{
  chkrx();
//  if(mode == 0);
//  {
//    switchoff();
//    return;
//  }
  if(mode < 2)
  {
    digitalWrite(beacon, 0);
    return;
  }
  if(mode > 1);
  {
    analogWrite(beacon, beaconvalue);
    beaconvalue = beaconvalue + (yon * 34);
    if(beaconvalue >= 255)
    {
      yon = yon * (-1);
      beaconvalue = 255;
    }
    if(beaconvalue < 10)
    {
      yon = yon * (-1);
      beaconvalue = 10;
    }
  }

}


void strobeon()
{
  int z = 0;
  timer = millis();
  digitalWrite(strobe1, HIGH);
  digitalWrite(strobe2, HIGH);
  while((millis() - timer) < 60)
  {
  }
  digitalWrite(strobe1, LOW);
  digitalWrite(strobe2, LOW);

  timer = millis();
  while((millis() - timer) < 60)
  {
  }

  timer = millis();
  digitalWrite(strobe1, HIGH);
  digitalWrite(strobe2, HIGH);
  while((millis() - timer) < 60)
  {
  }
  digitalWrite(strobe1, LOW);
  digitalWrite(strobe2, LOW);
  timer = millis();
  while((millis() - timer) < 60)
  {
  }

  timer = millis();
  digitalWrite(strobe1, HIGH);
  digitalWrite(strobe2, HIGH);
  while((millis() - timer) < 60)
  {
  }
  digitalWrite(strobe1, LOW);
  digitalWrite(strobe2, LOW);
  timer = millis();
  while((millis() - timer) < 60)
  {
  }

  timer = millis();
  digitalWrite(strobe3, HIGH);
  while((millis() - timer) < 60)
  {
  }
  digitalWrite(strobe3, LOW);
  timer = millis();
  while((millis() - timer) < 180)
  {
  }

  timer = millis();
  digitalWrite(strobe3, HIGH);
  while((millis() - timer) < 60)
  {
  }
  digitalWrite(strobe3, LOW);
  timer = millis();
  while((millis() - timer) < 380)
  {
    z = millis() - timer;
    if(z == 100)
    {
    }
    if(z == 250)
    {
    }

  }
}

Strobe LED'leri yüksek akım darbeleri ile süreceğim. O nedenle hiçbir şekilde belirlediğim 60 mS süreden uzun açık kalmamaları gerekiyor. Bu kod bu riski de ortadan kaldırıyor. Yani herhangi bir anda buton konumu ne olursa olsun strobe'lar çakıp sönmüş oluyorlar.

Multitasking'i kolaylaştıran bir non-standart kütüphane var aslında. "Scheduler". Ama bu Arduino Due ile çalışabiliyor sadece.