BUTONA BASMA SÜRESİNE GÖRE FONKSİYONLAR ARASI GEÇİŞ YAPMA
  • Baya kafa yordum fakat yapamadım.Sistemde bir buton olacak ve butona 1 sn basılırsa fonksiyon1 , 2sn basılırsa fonksiyon2,3saniye basılırsa fonksiyon3'e gidecek. Herhangi fonksiyona gittikten sonra butona basılma süresine göre yeni fonksiyona gidecek.

    Mesela aşağıdaki kodda butona 3-6sn arası basılırsa devamlı joystickten gelen bilgiye göre motor hızı kontrol edilsin istiyorum.Fakat joystick bilgisini 1 kere alıyor ve devamlı o hızda gidiyor motor.

    const int buttonPin = 7 ; //Butonu 7. pine atadık.
    int led1 = 3 ;
    int led2 = 4 ;
    int led3 = 5 ;
    const int X_PIN = A0;
    const int MOTOR=11;
    int hiz ;
    int hizz ;
    int buttonCase = 0;//Butonun başlangıç değerini LOW olarak atadık.
    long lastTime = 0;//En son butona basma zamanını bu değişkende tutacağız.

    void setup()
    {
    pinMode(7, INPUT);
    pinMode(MOTOR,OUTPUT);
    pinMode(3, OUTPUT);
    pinMode(4, OUTPUT);
    pinMode(5, OUTPUT);
    //Butonun bağlı olduğu pini giriş olarak atadık
    Serial.begin(9600);
    }

    void loop()
    {
    unsigned long startTime = millis() ;//Başlangıçtan sonra geçen zamanımızı bu değişkenimizde tutacağız.
    long highTime = 0;//Butonun ne kadar süre HIGH durumunda kaldığını bu değişkende tutacağız.

    buttonCase = digitalRead(7);// Butonun bağlı olduğu pini okuyoruz

    if ( buttonCase != LOW )// Eğer buton HIGH durumundaysa
    {
    if( lastTime == 0 ) // Ve önceden bir atama yapılmamışsa
    lastTime = startTime;//Anahtarlama anı kaydedilir.
    }
    //Eger lastTime == 0 gibi bir şart olmasaydı,
    //buton basılı olduğu durumda lastTime ' a sürekli atama yapılacaktı.
    //Bu şartı ekleyerek sadece ilk basılma anını kaydetmiş oluyoruz.

    else// Eğer buton LOW durumundaysa. Yani basılı değilken
    {
    if (lastTime != 0)//Butonun önceden basılı olup olmadığına bakılır.
    { // Eğer önceden atama yapılmışsa. Yani butona basılıp çekilmişse
    highTime = startTime - lastTime ; // Başlangıçtan şimdiye kadar olan zamandan (startTime) anahtara en son basılan
    Serial.print("Zaman araligi = "); //zaman (lastTime) çıkarılır ve butona basılı tutma süresi (highTime) bulunmuş olur.
    Serial.println(highTime);// Serial.print ve .println komutlarıyla da yazdırılır.
    if ((startTime - lastTime)>0 && (startTime - lastTime)<3000)<br />{




    digitalWrite(3,HIGH);
    digitalWrite(4,LOW);
    digitalWrite(5,LOW);
    }

    else if ((startTime - lastTime)>3000 && (startTime - lastTime)<6000)<br />

    { digitalWrite(4,HIGH);
    digitalWrite(3,LOW);
    digitalWrite(5,LOW);
    hiz= analogRead(X_PIN);
    hizz = map(hiz,0,1023,255,0);
    Serial.println(hiz);
    analogWrite(MOTOR, hizz);
    delay(10);
    }
    else
    {

    digitalWrite(5,HIGH);
    digitalWrite(3,LOW);
    digitalWrite(4,LOW);}
    lastTime = 0; // Bir sonraki anahtarlama anı için lastTime sıfırlanır. Ve işlem devam eder.


    }

    else
    {

    }
    }
    }


  • Karışık görünüyor okuyamadım. Algoritma sadeleştirilebilir gibi geldi.

    while(digitalRead(7) == LOW); // Butona basılana kadar bekle
    unsigned long startTime = millis(); // Başlangıç zamanını al

    while(digitalRead(7) == HIGH); // Buton bırakılana kadar bekle
    unsigned long highTime = millis() - startTime; // Farkını al

    if(highTime > 3000)
    fonksiyon3();
    else if(highTime > 2000)
    fonksiyon2();
    else if(highTime > 1000)
    fonksiyon1();
    else
    BaskaBisey();

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.