Arduino önceki komutu iptal etme

bir değişkene kaydettiyseniz değişkene yeni durum atayın.
 
Bir fonksiyon yazın, fonksiyon içerisinde tüm pin değerlerini LOW konumuna çekin.
Her butona bastığınızda önce bu fonksiyonu çağırın.

Örnek:
Kod:
void loop(){
  if(buton1 == true){
    sifirla();
    // diğer kodlar
  }
  if(buton == true){
    sifirla();
    // diğer kodlar
  }
}

void sifirla() {
  digitalWrite(led1, LOW);
  digitalWrite(led2, LOW);
  digitalWrite(led3, LOW);
  digitalWrite(led4, LOW);
  digitalWrite(led5, LOW);
  digitalWrite(led6, LOW);
}
 
her bir if koşulunun içine örneğin ilk if

butondurum2 = 0;
butondurum3 = 0;
butondurum4 = 0;
butondurum5 = 0;
butondurum6 = 0;

ekleyin ikinci elseif için

butondurum1 = 0;
butondurum3 = 0;
butondurum4 = 0;
butondurum5 = 0;
butondurum6 = 0;
gibi hepsine bu ifadeyi ekleyin açık kalmasını istediğiniz durum hariç.
 
Merhaba, ben bu devrede her yeni bir tuşa basıldığında önceki komutun iptal edilmesini istiyorum bunu nasıl yapabilirim?
Kod:
const int led1 = 6;

const int buton1 = 0;

int butondurum1=0;


const int led2 = 7;

const int buton2 = 1;

int butondurum2=0;


const int led3 = 8;

const int buton3 = 2;

int butondurum3=0;


const int led4 = 9;

const int buton4 = 3;

int butondurum4=0;


const int led5 = 10;

const int buton5 = 4;

int butondurum5=0;


const int led6 = 11;

const int buton6 = 5;

int butondurum6=0;

void setup()
{
  pinMode(led1,OUTPUT);
  pinMode(buton1,INPUT);

  pinMode(led2,OUTPUT);
  pinMode(buton2,INPUT);

  pinMode(led3,OUTPUT);
  pinMode(buton3,INPUT);

  pinMode(led4,OUTPUT);
  pinMode(buton4,INPUT);

  pinMode(led5,OUTPUT);
  pinMode(buton5,INPUT);

  pinMode(led6,OUTPUT);
  pinMode(buton6,INPUT);
}

