While Döngüsüne Çift Koşul Yazılamaz mı?

Gokrtl

Gökhan Kartal (TeknoDay)
Staff member
Katılım
27 Şubat 2019
Mesajlar
11,238
7 segment display ile geriye sayım kodlamaya çalışıyorum.
saniye çift basamaklı olduğundan iki tane digit kullanarak kodlamak istiyorum.
"saniye" ve "saniye2" adında iki değişken tanımlayarak ilerliyorum.
while döngüsü içinde geriye sayım yapmak istiyorum ama saniye > 0 || saniye2 > 0 şeklinde iki kontrolden biri doğruysa döngüye girsin olayını bir türlü kabul ettiremedim.

Kodlama kabaca şöyle. Tam bitirmedim ama. iki koşulu denetlemeyi çözersem devam edeceğim.
arduino zaman ayarlama:
if (digitalRead(7))    // 7. pine bağlı butona basılmışsa   sayacı başlatıyoruz.
  {
      while ((saniye > 0) || (saniye2 > 0))
      {
          digitalWrite(8, HIGH);

          saniye = saniye - 1;
          lc.setDigit(0, 5, saniye, false);
          delay(1000);
          if ((saniye == 0) && (saniye2 > 0))
          {
            saniye = 10;
            saniye2 = saniye2 - 1;
            lc.setDigit(0, 4, saniye2, false);
          }

          if ((dakika > 0) && (saniye2 == 0) && (saniye == 0))
          {
            dakika = dakika - 1;
            lc.setDigit(0, 3, dakika, true);
            saniye = 10;
            saniye2 = 5;
            lc.setDigit(0, 4, saniye2, false);
          }

          if ((dakika2 > 0) && (dakika == 0))
          {
            dakika = 10;
            dakika2 = dakika2 - 1;
            lc.setDigit(0, 2, dakika2, false);
            lc.setDigit(0, 3, dakika, false);

          }

        }
      }
 
Kod:
while( koşul1 | koşul2 )
Şeklinde dene.
Çalışmadı.
Hatta bir de şu şekilde denedim yine çalışmadı.

Kod:
bool state1 = 0;
    if (saniye > 0)
      state1 = 1;
    bool state2 = 0;
    if (saniye2 > 0)
      state2 = 1;
    while (state1 || state2)
 
Eğer iki değişkeni bitler bazında mantıksal işlem yapacaksan | olmasi lazım. Ama iki değişkeni sıfır veya sıfırdan farklı olması bazında işlem yapacaksan || kullanman lazım. Bazan her ikisi de kullanılabiliyor, bazan farkediyor. Senin kullanım şeklin doğru, başka bir problem var.

Bir de program çok karışık, öyle her türlü yan işi yapan tek bir fonksiyon kullanmamak lazım. Bir fonksiyon saniye sayacını azaltsın. Başka bir fonksiyon bu saniye sayacını (saat::dakika::saniye) formatına dönüştürsün. Başka bir fonksiyon da saat bilgisini ekrana yazsın. Her fonksiyonun yaptığı iş sınırlı ve net olmalı.
 
saniyelerin durumunu başka yeni bir değişkene ata... Bu yeni değişkeni while döngüsünde koşul olarak kullan...
 
Eğer iki değişkeni bitler bazında mantıksal işlem yapacaksan | olmasi lazım. Ama iki değişkeni sıfır veya sıfırdan farklı olması bazında işlem yapacaksan || kullanman lazım. Bazan her ikisi de kullanılabiliyor, bazan farkediyor. Senin kullanım şeklin doğru, başka bir problem var.

