Arduino buton basma süresine göre işlem yapma

Herkese iyi günler. Bir arkadaşım mesaj attı ve “Bir butona  belli bir süre basınca bir röle, belli bir süre basınca başka bir röleyi tetikleyebilir miyiz?” diye sordu. Biraz araştırdım ve birçok kod buldum ama kodlar biraz karışık geldi açıkçası. Biraz düşününce kendim yapmaya karar verdim. Biraz uğraşınca başardım şükür. Burada 2 adet led kullandım ve 1 saniyeden az basarsam kırmızı led, 1-2 saniye arasında basarsam yeşil led yanıyor. 2 saniyeden fazla basarsam ledler sönüyor. Mantık olarak ise şu şekilde düşündüm;

Butona basıldığında while döngüsü çalışıyor ve delay ile 100 milisaniye bekleyerek bir değişkeni arttırıyor. B değer en başta 0. Butondan elimizi çekince  değer 10 kez artarsa 1 saniye beklemiş oluyoruz ve kırmızı led yanıyor. Eğer değer sayısı 10 ile 20 arasında ise 2 saniye beklemiş oluyoruz ve değer 20’den fazla ise 2 saniyeden fazla beklemiş oluyoruz. While komutu bu sayıyı buluyor.

While’dan sonraki if bloğu ise işlemin yapılacağını onaylayarak say değerine göre ilgili ledi yakıyor diğerini söndürüyor ve say değeri ile işlem değerlerini tekrar sıfırlıyor. işlem bu şekilde sürekli devam ediyor. Led yerine istediğiniz röleyi tetikleyerek işlem yapabilirsiniz.

Mantık kolay umarım işinize yarar. Kodlar ve devre aşağıdaki gibi. Kolay gelsin.

Devre şeması
Butona 5 volt giriş yaptık ve çıkışı  digital 2’ye, kırmızı led digital 7’ye ve yeşil led digital 6’ya bağladık.

Video

Kodlar

int buton=2;
int kirmizi=7;
int yesil = 6;
int deger = 0;
int say = 0;
bool islem = false;
void setup() {
  pinMode(buton, INPUT);
  pinMode(kirmizi, OUTPUT);
  pinMode(buton, OUTPUT);
  Serial.begin(9600);
  
}

void loop() {
  deger = digitalRead(buton);
  Serial.println(deger);
  while (deger == 1)
  {
    delay(100);
    say++; 
    deger = digitalRead(buton); //butonu tekrar okuyoruz ki while takılı kalmasın. aksi halde 
    islem = true;               // deger değişkeni hep 1 olduğu için while sonsuz döngüye girer
  }
  Serial.println(say);
  if (islem == true)
  {
        if (say >0 && say <= 10) //1 saniye basıldı
        {
          digitalWrite(kirmizi,HIGH);
          digitalWrite(yesil,LOW);
        }
        else if (say >10 && say <= 20) //2 saniye basıldı
        {
           digitalWrite(yesil,HIGH);
           digitalWrite(kirmizi,LOW);
        }
        else //2 saniyeden fazla basıldı
          {
             digitalWrite(yesil,LOW);
             digitalWrite(kirmizi,LOW);
          }
           say=0; 
           islem = false;
  }
}

 