void loop()
{
  butondurum1 = digitalRead(buton1);
  butondurum2 = digitalRead(buton2);
  butondurum3 = digitalRead(buton3);
  butondurum4 = digitalRead(buton4);
  butondurum5 = digitalRead(buton5);
  butondurum6 = digitalRead(buton6);
     
    if(butondurum1 == HIGH)
    {
      digitalWrite(led1,LOW);
      digitalWrite(led2,LOW);
      digitalWrite(led3,LOW);
      digitalWrite(led4,LOW);
      digitalWrite(led5,LOW);
      digitalWrite(led6,LOW);
     
      digitalWrite(led1,HIGH);
      delay(500);
     
      digitalWrite(led1,LOW);
      digitalWrite(led6,HIGH);
      delay(9999);
    }

    else if(butondurum2 == HIGH)
    {
      digitalWrite(led1,HIGH);
      digitalWrite(led2,HIGH);
      delay(500);
     
      digitalWrite(led1,LOW);
      digitalWrite(led2,LOW);
      digitalWrite(led6,HIGH);
      delay(2000);
    }

    else if(butondurum3 == HIGH)
    {
      digitalWrite(led1,LOW);
      digitalWrite(led2,LOW);
      digitalWrite(led3,LOW);
      digitalWrite(led4,LOW);
      digitalWrite(led5,LOW);
      digitalWrite(led6,LOW);
     
      digitalWrite(led1,HIGH);
      delay(250);
     
      digitalWrite(led1,LOW);
      digitalWrite(led2,HIGH);
      delay(250);
     
      digitalWrite(led2,LOW);
      digitalWrite(led3,HIGH);
      delay(250);
     
      digitalWrite(led3,LOW);
      digitalWrite(led4,HIGH);
      delay(250);
     
      digitalWrite(led4,LOW);
      digitalWrite(led5,HIGH);
      delay(250);
     
      digitalWrite(led5,LOW);
      digitalWrite(led6,HIGH);
      delay(9999);
    }

    else if(butondurum4 == HIGH)
    {
      digitalWrite(led4,HIGH);
      delay(250);
     
      digitalWrite(led4,LOW);
      delay(250);
     
      digitalWrite(led3,HIGH);
      delay(250);
     
      digitalWrite(led3,LOW);
      delay(250);
     
      digitalWrite(led4,HIGH);
      delay(250);
     
      digitalWrite(led4,LOW);
      delay(250);
     
      digitalWrite(led3,HIGH);
      delay(250);
     
      digitalWrite(led3,LOW);
      delay(250);
     
      digitalWrite(led4,HIGH);
      delay(250);
     
      digitalWrite(led4,LOW);
      delay(250);
     
      digitalWrite(led3,HIGH);
      delay(250);
   
      digitalWrite(led3,LOW);
      delay(9999);
    }

    else if(butondurum5 == HIGH)
    {
      digitalWrite(led6,HIGH);
      delay(250);
     
      digitalWrite(led6,LOW);
      digitalWrite(led5,HIGH);
      delay(250);
     
      digitalWrite(led5,LOW);
      digitalWrite(led4,HIGH);
      delay(250);
     
      digitalWrite(led4,LOW);
      digitalWrite(led3,HIGH);
      delay(250);
     
      digitalWrite(led3,LOW);
      digitalWrite(led2,HIGH);
      delay(250);
     
      digitalWrite(led2,LOW);
      digitalWrite(led1,HIGH);
      delay(250);
     
      digitalWrite(led1,LOW);
      digitalWrite(led6,HIGH);
      delay(9999);
    }

    else if(butondurum6 == HIGH)
    {
      digitalWrite(led1,HIGH);
      digitalWrite(led2,HIGH);
      digitalWrite(led3,HIGH);
      digitalWrite(led4,HIGH);
      digitalWrite(led5,HIGH);
      digitalWrite(led6,HIGH);
      delay(500);
     
      digitalWrite(led1,LOW);
      digitalWrite(led2,LOW);
      digitalWrite(led3,LOW);
      digitalWrite(led4,LOW);
      digitalWrite(led5,LOW);
      digitalWrite(led6,LOW);
      delay(500);
     
      digitalWrite(led1,HIGH);
      digitalWrite(led2,HIGH);
      digitalWrite(led3,HIGH);
      digitalWrite(led4,HIGH);
      digitalWrite(led5,HIGH);
      digitalWrite(led6,HIGH);
      delay(500);
     
      digitalWrite(led1,LOW);
      digitalWrite(led2,LOW);
      digitalWrite(led3,LOW);
      digitalWrite(led4,LOW);
      digitalWrite(led5,LOW);
      digitalWrite(led6,LOW);
      delay(500);
     
      digitalWrite(led1,HIGH);
      digitalWrite(led2,HIGH);
      digitalWrite(led3,HIGH);
      digitalWrite(led4,HIGH);
      digitalWrite(led5,HIGH);
      digitalWrite(led6,HIGH);
      delay(500);
     
      digitalWrite(led1,LOW);
      digitalWrite(led2,LOW);
      digitalWrite(led3,LOW);
      digitalWrite(led4,LOW);
      digitalWrite(led5,LOW);
      digitalWrite(led6,LOW);
    }

  else
  {
      digitalWrite(led1,LOW);
      digitalWrite(led2,LOW);
      digitalWrite(led3,LOW);
      digitalWrite(led4,LOW);
      digitalWrite(led5,LOW);
      digitalWrite(led6,LOW);
  }
}
Sana çözümü söylemeden önce birkaç öneride bulunacağım. Birincisi dijital girişler int değil bool dur yani sayı değil durumdur onları öyle yani onlar high veya low değil −2,147,483,648 ve +2,147,483,647 arasında bir değermiş gibi davranamazsın. İkincisi birbirini tekrar eden işlerde fonksiyon kullanmalısın yoksa hem aletin hafızası dolar hemde boşa hamallık edersin. Üçüncüsü sırayla yapılacak işlerde for döngüsünü çok koşullu işlerde if yerine switch döngüsünü kullanman gerekir. Şimdi senin soruna gelirsek; Anladığım kadarıyla bir butona basıldığında başlanan işi tamamlanmadan diğer buton basılırsa yarıda kesmek istiyorsun. Bunu kesmeyle yapabilirdik ama 6 butona kesme vereeyiz o yüzden belirli aralıklarla butonlara bakmak zorundayız. delay(500) komutu aleti 500ms uyutacağı için butonları göremeyiz onun yerine aleti 500e kadar saydırıp her bir sayıda butonlara baktırmamız gerekir. bunun için bekle() adında bir fonksiyon yazmalıyız. Yazdığın kodu sadeleştirdim bi bakarsın. Derledim ama çalıştırmadım sen deneyip göreceksin. Daha fazla sadeleştirmek mümkün ama anlayamazsın o zaman. Şimdi aşağıdaki kodu incele çalıştır olmayan birşey varsa buraya yaz.

