Arduino önceki komutu iptal etme

XOlnyS

Üye
Katılım
4 Ocak 2021
Mesajlar
7
Puanları
1
Yaş
20
Merhaba, ben bu devrede her yeni bir tuşa basıldığında önceki komutun iptal edilmesini istiyorum bunu nasıl yapabilirim?
 

Ekli dosyalar

  • resim_2021-01-04_141717.png
    resim_2021-01-04_141717.png
    79.1 KB · Görüntüleme: 12
Önceki komutun tersini yaparsan iptal etmiş olursun
 
Önceki komuttan kasıt yanıyorsa yanmasın, yanmıyorsa yansın anlamında ise;
Kod:
if (digitalRead(Buton) == 1)
  digitalWrite(13, !digitalRead(13));  // mevcut durumun tersini yap, HIGH ise LOW, LOW ise HIGH yap
 
Diyelim ki bir robotumuz olsun.

Bir düğmeye bastığım zaman sağa gitsin. Başka bir düğmeye bastığım zaman önceki komutu iptal edip sola doğru gitmeye başlasın.

Bu durumda Arduino'nun normal bekleme komutu yerine durumaGoreBekle() diye bir işlev yazabilirsiniz.

C++:
void setup()
{
    /*  ..  */
}

bool dugmeyeBasildi()
{
    /*  ..  */
}

bool durumaGoreBekle(unsigned long sure)
{
    unsigned long bitis = millis() + sure;
    while (millis() < bitis)
    {
        if (dugmeyeBasildi())
        {
            return true;
        }
        delay(10); /*  duruma göre değişebilir */
    }
    return false;
}

void sagaHareketEt()
{
    Serial.println("------------");
    Serial.println("Sağa gidiyorum");
    Serial.println("------------");

    for (int i = 0; i < 3; ++i)
    {
        digitalWrite(SAG_ISIGI, HIGH);
        durumaGoreBekle(1000);
        digitalWrite(SAG_ISIGI, LOW);
        durumaGoreBekle(1000);
    }
}

void solaHareketEt()
{
    Serial.println("------------");
    Serial.println("Sola gidiyorum");
    Serial.println("------------");

    for (int i = 0; i < 3; ++i)
    {
        digitalWrite(SOL_ISIGI, HIGH);
        durumaGoreBekle(1000);
        digitalWrite(SOL_ISIGI, LOW);
        durumaGoreBekle(1000);
    }
}

void loop()
{
    /*  ..  */
}

Basit bir ışık yakmaktan daha karmaşık bir işlem yapıyorsak o zaman kesme işlevinde de geliştirmeler yapmak durumundayız.

Diyelim ki eylemimiz bir dizi karmaşık motor hareketi olsun. Ve bu eylemin tam ortasında bir kesme ya da durum değiştir isteği geldi. Bu durumda motoru güvenli ya da eylemsiz duruma getirdikten sonra diğer eyleme geçmek isteriz.

Yukarıdaki örneğin pratik bir uygulamasını burada bulabilirsiniz. Burada bir durumdan diğerine geçmek için radyo sinyalleri kullanılıyor
 
Son düzenleme:
benim yaptığım şey şu, her buton farklı bir led ışığını yakıyor. Bir butona bastıktan sonra eğer diğer butona basarsam ilk bastığım butonun yaptığı işlemin iptal olup diğer işlemi yapmasını istiyorum.Bunun için koda ne yazmalıyım?
 
Buton1 bastığınız zaman 1 numaralı led high yaparken diğerlerini low yapın. Buton 2 ye bastığınız zaman 2 numaralı ledi high yapın diğerlerini low. Bütün konutları bu şekilde yazarsanız hanği butona basarsanız onun ledi yanar diğerleri söner.
 
Buton1 bastığınız zaman 1 numaralı led high yaparken diğerlerini low yapın. Buton 2 ye bastığınız zaman 2 numaralı ledi high yapın diğerlerini low. Bütün konutları bu şekilde yazarsanız hanği butona basarsanız onun ledi yanar diğerleri söner.
Şu şekilde, bir buton 2-3 ledi aynı anda yakıyor. Bir butona bastığımda 2-3 led yanarken, diğer butona bastığımda yanan ledlerin kapanıp son bastığım butonun ledlerinin yanmasını istiyorum.
 
Burada tek yapmanız gereken yukarıdaki örnekte dugmeyeBasildi() işlevinin içini doldurmak.

Eğer düğmeye ya da düğmelerden herhangi birine basıldı ise bu işlev true döndürecek.

C++:
String durum = "boşta";

void setup()
{
    /*  ..  */
}

bool dugmeyeBasildi()
{
    if (digitalRead(ilkDugme) == LOW)
    {
        durum = "sagaGit";
        return true;
    }
    if (digitalRead(ikinciDugme) == LOW)
    {
        durum = "solaGit";
        return true;
    }

    /*  ..  */

    return false;
}

bool durumaGoreBekle(unsigned long sure)
{
    /*  ..  */
}

void sagaHareketEt()
{
    /*  ..  */
}

void solaHareketEt()
{
    /*  ..  */
}

void komutlariIsle(String komut)
{
    switch(komut)
    {
    case "sagaGit":
        sagaHareketEt();
        break;
    case "solaGit":
        solaHareketEt();
        break;

        /*  .. */
    default:
        break;
    }
}

void loop()
{
    komutlarıIsle(durum);
    /*  ..  */
}
 
Burada tek yapmanız gereken yukarıdaki örnekte dugmeyeBasildi() işlevinin içini doldurmak.

Eğer düğmeye ya da düğmelerden herhangi birine basıldı ise bu işlev true döndürecek.

C++:
String durum = "boşta";

void setup()
{
    /*  ..  */
}

bool dugmeyeBasildi()
{
    if (digitalRead(ilkDugme) == LOW)
    {
        durum = "sagaGit";
        return true;
    }
    if (digitalRead(ikinciDugme) == LOW)
    {
        durum = "solaGit";
        return true;
    }

    /*  ..  */

    return false;
}

bool durumaGoreBekle(unsigned long sure)
{
    /*  ..  */
}

void sagaHareketEt()
{
    /*  ..  */
}

void solaHareketEt()
{
    /*  ..  */
}

void komutlariIsle(String komut)
{
    switch(komut)
    {
    case "sagaGit":
        sagaHareketEt();
        break;
    case "solaGit":
        solaHareketEt();
        break;

        /*  .. */
    default:
        break;
    }
}

void loop()
{
    komutlarıIsle(durum);
    /*  ..  */
}
Hocam böyle yazmışsınız teşekkür ederimde ben bunu kendi koduma geçiremiyorum. Rica etsem Arduino dosyamı atsam değiştirebilirmisiniz?
 

Forum istatistikleri

Konular
130,148
Mesajlar
933,626
Kullanıcılar
453,235
Son üye
aky

Yeni konular

Geri
Üst