极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 72575|回复: 24

红外线 遥控 空调 测试成功

[复制链接]
发表于 2013-6-30 12:44:27 | 显示全部楼层 |阅读模式
本帖最后由 blueleafxp 于 2013-6-30 12:48 编辑

参考了群里的很多文章以及网络上关于红外线的文章,也买了帖子里的那个逻辑调试仪
35块非常非常实惠,如果大家有兴趣在这方面有深入研究的这个是必须的
http://www.geek-workshop.com/forum.php?mod=viewthread&tid=5095&page=1&extra=#pid37445
http://www.geek-workshop.com/forum.php?mod=viewthread&tid=3444

当然,小白如果没兴趣弄那么高深的东西接下去我会教你们如何用arduino iremote现有的库完成
对家里的空调 进行控制

关于红外遥控器的文章很多,我不多叙述了,这里要说的就是空调的遥控器的发射和普通电视不太一样
码会非常长,所以iremote库内的函数无法支持(不是说写的有什么核心问题就是数据位的问题)
其实懂了之后很简单,但是这个问题我也研究了好几天,昨天用逻辑仪分析出结果控制成功,但是这个不适合小白
所以我今天进一步改进了原有的iremote 库的一些参数设置,让小白可以顺利的控制自己家的空调及其他非标设备

第一步 源代码的修改
1  你要找到如下三个文件 IRremote.ccp IRremote.h IRremoteInt.h ,在 arduino 安装目录下的libraries\arduino_iremote_master
也就是你的库文件,如果没有请参考帖子下载

2 修改IRremote.h
1)#define RAWBUF 270 // Length of raw duration buffer

// Marks tend to be 100us too long, and spaces 100us too short
// when received due to sensor lag.

这个默认值是100,因为我们接收的数据会超过100,所以在这里改成270,当然你也可以根据需要继续扩大

3 修改IRremoteInt.h
1)#define _GAP 50000 // Minimum map between transmissions

默认的数据是5000,因为遥控器会连续发两段代码,所以5000这个参数不适用,需要改到50000,否则你只能
接受到前一段代码仍然无法控制你家的空调

2)// information for the interrupt handler
typedef struct {
  uint8_t recvpin;           // pin for IR data from detector
  uint8_t rcvstate;          // state machine
  uint8_t blinkflag;         // TRUE to enable blinking of pin 13 on IR processing
  unsigned int timer;     // state timer, counts 50uS ticks.
  unsigned int rawbuf[RAWBUF]; // raw data
// uint8_t rawlen;         // counter of entries in rawbuf
int rawlen;
}
irparams_t;

这段代码我们要修改的 rawlen的定义,在默认库中这个数据被定义为uint8 也就是 一个字节的整数,最大只能到255
所以我们将此参数改成int

第二部 dump 空调的代码
在你的第一部完成之后,我们可以开始dump空调代码了,
1 连线  按照我贴的连接的教程连接好你的红外接收器 ,一般 最左侧的是数据线然后是gnd 和vcc
2 在arduino 中调出IRecvDump 的例程序,可以通过 FILE->EXAMPLES->Arduino_IRremote_master 下找到
3 编译和下载
4 打开com口监控 Tools->Serial Monitor
5 使用你家的空调遥控器对着接收头按一下开关键
6 这个时候串口会跳出你家空调开关的代码
“Raw (264): 13306 3500 -1700 450 -1250 500 -400 450。。。。”

请记住第一个 13306 不是代码头,你需要把这个放到你的数据的最后也就是说你的发送代码是

Raw (264):  3500 -1700 450 -1250 500 -400 450 。。。。。。。13306“

第三部发送你的代码
请注意,由于电路的问题,你的红外发射器可能只能在很短的距离内控制家电,如果要增强效果请增加三极管放大电路
我这里不写放大的那部分,因为不是本文的核心
1  连接好线路 (此时你可以把你的红外 led 连接到你的arduino了)
这个非常简单,如果不用考虑设备电流以及其他问题,可以直接把pin 3 接到红外发射头的 正级(小的那块)
负极 是一个像旗子的一个东西,接地