Kod:
#define ON true
#define OFF false

const int led1 = 6;
const int led2 = 7;
const int led3 = 8;
const int led4 = 9;
const int led5 = 10;
const int led6 = 11;

const int buton1 = 0;
const int buton2 = 1;
const int buton3 = 2;
const int buton4 = 3;
const int buton5 = 4;
const int buton6 = 5;

int flag=0;
void led(bool,bool,bool,bool,bool,bool);// Led Fonksiyon prototipi
void bekle(int,int);
void check_inputs(); 
void setup()
{
  for(int i=0;i<6;i++)    //Girişler
    pinMode(i,INPUT);

  for(int k=6;k<12;k++)    //Çıkışlar
    pinMode(k,OUTPUT);
}

void loop()
{
    flag=0;
    check_inputs();
    switch(flag){
      case 1:
        led(ON,OFF,OFF,OFF,OFF,OFF);
        bekle(1,500);
        led(OFF,OFF,OFF,OFF,OFF,ON);
        bekle(1,9999);
        break;
      case 2:
        led(ON,ON,OFF,OFF,OFF,OFF);
        bekle(2,500);
        led(OFF,OFF,OFF,OFF,OFF,ON);
        bekle(2,2000);
        break;
      case 3:
        led(ON,OFF,OFF,OFF,OFF,OFF);
        bekle(3,250);
        led(OFF,ON,OFF,OFF,OFF,OFF);
        bekle(3,250);
        led(OFF,OFF,ON,OFF,OFF,OFF);
        bekle(3,250);
        led(OFF,OFF,OFF,ON,OFF,OFF);
        bekle(3,250);
        led(OFF,OFF,OFF,OFF,ON,OFF);
        bekle(3,250);
        led(OFF,OFF,OFF,OFF,OFF,ON);
        bekle(3,9999);
        break;
      case 4:
        led(OFF,OFF,OFF,ON,OFF,ON);
        bekle(4,250);
        led(OFF,OFF,OFF,OFF,OFF,ON);
        bekle(4,250);
        led(OFF,OFF,ON,OFF,OFF,ON);
        bekle(4,250);
        led(OFF,OFF,OFF,OFF,OFF,ON);
        bekle(4,250);
        led(OFF,OFF,OFF,ON,OFF,ON);
        bekle(4,250);
        led(OFF,OFF,OFF,OFF,OFF,ON);
        bekle(4,250);
        led(OFF,OFF,ON,OFF,OFF,ON);
        bekle(4,250);
        led(OFF,OFF,OFF,OFF,OFF,ON);
        bekle(4,250);
        led(OFF,OFF,OFF,ON,OFF,ON);
        bekle(4,250);
        led(OFF,OFF,OFF,OFF,OFF,ON);
        bekle(4,250);
        led(OFF,OFF,ON,OFF,OFF,ON);
        bekle(4,250);
        led(OFF,OFF,OFF,OFF,OFF,ON);
        bekle(4,9999);
        break;
      case 5:
        led(OFF,OFF,OFF,OFF,OFF,ON);
        bekle(5,250);
        led(OFF,OFF,OFF,OFF,ON,OFF);
        bekle(5,250);
        led(OFF,OFF,OFF,ON,OFF,OFF);
        bekle(5,250);
        led(OFF,OFF,ON,OFF,OFF,OFF);
        bekle(5,250);
        led(OFF,ON,OFF,OFF,OFF,OFF);
        bekle(5,250);
        led(ON,OFF,OFF,OFF,OFF,OFF);
        bekle(5,250);
        led(OFF,OFF,OFF,OFF,OFF,ON);
        bekle(5,9999);
        break;
      case 6:
        led(ON,ON,ON,ON,ON,ON);
        bekle(6,500);
        led(OFF,OFF,OFF,OFF,OFF,OFF);
        bekle(6,500);
        led(ON,ON,ON,ON,ON,ON);
        bekle(6,500);
        led(OFF,OFF,OFF,OFF,OFF,OFF);
        bekle(6,500);
        led(ON,ON,ON,ON,ON,ON);
        bekle(6,500);
        led(OFF,OFF,OFF,OFF,OFF,OFF);
        break;
      deafult:
        break;
    }
}

