Arduino RF decode Yardım

sercan341

Üye
Katılım
19 Eki 2019
Mesajlar
14
Puanları
1
Arkadaşlar merhaba RF verici kartını arduinoya bağlayıp kumandamın kodlarını öğrendim. Ancak bu kodları kendi projemde kütüphane olmadan kullanamaz mıyım ? Araştırdığım projelerde hep kodları öğrenip led yakma ve söndüme işlemleri yapıyolar ama tek sorun kütüphanenın içindeki kodların arasına iki üç satır şeklinde yazılıyor ben satırlarca kodumun içerisine nasıl dahil edebilirim. Eğer bu kumanda kodlarını int şeklinde yada define şeklinde tanımlarsam kütphane eklemeden yada başka kod eklemeden kendi projeme dahil edebilirmiyim ?

Araştırdığım konularda bu şekilde kodlar kullanılmış;
void loop() {
if(mySwitch.available())
{
unsigned long int num = mySwitch.getReceivedValue();
Serial.println("Gelen Deger:" + String(num));
switch(num)
{
case 10314241: mySwitch.disableReceive();
statusLed1 = HIGH;
break;
case 10314242: mySwitch.disableReceive();
statusLed2 = HIGH;
break;
case 10314244: mySwitch.disableReceive();
statusLed3 = HIGH;
break;
case 10314248: mySwitch.disableReceive();
statusLed1 = LOW;
statusLed2 = LOW;
statusLed3 = LOW;
break;
}
digitalWrite(led1, statusLed1);
digitalWrite(led2, statusLed2);
digitalWrite(led3, statusLed3);
delay(100);
mySwitch.resetAvailable();
mySwitch.enableReceive(0);
}
}
benim projemde sadece 3 led yok ve butondan ses çalma gibi durumda oldugu için hepsine teker teker bu durumlarını low olarak gösteren bir kod mu girmem gerekiyor?
 
Ben böyle çok komutlu işlemlerde tüm komutları ve fonksiyonları bir yapı veya sınıf içerisinde tutup bir döngüyle kontrol etmeyi öneriyorum. karttan gelen bilgiyi okuduğunu varsayarak aşağıdaki örneği veriyorum. Yapman gereken enum komutlar{... içerisine eklemek istediğin komutu sondan bir önceki eleman olarak ekleyip setup() içerisinde de fonksiyonu ve kumandadan gelen kodu tanımlaman yeterli olacaktır. Unutma örnekteki sayılar ve fonksiyonlar tamamen hayal ürünüdür. Ben örnek olarak ledi yakıp söndürttüm.

C++:
#include <RCSwitch.h>

enum komutlar{yak,sondur,ac,kapa,toplam_komut_sayisi}; //toplam_komut_sayisi en sonda kalacak
struct Kumanda{
  uint32_t kod;
  void (*fonksiyon)(void);
}kumanda[toplam_komut_sayisi];

RCSwitch mySwitch = RCSwitch();
void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  mySwitch.enableReceive(0);  // Receiver on interrupt 0 => that is pin #2

/*Kumanda da kullanılmak istenen komutlar için kod ve fonksiyonlar aşağıdaki gibi tanımlanacak */
/*--------yakma işlemi-----*/
kumanda[yak].kod = 10314241;
kumanda[yak].fonksiyon = []{
  digitalWrite(LED_BUILTIN, HIGH);
  /*yapılmak istenen işlemler buraya girilecek*/
};
/*--------söndürme işlemi-----*/
kumanda[sondur].kod = 10314242;
kumanda[sondur].fonksiyon = []{
  digitalWrite(LED_BUILTIN, LOW);
  /*yapılmak istenen işlemler buraya girilecek*/
};
/*--------açma işlemi-----*/
kumanda[ac].kod = 10314243;
kumanda[ac].fonksiyon = []{
  /*yapılmak istenen işlemler buraya girilecek*/
};
/*--------kapatma işlemi-----*/
kumanda[kapa].kod = 10314244;
kumanda[kapa].fonksiyon = []{
  /*yapılmak istenen işlemler buraya girilecek*/
};
}
void loop() {
    if (mySwitch.available()) {
      uint32_t value = mySwitch.getReceivedValue();
      if (value != 0) 
        for(int i=0;i<toplam_komut_sayisi;i++)
          if(value == kumanda[i].kod)
            kumanda[i].fonksiyon();
     mySwitch.resetAvailable();
    }
}
 
