butonla döngü kontrolü
  • herkeze selam
    takıldığım yeri şu şekilde örneklemek istiyorum;
    butona bastım, butona bastığım sürece led belli zaman aralıkları ile yanıp sönecek döngü sürecek.
    ta ki elimi butondan cektiğim ana kadar.
    elimi butondan çektiğim an döngü başlangıç pozisyonuna geri dönüp butona basmamı bekleyecek

    benim kodumda ise butona bir kez basıp çekince döngü sonuna kadar devam ediyor

    int ledPin=8;
    int butonPin=9;
    int butonDurum=0;
    void setup(){

    pinMode(ledPin,OUTPUT); //led pinimizi çıkıs ayarladık
    pinMode(butonPin,INPUT); // buton pinimizi giriş ayarladık
    }
    void loop(){

    butonDurum=digitalRead(butonPin); // dijital olarak okuduk
    if(butonDurum==HIGH){
    digitalWrite(ledPin,HIGH);
    delay (100);
    digitalWrite(ledPin,LOW);
    delay (100);
    digitalWrite(ledPin,HIGH);
    delay (280);
    digitalWrite(ledPin,LOW);
    delay (100);
    digitalWrite(ledPin,HIGH);
    delay (28000);

    }else
    digitalWrite(ledPin,LOW);
    }
  • Dostum zaten döngü dediğin şeyde butona basıyormusun basmıyormusun kontrolünden başka birşey yokki. yani şuan zaten butona basmazsan sürekli buton kontrolü yapar.
    Tam olarak anlayamadım ne demek istediğini kod olarak değilde türkçe anlatırsan derdini daha iyi olur
  • ekmekçi öncelikle ilgilendiğin için teşekkür ederim
    şu şekilde anlatmaya çalışayım
    olması gereken
    1- butona bastım diyelim ama elimi çekmedim buton hala basılı
    2- led değişik aralıklarla yanıp sönecek
    3- elimi butondan çektiğim an led hangi durumda olursa olsun sönecek

    benim yaptığımda ise (yukarıda kodu olan);
    butona basılı tutuyorum
    led değişik aralıklarla yanıp sönmeye başlıyor
    buraya kadar sorun yok

    elimi butondan çeksemde
    led bütün komutları aldıktan sonra sönüyor

    ben ise butondan elimi çekercekmez sönmesini istiyorum

    (yinemi karışık anlattım acaba :( )


  • Anladım o basit. Hemen hemen her yorumumda bahsettiğim DELAY problemi. Yazılımda delay kullanmak kesinlikle açıklara sebep olacktır ki sendede olmuş. Delayın mantığı şudur delay satırına geldiğinde işlemci bir sonraki satıra geçmez delay içerisine yazdıgın sayı kadar orda bekler. E şimdi sana sorayım diyelim buton basılı if(butonDurum==HIGH) satırına girdi ilk sırada gelen digitalWrite(ledPin,HIGH); delay (100);satırlarınıda yaptı sen burada elini bıraksan bile bu işlemci nasıl algılasın ? adam delay komutunda boşa sayıyor butonu kontrol etmiyor ki. Velhasıl kelam delay yerine bir millis(); kullan herşey düzelecektir.
  • hocam delay (); yerine millis(); kullanmayı bilmiyorum :(
    birebir delay(); yerine koydum olmadı tabiki :(
  • örnek verebilirmisiniz
  • millis fonksiyonu milisaniye cinsinden bir sayıcıdır. bu fonksiyonu kullanarak bekleme oluşturacaksın yani delay(150) demek 150milisaniye bekle demek sen bunu millis ile yapacaksın. Algoritması sende
  • Ekmekci hocam bu delay kullanımında ki yanılgının nedeni nerdeyse tüm basit örnek kodlarda kullanılmasından kaynaklanıyor. Balık baştan kokar blink örneğiyle yani. Bu arkadaşımızda led yanıp sönecekse delay lazım deyip basmış delayi. Şu an mobildeyim müsait olursam bu konu altına bi milis kalıbı atayim müsaitseniz siz atın benzer sorunları link atıp geçeriz.
  • Aynen haklısın.
    Türkiyede yeni başlayanlar için sıralama şu şekilde;

    İşlemci ? >>> arduino
    arduino?>>> Led blink
    Led blink? >>> Led on, Delay Led off

    Asagıda basit bir örnek mevcut. Açıklaması ise şöyle;
    3 tane değişken var bunlardan birtanesi "bekleneceksure", digeri "oncekizaman" ve sonuncusu ise"suankizaman"
    millis(); fonksiyonu yapısı gereği durmadan sayar hiç birşeye bakmaz sadece sayar sen ledde yaksan ledde söndürsen rölede çektirsen bu saymaya devam eder. bundan faydalanarak zaman aralıkları yapmak asıl amacımız.
    bekleneceksure: zaman aralığını belirlemek
    oncekizaman: birkere millis(); fonksiyonu içindeki değeri alırız ( değer ne olursa olsun ) ve bu değişkene atarız böylece elimizde bir zaman referansı olur.
    suankizaman: bu değişkenede her loop döngüsü içerisinde millis(); fonksiyonu içerisinde ne değer varsa almasını söyleriz. Böylece "oncekizaman" değişkeninde sabit bir sayı, "suankizaman" değişkeninde de sürekli sayan bir sayı olur. Sürekli değişen sayıdan sabit sayıyı çıkardığımızda elimizde bir fark değeri oluşur sonra bu farka bakarız bizim "bekleneceksure" kadar olmuşmu diye. Böylece basit bir sayıcı /timer kurulmuş olur

    unsigned long bekleneceksure=1000; // beklenecek süreyi belirtir burada 1 sn dir
    unsigned long oncekizaman=0; // sayıcıyı karsılaştırırken bize gereken bir değişken.

    void loop()
    {
    unsigned long suankizaman= millis(); // millis fonksiyonunda hangi deger varsa onu al

    if ((unsigned long)(suankizaman- oncekizaman) >= bekleneceksure) // burada belirlemis oldugun beklenecek sure kadar beklenildimi kontrol eder böylece 1 saniyelik bir bekleme olmus olur
    {
    ledState = !ledState; // Led yanıksa söndür, sönükse yak
    digitalWrite(13, ledState); //değeri 13 numaralı çıkışa aktar
    oncekizaman= millis(); //millis fonksiyonunda hangi değer varsa onu al
    }
    }

Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Login with Facebook

Tagged

Açık kaynak kültürü gereği, çözdüğünüz problemlerin çözümlerini paylaşmayı lütfen unutmayın.