void led(bool Led1,bool Led2,bool Led3,bool Led4,bool Led5,bool Led6){
  digitalWrite(led1,Led1);
  digitalWrite(led2,Led2);
  digitalWrite(led3,Led3);
  digitalWrite(led4,Led4);
  digitalWrite(led5,Led5);
  digitalWrite(led6,Led6);
}

void bekle(int mflag,int sure){
  int isure = 0;
  while(isure<sure && flag==mflag){
    delay(1);
    check_inputs();
    isure++;
  }
}
void check_inputs(){
  int mflag=0;
  for(int i=0;i<6;i++)
    if(digitalRead(i))
      mflag=i+1;
  if(mflag != flag && mflag !=0)
    flag=mflag;
}
 
Sana çözümü söylemeden önce birkaç öneride bulunacağım. Birincisi dijital girişler int değil bool dur yani sayı değil durumdur onları öyle yani onlar high veya low değil −2,147,483,648 ve +2,147,483,647 arasında bir değermiş gibi davranamazsın. İkincisi birbirini tekrar eden işlerde fonksiyon kullanmalısın yoksa hem aletin hafızası dolar hemde boşa hamallık edersin. Üçüncüsü sırayla yapılacak işlerde for döngüsünü çok koşullu işlerde if yerine switch döngüsünü kullanman gerekir. Şimdi senin soruna gelirsek; Anladığım kadarıyla bir butona basıldığında başlanan işi tamamlanmadan diğer buton basılırsa yarıda kesmek istiyorsun. Bunu kesmeyle yapabilirdik ama 6 butona kesme vereeyiz o yüzden belirli aralıklarla butonlara bakmak zorundayız. delay(500) komutu aleti 500ms uyutacağı için butonları göremeyiz onun yerine aleti 500e kadar saydırıp her bir sayıda butonlara baktırmamız gerekir. bunun için bekle() adında bir fonksiyon yazmalıyız. Yazdığın kodu sadeleştirdim bi bakarsın. Derledim ama çalıştırmadım sen deneyip göreceksin. Daha fazla sadeleştirmek mümkün ama anlayamazsın o zaman. Şimdi aşağıdaki kodu incele çalıştır olmayan birşey varsa buraya yaz.

Kod:
#define ON true
#define OFF false

const int led1 = 6;
const int led2 = 7;
const int led3 = 8;
const int led4 = 9;
const int led5 = 10;
const int led6 = 11;

const int buton1 = 0;
const int buton2 = 1;
const int buton3 = 2;
const int buton4 = 3;
const int buton5 = 4;
const int buton6 = 5;

int flag=0;
void led(bool,bool,bool,bool,bool,bool);// Led Fonksiyon prototipi
void bekle(int,int);
void check_inputs();
void setup()
{
  for(int i=0;i<6;i++)    //Girişler
    pinMode(i,INPUT);

  for(int k=6;k<12;k++)    //Çıkışlar
    pinMode(k,OUTPUT);
}

