所有教程由网友发布,仅供参考,请谨慎采纳。科创不对教程的科学性、准确性、可靠性负责。
转帖:Arduino教程(提高篇)——使用IRremote库红外遥控家里的电器
kc20382013/09/06电子技术 IP:广西
Arduino教程(提高篇)——使用IRremote库红外遥控家里的电器
XXXXXXXXXXXXXXXXXXXXX/XXXXXXXXXXXXXXXXXXml
最近众筹网站上出现了不少所谓的智能家居控制器,其核心功能大概有二。

一是,控制电源通断,说白了就是arduino控制继电器,这个大家都会;

二是,收录家里各电器的遥控器的红外信号,然后控制电器。

本帖就是教大家做一个Arduino万能遥控器(希望卖万能遥控器、红外智能家居的朋友不要恨我...


这篇文章收录在年底出版的《Arduino程序设计基础》中(当然书里面是写的很严肃的,细节也比这个帖子更详细),希望经常看我教程的坛友,等书出版了,希望能买本书支持一下

000.gif

这里我们就讲讲这个红外信号收录的功能。

这里我们要用到ArduinoIRremote 库,其下载地址如下:

XXXXXXXXXXXXXXXXXX/shirriff/Arduino-IRremote


使用到的硬件有:  
Arduino
38K红外接收模块
红外发射模块
、屌丝空调、屌丝专用空调遥控器(也可以是电视或者其他的红外控制的电器)

001.jpg          002.jpg

下面正式开始了,本帖中我将以自己的屌丝空调为例。(
补充下空调是长虹的1999元的空调,具体啥型号忘了)

和其他红外遥控项目一样,我们需要先解码遥控器,去年我用遥控器解码发送,老是不成功,一直没找到原因,不过最近在IRremote 库作者的blog上,我看到了这么一句话:

003.jpg

这位网友的意思,大致是说 大多数空调遥控器编码都是100位以上,甚至200位。


我们再来看看IRremote 库 能接收多少位,在IRremote.h中你可以找到如下语句


#define RAWBUF 100 // Length of raw duration buffer

不给力啊,居然才100位,果断修改成


#define RAWBUF 255


现在我们再使用如下程序获取红外原始编码。


// 奈何哥哥教你推倒Arduino-红外遥控~
#include <IRremote.h>

int RECV_PIN = 11;

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
  XXXXXXXXXgin(9600);
  irrecv.enableIRIn();
}

void dump(decode_results *results) {
  int count = results->rawlen;
  XXXXXXXXXint("Raw (");
  XXXXXXXXXint(count, DEC);
  XXXXXXXXXint("): ");

  for (int i = 0; i < count; i++) {
    if ((i % 2) == 1) {
[size=10][font=宋体]      XXXXXXXXXint(results->rawbuf[i]*USECPERTICK, DEC);[/font][/size]
    }
    else {
[size=10][font=宋体]      XXXXXXXXXint(-(int)results->rawbuf[i]*USECPERTICK, DEC);[/font][/size]
    }
    XXXXXXXXXint(" ");
  }
  XXXXXXXXXintln("");
}


void loop() {
  if (XXXXXXXXXcode(&results)) {
    dump(&results);
    XXXXXXXXXsume();
  }
}

下载该程序到Arduino后,我又用我的屌丝遥控按了按。

串口输出了如下信息:

Raw (244): -23424 8300 -4200 500 -550 550 -1600 550 -1600 550 -500 600 -1550 550 -600 500 -1600 550 -550 550 -1600 550 -1600 550 -1600 550 -500 550 -1650 500 -1650 500 -1650 500 -550 550 -550 550 -550 500 -550 550 -550 550 -550 550 -550 500 -550 550 -550 550 -1600 550 -550 500 -550 550 -550 550 -550 550 -550 500 -550 550 -550 550 -500 550 -1650 500 -550 550 -550 550 -550 550 -1600 550 -550 500 -550 550 -550 550 -550 500 -550 550 -550 550 -550 550 -550 500 -550 550 -550 550 -550 500 -600 500 -550 550 -550 550 -550 500 -600 500 -550 550 -550 550 -550 500 -600 500 -550 550 -550 500 -550 550 -550 550 -550 550 -550 500 -550 550 -550 550 -500 550 -600 500 -550 550 -550 550 -550 500 -550 550 -550 550 -550 550 -550 500 -600 500 -550 550 -550 500 -600 500 -550 550 -550 550 -500 550 -550 550 -550 550 -550 550 -550 500 -550 550 -550 550 -550 550 -550 500 -550 550 -550 550 -550 500 -600 500 -550 550 -500 600 -550 500 -550 550 -550 550 -550 500 -600 500 -550 550 -550 550 -500 550 -550 550 -550 550 -550 550 -550 500 -550 550 -550 550 -550 500 -600 500 -550 550 -1600 550 -1600 550 -1600 550 -1550 600 -550 500 -550 550 -550 550

