• Merhaba, elimde bir röle var, arduinoya bağladım, rölenin açıldıktan sonra 30 saniye açık kalıp sonra kapanmasını istiyorum, bir türlü yapamadım, millis ile yapılıyormus, sitede baktım pek anlayamadım, sonra başka bir yerde buldum o da çalışmadı, açılır açılmaz kapanıyor röle :( kodun sadece konuya ilişkin tarafını paylaştım, Kod çok uzu ve karmaşık çünkü.bir yol gösterecek olan olursa sevinirim. amacım rölenin 30 saniye açık kalması ve sonra kapanması, delay fonksiyonu ile yapamıyorum çünkü o esnada diğer fonksiyonların da çalışması gerekiyor. şimdiden teşekkür ederim.

    int relaymod;
    unsigned long oldtime=0;
    unsigned long newtime;

    void relaymode()
    {
    relaymod = '1';
    digitalWrite(relay, LOW);
    Serial.println("relay opened");

    newtime = millis();
    if(relaymod == '1'){
    if(newtime-oldtime > 30000){
    digitalWrite(relay, HIGH);
    Serial.println("relay closed");
    }
    relaymod = '0';
    oldtime = newtime;

    }
    }

  • newtime=millis(); fonksiyonun direk loopun içerisinde olması gerekiyor.

    röleyi açan değişken/bit ne ise onunla birlikte timeri kontrol etmen gerek.

    örneğin;


    if(relay == 0)
    {
    if(tekseferlikislembit) //bu bit rölenin açıldıktan sonra alttaki işlemi 1 kere yapmasını sağlayacak
    {
    tekseferlikislembit=0;
    oldtime=newtime;
    }
    }
    else tekseferlikislembit=1;

    if(newtime-oldtime > 30000){
    digitalWrite(relay, HIGH);
    Serial.println("relay closed");
    }

    Kanaatimce bu fonksiyonda zaten mantık hatası mevcut. Neden diye sorarsan,

    senin bu 30 saniye kontrolünü yapabilmen için relaymode() fonksiyonunu sürekli işlemen gerek. fakat relaymode() fonksiyonunu sürekli işlersen, digitalWrite(relay, LOW); komutundan dolayı dölen hep açılacaktır.


    Daha mantıklı bir çözüm için, şunu belirtmen gerek, ne olunca röle açılacak ?
    bir bitlemi değişkenlemi neyle kontrol ediyosun. O zaman daha mantıklı bir öneride bulunabilirim.
  • ilginiz için teşekkür ederim, olay şu ki, kodda bir değişken tanımlı, sensörden değer geldiğinde değişkeni 1 yapıyorum, 1 olduğunda röle çalışıyor ama bir türlü 30 saniye çalış sonra kapan diyemedim. aynı zamanda diğer kodların da çalışmasını istiyorum ama 30 saniye sistemin bloke olmaması gerekiyor
  • heh tamam öğrenmek istediğim buydu.

    Değişkenin ismini bilmiyorum farzediyorum ki "rolecek"

    void loopun içerisine direk şu kodu ekle problemin düzelecektir.

    NOT1: benim "rolecek" diye adlandırdığım yerlere kendi değişkeninin ismini yaz.
    NOT2: int olarak bir kontrolbit değişkeni tanımla ve ilk değerini 1 yaz. (int kontrolbit =1;)
    NOT3: int olarak bir saniyedoldubit değişkeni tanımla ilk degerini 1 yaz (int saniyedoldubit =1;)

    void loop()
    {
    newtime = millis();

    if(rolecek)
    {
    if(kontrolbit)
    {
    kontrolbit=0;
    saniyedoldubit=0;
    digitalWrite(relay, LOW);
    Serial.println("relay opened");
    oldtime=newtime;
    }
    }
    else kontrolbit=1;

    if(newtime - oldtime >30000 && saniyedoldubit==0)
    {
    saniyedoldubit=1;
    digitalWrite(relay, HIGH);
    Serial.println("relay closed");
    }
    }
  • evet denedim ve tam istediğim gibi oldu, çok teşekkür ederim, elinize ve emeğinize sağlık :)
  • e hadi gözün aydın o zaman :)

Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Açık kaynak kültürü gereği, çözdüğünüz problemlerin çözümlerini paylaşmayı lütfen unutmayın.