Sonsuz Döngü

Ben sadece şunu anlamadım: flag = !flag;
flag değişkeni içinde sıfır olduğuna göre, !flag komutu değişken içine sıfırdan farklı bir şey mi atıyor?

Sıfır olmayan bir değer atıyor. Birçok derleyicide bu değer 1 oluyor.
 
Tutmuyor çünkü kod çok hızlı çalıştığı için millis fonksiyonu birkaç kere peş peşe aynı değeri döndürüyor. Senin program da birkaç kere yapıyor işlemi sadece bir kere yapacağına. Aşağıdaki kodu arduino uno'daki LED ile denedim doğru çalışıyor.

C++:
int flag = 0;
unsigned long prev_ts, ts;

void setup()
{
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop()
{
  ts = millis();
  if (ts != prev_ts)
  {
    if ((ts % 1000) == 0)
    {
      flag = !flag;
 
      if (flag)
      {
        // turn on LED
        digitalWrite(LED_BUILTIN, HIGH);
      }
      else
      {
        // turn off LED
        digitalWrite(LED_BUILTIN, LOW);
      }
    }

    prev_ts = ts;
  }
}

Bende çalışmadı bu abi. Sıcaklık 21 dereceye çıktığında sönüyor geri yanmıyor.

C++:
if (temp >= 21) {
    ts = millis();
    if (ts != prev_ts)
    {
      if ((ts % 1000) == 0)
      {
        flag = !flag;

        if (flag)
        {
          u8g2.drawLine(116, 25, 116, 40);
          u8g2.drawLine(123, 25, 123, 40);
          u8g2.setFont(u8g2_font_u8glib_4_tr);
          u8g2.setCursor(118, 30);
          u8g2.print("F");
          u8g2.setCursor(118, 35);
          u8g2.print("A");
          u8g2.setCursor(118, 40);
          u8g2.print("N");
        }
        else
        {
          // turn off LED

        }
      }

      prev_ts = ts;
    }

    digitalWrite(fan_led, HIGH);
  } else {
    u8g2.setFont(u8g2_font_unifont_t_weather);
    u8g2.drawStr(113, 39, "\u0031");
    digitalWrite(fan_led, LOW);
  }
 
Bende çalışmadı bu abi. Sıcaklık 21 dereceye çıktığında sönüyor geri yanmıyor.

C++:
if (temp >= 21) {
    ts = millis();
    if (ts != prev_ts)
    {
      if ((ts % 1000) == 0)
      {
        flag = !flag;

        if (flag)
        {
          u8g2.drawLine(116, 25, 116, 40);
          u8g2.drawLine(123, 25, 123, 40);
          u8g2.setFont(u8g2_font_u8glib_4_tr);
          u8g2.setCursor(118, 30);
          u8g2.print("F");
          u8g2.setCursor(118, 35);
          u8g2.print("A");
          u8g2.setCursor(118, 40);
          u8g2.print("N");
        }
        else
        {
          // turn off LED

        }
      }

      prev_ts = ts;
    }

    digitalWrite(fan_led, HIGH);
  } else {
    u8g2.setFont(u8g2_font_unifont_t_weather);
    u8g2.drawStr(113, 39, "\u0031");
    digitalWrite(fan_led, LOW);
  }
abi else kısmına söndürmeyi yazman gerekiyor
 
abi else kısmına söndürmeyi yazman gerekiyor
Led değilki bu pinini low'a çekeyim. Orada birşey görünmesini istemiyorsan en basit mantık kod yazmazsın. Ben bunu yazdım ama sen yinede gösterme demek için ekstra kod yazmak biraz mantık dışı olmuyor mu?
 
Led değilki bu pinini low'a çekeyim. Orada birşey görünmesini istemiyorsan en basit mantık kod yazmazsın. Ben bunu yazdım ama sen yinede gösterme demek için ekstra kod yazmak biraz mantık dışı olmuyor mu?
asdsad:
if (temp >= 21) {
  ts = millis();
  if (ts != prev_ts)
  {
    if ((ts % 1000) == 0)
    {
      flag = !flag;

      if (flag)
      {
        u8g2.drawLine(116, 25, 116, 40);
        u8g2.drawLine(123, 25, 123, 40);
        u8g2.setFont(u8g2_font_u8glib_4_tr);
        u8g2.setCursor(118, 30);
        u8g2.print("F");
        u8g2.setCursor(118, 35);
        u8g2.print("A");
        u8g2.setCursor(118, 40);
        u8g2.print("N");
      }
      else
      {
        // turn off LED
        u8g2.setFont(u8g2_font_unifont_t_weather);
        u8g2.drawStr(113, 39, "\u0031");
        digitalWrite(fan_led, LOW);

      }
    }

    prev_ts = ts;
  }

  digitalWrite(fan_led, HIGH);
}

bu şekilde dener misin abi
 
asdsad:
if (temp >= 21) {
  ts = millis();
  if (ts != prev_ts)
  {
    if ((ts % 1000) == 0)
    {
      flag = !flag;

      if (flag)
      {
        u8g2.drawLine(116, 25, 116, 40);
        u8g2.drawLine(123, 25, 123, 40);
        u8g2.setFont(u8g2_font_u8glib_4_tr);
        u8g2.setCursor(118, 30);
        u8g2.print("F");
        u8g2.setCursor(118, 35);
        u8g2.print("A");
        u8g2.setCursor(118, 40);
        u8g2.print("N");
      }
      else
      {
        // turn off LED
        u8g2.setFont(u8g2_font_unifont_t_weather);
        u8g2.drawStr(113, 39, "\u0031");
        digitalWrite(fan_led, LOW);

      }
    }

    prev_ts = ts;
  }

  digitalWrite(fan_led, HIGH);
}

bu şekilde dener misin abi
Olmaz o eklediğin derece kodu. Onu eklersem, ekranda bir FAN yazar bir derece gösterir. Ben derece görünsün istemiyorum, Boş olsun istiyorum.
 
Deneme amaçlı ekledim ama oda gelmiyor
 
Olmaz o eklediğin derece kodu. Onu eklersem, ekranda bir FAN yazar bir derece gösterir. Ben derece görünsün istemiyorum, Boş olsun istiyorum.
Abi sana lazım olan arka plandaki işlemi durdurmadan blink kodu değil mi?
Sen içeriği nası doldurursan öyle çalışır.

Else kısmına clear çalıştırırsan orayı temizler.
 
Abi sana lazım olan arka plandaki işlemi durdurmadan blink kodu değil mi?
Sen içeriği nası doldurursan öyle çalışır.

Else kısmına clear çalıştırırsan orayı temizler.
Şuanda sorun orayı temizlemek değil. Kod çalışmıyor bende. İki durumda da ekrana birşey gelmiyor. Ne yanma var ne sönme.
 
Sen arka planda çalışan ve ekrandaki FAN yazısını blink ettiren kod istedin. Sonra da o kodu alıp bir if in içine koymuşsun. Çalışmaz tabi. O kodun ana döngüde, herşeyin dışında, sürekli olarak çalışması lazım.
 
Sen arka planda çalışan ve ekrandaki FAN yazısını blink ettiren kod istedin. Sonra da o kodu alıp bir if in içine koymuşsun. Çalışmaz tabi. O kodun ana döngüde, herşeyin dışında, sürekli olarak çalışması lazım.
Ama abi FAN'ın yanıp sönmeside bir koşula bağlı olmak zorunda.
 
Ama abi FAN'ın yanıp sönmeside bir koşula bağlı olmak zorunda.

o zaman if sadece LED'i yakıp söndüren kısmı içine almalı. Zamanı okuyan kısmın sürekli çalışması lazım.
 
Basit örnek programdan gidersek:

C++:
int flag = 0;
unsigned long prev_ts, ts;

void setup()
{
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop()
{
  ts = millis();
  if (ts != prev_ts)
  {
    if ((ts % 1000) == 0)
    {
      if (blink)
      {
        flag = !flag;
 
        if (flag)
        {
          // turn on LED
          digitalWrite(LED_BUILTIN, HIGH);
        }
        else
        {
          // turn off LED
          digitalWrite(LED_BUILTIN, LOW);
        }
      }
    }

    prev_ts = ts;
  }
}
 
Bu kodun bir dezavantajı var yalnız. Eğer senin program bazan uzun süreliğine bir yerlerde takılıp kalıyorsa, ana döngüye dönmesi uzun sürüyorsa (yukarıdaki örnek kod için 1 milisaniye), ve tam olarak o anda da millis 1000'in katları olan bir sayı döndürdü ise, o zaman bir blink kaçırabilir bu. 1 saniye on 1 saniye off oluryorken 2 saniye on yapıp sonra normale döner. Veya 2 saniye off yapıp sonra normale döner.

Bu, ihtimali elimine etmek istiyorsan, millis'in 1000'in katları olmasına bakacağına, zaman farkına bakabilirsin:

C++:
int flag = 0;
unsigned long prev_ts, ts;

void setup()
{
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop()
{
  ts = millis();
  if (ts != prev_ts)
  {
    if (labs(ts - prev_ts) >= 1000)
    {
      flag = !flag;
 
      if (flag)
      {
        // turn on LED
        digitalWrite(LED_BUILTIN, HIGH);
      }
      else
      {
        // turn off LED
        digitalWrite(LED_BUILTIN, LOW);
      }

      prev_ts = ts;
    }
  }
}
 
Bu kodun bir dezavantajı var yalnız. Eğer senin program bazan uzun süreliğine bir yerlerde takılıp kalıyorsa, ana döngüye dönmesi uzun sürüyorsa (yukarıdaki örnek kod için 1 milisaniye), ve tam olarak o anda da millis 1000'in katları olan bir sayı döndürdü ise, o zaman bir blink kaçırabilir bu. 1 saniye on 1 saniye off oluryorken 2 saniye on yapıp sonra normale döner. Veya 2 saniye off yapıp sonra normale döner.

Bu, ihtimali elimine etmek istiyorsan, millis'in 1000'in katları olmasına bakacağına, zaman farkına bakabilirsin:

C++:
int flag = 0;
unsigned long prev_ts, ts;

void setup()
{
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop()
{
  ts = millis();
  if (ts != prev_ts)
  {
    if (labs(ts - prev_ts) >= 1000)
    {
      flag = !flag;
 
      if (flag)
      {
        // turn on LED
        digitalWrite(LED_BUILTIN, HIGH);
      }
      else
      {
        // turn off LED
        digitalWrite(LED_BUILTIN, LOW);
      }

      prev_ts = ts;
    }
  }
}
Çalışsa da keşke zamanı ayarlamak kolay abi.
Yine çalışmadı. En iyisi fonksiyonun tamamını koyayım.

Çağırıldığı yer Void Loop içinde:
C++:
temp(sicaklik);

Fonksiyonun Tamamı:
C++:
void temp(int temp) {
  u8g2.setFont(u8g2_font_6x10_tr);
  u8g2.drawStr(90, 32, "Tem");
  u8g2.setFont(u8g2_font_6x10_tr);
  u8g2.drawStr(108, 31, "p");
  ts = millis();
  if (ts != prev_ts)
  {
    if ((ts % 1000) == 0)
    {
      if (temp >= 21) {
        flag = !flag;
        if (flag)
        {
          u8g2.drawLine(116, 25, 116, 40);
          u8g2.drawLine(123, 25, 123, 40);
          u8g2.setFont(u8g2_font_u8glib_4_tr);
          u8g2.setCursor(118, 30);
          u8g2.print("F");
          u8g2.setCursor(118, 35);
          u8g2.print("A");
          u8g2.setCursor(118, 40);
          u8g2.print("N");
        }
        else
        {
          // turn off LED
          u8g2.drawLine(116, 25, 116, 40);
          u8g2.drawLine(123, 25, 123, 40);
        }
        digitalWrite(fan_led, HIGH);
      }
    }
    prev_ts = ts;
  }
  u8g2.setFont(u8g2_font_unifont_t_weather);
  u8g2.drawStr(113, 39, "\u0031");
  digitalWrite(fan_led, LOW);
  u8g2.setFont(u8g2_font_chikita_tr);
  u8g2.setCursor(94, 40);
  u8g2.print(temp);
  u8g2.setFont(u8g2_font_chikita_tr);
  u8g2.drawStr(107, 40, "C");
}
 
Bu zaman takibi global bir iş, her zaman, her şartta yapılacak. Şimdi de temp fonksiyonun içine koymuşsun :)

C++:
void loop()
{
    /* zaman takibi kodu
     *
     * ts = millis() vs vs
     */
    
    /* geri kalan kodlarin tamami */
}
 
Bu zaman takibi global bir iş, her zaman, her şartta yapılacak. Şimdi de temp fonksiyonun içine koymuşsun :)

C++:
void loop()
{
    /* zaman takibi kodu
     *
     * ts = millis() vs vs
     */
   
    /* geri kalan kodlarin tamami */
}
Çağırıldığı yerde saymaya başlasa olmuyor mu? :katil2:
Neyse o zaman ben void loop'un en başına ve en sonuna yerleştireyim bunu. Arada kalan herşey faydalansın. Nerede çağırırsam gelsin. Daha çok işime gelir. Her lazım olduğunda ayrı yazmaya gerek kalmaz.
 
Bu zaman takibi global bir iş, her zaman, her şartta yapılacak. Şimdi de temp fonksiyonun içine koymuşsun :)

C++:
void loop()
{
    /* zaman takibi kodu
     *
     * ts = millis() vs vs
     */
   
    /* geri kalan kodlarin tamami */
}
Şöyle yaptım yine çalışmadı yav. :kizgin3:

C++:
void loop() {
  ts = millis();
  if (ts != prev_ts)
  {
    u8g2.setFont(u8g2_font_6x10_tr);
    u8g2.drawStr(90, 32, "Tem");
    u8g2.setFont(u8g2_font_6x10_tr);
    u8g2.drawStr(108, 31, "p");
    if ((ts % 1000) == 0)
    {
      if (temp >= 21) {
        flag = !flag;
        if (flag)
        {
          u8g2.drawLine(116, 25, 116, 40);
          u8g2.drawLine(123, 25, 123, 40);
          u8g2.setFont(u8g2_font_u8glib_4_tr);
          u8g2.setCursor(118, 30);
          u8g2.print("F");
          u8g2.setCursor(118, 35);
          u8g2.print("A");
          u8g2.setCursor(118, 40);
          u8g2.print("N");
        }
        else
        {
          // turn off LED
          u8g2.drawLine(116, 25, 116, 40);
          u8g2.drawLine(123, 25, 123, 40);
        }
        digitalWrite(fan_led, HIGH);
      }
    }
    u8g2.setFont(u8g2_font_unifont_t_weather);
    u8g2.drawStr(113, 39, "\u0031");
    digitalWrite(fan_led, LOW);
    u8g2.setFont(u8g2_font_chikita_tr);
    u8g2.setCursor(94, 40);
    u8g2.print(temp);
    u8g2.setFont(u8g2_font_chikita_tr);
    u8g2.drawStr(107, 40, "C");

    prev_ts = ts;
  }
}
 

Forum istatistikleri

Konular
5,823
Mesajlar
99,365
Üyeler
2,476
Son üye
mrmandos

Son kaynaklar

Son profil mesajları

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.
cemalettin keçeci wrote on HaydarBaris's profile.
barış kardeşim bende bu sene akıllı denizaltı projesine girdim ve sensörleri arastırıyorum tam olarak hangi sensör ve markaları kullandınız yardımcı olabilir misin?
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.
* En mühim ve feyizli vazifelerimiz millî eğitim işleridir. Millî eğitim işlerinde mutlaka muzaffer olmak lâzımdır. Bir milletin hakikî kurtuluşu ancak bu suretle olur. (1922)
Back
Top