极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 15521|回复: 8

【求问】发送NEC红外为什么不能识别?

[复制链接]
发表于 2014-6-18 23:00:29 | 显示全部楼层 |阅读模式
想法是:想通过接收空调遥控器信号,进行解析,再发送同样的信号达到控制的目的。
已经做到了接受遥控器信号,使用IRdump程序,可以获得一个C3E10000的NEC编码,之后进行发送验证,两块Arduino开发板,一个发送,一个接收,但是我在使用发射模块 irsend.sendNEC(0xC3E10000,32) 发射信号,接收器使用IRdump程序接收,COM口观察却是 unkown类型……
这个问题困扰好久了……还望大家指教!
贴上使用的代码和结果图片。
接收部分:
[pre lang="arduino" line="1" file="IRDump"]/*
* IRremote: IRrecvDump - dump details of IR codes with IRrecv
* An IR detector/demodulator must be connected to the input RECV_PIN.
* Version 0.1 July, 2009
* Copyright 2009 Ken Shirriff
* http://arcfn.com
* JVC and Panasonic protocol added by Kristian Lauszus (Thanks to zenwheel and other people at the original blog post)
*/

#include <IRremote.h>

int RECV_PIN = 11;

IRrecv irrecv(RECV_PIN);

decode_results results;

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

// Dumps out the decode_results structure.
// Call this after IRrecv::decode()
// void * to work around compiler issue
//void dump(void *v) {
//  decode_results *results = (decode_results *)v
void dump(decode_results *results) {
  int count = results->rawlen;
  if (results->decode_type == UNKNOWN) {
    Serial.print("Unknown encoding: ");
  }
  else if (results->decode_type == NEC) {
    Serial.print("Decoded NEC: ");
  }
  else if (results->decode_type == SONY) {
    Serial.print("Decoded SONY: ");
  }
  else if (results->decode_type == RC5) {
    Serial.print("Decoded RC5: ");
  }
  else if (results->decode_type == RC6) {
    Serial.print("Decoded RC6: ");
  }
  else if (results->decode_type == PANASONIC) {       
    Serial.print("Decoded PANASONIC - Address: ");
    Serial.print(results->panasonicAddress,HEX);
    Serial.print(" Value: ");
  }
  else if (results->decode_type == JVC) {
     Serial.print("Decoded JVC: ");
  }
  Serial.print(results->value, HEX);
  Serial.print(" (");
  Serial.print(results->bits, DEC);
  Serial.println(" bits)");
  Serial.print("Raw (");
  Serial.print(count, DEC);
  Serial.print("): ");

  for (int i = 0; i < count; i++) {
    if ((i % 2) == 1) {
      Serial.print(results->rawbuf*USECPERTICK, DEC);
    }
    else {
      Serial.print(-(int)results->rawbuf*USECPERTICK, DEC);
    }
    Serial.print(" ");
  }
  Serial.println("");
}


void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    dump(&results);
    irrecv.resume(); // Receive the next value
  }
}[/code]

发送部分:
[pre lang="arduino" line="1" file="send"]//圣源电子制作网:www.syyyd.com
//淘宝:http://syyyd.taobao.com
//红外遥控测试程序  发射端
// 红外发射模块接=3
#include <IRremote.h>                  // 引用 IRRemote 函式库

IRsend irsend;                          // 定义 IRsend 物件来发射红外线讯号

void setup()
{
  pinMode(3, OUTPUT);      
  digitalWrite(3, HIGH);   // 点亮红外发射测试(可以用手机摄像查看是不是有工作)
  delay(3000);             // 等待3秒
  digitalWrite(3, LOW);    // 结束测试
}

void loop()
{
  Serial.print("SendIR: ");
  int i;
  for(i=0;i<2;i++)
  irsend.sendNEC(0xC3E10000, 32);   // 发射遥控器的红外线编码
  delay(1000);             // 等待1秒  自动循环发射
}
[/code]

下面是COM口的内容,蓝色的是遥控器的信号,可以看到是NEC协议的C3E10000,其他的都是我发射模块发射的sendNEC(0xC3E10000,32)……这是为什么呢?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2014-6-19 11:57:35 | 显示全部楼层
遥控器发出的代码都是很复杂的,收不到的那个Arduino可能是因为发射的代码不正确。。

我用Arduino录制遥控器发出的信号,似乎每次都不太一样。感觉遥控器的红外信号比我想象的要复杂的多。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-6-19 12:15:29 | 显示全部楼层
shihaipeng04 发表于 2014-6-19 11:57
遥控器发出的代码都是很复杂的,收不到的那个Arduino可能是因为发射的代码不正确。。

我用Arduino录制遥 ...

是呀,比想象中复杂得多……这个瓶颈卡了好久了……完全没进展
回复 支持 反对

使用道具 举报

发表于 2014-6-19 13:17:04 | 显示全部楼层
白雪 发表于 2014-6-19 12:15
是呀,比想象中复杂得多……这个瓶颈卡了好久了……完全没进展

如果只是想替代遥控器来控制电器,不需要2个Arduino。。只要提前录制下遥控器的信号,保存到数组里,用控制程序发送就好了。 自发自接收的,必须得知道这些传输的规则,否则好像啥也没有。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-6-19 17:08:12 | 显示全部楼层
shihaipeng04 发表于 2014-6-19 13:17
如果只是想替代遥控器来控制电器,不需要2个Arduino。。只要提前录制下遥控器的信号,保存到数组里,用控 ...

请问如何将收到的红外编码,就是在串口里看到的例如C3E10000保存下来?保存为a=0xC3E10000这样的
回复 支持 反对

使用道具 举报

发表于 2014-6-19 17:34:41 | 显示全部楼层
白雪 发表于 2014-6-19 17:08
请问如何将收到的红外编码,就是在串口里看到的例如C3E10000保存下来?保存为a=0xC3E10000这样的

好像需要是字符串格式吧。。。a="C3E10000"

我自己录的格力的老式遥控器的开机代码,在我家的老空调上实验成功了。


  1. #include <IRremote.h>

  2. IRsend irsend;
  3. unsigned int buf[]=    {
  4.   
  5. 9200,4250,800,400,800,400,850,2300,800,2300,800,400,850,400,800,400,800,400,850,400,800,400,800,400,800,450,750,450,750,500,700,500,700,550,600,600,600,2550,600,600,600,650,550,2550,550,650,600,650,550,650,550,650,600,650,550,700,550,650,600,650,550,650,550,700,550,650,550,650,550,2600,550,650,550,650,600,2550,550,650,550,650,600,650,550,650,550,650,650,650,550,650,550,650,600,2550,550,650,550,700,550,650,550,2600,600,650,550,650,550

  6. };

  7. void setup()
  8. {
  9. }

  10. void loop() {
  11.   irsend.sendRaw(buf,117,38);
  12.   delay(3000);
  13. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2014-6-19 19:02:32 | 显示全部楼层
坛子里有人介绍,空调遥控很复杂,他不尽发射现在你想发射的指令,而且还会顺带发射状态,因此你会觉得琢磨不定。
最好,你认为目前的指令和状态是对的,就把收到的数组纪录后重发就可以了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-6-19 23:12:07 | 显示全部楼层
shihaipeng04 发表于 2014-6-19 17:34
好像需要是字符串格式吧。。。a="C3E10000"

我自己录的格力的老式遥控器的开机代码,在我家的老空调上 ...

嗯,原始数组我也记录下来过,然后用一个板子和发射模块把数组发送出去,但是另一块接收模块上面也是无法解析成NEC协议的相关编码……一直卡在这里。。。
回复 支持 反对

使用道具 举报

发表于 2015-10-6 14:27:06 | 显示全部楼层
shihaipeng04 发表于 2014-6-19 17:34
好像需要是字符串格式吧。。。a="C3E10000"

我自己录的格力的老式遥控器的开机代码,在我家的老空调上 ...

你试的空调遥控器是什么型号的,怎么我的格力不能用,
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-17 18:29 , Processed in 0.038730 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表