Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
RF remote decoder
30-08-2015, 11:17 AM,
#1
RF remote decoder
Hi everyone,
I would like to share this code which decode RF remote signal
Hope it can help you! Any improvement of the code is well appreciated!!
Code:
/*-----------------------------------------------------
Author:  --<Brikker>
Date: 2015-08-30
Description:
Tested on PInguino2550
Receiver module: Aurel RX-4MM5/F
PIN 0 [INT0] receive RSSI signal throgh a comparator.
PIN 1 [INT1] is polled: 1 = Acq Mode  0 = Normal Mode
For the moment radio-code is stored on array
-----------------------------------------------------*/
#define RSSI            0
#define ACQMODE    1
#define OUTLED0        13
#define OUTLED1        14

/* RF Decode 25 bit */          
int RF_Ch1 [25] = {0,0,1,1,1,1,0,0,1,1,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0};
int RF_Ch2 [25] = {0,0,1,1,1,1,0,0,1,1,0,0,0,0,1,1,0,1,0,0,0,1,0,0,0};
int RF_Data[25];
int RF_Data_Len = 25;
int RF_Middle_Wave_Delay = 600;

/* RF Decode 18 bit */
//int RF_Ch1 [18] = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
//int RF_Ch2 [18] = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0};
//int RF_Data[18];
//int RF_Data_Len = 18;
//int RF_Middle_Wave_Delay = 800;

/* RF Acq Mode */
int RF_Data_Acq[128];
int RF_Data_Acq_Len = 128;
int RF_Acq_Middle_Wave_Delay = 600;

// Vars
int led_handle = 0;
u8 ch1_match = 0;
u8 ch2_match = 0;
u8 RF_Data_Count = 0;
u8 Flag_RF_Data_Available = 0;        
u8 Flag_RF_Data_Busy = 0;
u8 Flag_RF_Data_Timeout = 1;
u8 Flag_RF_Data_Valid = 0;
u8 Flag_RF_Acq_Mode = 0;
u8 Flag_USERLED_busy = 0;
u8 Flag_USERLED_fastblink = 0;
u8 Userled_fastblink_counter = 0;
u8 tickUserled = 0;
u8 i  = 0;
char Char_Key_Pressed = 0;
u8 income_uno = 0;
u8 income_zero = 0;
u8 timeout_1_delay = 2;
u32 millis_timeout_1 = 0;


void TMR3_Tick() {
   //led_handle = (led_handle ^ 1);
   //digitalWrite(USERLED, led_handle);
   
   tickUserled ++;
     
   // Handle USERLED
   if (tickUserled >= 5)
   {
       if (Flag_USERLED_busy == 0)
       {
           led_handle = (led_handle ^ 1);
           digitalWrite(USERLED, led_handle);
           tickUserled = 0;
       }
   }
   
   // Handle Fastblink USERLED  
   if (Flag_USERLED_fastblink == 1) {
       led_handle = (led_handle ^ 1);
       digitalWrite(USERLED, led_handle);
       Userled_fastblink_counter--;
       if (Userled_fastblink_counter == 0) {
           Flag_USERLED_fastblink = 0;
           Flag_USERLED_busy = 0;
       }    
   }
}

void USERLED_fastblink(u8 num_blinks) {
   Userled_fastblink_counter = num_blinks;
   Flag_USERLED_busy = 1;
   Flag_USERLED_fastblink = 1;
}