2 把你接受的数据 放入程序,也就是unsigned int rawCodes_ac_close[264]这个数组【】内的数字根据你接受的数据大小来调整


  1. /*
  2. * IRremote: IRrecvDump - dump details of IR codes with IRrecv
  3. * An IR detector/demodulator must be connected to the input RECV_PIN.
  4. * Version 0.1 July, 2009
  5. * Copyright 2009 Ken Shirriff
  6. * http://arcfn.com
  7. * JVC and Panasonic protocol added by Kristian Lauszus (Thanks to zenwheel and other people at the original blog post)
  8. */

  9. #include <IRremote.h>
  10. int RECV_PIN = 11;//定义红外接收器的引脚为11
  11. //unsigned int rawCodes_ac_close[264]={3288,1591,432,1186,432,372,444,383,433,375,443,1184,434,382,434,383,433,384,433,383,433,1187,432,382,433,1186,432,1185,432,382,434,1186,431,1187,432,1186,432,1186,432,1186,432,383,433,1185,432,383,434,383,433,1186,432,383,433,383,433,383,433,384,433,1186,432,1186,432,1186,432,1186,432,383,433,383,433,383,433,384,433,384,433,384,433,383,433,383,433,383,433,383,433,383,433,384,433,384,432,384,432,383,433,383,432,384,432,385,432,385,432,384,432,384,432,385,432,384,432,384,432,384,432,1187,431,384,433,384,432,1187,431,1186,431,1186,431,384,433,27841,3287,1590,432,1186,431,384,434,383,433,383,433,1185,434,375,441,383,433,383,434,383,432,1186,433,382,433,1187,431,1186,432,383,433,1187,431,1186,432,1186,431,1186,432,1186,432,382,432,1187,431,383,433,384,433,1187,432,383,434,383,433,384,433,384,433,384,433,384,433,384,433,384,433,1186,432,1186,431,1187,431,1186,432,383,433,384,433,382,433,1186,430,1188,431,384,433,383,433,384,432,384,432,385,432,384,433,384,432,384,432,384,432,384,432,384,432,385,431,384,432,384,432,385,432,384,432,1188,431,383,433,384,432,1187,431,384,432,384,433,384,432,27841};

  12. //unsigned int rawCodes_ac_close[264]={3448,1668,453,1244,453,390,466,402,454,393,464,1242,455,400,455,401,454,402,454,402,454,1244,453,401,454,1244,453,1243,453,401,455,1243,452,1244,453,1243,453,1243,453,1243,453,402,454,1243,453,402,455,401,454,1244,453,401,454,402,454,401,454,402,454,1244,453,1244,453,1244,453,1243,453,401,454,402,454,402,454,403,454,402,454,402,454,402,454,402,454,402,454,402,454,402,454,402,454,403,453,402,453,402,454,402,453,403,453,403,452,403,453,403,453,402,453,403,453,403,453,403,453,403,453,1245,452,402,454,402,452,1245,452,1244,452,1244,452,402,454,29191,3446,1668,453,1244,452,402,455,402,454,402,454,1242,455,394,462,401,454,402,455,402,453,1244,454,401,454,1244,452,1244,453,401,454,1244,452,1243,453,1243,452,1244,453,1243,453,401,453,1245,452,402,454,402,454,1244,452,401,455,402,454,402,454,402,454,402,454,402,454,402,454,403,454,1244,453,1244,452,1245,452,1244,453,402,454,402,454,401,454,1244,451,1245,452,402,454,402,454,403,453,403,453,403,453,403,454,403,453,403,453,402,453,403,453,403,453,403,452,403,453,403,453,403,453,403,453,1245,452,402,454,402,453,1245,452,403,453,402,454,402,453,29191};

  13. unsigned int rawCodes_ac_close[264]={3500,1700,450,1250,500,400,450,400,450,450,450,1250,450,400,500,350,500,400,450,400,500,1250,450,400,500,1250,450,1250,450,400,500,1250,450,1300,450,1250,450,1300,450,1250,450,400,500,1250,450,400,450,400,500,1250,450,400,500,400,450,400,450,450,450,1250,450,1300,450,1250,450,1250,500,400,450,400,450,400,500,400,450,400,500,400,450,400,450,450,450,400,450,400,500,400,450,400,450,400,500,400,450,400,450,450,450,400,450,400,500,400,450,400,450,450,450,400,450,400,500,400,450,400,450,1300,450,400,450,400,500,1250,450,1250,450,1300,450,400,450,29650,3500,1700,450,1300,450,400,450,400,500,400,450,1250,500,400,450,400,450,400,500,400,450,1250,500,400,450,1250,450,1300,450,400,450,1250,500,1250,450,1250,500,1250,450,1250,500,400,450,1250,450,400,500,400,450,1250,500,400,450,400,450,450,450,400,450,400,500,400,450,400,450,400,500,1250,450,1250,500,1250,450,1250,500,400,450,400,450,400,500,1250,450,1250,500,400,450,400,450,450,450,400,450,400,500,350,500,400,450,450,450,400,450,400,450,450,450,400,450,400,500,400,450,400,450,450,450,1250,450,400,500,400,450,1250,450,400,500,400,450,400,500,13306};
  14. //上面改成你接受到的数据,请注意把接受到的第一个数据放到最后

  15. IRrecv irrecv(RECV_PIN);

  16. decode_results results;

  17. IRsend  irsend;

  18. //test

  19. void setup()
  20. {
  21.   Serial.begin(9600);
  22. irrecv.enableIRIn(); // 初始化红外接收器
  23. }


  24. void dump(decode_results *results) {
  25.   int count = results->rawlen;
  26.   if (results->decode_type == UNKNOWN) {
  27.     Serial.print("Unknown encoding: ");
  28.   }
  29.   else if (results->decode_type == NEC) {
  30.     Serial.print("Decoded NEC: ");
  31.   }
  32.   else if (results->decode_type == SONY) {
  33.     Serial.print("Decoded SONY: ");
  34.   }
  35.   else if (results->decode_type == RC5) {
  36.     Serial.print("Decoded RC5: ");
  37.   }
  38.   else if (results->decode_type == RC6) {
  39.     Serial.print("Decoded RC6: ");
  40.   }
  41.   else if (results->decode_type == PANASONIC) {       
  42.     Serial.print("Decoded PANASONIC - Address: ");
  43.     Serial.print(results->panasonicAddress,HEX);
  44.     Serial.print(" Value: ");
  45.   }
  46.   else if (results->decode_type == JVC) {
  47.      Serial.print("Decoded JVC: ");
  48.   }
  49.   Serial.print(results->value, HEX);
  50.   Serial.print(" (");
  51.   Serial.print(results->bits, DEC);
  52.   Serial.println(" bits)");
  53.   Serial.print("Raw (");
  54.   Serial.print(count, DEC);
  55.   Serial.print("): ");

  56.   for (int i = 0; i < count; i++) {
  57.     if ((i % 2) == 1) {
  58.       Serial.print(results->rawbuf[i]*USECPERTICK, DEC);
  59.     }
  60.     else {
  61.       Serial.print(-(int)results->rawbuf[i]*USECPERTICK, DEC);
  62.     }
  63.     Serial.print(" ");
  64.   }
  65.   Serial.println("");
  66. }


  67. void loop() {
  68.   irsend.sendRaw(rawCodes_ac_close,264, 40);
  69.   delay(5);
  70.   // irsend.sendRaw(rawCodes_ac_close,264, 40);

  71.   if (irrecv.decode(&results)) {
  72.     Serial.println(results.value, HEX);
  73.     dump(&results);
  74. //    irsend.mark(560);
  75.   //    irsend.space(560);
  76.   //    irsend.mark(2000);
  77.    //   irsend.space(560);
  78.    //rsend.sendRaw(rawCodes_ac_close,6, 32);
  79.     irrecv.resume(); // Receive the next value
  80.   }
  81.    delay(5000);
  82. }
