Sonsuz Döngü

Gokrtl

Gökhan Kartal (TeknoDay)
Staff member
Katılım
27 Şubat 2019
Mesajlar
12,750
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.
Kod:
  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ü.

Kod:
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
 
Kod:
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
 
Kod:
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.

Kod:
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.

Kod:
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?
 
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.

Kod:
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
8,427
Mesajlar
138,286
Üyeler
3,337
Son üye
SnowRain

Son kaynaklar

Son profil mesajları

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ı?
Mutluluğun resmi illa güzel çizilmiş tablo olmak zorunda değil.Bazen basit bir çizgi,doğru bir renk,yada küçük bir detay
Back
Top