Bir de program çok karışık, öyle her türlü yan işi yapan tek bir fonksiyon kullanmamak lazım. Bir fonksiyon saniye sayacını azaltsın. Başka bir fonksiyon bu saniye sayacını (saat::dakika::saniye) formatına dönüştürsün. Başka bir fonksiyon da saat bilgisini ekrana yazsın. Her fonksiyonun yaptığı iş sınırlı ve net olmalı.
saniyelerin durumunu başka yeni bir değişkene ata... Bu yeni değişkeni while döngüsünde koşul olarak kullan...
Şimdi while içini komple boşalttım ve iki koşulu ayrı ayrı denetleyerek "merhaba dünya" yazdırdım. İki koşul da çalıştı.
İçerideki kodlarda sıkıntı var anlaşılan. Sorun aslında saniyenin çift basamaklı olup, benim bu çift basamağı ayrı ayrı kontrol etmeye çalışmamdan kaynaklanıyor. Ben biraz while içindeki kodlara odaklanayım, içinden çıkamazsam tekrar yazarım.
 
Sonunda doğru yolu buldum :)

Kod:
if (digitalRead(7))    // 7. pine bağlı butona basılmışsa   sayacı başlatıyoruz.
  {
    while (saniye2 > 0 || saniye > 0)
    {
      digitalWrite(8, HIGH); // Röle Aktif
      saniyeSay();
      dakikaSay();
    }
  }

  digitalWrite(8, LOW); // Saniye ve Dakika Sıfırlandığında Sayaç Tamamlanmış Olacak ve Röleyi Pasif Yapacak

}

/////////// FONKSİYONLAR //////////


/////////// Saniye Sayma Fonksiyonu /////////////////

void saniyeSay() {
  if (saniye > 0)
  {
    saniye = saniye - 1;
    lc.setDigit(0, 5, saniye, false);
    delay(1000);
  }

  if ((saniye == 0) && (saniye2 > 0))
  {
    saniye = saniye - 1;
    saniye = 9;
    saniye2 = saniye2 - 1;
    lc.setDigit(0, 4, saniye2, false);
    lc.setDigit(0, 5, saniye, false);
    delay(1000);
  }

}

//////////////// Dakika Sayma Fonksiyonu  //////////////////////
void dakikaSay() {
  if ((dakika > 0) && (saniye2 == 0) && (saniye == 0))
  {
    saniyeSay();
    dakika = dakika - 1;
    lc.setDigit(0, 3, dakika, true);
    saniye = 10;
    saniye2 = 5;
    lc.setDigit(0, 4, saniye2, false);
  }
  if (dakika == 0)
  {
    saniyeSay();
  }
  if ((dakika2 > 0) && (dakika == 0) && (saniye2 == 0) && (saniye == 0))
  {
    dakika2 = dakika2 - 1;
    lc.setDigit(0, 2, dakika2, false);
    saniye = 10;
    saniye2 = 5;
    dakika = 9;
    lc.setDigit(0, 3, dakika, true);
    lc.setDigit(0, 4, saniye2, false);
  }
}
 

Çevrimiçi personel

Forum istatistikleri

Konular
5,926
Mesajlar
101,235
Üyeler
2,504
Son üye
yaxe22

Son kaynaklar

Son profil mesajları

Lyewor_ wrote on taydin's profile.
Merhabalar. Elektrik laboratuvarınız varsa bunun hakkında bir konunuz var mı acaba? Sizin laboratuvarınızı merak ettim de :)
Lyewor_ wrote on taydin's profile.
Merhabalar forumda yeniyim! Bir sorum olacaktı lcr meterler hakkında. Hem bobini ölçen hemde bobin direnci ölçen bir lcr meter var mı acaba?
gruptaki arkadaşlara selamlar. sıteyi bu gün fark ettim. Asansör için 2x7 segment LCD gösterge üretmek istiyorum. acaba bu sayfadaki arkadaşlardan destek alabilirmiyim. LCD nin mantık açılımı ektedir.
deneyci wrote on TA3UIS's profile.
Selam.
Amatör telsiz lisansı nasıl alınıyor?
Lisansı olmayanı forumlarına almıyorlar. :)
Bilgi alamıyoruz.
m.white wrote on Altair's profile.
İyi akşamlar.Arabanız ne marka ve sorunu nedir.Ben araba tamircisi değilim ama tamirden anlarım.
Back
Top