Milis ile Pot Kullanımı
  • int sayac;
    int ch1=2;
    int ch2=3;
    int ch3=4;
    int ch4=5;
    int ch5=6;
    int ch6=7;
    int mz80=8;
    int ms1=9;
    int pot=A0;

    void setup() {
    sayac=0;
    pinMode(mz80,INPUT);
    pinMode(ms1,INPUT);
    pinMode(pot,INPUT);
    pinMode(ch1,OUTPUT);
    pinMode(ch2,OUTPUT);
    pinMode(ch3,OUTPUT);
    pinMode(ch4,OUTPUT);
    pinMode(ch5,OUTPUT);
    pinMode(ch6,OUTPUT);
    digitalWrite(ch1,HIGH);
    }

    void loop() {

    if(digitalRead(mz80)==0)
    {
    delay(20);
    if(digitalRead(mz80)==1)
    {
    sayac=sayac+1;
    }
    }
    else if(sayac==1)
    {


    digitalWrite(ch1,LOW);
    digitalWrite(ch2,HIGH);
    delay(3000);
    digitalWrite(ch3,HIGH);
    delay(1000);
    digitalWrite(ch4,HIGH);
    byte oku_ms1 = 0;
    while(!oku_ms1) {
    if(oku_ms1 == 0) {
    oku_ms1 = digitalRead(ms1);
    digitalWrite(ch4, !oku_ms1);
    }

    }


    digitalWrite(ch3,LOW);
    delay(1000);
    digitalWrite(ch2,LOW);
    delay(3000);
    digitalWrite(ch1,HIGH);

    sayac=0;
    }

    }


    Yukarıda ki kodlarda mz80 1 saydığında ch1,2,3,4 ler işlemlerini yapıp tekrar mz80 in 1 görmesini bekliyor.

    Bu işlemler olurken bn de ch5 ve 6 yı pottan aldığım değer ile 0 ile 3 sn arasında(map fonksiyonu ile yapabilirim) HIGH yapıp sonrasında LOW olması ve tekrar mz80 in 1 görmesini beklemesini istiyor.

    Blink without delay örneğini inceledim fakat ne yaptıysam istediğimi beceremedim. Yardımcı olur musunuz ?

    Sayın @amenofis @gumulcine @okoman siz de davetlisiniz :)
  • En baştaki kısmı şöyle yapıp devam edersin.

    digitalWrite(ch1,LOW);
    digitalWrite(ch2,HIGH);
    int sure = analogRead(pot) * (3000.0 / 1023.0);

    digitalWrite(ch5, HIGH);
    delay(sure);
    digitalWrite(ch5, LOW);
    delay(3000 - sure);
    ...
  • Sayın @amenofis böyle de olur tabi ama benim istediğim bu akıştan bağımsız çalışması eğer bu ch5 in max çalışma süresi olan 3 sn i arttırmak istesem gereksiz bekleme olucak. Eğer mümkünse bu şekilde yardımcı olabilir misiniz ? İlginize çok teşekkür ederim.
  • Öyleyse timer interrupt kullanırsın. Biraz araştır, olmazsa akşama çözeriz.
  • başlangıçta
    unsigned long timer;
    unsigned int ch_delays = 0;

    mz80 okuduğun yerde sayac=sayac+1; sürekli artmasın onu sayac = 1; yap
    sayac 1 olduğunda altta verdiğim örnek gibi bir mantık oluştur delay hiç kullanma

    int sure = map(analogRead(pot), 0, 1023, 0, 3);

    if (millis() > timer) {
    timer = millis() + 1000;
    ch_delays++;

    if (ch_delays == 1) {
    //ch_delays 1 ise yapılacaklar
    } else if (ch_delays == 4) {
    //ch_delays 4 olunca bir önceki 1 olduğu için 3 saniye bekledik demektir
    } else if (ch_delays == 5) {
    //ch_delays 5 olunca bir önceki 4 olduğu için 1 bekledik demektir
    }
    if (ch_delays == (5 + sure)) {
    //ch_delays 5+sure olunca bir önceki 5 olduğu için (5+sure) kadar saniye bekledik demektir

    // bu şekilde zamanlama yapabilirsin
    //işlem bitince
    sayac = 0; //sayac tekrar 0
    ch_delays = 0; //ch_delays tekrar 0
    }

    }//millis end

    yapmak istediğini doğru anladıysam bu şekilde bir mantık ile istediğin olacaktır
  • @gumulcine UnoArduSim' de denedim farklı şekillerde ama çalıştıramadım bir türlü.
  • büyük ihtimalle timer değişkeninde hata verdi program
    başlangıçta
    unsigned long timer; yerine unsigned int timerr = 0; yap dene
  • int sayac;
    int ch1=2;
    int ch2=3;
    int ch3=4;
    int ch4=5;
    int ch5=6;
    int ch6=7;
    int mz80=8;
    int ms1=9;
    int pot=A0;
    unsigned int timerr = 0;
    unsigned int ch_delays = 0;

    void setup() {
    sayac=0;
    pinMode(mz80,INPUT);
    pinMode(ms1,INPUT);
    pinMode(pot,INPUT);
    pinMode(ch1,OUTPUT);
    pinMode(ch2,OUTPUT);
    pinMode(ch3,OUTPUT);
    pinMode(ch4,OUTPUT);
    pinMode(ch5,OUTPUT);
    pinMode(ch6,OUTPUT);
    digitalWrite(ch1,HIGH);
    }

    void loop() {

    if(digitalRead(mz80)==0)
    {
    delay(20);
    if(digitalRead(mz80)==1)
    {
    sayac=1;
    }
    }
    else if(sayac==1)
    {
    int sure = map(analogRead(pot), 0, 1023, 0, 3);
    if (millis() > timerr)
    {

    timerr = millis() + 1000;
    ch_delays++;

    if (ch_delays == 1)
    {
    digitalWrite(ch1,LOW);
    //ch_delays 1 ise yapılacaklar
    }
    else if (ch_delays == 4)
    {
    digitalWrite(ch2,HIGH);
    //ch_delays 4 olunca bir önceki 1 olduğu için 3 saniye bekledik demektir
    }
    else if (ch_delays == 5)
    {
    digitalWrite(ch3,HIGH);
    //ch_delays 5 olunca bir önceki 4 olduğu için 1 bekledik demektir
    }
    if (ch_delays == (5 + sure))
    {
    //ch_delays 5+sure olunca bir önceki 5 olduğu için (5+sure) kadar saniye bekledik demektir
    digitalWrite(ch4,HIGH);
    // bu şekilde zamanlama yapabilirsin
    //işlem bitince
    sayac = 0; //sayac tekrar 0
    ch_delays = 0; //ch_delays tekrar 0
    digitalWrite(ch1,HIGH);
    digitalWrite(ch2,LOW);
    digitalWrite(ch3,LOW);
    digitalWrite(ch4,LOW);
    }

    }//millis end
    }

    }

    @gumulcine dediğiniz gibi yaptım ch_delays değeri mz80 değeri her 1 olduğunda artıyor malesef
  • Üstte unsigned long timer; yerine unsigned int timerr = 0; yap dene dediğimde timerr = 0; demeliydim sadece hatayla long yerine int yazmışım.

    Bu işlemler olurken loop sürekli tekrarladığı için loop başındaki mz80 koşulları da tekrarlıyor bu yüzden eğer mz80 bir defa 1 olup ta işlemler bitmeden tekrar 0 olursa bekliyor tekrar 1 olunca ch_delays değeri artıyor
    başlangiçtaki bu mz80 koşulunu sürekli okumak yerine sadece sayac 0 ise koşulu yapılabilir fakat

    Yapmak istediğimiz tam olarak nedir bunu anlamamız gerek

    mz80 1 olunca sayac 1 oluyor ve ch1,2,3,4 ler işlemlerini yapıyor mz80 sürekli 1 mi kalıyor değişiyor mu?

    sayac 1 olduktan sonra ch1,2,3,4 ler işlemlerini yaparken pottan aldığımız bekleme süresi ch5 ve ch6 işlemleri nerede yapılacak ch1,2,3,4 tamamlandıktan sonra mı yoksa bu işlemler yapılırken herhangi bir aralıkta mı?

    herhangi bir aralıkta ise sayac tekrar 0 ne zaman olacak ch5 ve ch6 işlevini tamamlayınca mı ch1,2,3,4 ler tamamlayınca mı?

    benim anladığıma göre yapılmak istenen kod aşağıdaki gibi.

    int sayac = 0;
    int ch1 = 2;
    int ch2 = 3;
    int ch3 = 4;
    int ch4 = 5;
    int ch5 = 6;
    int ch6 = 7;
    int mz80 = 8;
    int ms1 = 9;
    int pot = A0;
    unsigned long timerr = 0;
    unsigned int ch_delays = 0;

    void setup() {
    sayac = 0;
    pinMode(mz80, INPUT);
    pinMode(ms1, INPUT);
    pinMode(pot, INPUT);
    pinMode(ch1, OUTPUT);
    pinMode(ch2, OUTPUT);
    pinMode(ch3, OUTPUT);
    pinMode(ch4, OUTPUT);
    pinMode(ch5, OUTPUT);
    pinMode(ch6, OUTPUT);
    digitalWrite(ch1, HIGH);
    }

    void loop() {

    if (digitalRead(mz80) == 0 && sayac == 0)
    {
    delay(20);
    if (digitalRead(mz80) == 1)
    {
    sayac = 1;
    }
    }
    else if (sayac == 1)
    {
    int sure = map(analogRead(pot), 0, 1023, 0, 3);
    if (millis() > timerr)
    {
    timerr = millis() + 1000;
    ch_delays++;

    if (ch_delays == 1)
    {
    digitalWrite(ch1, LOW);
    digitalWrite(ch2, HIGH);
    }
    else if (ch_delays == 4)
    {
    digitalWrite(ch3, HIGH);
    }
    else if (ch_delays == 5)
    {
    digitalWrite(ch4, HIGH);
    digitalWrite(ch5, HIGH);
    digitalWrite(ch6, HIGH);
    }
    if (ch_delays == (5 + sure))
    {
    digitalWrite(ch5, LOW);
    digitalWrite(ch6, LOW);

    digitalWrite(ch1, HIGH);
    digitalWrite(ch2, LOW);
    digitalWrite(ch3, LOW);
    digitalWrite(ch4, LOW);

    sayac = 0; //sayac tekrar 0
    ch_delays = 0; //ch_delays tekrar 0
    }

    }//millis end
    }

    }
  • Sayın @gumulcine çok güzel anlattınız ama yapamadım yazarken de utanıyorum.

    Şimdi şöyle bir döküman hazırladım linkini verdim altta.

    Sol akış ile sağ akış birbirinden bağımsız ve ikisi tamamlanmadan ch1,HIGH olmaması gerekiyor. Diyeceksiniz ki verdiğin sürelerden dolayı ch5 ve 6 nın akışı diğer akıştan çok önce tamamlanıyor ve duruyor fakat pot ve diğer sürelerde değişiklik yapıldığında böyle bir olasılık mümkün oluyor.

    MZ80 NPN sensör cisim görünce 0 çıkışını veriyor eski kodlar yanlışmış.

    https://resmim.net/f/aTzbmd.jpg
  • Atmel avr için yazılmış bir dünya görev zamanlayıcı var, bunlardan birini kullanabilirsin. "avr task scheduler" diye aratırsan çıkar.
  • Sayın @amenofis dediğiniz gibi araştırdım ama malesef yapamadım. Basit bir örnek verirseniz onun üstünden gitmek isterim.
  • verdiğim örnekte ch_delays sağ akışı yapıyor nerdeyse bazı düzeltmelerle tamamını yapar msi sensörü 1 olana kadar bekletmek için ch_delays'ın artmasını durdurarak yani sensör 1 olana kadar sürekli ch_delays'a bir önceki değerini vererek yapabilirsin.

    Sol akış için sol_ch_delays yeni bir değişken tanımla onu da millis içinde aynen ch_delays
    mantığı gibi kullan

    yapamazsan haber et el atalım gece 11,30 dan sonra malum teravih ancak o saatte evde oluyorum
  • Allah kabul etsin @gumulcine
  • Yapamadım @gumulcine bir el atar mısın ?
  • acele acele vakit bulup düzelttim kodu bir dene bakalım

    int sayac = 0;
    int ch1 = 2;
    int ch2 = 3;
    int ch3 = 4;
    int ch4 = 5;
    int ch5 = 6;
    int ch6 = 7;
    int mz80 = 8;
    int ms1 = 9;
    int pot = A0;
    unsigned long timerr = 0;
    unsigned int ch_delays = 0, sol_ch_delays = 0;
    int ms1_durumu = 0;

    void setup() {
    pinMode(mz80, INPUT);
    pinMode(ms1, INPUT);
    pinMode(pot, INPUT);
    pinMode(ch1, OUTPUT);
    pinMode(ch2, OUTPUT);
    pinMode(ch3, OUTPUT);
    pinMode(ch4, OUTPUT);
    pinMode(ch5, OUTPUT);
    pinMode(ch6, OUTPUT);
    digitalWrite(ch1, HIGH);
    }

    void loop() {

    int sure = map(analogRead(pot), 0, 1023, 0, 3000);

    // mz1 = 1 . ch4 = HIG ve ms1_durumu = 0 ise
    if (digitalRead(ms1) == 1 && digitalRead(ch4) == HIGH && ms1_durumu == 0)
    {
    ms1_durumu = 1;
    }

    // if (digitalRead(mz80) == 0 && sayac == 0)
    // {
    // delay(20);
    // if (digitalRead(mz80) == 1)
    // {
    // sayac = 1;
    // }
    // }
    // else if (sayac == 1)

    if (digitalRead(mz80) == 0 && sayac == 0)
    {
    sayac = 1;
    }
    else if (sayac == 1)
    {

    if (millis() > timerr)
    {
    timerr = millis(); // 1 milisaniyede 1 defa millis koşulu sağlanacak
    sol_ch_delays++; // her milisaniye artacak
    ch_delays++; // her milisaniye artacak

    //Sol akış
    if (sol_ch_delays == 1) // ilk milisaniyede daha sonra 1000'ninci milisaniyede (yani 1 saniye sonra) v.s devam edecek
    {
    digitalWrite(ch5, HIGH);
    }
    else if (sol_ch_delays == 1000)
    {
    digitalWrite(ch6, HIGH);
    }
    if (sol_ch_delays == (1000) + sure)
    {
    // burada pot 0 ise ch6 HIGH ve LOW aralığı görülmeyecek kadar hızlı olacaktır
    // çünkü ch6, HIGH olduktan hemen sonra 0 bekleme ile aşağıdaki kod çalışacak
    // üstte "(1000) + sure" yerine "(2000) + sure" yapılırsa ch6, HIGH olunca 1sn + pot değeri kadar bekler
    // delay(50); gibi lüçük bir bekleme yapabilirsin burda ancak sağ akış ta o anda yaptığı işlemi 50ms fazla yapar
    digitalWrite(ch5, LOW);
    digitalWrite(ch6, LOW);
    }
    //Sol akış end

    //sağ akış
    if (ch_delays == 1) // ilk milisaniyede
    {
    digitalWrite(ch1, LOW);
    digitalWrite(ch2, HIGH);
    }
    else if (ch_delays == 3000) // 3000 milisaniye (3 saniye sonra) v.s
    {
    digitalWrite(ch3, HIGH);
    }
    else if (ch_delays == 4000)
    {
    digitalWrite(ch4, HIGH);

    if (ms1_durumu == 0) { //ms1 durumu hala 0 ozaman
    ch_delays = 3999 // ch_delays 3999 veriyoruz sonraki dönüşte 4000 olacak tekrar burayi kontrol edecektir
    } // ms1_durumu 0 değilse ch_delays 4000 geçmiştir burası kontrol edilmeyerek aşağıdaki kodlar işlem yapacak

    }

    if (ch_delays == 5000)
    {
    digitalWrite(ch4, LOW);
    }
    else if (ch_delays == 6000)
    {
    digitalWrite(ch3, LOW);
    }
    else if (ch_delays == 9000)
    {
    digitalWrite(ch2, LOW);
    digitalWrite(ch1, HIGH);

    sayac = 0; //sayac tekrar 0
    ch_delays = 0; //ch_delays tekrar 0
    sol_ch_delays = 0; //sol_ch_delays tekrar 0
    ms1_durumu = 0; //ms1_durumu tekrar 0
    }
    //sağ akış end


    } //millis end


    }

    }
  • Çok teşekkür ederim @gumulcine.

    Oldu çalışıyor sizi de uğraştırdım kusura bakmayın.

Howdy, Stranger!

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

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