Sonsuz Döngü

Gokrtl

Gökhan Kartal (TeknoDay)
Staff member
Katılım
27 Şubat 2019
Mesajlar
11,181
Projemde sıcaklık belli bir dereceyi geçtiğinde "FAN" simgesini yakıyorum bildiğiniz üzere.
Şimdi ben bu "FAN" simgesinin ekranda sürekli yanıp söner halde olmasını istiyorum.
Bunun için cihazın çalışmasını engellemeyecek sonsuz bir döngü yapmalıyım.
Ama nasıl yapılır bilemedim. Var mı önerisi olan?

Aşağıdaki kod bloğu fan simgesinin ekranda görünmesini sağlıyor.
C++:
  if(temp >= 22){
    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");
  }
 
millis ile sayaç tutalım
atıyorum 1 saniyelik bir sayaç

int derece
bool acKapa = 0

if(derece 22 && millis-önceki millis 1 saniye ise && acKapa == 0){
fan simgesi yazdır
acKapa = 1
}

if(derece 22 && millis-önceki millis 2 saniye ise && acKapa == 1){
fan simgesi yazdır
acKapa = 0
}

böyle bir mantık kurdum
 
Neyi yanlış yapıyorum yav? Fan yanıp sönüyor ama süresini ayarlayamıyorum bir türlü.

C++:
adimBayrak = 0;
    if(millis() - oncekiZaman > 1000 && adimBayrak == 0){
    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");
    adimBayrak = 1;
    }else if(millis() - oncekiZaman > 500 && adimBayrak == 1){
      adimBayrak = 0;
    }
 
else if kımsındakini uzatıp if kısmındakini kısalt abi
 
millis:
int son = 0;
bool bayrak = 0;

void setup(){
  Serial.begin(9600);
 
 
}

void loop(){
 
  if((millis() - son == 1000) && bayrak == 0){
  Serial.println("a");
    son = millis();
    bayrak = 1;
    
 
}
 else if(millis() - son == 2000 && bayrak == 1){
   Serial.println("b");
   son = millis();
   bayrak = 0;
    
  }

bunu tinkercad'de çalıştırdım abi gayet güzel çalışıyor
 
millis:
int son = 0;
bool bayrak = 0;

void setup(){
  Serial.begin(9600);
 
 
}

void loop(){
 
  if((millis() - son == 1000) && bayrak == 0){
  Serial.println("a");
    son = millis();
    bayrak = 1;
   
 
}
 else if(millis() - son == 2000 && bayrak == 1){
   Serial.println("b");
   son = millis();
   bayrak = 0;
   
  }

bunu tinkercad'de çalıştırdım abi gayet güzel çalışıyor
Şu şekilde senin koda göre değiştirdim. Çalışıyor ama zamana uyamıyor.
 
Şu şekilde senin koda göre değiştirdim. Çalışıyor ama zamana uyamıyor.
ben bişeyleri yanlış yazıyor olabilirim ama mantığın doğru olması lazım

bayrak ile izole ediyoruz birbirine karışmıyorlar yanıp söneceği zamanlar.
millis ile saydırıp işlem yapıyoruz doğru mantığımız var programa bakınca görüyorum bunu ama zaman neden tutmuyor onu anlayamadım
 
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;
  }
}
 
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;
  }
}
abi iç içe if kullanmak ve && kullanmak arasında ne fark var bu yazdığını && ile bağlasak aynı şekilde çalışır mı
 
abi iç içe if kullanmak ve && kullanmak arasında ne fark var bu yazdığını && ile bağlasak aynı şekilde çalışır mı

Programı olabildiğince en basit şekilde yazman lazım. Bu durumda iç içe yazsan da aynı sonucu alırsın ama kod daha zor anlaşılır duruma gelir. Artık derleyiciler yeterince güçlü, her iki şekilde de yazsan ona karşılık gelen en optimal makina kodunu üretebilir.
 
Millis bir süre sonra kafa karıştırmaya başlıyor. Ben ayrı bir fonksiyon içinde millis çalıştırıp bayrak set ediyorum. Mainde bayrağa göre işlem yapıyorum.
 
Millis bir süre sonra kafa karıştırmaya başlıyor. Ben ayrı bir fonksiyon içinde millis çalıştırıp bayrak set ediyorum. Mainde bayrağa göre işlem yapıyorum.
57 gün sonra değişkeni taşıyor vs. deniliyor ama bu @Gokrtl abinin projesi için önemli bir kriter değil 57 gün boyunca güç kaynağı aktif duracağını sanmıyorum.

daha önce millisin 1-2 hafta sonra da sapıttığını duymuştum rtc kullanmadan sadece millis komutunu kullanarak bir saat yapan arkadaşımdan.
 
57 gün sonra değişkeni taşıyor vs. deniliyor ama bu @Gokrtl abinin projesi için önemli bir kriter değil 57 gün boyunca güç kaynağı aktif duracağını sanmıyorum.

Böyle bir varsayım yapmak çok yanlış. 57 gün sonra taşsa bile doğru çalışacak kod yazmak çok kolay, yazıp da bu olasılığı tamamen hayatından çıkarmak varken neden yapmayasın?
 
TA.png

@taydin abinin yazdığı çok güzel çalışıyor.
 
Fanın ilk çalıştığı anda bir zaman değişkeni tanımlayıp bunun moduna göre yakıp döndürebilirsiniz. Main döngüsünde fan işaretinin yanma-sönme sırası geldiğinde ilk zamanı bu yeni zamandan çıkarıp 2 saniyeye göre modunu alırsın, sonuç tek ise söner sıfır ise yanar...

Redmi Note 8 Pro cihazımdan Tapatalk kullanılarak gönderildi
 
Böyle bir varsayım yapmak çok yanlış. 57 gün sonra taşsa bile doğru çalışacak kod yazmak çok kolay, yazıp da bu olasılığı tamamen hayatından çıkarmak varken neden yapmayasın?
Abi doğru diyorsun ama resetlemeden nası önüne geçebiliriz bu durumun.
 
Abi doğru diyorsun ama resetlemeden nası önüne geçebiliriz bu durumun.

Aşağıdaki mesajdaki gibi yapman lazım:

 
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;
  }
}
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?
 

Forum istatistikleri

Konular
5,663
Mesajlar
97,412
Üyeler
2,439
Son üye
Efekan

Son kaynaklar

Son profil mesajları

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)
Kesici/Spindle hızı hesaplamak için SpreadSheet UDF'leri kullanın, hesap makinesi çok eski kalan bir yöntem :)
Dr. Bülent Başaran,
Elektrik ve Elektronik Mühendisi
Yonga Tasarım Özdevinimcisi
Üç güzel "çocuk" babası
Ortahisar/Ürgüp/Konya/Ankara/Pittsburgh/San Francisco/Atlanta/Alaçatı/Taşucu...

Back
Top