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,776
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
8,485
Mesajlar
139,220
Üyeler
3,372
Son üye
murat1557

Son kaynaklar

Son profil mesajları

"Araştırma, ne yaptığını bilmediğinde yaptığın şeydir." - Wernher von Braun
mechanic ayhanarican mechanic wrote on ayhanarican's profile.
https://www.allmystery.de almanca biliyorsan burada araştır. Yapay zekada çeviriyor gerçi.
Almanların matematik bilgisi daha iyi oluyor.
“Kendi yolunu çizen kişi, kimsenin izinden gitmez.” – Nietzsche
Kim İslâm’da güzel bir çığır açarsa (güzel bir alışkanlık başlatırsa), onun sevabı ve kendisinden sonra ona uyanların sevapları, onların sevaplarından hiçbir şey eksilmeksizin ona da yazılır.
erdemtr55 taydin erdemtr55 wrote on taydin's profile.
Merhaba Taydin bey,
Gruba spms serisi yapıcak mısınız?
ben 3 sargılı toroid ile 2 adet flyback sürücek bir devre yapmayı düşünüyorum.size soracak sorularım vardı?
Back
Top