Son düzenleme:
Hocam yanıtınız için teşekkür ediyorum. Arduino sistemine çalışırken böyle enum kodların gösterilmediği için zaten bu tür sıkıntıları yaşıyoruz. Benim projemde 4 kanallı rf alıcı kullandım kısaca açıklayacak olursam sistem case komutlarıyla ledlerin karaşimşek v.b olması için 20-25 tane ışık moduyla döngü içinde devam ediyor yani her aynı butona bir süre basıldığında mod değişiyor bunlardan hariç 3 kanal kalıyor onlarda siren sistemi gibi sesleri çalıyor 3 butondan herhangi butona basıldığında. Şimdi 4 kanallı rf alıcıda tek tek kanalları buton olarak tanıtıp işlem yapabiliyordum. Ancak bunda tek bir data kablosu gidiyor rf kumandasının kodlarını öğrenip işlemi sadece o kumandaya aktarmak için bu işlemi istiyorum. Anladığım kadarıyla bu serial port ekranını kullanmadan yada rc swicth kütüphanesini kullanmadan bu işlemi yapamıyoruz. Sizin yazmış olduğunuz kodlarda Ledi yakıp söndürme işlemi yapılıyor. Bu kodları eğer 'yapılacak işlemler' yazdığınız kısıma benim döngümü girersem ve döngüden çıkıp tamamen ledleri kapatması içinde kapatma kısmına kodu girersem ve öteki butonlar içinde mesela A butonuna basılınca lambalar yansın A butonuna basınca ledlerin geri modlarını değiştirsin B butonuna basınca Ledleri kapatsın C basınca bir ses çalsın korna gibi D basınca farklı bir ses çalsın ama D butonuna bastığım sürece çalsın istersem hepsi birbirininden bağımsız çalışır mı?
 
#include <RCSwitch.h>

enum komutlar{yak,sondur,ac,kapa,toplam_komut_sayisi}; //toplam_komut_sayisi en sonda kalacak
struct Kumanda{
uint32_t kod;
void (*fonksiyon)(void);


}kumanda[toplam_komut_sayisi];
int buttonPin= 13;
int buzzer= 10;
int LED1= 3;
int LED2= 4;
int LED3= 5;
int LED4= 6;
RCSwitch mySwitch = RCSwitch();
void setup() {

pinMode(10, OUTPUT); //
pinMode(LED1, OUTPUT); //
pinMode(LED2, OUTPUT); //
pinMode(LED3, OUTPUT); //
pinMode(LED4, OUTPUT); //
pinMode(13, INPUT);

mySwitch.enableReceive(0); // Receiver on interrupt 0 => that is pin #2

/*Kumanda da kullanılmak istenen komutlar için kod ve fonksiyonlar aşağıdaki gibi tanımlanacak */
/*--------yakma işlemi-----*/
kumanda[yak].kod = 10314241;
kumanda[yak].fonksiyon = []{
static int pattern = 0;
//
const int patternCount = 30;
static unsigned long lastButtonTime = 0;
if (digitalRead(buttonPin) && (millis() - lastButtonTime) > 100)

{
lastButtonTime = millis();

pattern = (pattern + 1) % patternCount;

}

switch (pattern)
{


case 1:

digitalWrite(LED1,HIGH);
digitalWrite(LED4,HIGH);
delay(50);

digitalWrite(LED1,LOW);
digitalWrite(LED4,LOW);
delay(50);

digitalWrite(LED2,HIGH);
digitalWrite(LED3,HIGH);
delay(50);

digitalWrite(LED2,LOW);
digitalWrite(LED3,LOW);
delay(50);




//*********************3 times***************************************



break;

case 2:
digitalWrite(LED1,HIGH);
digitalWrite(LED3,HIGH);

delay(180);

digitalWrite(LED1,LOW);
digitalWrite(LED3,LOW);

delay(180);

digitalWrite(LED2,HIGH);
digitalWrite(LED4,HIGH);
delay(180);

digitalWrite(LED2,LOW);
digitalWrite(LED4,LOW);
delay(180);
digitalWrite(LED1,HIGH);
digitalWrite(LED3,HIGH);
delay(180);

digitalWrite(LED1,LOW);
digitalWrite(LED3,LOW);
delay(180);

digitalWrite(LED2,HIGH);
digitalWrite(LED4,HIGH);
delay(180);

digitalWrite(LED2,LOW);
digitalWrite(LED4,LOW);
delay(180);

//*********************3 times***************************************


break;

case 3:


digitalWrite(LED1,HIGH);
digitalWrite(LED4,HIGH);

delay(50);

digitalWrite(LED1,LOW);
digitalWrite(LED4,LOW);

delay(50);

digitalWrite(LED1,HIGH);
digitalWrite(LED4,HIGH);

delay(50);

digitalWrite(LED1,LOW);
digitalWrite(LED4,LOW);








digitalWrite(LED2,HIGH);
digitalWrite(LED3,HIGH);

delay(50);

digitalWrite(LED2,LOW);
digitalWrite(LED3,LOW);

delay(50);

digitalWrite(LED2,HIGH);
digitalWrite(LED3,HIGH);

delay(50);

digitalWrite(LED2,LOW);
digitalWrite(LED3,LOW);





//*********************3 times***************************************

digitalWrite(LED1,HIGH);
digitalWrite(LED2,HIGH);

delay(50);
digitalWrite(LED1,LOW);
digitalWrite(LED2,LOW);

delay(50);
digitalWrite(LED1,HIGH);
digitalWrite(LED2,HIGH);

delay(50);
digitalWrite(LED1,LOW);
digitalWrite(LED2,LOW);

delay(50);
digitalWrite(LED1,HIGH);
digitalWrite(LED2,HIGH);

delay(50);
digitalWrite(LED1,HIGH);
digitalWrite(LED2,HIGH);

delay(50);
digitalWrite(LED1,LOW);
digitalWrite(LED2,LOW);


delay(50);

digitalWrite(LED1,LOW);
digitalWrite(LED2,LOW);



/*yapılmak istenen işlemler buraya girilecek*/
}
};
/*--------söndürme işlemi-----*/
kumanda[sondur].kod = 3263246;
kumanda[sondur].fonksiyon = []{
digitalWrite(LED1,LOW);
digitalWrite(LED2,LOW);
digitalWrite(LED3,LOW);
digitalWrite(LED4,LOW);

/*yapılmak istenen işlemler buraya girilecek*/
};
/*--------açma işlemi-----*/
kumanda[ac].kod = 3694647;
kumanda[ac].fonksiyon = []{


tone(10,50,125); // write to buzzer
delay(10);


};

/*--------kapatma işlemi-----*/
kumanda[kapa].kod = 3654797;
kumanda[kapa].fonksiyon = []{
for(int hz = 440; hz < 1000; hz+=5){
tone(10, hz,200);
delay(5);
for(int i=0;i<=9;i++)
digitalWrite(i,HIGH);
}
};

}


