2014-03-30 97 views
0

發送原始紅外數據以下是我的代碼來讀取Arduino的原始IR數據:如何正確地接收和Arduino的

#define sprint Serial.print 
#define sprintln Serial.println 
#include <IRremote.h> 

#define IR_RCVR_PIN 11 
IRrecv ir_receiver(IR_RCVR_PIN); 
decode_results results; 

void setup() { 
    Serial.begin(9600); 
    ir_receiver.enableIRIn(); // Start the receiver 
} 

void loop() { 
    if (ir_receiver.decode(&results)) { 
    dump(&results); 
    ir_receiver.resume(); // Receive the next value 
    } 
} 

int c = 1; 

void dump(decode_results *results) { 
    int count = results->rawlen; 
    sprintln(c); 
    c++; 
    sprintln("For IR Scope: "); 
    for (int i = 1; i < count; i++) { 
     sprint("0x"); 
     sprint((unsigned int)results->rawbuf[i], HEX); 
    sprint(" "); 
    } 

    sprintln(""); 
    sprintln("For Arduino sketch: "); 
    sprint("unsigned int raw["); 
    sprint(count, DEC); 
    sprint("] = {"); 
    for (int i = 1; i < count; i++) { 
     sprint("0x"); 
     sprint((unsigned int)results->rawbuf[i], HEX); 
     sprint(","); 
    } 
    sprint("};"); 
    sprintln(""); 
    sprint("irsend.sendRaw(raw,"); 
    sprint(count, DEC); 
    sprint(",38);"); 
    sprintln(""); 
    sprintln(""); 
} 

使用,我可以從遙控器得到這樣的:

1 
For IR Scope: 
0x47 0x1F 0xB 0x17 0xA 0x17 0xB 0x6 0xA 0x6 0xB 0x6 0xA 0x17 0xB 0x6 0xA 0x6 0xB 0x17  
0xA 0x17 0xA 0x7 0xA 0x17 0xA 0x7 0xA 0x6 0xB 0x17 0xA 0x17 0xA 0x6 0xB 0x17 0xA 0x17  
0xB 0x6 0xA 0x6 0xB 0x17 0xA 0x6 0xB 0x6 0xA 0x17 0xB 0x6 0xA 0x6 0xB 0x6 0xA 0x7 0xA  
0x6 0xB 0x6 0xA 0x6 0xB 0x6 0xA 0x7 0xA 0x6 0xB 0x6 0xA 0x7 0xA 0x6 0xB 0x6 0xA 0x6 0xB  
0x6 0xA 0x7 0xA 0x6 0xB 0x6 0xA 0x6 0xB 0x17 0xA 0x6 0xB 0x6 0xA 

For Arduino sketch: 

unsigned int raw[100] =  
{0x47,0x1F,0xB,0x17,0xA,0x17,0xB,0x6,0xA,0x6,0xB,0x6,0xA,0x17, 
0xB,0x6,0xA,0x6,0xB,0x17,0xA,0x17,0xA,0x7,0xA,0x17,0xA,0x7,0xA,0x6, 
0xB,0x17,0xA,0x17,0xA,0x6,0xB,0x17,0xA,0x17,0xB,0x6,0xA,0x6,0xB,0x17,0xA, 
0x6,0xB,0x6,0xA,0x17,0xB,0x6,0xA,0x6,0xB,0x6,0xA,0x7,0xA,0x6,0xB,0x6,0xA, 
0x6,0xB,0x6,0xA,0x7,0xA,0x6,0xB,0x6,0xA,0x7,0xA,0x6,0xB,0x6,0xA,0x6,0xB, 
0x6,0xA,0x7,0xA,0x6,0xB,0x6,0xA,0x6,0xB,0x17,0xA,0x6,0xB,0x6,0xA,}; 

所以在發送此數據,我可以使用此指令:

irsend.sendRaw(raw,100,38); 

問題是我無法從我所需要的設備的任何響應控制。我已經檢查過我的紅外發射器,我的讀數與上面相同。

我錯過了什麼?

回答

0

您應該多次讀取信號,然後對其值進行平均以消除很小的偏差誤差。確保您的發射器和接收器使用相同的光波長並以38KHz工作(如果發射器在38KHz進行調製,如果您的發射器爲您調製,則不應使用IRremote)。

此外,你期望什麼作爲「迴應」?通常,IR通信是單向的。

+0

*此外,你期望什麼作爲「迴應」?通常情況下,紅外通信是單向的。*我認爲OP只是表示接收數據(電視機或類似設備)的設備的響應。 OP的電視或其他什麼都不能改變頻道/音量/等等。 –

+0

我的意思是「響應」是設備沒有按照我所使用的代碼命令它,因爲它沒有打開或關閉。謝謝你,我會嘗試你所說的獲得平均水平。 –

0

您已達到RAWBUF的100個字節限制,因此您可能需要增加該數量。嘗試在IRemote.h上升到400

打開和修改這條線(約122#)

#define RAWBUF 100 // Length of raw duration buffer 

到更大的東西

#define RAWBUF 400 // Length of raw duration buffer 

我用三星綁你的代碼空調和我收到116字節

+0

請注意,IRremote庫不能存儲超過255個字節。 這裏解釋 - http://www.analysir.com/blog/2014/03/19/air-conditioners-problems-recording-long-infrared-remote-control-signals-arduino/ – Evgeny

相關問題