复制代码


好了,编译下载,通电,用led 对准你家的空调就可以了















评分

参与人数 1 +1 收起 理由
幻生幻灭 + 1 赞一个! 感谢分享

查看全部评分

回复

使用道具 举报

发表于 2013-6-30 13:48:39 | 显示全部楼层
又学习了,最近正在用 电视机的 红外遥控板 控制一个小车,不过,还没有把 电视机 的遥控器解码出来。
回复 支持 反对

使用道具 举报

发表于 2013-6-30 19:39:30 | 显示全部楼层
好东西啊,要试一试
回复 支持 反对

使用道具 举报

发表于 2013-6-30 20:30:19 | 显示全部楼层
又学一招!支持分享!
回复 支持 反对

使用道具 举报

发表于 2013-7-1 13:42:23 | 显示全部楼层
感谢分享 !
回复 支持 反对

使用道具 举报

发表于 2013-7-2 01:32:03 | 显示全部楼层
控制空调主要是学习起来比较麻烦,空调都是组合键,不同状态下,按相同的键,出来的数据都不同的。另外国产空调比较容易控制一些。小日本的空调,比较难弄,只有用RAW的方式。
回复 支持 反对

使用道具 举报

发表于 2013-7-2 16:30:12 | 显示全部楼层
留下来,以后有用得着的地方
回复 支持 反对

使用道具 举报

发表于 2013-7-10 16:24:21 | 显示全部楼层
必顺顶一下.
回复 支持 反对

使用道具 举报

发表于 2013-7-15 00:25:59 | 显示全部楼层
为何要把第一个编码放到最后?是什么原理?
回复 支持 反对

使用道具 举报

发表于 2013-7-31 14:01:23 | 显示全部楼层
这个方法我试了三菱电机 没反应。。。。。。。
回复 支持 反对

使用道具 举报

发表于 2013-8-2 16:36:06 | 显示全部楼层
为何要把第一个编码放到最后?是什么原理?
回复 支持 反对

使用道具 举报

发表于 2013-8-17 10:21:06 | 显示全部楼层
我用这个方法试了也没反应。
可能是这样dump的代码不正确。还是需要逻辑分析仪啊
回复 支持 反对

使用道具 举报

发表于 2013-8-31 22:42:13 | 显示全部楼层
有TCL 和 海尔的空调调试方法不,我用这两个遥控器对着空调没有反应的~~
回复 支持 反对

使用道具 举报

发表于 2013-9-14 09:58:29 | 显示全部楼层
我怎么接收不了,串口打印不出来
回复 支持 反对

使用道具 举报

发表于 2013-12-31 10:24:24 | 显示全部楼层
感谢高手!我先测试时红外发射管坏,更换后昨天测试成功!这个对我很重要,顶!
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-5-6 16:02 , Processed in 0.043483 second(s), 32 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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