void loop() {
if (mySwitch.available()) {
uint32_t value = mySwitch.getReceivedValue();
if (value != 0)
for(int i=0;i<toplam_komut_sayisi;i++)
if(value == kumanda.kod)
kumanda.fonksiyon();
mySwitch.resetAvailable();
}
}


Senin kodlarına böyle bir ekleme yaptım hocam ancak programda sürekli hatalar alıyorum. For, if veya case gibi komutlarla çakışıyor sanırım. Birde karta yüklenirken farklı kütüphaneler bulundu gibi uyarılar alıyorum veya karta çok geç yüklüyor. Yardım edebilirsen çok mutlu olurum.

Tamamdır kodlar şuan çalışıyor ancak iki sorunum var;
1. sorun digital buttonPin okuyarak yani buton varmış gibi onu okuyarak aynı butona kısa bir süre basılınca mod değişiyor bunu rf koduna çeviremedim.
2. sorun ise
tone(10,50,125); // write to buzzer
delay(10); // Bu sesi butona basıldığı süre kadar çalsın istiyorum.
C#:
static int pattern = 0; 
//  If the button is down and the last time it went down was more than 1/10th second ago.
   if (digitalRead(buttonPin) && (millis() - lastButtonTime) > 100)
    
        {
        lastButtonTime = millis();
        
        pattern = (pattern + 1) % patternCount;
        
        }

       {

    
    switch (pattern)
        {


    
    case 1:
 
   digitalWrite(LED4,HIGH);
   delay(50);

   digitalWrite(LED4,LOW);
   delay(50);

   digitalWrite(LED3,HIGH);
   delay(50);
  
   digitalWrite(LED3,LOW);
   delay(50);

      
 
  
   //*********************3 times***************************************
  


    break;
    
    case 2:
   digitalWrite(LED3,HIGH);

   delay(180);

   digitalWrite(LED3,LOW);
 
   delay(180);

   digitalWrite(LED4,HIGH);
   delay(180);
  
   digitalWrite(LED4,LOW);
   delay(180);
   digitalWrite(LED3,HIGH);
   delay(180);

   digitalWrite(LED3,LOW);
   delay(180);

   digitalWrite(LED4,HIGH);
   delay(180);
  
   digitalWrite(LED4,LOW);
   delay(180);
 
Son düzenleme:
Bu siteyi kullanmak için çerezler gereklidir. Siteyi kullanmaya devam etmek için onları kabul etmelisiniz. Daha fazla bilgi edin…