void loop()
{
    flag=0;
    check_inputs();
    switch(flag){
      case 1:
        led(ON,OFF,OFF,OFF,OFF,OFF);
        bekle(1,500);
        led(OFF,OFF,OFF,OFF,OFF,ON);
        bekle(1,9999);
        break;
      case 2:
        led(ON,ON,OFF,OFF,OFF,OFF);
        bekle(2,500);
        led(OFF,OFF,OFF,OFF,OFF,ON);
        bekle(2,2000);
        break;
      case 3:
        led(ON,OFF,OFF,OFF,OFF,OFF);
        bekle(3,250);
        led(OFF,ON,OFF,OFF,OFF,OFF);
        bekle(3,250);
        led(OFF,OFF,ON,OFF,OFF,OFF);
        bekle(3,250);
        led(OFF,OFF,OFF,ON,OFF,OFF);
        bekle(3,250);
        led(OFF,OFF,OFF,OFF,ON,OFF);
        bekle(3,250);
        led(OFF,OFF,OFF,OFF,OFF,ON);
        bekle(3,9999);
        break;
      case 4:
        led(OFF,OFF,OFF,ON,OFF,ON);
        bekle(4,250);
        led(OFF,OFF,OFF,OFF,OFF,ON);
        bekle(4,250);
        led(OFF,OFF,ON,OFF,OFF,ON);
        bekle(4,250);
        led(OFF,OFF,OFF,OFF,OFF,ON);
        bekle(4,250);
        led(OFF,OFF,OFF,ON,OFF,ON);
        bekle(4,250);
        led(OFF,OFF,OFF,OFF,OFF,ON);
        bekle(4,250);
        led(OFF,OFF,ON,OFF,OFF,ON);
        bekle(4,250);
        led(OFF,OFF,OFF,OFF,OFF,ON);
        bekle(4,250);
        led(OFF,OFF,OFF,ON,OFF,ON);
        bekle(4,250);
        led(OFF,OFF,OFF,OFF,OFF,ON);
        bekle(4,250);
        led(OFF,OFF,ON,OFF,OFF,ON);
        bekle(4,250);
        led(OFF,OFF,OFF,OFF,OFF,ON);
        bekle(4,9999);
        break;
      case 5:
        led(OFF,OFF,OFF,OFF,OFF,ON);
        bekle(5,250);
        led(OFF,OFF,OFF,OFF,ON,OFF);
        bekle(5,250);
        led(OFF,OFF,OFF,ON,OFF,OFF);
        bekle(5,250);
        led(OFF,OFF,ON,OFF,OFF,OFF);
        bekle(5,250);
        led(OFF,ON,OFF,OFF,OFF,OFF);
        bekle(5,250);
        led(ON,OFF,OFF,OFF,OFF,OFF);
        bekle(5,250);
        led(OFF,OFF,OFF,OFF,OFF,ON);
        bekle(5,9999);
        break;
      case 6:
        led(ON,ON,ON,ON,ON,ON);
        bekle(6,500);
        led(OFF,OFF,OFF,OFF,OFF,OFF);
        bekle(6,500);
        led(ON,ON,ON,ON,ON,ON);
        bekle(6,500);
        led(OFF,OFF,OFF,OFF,OFF,OFF);
        bekle(6,500);
        led(ON,ON,ON,ON,ON,ON);
        bekle(6,500);
        led(OFF,OFF,OFF,OFF,OFF,OFF);
        break;
      deafult:
        break;
    }
}

void led(bool Led1,bool Led2,bool Led3,bool Led4,bool Led5,bool Led6){
  digitalWrite(led1,Led1);
  digitalWrite(led2,Led2);
  digitalWrite(led3,Led3);
  digitalWrite(led4,Led4);
  digitalWrite(led5,Led5);
  digitalWrite(led6,Led6);
}

void bekle(int mflag,int sure){
  int isure = 0;
  while(isure<sure && flag==mflag){
    delay(1);
    check_inputs();
    isure++;
  }
}
void check_inputs(){
  int mflag=0;
  for(int i=0;i<6;i++)
    if(digitalRead(i))
      mflag=i+1;
  if(mflag != flag && mflag !=0)
    flag=mflag;
}
Çok ama çok teşekkür ederim.
 

Forum istatistikleri

Konular
127,951
Mesajlar
913,867
Kullanıcılar
449,599
Son üye
Gksn

Yeni konular

Geri
Üst