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
12,204
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.
Kod:
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);
  }
}
 

Forum istatistikleri

Konular
7,718
Mesajlar
128,452
Üyeler
3,117
Son üye
MekanikAdam

Son kaynaklar

Son profil mesajları

Python Geliştirmeye eklediğim yapay zeka sunucusu, yeni başlayanlar için roket etkisi
Bir insanın zeka seviyesinin en kolay tesbiti, sorduğu sorulardır.
yapay zeka interneti yedi bitirdi, arama motoru kullanan, forumlara yazan kaldı mı ?
Freemont2.0 herbokolog Freemont2.0 wrote on herbokolog's profile.
nick iniz yakıyor
:D
az bilgili çok meraklı
Back
Top