/*****************************************************************
***
***    RF Details for Aurel TX-SAW [18bit => 16bit tri-state dipswitch and 2bit buttons]:
***    Period: about 2200us    1 = HIGH (1800us), LOW (350us)    |||    0 = HIGH (200us), LOW (2000us)
***    Frame: about 37,5ms [18bit] - about 31ms [25bit]
***    Pause: 13ms[18bit] - 9ms[25bit] between 2 sequential frame
***    Description:
***    Detection of the rising edge then wait for 800us and read pin value
***
******************************************************************/
void RF_IN() {
   if (Flag_RF_Acq_Mode == 0) {
   // Non-Acq Mode
       if (Flag_RF_Data_Timeout == 1) {
           Flag_RF_Data_Timeout = 0;
           RF_Data_Count = 0;
           Flag_RF_Data_Busy = 1;
       }  
       delayMicroseconds (RF_Middle_Wave_Delay);            // Wait to read in the middle of the wave
       income_uno = 0;
       income_zero = 0;
       for (i=0; i<5; i++) {
           if (digitalRead(RSSI)) {
               income_uno++;
           } else {
               income_zero++;
           }
           delayMicroseconds(10);
       }
           if (income_uno>income_zero) {
               RF_Data[RF_Data_Count] = 1;
           } else {
               RF_Data[RF_Data_Count] = 0;
           }          
       if (RF_Data_Count >= (RF_Data_Len-1)) {
           RF_Data_Count = 0;
           Flag_RF_Data_Timeout = 1;
           Flag_RF_Data_Available = 1;
           Flag_RF_Data_Busy = 0;      
       } else {
           Flag_RF_Data_Available = 0;
           RF_Data_Count++;
           millis_timeout_1 =millis();        
       }
   } else {
   // Acq Mode
   if (Char_Key_Pressed != 0) {
       if (Flag_RF_Data_Timeout == 1) {
           Flag_RF_Data_Timeout = 0;
           RF_Data_Count = 0;
           Flag_RF_Data_Busy = 1;
       }  
       delayMicroseconds (RF_Acq_Middle_Wave_Delay);            // Wait to read in the middle of the wave
       income_uno = 0;
       income_zero = 0;
       for (i=0; i<5; i++) {
           if (digitalRead(RSSI)) {
               income_uno++;
           } else {
               income_zero++;
           }
           delayMicroseconds(10);
       }
           if (income_uno>income_zero) {
               RF_Data_Acq[RF_Data_Count] = 1;
               CDC.print ("1");
           } else {
               RF_Data_Acq[RF_Data_Count] = 0;
               CDC.print ("0");
           }          
       if (RF_Data_Count >= (RF_Data_Acq_Len-1)) {
           RF_Data_Count = 0;
           Flag_RF_Data_Timeout = 1;
           Flag_RF_Data_Available = 1;
           Flag_RF_Data_Busy = 0;      
       } else {
           Flag_RF_Data_Available = 0;
           RF_Data_Count++;
           millis_timeout_1 =millis();        
       }    
   }
   }
}

void setup() {

   pinMode(USERLED, OUTPUT);
   pinMode(OUTLED0, OUTPUT);
   pinMode(OUTLED1, OUTPUT);    
   pinMode(RSSI, INPUT);
   pinMode(ACQMODE, INPUT);
   
   digitalWrite(USERLED, HIGH);
   digitalWrite(OUTLED0, LOW);
   digitalWrite(OUTLED1, LOW);
   
   OnChangePin0(RF_IN, INT_RISING_EDGE);
   OnTimer3(TMR3_Tick, INT_MILLISEC, 100);
   _millis = 0;
       

}

void loop() {

   if (digitalRead(ACQMODE) == 1) {
       Flag_RF_Acq_Mode = 1;

       if (Char_Key_Pressed == 0) {
           // Program starts after a serial terminal emulator is open and any key from the keybord is pressed.
           CDC.println("----- Hit any key ------");
           Char_Key_Pressed = CDC.getKey();
           CDC.println("----- Pinguino RF decoder ------");
           Flag_RF_Data_Timeout = 1;
       }
               
   } else {
       Flag_RF_Acq_Mode = 0;
   }

   if ((Flag_RF_Data_Available == 0) && (Flag_RF_Data_Busy == 1)) {
       if ((millis() - millis_timeout_1) > timeout_1_delay) {
           if (Flag_RF_Acq_Mode == 1) {
               CDC.print ("   Bit: ");
               CDC.printNumber (RF_Data_Count, DEC);
               CDC.println("\r\n");
               USERLED_fastblink(5);
           }
           Flag_RF_Data_Busy = 0;
           Flag_RF_Data_Timeout = 1;    
       }
   }
 
   if ((Flag_RF_Data_Available == 1) && (Flag_RF_Data_Busy == 0)) {
           ch1_match = 1;
           ch2_match = 1;
           
           for (i=0; i<RF_Data_Len; i++) {
           
               if (RF_Data[i] == RF_Ch1[i]) {
                   ch1_match &= 1;
               } else {
                   ch1_match &= 0;
               }
           
               if (RF_Data[i] == RF_Ch2[i]) {
                   ch2_match &= 1;
               } else {
                   ch2_match &= 0;
               }
               
           }
                       
           if (ch1_match == 1) {
               //CDC.println ("ch1 received!");
               digitalWrite (OUTLED0, HIGH);
               digitalWrite (OUTLED1, LOW);
               USERLED_fastblink(3);
           }
           if (ch2_match == 1) {
               //CDC.println ("ch2 received!");
               digitalWrite (OUTLED0, LOW);
               digitalWrite (OUTLED1, HIGH);
               USERLED_fastblink(3);
           }

       delay (300);
       Flag_RF_Data_Available = 0;
       digitalWrite (OUTLED0, LOW);
       digitalWrite (OUTLED1, LOW);
   }
   
   if (millis() > 360000) {
       _millis = 0;
   }
}
Thanks,
Brikker


Attached Files
.pde   RF_input_v2.pde (Size: 7.64 KB / Downloads: 3)
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)