34 yorum

  • Mustafa KARSLI

    Ellerine sağlık dostum. Çok faydalı uygulama olmuş.

  • Çağrı

    Sade ve anlaşılır olmuş. Teşekkürler.

  • Ayhan Korcan

    Teşekkürler. İşime çok yaradı

  • Ufuk

    Oncelikle cok faydali olmus tesekkurler. Bir sorum olacakti. 3 ayri butonla tek bir roleyi 3 ayri sn de cektirmek istiyorum. Yani birinci butona bastim role 5 sn cekili kaldi sonra enerjisi kesildi. 2.butona bastim 3 sn cekili kaldi vs. Nasil yapabilirim. Yardimci olursaniz sevinirim.

  • İbrahim

    Merhaba, Elinizi sağlık güzel post olmuş ama şu pronlemime çözüm bulamıyorum. Yardımcı olabilir misiniz ?
    Kısa yanma ve uzun yanma modu olan bir ledi bir buton ile kontrol etmem gerekiyor. Butona 3 saniye basılı tutulduğunda uzun yanma moduna geçmesi daha az basılı tutulduğunda kısa yanma moduna geçmesi gerekiyor. Buton basılı tutulduğu sürece LED bulunduğu modun döngüsünde devam edecek. Buton bırakıldığında mod değişimi gerekiyorsa döngü yeni moda uygun olarak yeniden başlar (ör; uzun basma modunda iken kısa basma yapmak). Eğer mod değişimi gerekmiyorsa (ör; uzun basma modunda yine butona uzun basmak) LED döngüsü butona hiç basılmamış gibi devam edecektir.

    • mustafaakbal

      normalde zaten benim verdiğim kod temel olarak onu yapıyor. siz iki led yerine tek ledi kontrol ederseniz ve

      else //2 saniyeden fazla basıldı 
      { 
      digitalWrite(yesil,LOW); 
      digitalWrite(kirmizi,LOW); 
      }
      
      

      satırını kaldırırsanız yanlış anlamadıysam dediğinizi istediğinizi olacaktır.

      • ibrahim

        Mesele şurada sizinki süre kontrolü yapıyor ama normalde yanan ya da sönen lede göre yapıyor. Benim istediğimde led bir döngü içinde devamlı yanarken ben butonu arkaplanda yani kesme ile kontrol etmem gerekiyor.

        • mustafaakbal

          Yanan yada sönen lede göre yapmıyor. Basma süresine göre istenen ledi yakıyor. Tek led olursa uzun basarsanız ledin bağlı olan pinini high yaparak yanık kalır. Kısa basarsanız da pini low yaparak söndürürsünüz. Aksi halde hep yanık kalır led.

  • deniz

    Merhaba
    arduino ilk açıldığında iki led birden yanıyor bunu arduino ilk açıldıgında sadece bir led yansın sonrasında butona basınca biri sönsün digeri yansın istiyorum nasıl yapabilirim yardımcı olur musunuz. şimdiden teşekkürler

  • Hocam baya ugrasmissiniz mantik olarak bende ilk baslarda benzer bir yontem bulmuştum kendimce. Fakat pulsein kodu zaten bu işe yarıyormus megersem. Birtane uzunluk tanımlayıp (orn. long sure) long = pulsein(pinno, HIGH) Kodu ile belirlenen pin high oldugunda sure akmaya baslar low olana kadar saymaya devam eder. low oldugunda ise bu degeri sure tanimina yazar. Minimum 10 mikrosaniye sayabiliyor maximum bir sinir yok. Eger pulsein(pinno, HIGH) yazarsanız HIGH olunca saymaya baslar LOW olunca saniye sayma islemi biter. Sonrasinda yine senin yaptigin gibi if kosulu ile gerekli islemleri yaptirabilirsin. Satirlarca kodu yazmak zorunda kalmazsin hem bu koda ihtiyaci olan diger arkadaslarinda ise yarar diye yaziyorum hemde size kolaylik olsun diye.

    • mustafaakbal

      teşekkürler bilgi için. evet bu kodu yazarken yeni başlıyordum bende çok araştırmadan kendim böyle bir mantık oluşturmuştum. Sizin gönderinizi de pulsein(pinno, LOW) şeklindeki kısmını pulsein(pinno, HIGH) olarak güncelledim.

  • Emir

    Hocam,
    (say >0 && say 0 && say <= 10)
    yapılabilir mi?

    • mustafaakbal

      sanırım sayı 1-10 arasında ise şeklinde yapmaya çalışıyorsunuz ama bu şekilde olmaz.
      if (say>0 && say<=0) { çalışacak kodlar; } şeklinde olmalı. Amacınız o ise

  • Emir

    Hocam tek buton ile, önce kısa hemen ardından da uzun basarak ledi yaksak; sonra da aynı butonla aynı kısa ardından da uzun basma işlemini yaparak ledi söndürsek. Bunu kod da nasıl yapabilirim.

    • mustafaakbal

      şöyle bir mantık kurdum;
      butona basınca süreyi tutarsınız, sonra diğer basmada da tutarsınız ve ikisini birbiri ile toplarsınız. eğer toplam istediğiniz aralıkta ise yanıyorsa söndür, sönükse yak yapabilirsiniz.

  • Onur can

    Merhaba Oğlum un akülü motosiklet ine 1w lık power ledler ile çakar yapmaya çalışıyorum.
    Birden fazla mod eklemek istiyorum ve bun modlar arasında ki geçişi buton ile yapmaya çalıştım beceremedim ama.
    Buton a bastığım zaman modun değişmesi basmadığım zaman ise o modda devamlı döngü halinde kalmasını istiyorum yardımcı olursanız sevinirim.TESEKKURLER…

    • mustafaakbal

      Arduino kullanacaksanız şöyle birşey geldi aklıma. Kaç mod varsa bir değişken tanımlayıp 0’dan başlayın. Eğer 0 ise yanma şeklini kodlayın, dijital girişten bir buton okuyun. Butona basılınca değişken 1 artsın ve değerlere göre modlar çalıştırsın.

  • Enes

    5 buton ile 1 led yakıyorum her butonun led yakma süresi farklı. Soru: her buton için led yakma süresini butona basarak ayarlamam mümkün mü ?

  • Zeynep

    merhaba hocam ,Arduino ile kurduğumuz devrede butona tıklayıp basılı tuttuğumuz zaman kaç saniye basılı tutulduğunu hesaplayan bir kod yazmamızı istedi hocamız .Bu konuda yardımcı olabilir misiniz?

    • mustafaakbal

      Bu uygulama da onu yapıyor işte. Daha gelişmiş kodlar vardır belki ama basit hali ile 100milisaniye kayıpla hesaplama yapabiliyor basma süresini.

    • Srkan

      İki röle olduğunu varsayalım arduino ilk açıldığında birinci röle açık olacak yada en son hangi konumda kaldıysa o konumda açılacak butona birkez basınca 2. Röle açılacak birkezdaha basınca tekrar birinci röle açılacak ekranda ise röle bir röle 2 diye yazacak bunu kodlayabilen var mı

  • Faruk ÖZGÜR

    Merhabalar.
    Nodemcu ile çalışıyorum. Düğmeye basıldığı zaman LCD ekran da düğmeye basılan tarihi ve saati yazdırmak istiyorum ama bir türlü yapamadım. Bu konu da yardımcı olur musunuz?
    Mail adresim: farukozgur501@gmail.com
    İyi çalışmalar.

  • Faruk ÖZGÜR

    Yapmış olduğum çalışmada oda temizlendikce butona 5 saniye boyunca basılı tutulacak ve lcd ekran da butona basılan en son tarihi yazdırmaya çalışıyorum. Herhangi bir kod yazamadım.Bu konu da yardımcı olur musunuz?

  • hatice nur

    Birinci butona basınca ilk 3 led yediye kadar yanacak ikinci butona basınca da 2 grup 7’ye kadar yanacak 3 butona basıldığında da 1 butona bastığımızda 2 butona bastığımız sayıları toplayacak öyle yazacak . bunu nasıl yaparız hocam

    • mustafaakbal

      Şöyle bir yol izleyin.
      1. butona basınca 1-7 arasında rastgele sayı tutsun ve o sayıda ledi yaksın. aynı zamanda bu sayıyı bir değişkene aktarsın. sonra 2. butona basınca da aynısını yapsın ve bir değişkene aktarsın. 3. butona basınca iki değişkeni toplayıp gerekli ledleri yaksın.

  • sami

    Merhaba hocam. Su flatörü ile vana aç kapa kontrolü yapmak istiyorum. flatör açtığı zaman bunu buton olarak da düşünebiliriz. Buton açık konumuna geldiği zaman arduino sayaç bir artıyor. Flatör açık konuma geldiği zaman (2 ile 3 saat açık kalıyor) sayaç durmadan sayıyor. Yani 2 ile 3 saat açık kalsa da sayaç tek sayacak bir sistem düşünüyorum ama bir şey bulamıyorum. Videolarda uzun süre açık kalan buton bırakıldığı zaman tek sayan program örnekleri var ama bu da işime yaramıyor. Flatör devreye girdiğinde hemen tek sayacak ve sonraki döngüye kadar bekleyecek bir şey lazım. mekanik düzenekler düşünüyorum. Bu konuda var mı bir fikriniz. teşekkkürler.

    • mustafaakbal

      Dediğinizi şu şekilde anladım. Flatör açıldığında yani arduinoya bilgi geldiğinde değişken sadece bir artacak ve açık kalıp elektrik geldiği sürece başka artmayacak. Sonra kapandığında yani elektrik kesildiğinde değişken sadece 1 kez artmış olacak. Elektrik geldiği süre boyunca değişken değeri sürekli artmayacak.

      Bunu yapmaktaki amacınız sanırım gün içinde kaç kez açılıp kapandığını anlamak. Doğru mudur?

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir