buton ve geri sayım
  • merhabalar arkadaşlar, arduino uno, 3 adet butonum var, ve 3 adet led im var. butonun hangisine basılırsa o butona ait olan led in 10 dakika boyunca yanmasını ve kaç dakika kaldığını her saniye bana seri porttan vermesini istiyorum, fakat bu butonlar birbirinden bagımsız calısacak yani buton 1 e basıldıgında led yanarken ve geri sayarken, buton 3 e de basılabilecek ve bu sefer iki led birden yanıp kendi kalan süreleri ile geri saymaya devam edecek. süre bittiğinde de hangisinin süresi bitmiş ise onun led ini kapatacak. bir türlü beceremedim. yardımcı olabilecek olan var ise lütfen yardım edebilir mi ? buraya kadar geldim buradan sonrasının içinden çıkamıyorum, delay kullanamıyorum cunku bloke ediyor tüm kodu, bu sefer buton 2 ye yada 3 e basıldığında işlem yapmıyor

    int ledPin1 = 3, ledPin2 = 4, ledPin3 = 5;
    int buton_pin = 2, buton2_pin = 6, buton3_pin = 7;

    void setup()
    {
    pinMode(ledPin1, OUTPUT);
    pinMode(ledPin2, OUTPUT);
    pinMode(ledPin3, OUTPUT);
    pinMode(buton_pin, INPUT);
    pinMode(buton2_pin, INPUT);
    pinMode(buton3_pin, INPUT);
    Serial.begin(9600);
    }
    int ledzaman = 10;

    void loop()

    {
    buton_deger = digitalRead(buton_pin);
    buton_deger = digitalRead(buton2_pin);
    buton_deger = digitalRead(buton3_pin);
    if (buton_deger == HIGH)
    {

    }

    }

  • Bu programı bir deneyebilir misiniz.

    #include "Timer.h"

    Timer t;

    int led1 = 3, led2 = 4, led3 = 5;
    int buton1 = 2, buton2 = 6, buton3 = 7;

    unsigned long zaman;
    unsigned long buton1_ilk_zaman = 0;
    unsigned long buton1_son_zaman = 0;
    unsigned long buton2_ilk_zaman = 0;
    unsigned long buton2_son_zaman = 0;
    unsigned long buton3_ilk_zaman = 0;
    unsigned long buton3_son_zaman = 0;

    double sure1=0;
    double sure2=0;
    double sure3=0;

    bool durum1=false;
    bool durum2=false;
    bool durum3=false;


    void setup()
    {
    pinMode(led1, OUTPUT);
    pinMode(led2, OUTPUT);
    pinMode(led3, OUTPUT);
    pinMode(buton1, INPUT);
    pinMode(buton2, INPUT);
    pinMode(buton3, INPUT);
    Serial.begin(9600);
    t.every(1000, kalan_sure);
    }

    void loop()
    {
    t.update();

    if(digitalRead(buton1)==HIGH && durum1 == false)
    {
    buton1_ilk_zaman = millis();
    buton1_son_zaman = buton1_ilk_zaman + 600000;
    digitalWrite(led1,HIGH);
    durum1 = true;
    }
    if(digitalRead(buton2==HIGH) && durum2 == false)
    {
    buton2_ilk_zaman = millis();
    buton2_son_zaman = buton2_ilk_zaman + 600000;
    digitalWrite(led1,HIGH);
    durum2 = true;
    }
    if(digitalRead(buton3)==HIGH && durum3 == false)
    {
    buton3_ilk_zaman = millis();
    buton3_son_zaman = buton3_ilk_zaman + 600000;
    digitalWrite(led1,HIGH);
    durum3 = true;
    }


    if(buton1_son_zaman==millis())
    {
    digitalWrite(led1,LOW);
    durum1 = false;
    }
    if(buton2_son_zaman==millis())
    {
    digitalWrite(led2,LOW);
    durum2 = false;
    }
    if(buton3_son_zaman==millis())
    {
    digitalWrite(led3,LOW);
    durum3 = false;
    }
    }

    void kalan_sure()
    {
    if(durum1==true)
    {
    sure1 = (double) ((buton1_son_zaman-millis())/1000);
    }
    else
    {
    sure1=0;
    }

    if(durum2==true)
    {
    sure2 = (double) ((buton2_son_zaman-millis())/1000);
    }
    else
    {
    sure2=0;
    }

    if(durum3==true)
    {
    sure3 = (double) ((buton3_son_zaman-millis())/1000);
    }
    else
    {
    sure3=0;
    }

    Serial.print("Led1 kalan sure: ");
    Serial.print(sure1);
    Serial.print(" sn. Led2 kalan sure: ");
    Serial.print(sure2);
    Serial.print(" sn. Led3 kalan sure: ");
    Serial.print(sure3);
    Serial.println(" sn. \n");
    }
  • Öncelikle ilginiz için çok teşekkür ederim, kodu upload ettim, buton 2 ye otomatik basılmıs gibi calısmaya baslıyor direk, geri saymaya baslıyor, diğer buton 1 ve buton 3 te problem yok onlar basınca baslıyor, fakat buton 2 kendiliğinden seri portu acar acmaz saymaya baslıyor, pin numarasını degistirdim, olmadı buton2 yi arduino üzerinde baglantısını kestim yine de aynı sonuc degismedi,
  • tamam o sorun çözüldü, buton2 if de parantezi diğerlerindeki gibi değiştirdim, artık otomatik baslamıyor fakat bu seferde buton 2 ye bastıgımda buton2 ile birlikte buton 3 de tetikleniyor, buton 3 e bastıgımda ise buton 3 ile birlikte buton 1 de tetikleniyor.
    sadece buton 1 e bastıgımda hersey düzgün calısıyor :)
  • Programı inceledim ama sorunu bulamadım. Bulduğum tek sorun (ki sizde onu farketmişinizdir) şu:

    if(digitalRead(buton2)==HIGH && durum2 == false)
    {
    buton2_ilk_zaman = millis();
    buton2_son_zaman = buton2_ilk_zaman + 600000;
    digitalWrite(led1,HIGH); // burası yanlış yazılmış. Doğrusu: digitalWrite(led2,HIGH);
    durum2 = true;
    }
    if(digitalRead(buton3)==HIGH && durum3 == false)
    {
    buton3_ilk_zaman = millis();
    buton3_son_zaman = buton3_ilk_zaman + 600000;
    digitalWrite(led1,HIGH); // burası yanlış yazılmış. Doğrusu: digitalWrite(led3,HIGH);
    durum3 = true;
    }

    Dediğiniz sorunu bulursam buraya yazarım. Sizde devrenizi bi kontrol edin. Belki devreden kaynaklanıyor olabilir.
  • kontrol edeyim fakat devreden olmadıgını düşünüyorum, ledlerin hepsini breadboard dan cıkardım sadece butonlar kaldı, butonların önünde 10k direnc var, hersey normal gibi. yine aynı sorun oldu. buton 2 ye bastıgımda buton2 ile birlikte buton 3 de tetikleniyor, buton 3 e bastıgımda ise buton 3 ile birlikte buton 1 de tetikleniyor, fakat buton 1 e basarsam sadece buton 1 calısıyor o normal.
  • Teşekkür ederim, çalışıyor, galiba butonlardan birinde bir problem vardı, butonları yenileriyle değiştirdim şu an problemsiz çalışıyor, çok teşekkür ediyorum sağolun :)
  • rica ederim, başarılar
  • Peki şimdi 600 den geri sayıyor ya, yani 10 dakika 600 saniyeye tekabul ediyor, ben bunu direk 10 dakikadan dakika olarak saydırmaya kalksam kodda yani 10... 9... 8... gibi gitse dakika başı, kodda sure3 = (double) ((buton3_son_zaman-millis())/1000*60); conversionlarda böyle gösteriyor fakat yaptım ama olmadı ? bu millis olayında daha mı farklı conversion ?
  • (1000*60) olarak dene, yani şu şekil:

    sure3 = (double) ((buton3_son_zaman-millis())/ ( 1000*60 ) );
  • ok sure1 = (double) ((buton1_son_zaman-millis())/1000/60); yapınca oldu :) tesekkurler

Howdy, Stranger!

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

Login with Facebook

Tagged

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