这一长串就是我的屌丝空调开关键的原始编码,有长度有244,如果你疯狂的按了很多次案件,你会发现,编码的第一位是一个不定值。这是一个无关紧要的值,可以直接去除,然后我们可以把这段编码复制到记事本,然后除去其中的减号,并把空格替换成逗号。最后用一个数组保存这段编码数据。如下:


unsigned int buf[243]=
    {8300,4150,550,600,500,1550,600,1600,500,600,500,1600,550,600,500,1550,600,500,550,1650,500,1600,550,1600,550,550,550,1550,550,1650,500,1650,500,550,550,550,550,550,500,550,550,550,550,550,500,600,500,600,500,550,500,1600,550,550,550,550,550,550,500,550,550,550,550,600,450,600,450,600,550,1600,550,550,500,600,500,550,550,1600,550,550,500,550,550,550,550,550,550,550,500,550,550,550,550,550,500,550,550,550,550,550,550,550,500,550,550,550,500,600,500,550,550,550,550,550,500,600,500,550,550,550,500,600,500,550,550,550,500,600,500,550,550,550,550,550,500,550,550,550,550,550,500,550,550,550,550,550,500,600,500,550,550,550,500,600,500,550,550,550,550,550,500,550,550,550,550,550,550,550,500,550,550,550,550,550,500,550,550,550,550,550,500,550,550,550,550,550,500,600,500,550,550,550,500,600,500,550,550,550,550,550,500,550,550,550,550,550,500,600,500,550,550,550,500,600,500,550,550,550,500,600,500,550,550,550,550,550,500,550,550,1600,550,1600,550,1600,550,1600,550,500,550,550,550,550,550
};

然后我们可以使用如下程序,发送这个编码:

//奈何哥哥和你一起逆袭Arduino~红外控制
#include <IRremote.h>

IRsend irsend;
unsigned int buf[243]=
    {8300,4150,550,600,500,1550,600,1600,500,600,500,1600,550,600,500,1550,600,500,550,1650,500,1600,550,1600,550,550,550,1550,550,1650,500,1650,500,550,550,550,550,550,500,550,550,550,550,550,500,600,500,600,500,550,500,1600,550,550,550,550,550,550,500,550,550,550,550,600,450,600,450,600,550,1600,550,550,500,600,500,550,550,1600,550,550,500,550,550,550,550,550,550,550,500,550,550,550,550,550,500,550,550,550,550,550,550,550,500,550,550,550,500,600,500,550,550,550,550,550,500,600,500,550,550,550,500,600,500,550,550,550,500,600,500,550,550,550,550,550,500,550,550,550,550,550,500,550,550,550,550,550,500,600,500,550,550,550,500,600,500,550,550,550,550,550,500,550,550,550,550,550,550,550,500,550,550,550,550,550,500,550,550,550,550,550,500,550,550,550,550,550,500,600,500,550,550,550,500,600,500,550,550,550,550,550,500,550,550,550,550,550,500,600,500,550,550,550,500,600,500,550,550,550,500,600,500,550,550,550,550,550,500,550,550,1600,550,1600,550,1600,550,1600,550,500,550,550,550,550,550
};

void setup()
{
}

void loop() {
  XXXXXXXXXndRaw(buf,243,38);
  delay(3000);
}
是的,发送就是使用
sendRaw()
这个函数。其中三个参数分别是
数组名,数组长度,红外信号频率

我们使用的大部分红外遥控信号频率都是38K,所以这个参数填个38就行~

编译并下载

现在把红外发射头对着关闭的空调,就可以打开空调啦。



在这个超级超级超级超级热的夏日~吹着空调写着程序真是享受。 004.jpg


最后,需要注意的是,虽然是开关键,但实际打开和关闭,是两个编码,这里的编码是开空调的编码。空调的调温按钮,通常每一个温度都对应了一个按键编码,因此如果你要调温,就要使用之前的程序,把各个温度对应的编码都记录下来。


现在你可以自己尝试做个万能遥控器了,先记录按键编码,再发送编码。更可以结合wifi、蓝牙等模块,做出此类家庭家居控制器系统。


好了,现在我们再编译


复制这个RAW code 到记事本,
(
记事本不能搜索空格
,要用word把空格替换成逗号,做成数组
)
把第一个数字放到最后,然后用查找替换删掉横杠:-,剩下的数字就是真正的RAW code,通过sendRAW函数发送这个RAW code,滴,我们的高富帅空调打开了。
+100  科创币    虎哥    2013/09/10 辛苦了
来自:电子信息 / 电子技术严肃内容:教程/课程
2
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
发呆
10年9个月前 IP:未同步
566100
不错哈,不懂编程能路过吗
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
dome
8年10个月前 IP:江西
779694
楼主技术贴,赞!
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
所属分类
上级专业
同级专业
kc2038
学者 机友 笔友
文章
37
回复
268
学术分
1
2009/01/06注册,5年8个月前活动
暂无简介
主体类型:个人
所属领域:无
认证方式:手机号
IP归属地:未同步
文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
支持的图片格式:jpg, jpeg, png
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}