Butona basma sayısını sayarak, istenilen sayıda işlem yapma ile ilgili örnekleri daha önce yayınlamıştık.
http://www.ilerikontrol.com/showthread.php/15015
http://www.ilerikontrol.com/showthread.php/15009
http://www.ilerikontrol.com/showthread.php/14998

Yukarıdaki örneklerde butona basma sayısını sayarken, delay(250) ile aralıklı olarak kontrol ettiğimiz butonun bağlı olduğu bacağa gelen sinyalin okunması için tahmini bir bekleme süresi oluşturmuştuk.
Ancak bu durum bazı durumlarda butona bir kez basıldığında iki kez algılanmasına neden olmaktadır. Bunun önüne geçebilmek için, butondan elimizi çekene kadar programı bekleten bir kodlamaya ihtiyaç duyulmaktadır. Bu işlemi de ancak "şu olduğu sürece bekle" gibi bir ifade ile yapabiliriz.
Bu gibi durumlar için Arduino programlama dili içerisinde bir şart gerçekleştiği sürece programı bir kontrol yapmaya sürükleyen While yapısı kullanılmaktadır.
Kod:
while(şart) {
//şartla çalışacak kodlar.
}
Yukarıdaki kodlamada, şart olarak tanımladığımız mantıksal sınama sonucunda sürekli olarak True yani doğru değeri üretilirse program sürekli olarak while yapısı içinde kalacaktır. Bu şekilde while yapısı içerisindeki kodlar sonsuz döngü halinde gerçekleştirilecektir.
Şart bir kez yanlış olduğu zaman while döngüsü içine yazılmış kodlar işleme alınmadan sonraki satırdan itibaren kodlar işlenmeye devam edecektir.

While yapısını şu şekilde kullanarak butondan elimizi çekene kadar butona bağlı işlemlerin yapılmamasını sağlayabiliriz.

Kod:
   while(butonDurumu == 1) //butona basılı olduğu sürece 
{ 
     butonDurumu = digitalRead(buton); // butonu tekrar oku.
   }
Bu kodlama alanı butondan elimizi çekene kadar programın burada dönmesini sağlayacaktır. Butondan elimizi çektiğimiz anda, program while yapısı içindeki şart doğru olmayacağı için while yapısından sonraki satırdan işlemeye devam edecektir.

Yukarıdaki örnek, butona basılınca 1 geldiği durumlarda kullanılabilir. Butona basıldığı durumlarda 0 bilgisi geliyorsa şart bölümüne 0 a eşit mi sorusu kodlanmalıdır.

Kod:
while(butonDurumu == 0) //butona basılı olduğu sürece 
{ 
butonDurumu = digitalRead(buton); // butonu tekrar oku. 
}
Şimdi bu bilgileri kullanarak, butona basma sayısı kadar ledi yakıp söndüren bir uygulama yapalım.
A1 ve A2 girişlerine sıfır gönderen butonlar bağlanmış olsun.
A1 butonuna basıldıkça bir değişkenimizi (sayac gibi) 1 arttıralım.
A2 butonuna basılınca ise A1 butonuna basıldığı kadar 10 nolu bacaktaki ledimiz yanıp sönsün.
Aynı zamanda A2 butonu ile sayac olarak kullandığımız değişken 0 olarak düzenlensin.

Devre şeması:



Kodlar:

Kod:
int led = 10, sayac = 0; //led isminde ilk değeri 10 olan,
//sayac isminde ilk değeri 0 olan tamsayı değişkenler.
void setup() {
  pinMode(led, OUTPUT);//led i yani 10 nolu bacağı çıkış olarak ayarladık.
  digitalWrite(led, 1); //led sıfırda yandığı için başlangıçta söndürmek amaçlı 1 gönderdik.
  pinMode(A1, INPUT); //A1 ve A2 bacaklarını giriş olarak ayarladık.
  pinMode(A2, INPUT);
}
//www.ilerikontrol.com
//@mrt4shn
void loop() {
  int durum1 = digitalRead(A1); //butonları dijital yöntemle okuduk.
  int durum2 = digitalRead(A2); //butonlara basıldığında bu değişkenler 0 olacak.
  if (durum1 == 0) //durum1 0 ise yani A1 e basılmış ise.
  {
    sayac++; //sayac değişkenini 1 arttır.
    while (durum1 == 0) //durum1 hala sıfırsa.
    {
      durum1 = digitalRead(A1); //A1 i tekrar oku.
    }
    delay(10); //işlemcimiz nefes alsın :)
  }
  else if (durum2 == 0) //birinciye değil de ikinci butona basıldı ise.
  {
    for (int i = 1; i <= sayac; i++) //sayac kadar işlem yapacak döngü oluşturduk.
    {
      digitalWrite(led, 0); delay(200); //led ışık versin 200ms süre ile.
      digitalWrite(led, 1); delay(200); //led sönsün 200ms süre ile.
    }
    while (durum2 == 0) //A2 deki butona hala basılı ise şunu yap.
      //Butondan gelen bilgi 1 olana kadar döngü devam eder.
    {
      durum2 = digitalRead(A2); //A2 butonu tekrar oku.
    }
    sayac=0;//A2 ye basılınca son aşamada sayac değişkeni sıfırlansın.
    delay(10);// işlemcimiz biraz dinlensin.
  }
}
Kaynaklar:
https://www.arduino.cc/reference/en/...ructure/while/
https://gelecegiyazanlar.turkcell.co...tiklama-sayaci