Soru & Cevap

ARDUINO FONKSİYON KAPATMA VEYA ATLAMA

06.04.2019 - 11:54

Merhaba alttaki gibi bir kodlamam var aslında farklı kodlamam ama anlaşıbilmesi için basit bir hale çevirdim LED yakma şekli gibi. Sorum şuki resimdeki gibi 2 adet if döngüm var. 1 adet sayacım var. Sayaca 2 farklı değer geliyor 110 ve 140 olarak. Şimdi 110 değeri geldiğinde if komutu başlıyor . 110 değeri için yazılan kodlar çalışırken benim sayacım değişiyor 140 değeri geliyor. Yani program ledleri yakmayı yarıda bırakıp diğer if döngüsüne başlaması gerekiyor. Ama bu şekilde yapmıyor önce ilk döngüyü tamamlıyor sonra ikinci döngüye geçiyor. Benim istediğim sayac değiştiği zaman aniden işini yarıda bırakıp diğer işe geçmeli program. Bunun için ne kullanabilirim.     Programda aslında arka planda müzik çalıyor ve ledler müziğe göre hareket ediyor. Ben müziği değiştiriyorum ve sıradaki müziğe göre ledlerin yanması lazım fakat önce 1. müzik için programlanmış yakma söndürme işlemini bitirip sonra 2.ye başlıyor.

 

Başlığı fonksiyon atlama olarak açtım çünki ifler içindeki led yakma işlemleri için fonksiyon çağırıyorum. Yani 1. ifte muzik1();   için o fonksiyonu çalışyıroyurm 2. içinde muzik2();

 

 

örnek kodlama :

 

if(sayac==110)
 {
 digitalWrite(LED1,HIGH);
 delay(500);
 digitalWrite(LED2,HIGH);
 delay(500);
 digitalWrite(LED3,HIGH);
 delay(500);
 digitalWrite(LED4,HIGH);
 delay(500);
 digitalWrite(LED5,HIGH);
 delay(500);
 digitalWrite(LED6,HIGH);
 delay(500);
 digitalWrite(LED7,HIGH);
 delay(500);
digitalWrite(LED8,LOW);
 delay(500);
 digitalWrite(LED9,LOW);
 delay(500);
 digitalWrite(LED10,LOW);
 delay(500);
 digitalWrite(LED11,LOW);
 delay(500);
 digitalWrite(LED12,LOW);
 delay(500);
 digitalWrite(LED13,LOW);
 delay(500);
 digitalWrite(LED14,LOW);
 delay(500);
 //DEMO();
 }
 if(sayac==140)
 {
 digitalWrite(LED8,HIGH);
 delay(500);
 digitalWrite(LED9,HIGH);
 delay(500);
 digitalWrite(LED10,HIGH);
 delay(500);
 digitalWrite(LED11,HIGH);
 delay(500);
 digitalWrite(LED12,HIGH);
 delay(500);
 digitalWrite(LED13,HIGH);
 delay(500);
 digitalWrite(LED14,HIGH);
 delay(500);
 digitalWrite(LED1,LOW);
 delay(500);
 digitalWrite(LED2,LOW);
 delay(500);
 digitalWrite(LED3,LOW);
 delay(500);
 digitalWrite(LED4,LOW);
 delay(500);
 digitalWrite(LED5,LOW);
 delay(500);
 digitalWrite(LED6,LOW);
 delay(500);
 digitalWrite(LED7,LOW);
 delay(500);
 //DEMO_MUZIK1();

 } 

1,241 Görüntülenme

2 Cevap

Sitedeki sorulara cevap verebilmek için giriş yapın ya da üye olun.

picture-87289-1569234090.png
yakupgovler
28.09.2019 - 11:25

Delay ifadeleri yerine milis fonksiyonu ile geçekme nasıl yapılır konusunu araştırıp, kodunuza uyarlarsanız ve yine arduino ile dizi kullanımı konularını incelerseniz kodunuzu çok daha kısaltabilir ve fonksiyonel hale getirebilirsiniz.

picture-158072-1530701953.jpg
TGUNEYSU
07.04.2019 - 08:56

WHILE kumandasını inceleyin. Koşul doğru oldukça çalışan bir yapı sunar. Bunun içinde de değişkenlerle kontrollü bir döngü kodu yazmanız gerekir. "LEDn" kullanacağınıza sadece değişken "n" kullanarak geliştiriseniz, bunu +1 işlemiyle kullanıp WHILE içinde halledebilirsiniz: digitalWrite(n,LOW veya HIGH).   Kodunuzdan ne yapmak istediğiniz bilinmediği için, görünene göre bir SERİ olay yaratmak istiyorsunuz: LEDler sırayla yanıp sırayla sönecekler. Burada karar vermeniz gereken bir şey var: OLAY mı önemli (sayac = n) yoksa LEDlerin sırayla yanıp sönmesi mi?  Sayaç değiştiğinde hemen reaksiyon gerekiyorsa o zaman DELAY(500) kullanamazsınız. DELAY kullandığınız sürece BLOKE eden kod yazmış oluyorsunuz. Yani DELAY işlerken başka hiç birşey çalışmaz !!!  Sizin SERİniz 14 x 500ms, yani 7san uzunluğunda. En iyi halde Sayac 500ms den veya en kötü halde 7 saniyeden az zaman içinde değişiyorsa kodunuz doğru çalışmaz. KESME (interrupt) veya MILLIS() kullanan gecikme kodu gerekir. Bunu araştırıp bulabilirsiniz. Bu forumda bunun için birkaç yazım var.     Ayrıca LED yanıp sönmeyi LOJIK olarak uygulamanız daha kolay olabilir: LED1 in durumunu değiştirmek için (yanıyorsa söndür, sönükse yak) digitalWrite(1, digitalRead(1)) kullanabilrsiniz. Kodunuzu kısaltacaktır. İyi çalışmalar.