查看: 108156|回复: 194

使用IRremote库红外遥控家里的电器

  [复制链接]
  • TA的每日心情
    郁闷
    2018-12-6 22:21
  • 签到天数: 48 天

    [LV.5]常住居民I

    发表于 2013-8-4 14:41 | 显示全部楼层 |阅读模式
    最近众筹网站上出现了不少所谓的智能家居控制器,其核心功能大概有二。
    一是,控制电源通断,说白了就是arduino控制继电器,这个大家都会;
    二是,收录家里各电器的遥控器的红外信号,然后控制电器。
    本帖就是教大家做一个Arduino万能遥控器(希望卖万能遥控器、红外智能家居的朋友不要恨我...)

    这篇文章收录《Arduino程序设计基础》中(当然书里面是写的很严肃的,细节也比这个帖子更详细),希望经常看我教程的坛友,能买本书支持一下
    这里我们就讲讲这个红外信号收录的功能。
    这里我们要用到Arduino的IRremote 库,其下载地址如下:
    https://github.com/shirriff/Arduino-IRremote

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


           下面正式开始了,本帖中我将以自己的屌丝空调为例。(补充下空调是长虹的1999元的空调,具体啥型号忘了)
    和其他红外遥控项目一样,我们需要先解码遥控器,去年我用遥控器解码发送,老是不成功,一直没找到原因,不过最近在IRremote 库作者的blog上,我看到了这么一句话:

    网友指出编码位数

    网友指出编码位数

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

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

    kittenblock中小学创客名师推荐的图形化编程软件

    #define RAWBUF 100 // Length of raw duration buffer

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


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

    kittenblock中小学创客名师推荐的图形化编程软件

    
    // 奈何哥哥教你推倒Arduino-红外遥控~
    #include <IRremote.h>
    
    int RECV_PIN = 11;
    
    IRrecv irrecv(RECV_PIN);
    
    decode_results results;
    
    void setup()
    {
      Serial.begin(9600);
      irrecv.enableIRIn(); 
    }
    
    void dump(decode_results *results) {
      int count = results->rawlen;
      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)) {
        dump(&results);
        irrecv.resume(); 
      }
    }
    


    下载该程序到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,实际是红外信号的高低电平持续时间,如果你疯狂的按了很多次案件,你会发现,编码的第一位是一个不定值。这是一个无关紧要的值,可以直接去除,然后我们可以把这段编码复制到记事本,然后除去其中的减号,并把空格替换成逗号。最后用一个数组保存这段编码数据。如下:


    kittenblock中小学创客名师推荐的图形化编程软件

    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
    };


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

    kittenblock中小学创客名师推荐的图形化编程软件

    
    //奈何哥哥和你一起逆袭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() {
      irsend.sendRaw(buf,243,38);
      delay(3000);
    }
    
    


    是的,发送就是使用sendRaw()这个函数。其中三个参数分别是 数组名,数组长度,红外信号频率
    我们使用的大部分红外遥控信号频率都是38K,所以这个参数填个38就行~
    编译并下载
    现在把红外发射头对着关闭的空调,就可以打开空调啦。
    在这个超级超级超级超级热的夏日~吹着空调写着程序真是享受。{:soso__11535258577994767683_5:}

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

    现在你可以自己尝试做个万能遥控器了,先记录按键编码,再发送编码。更可以结合wifi、蓝牙等模块,做出此类家庭家居控制器系统。
    如果以上内容对你有帮助,你可以通过打赏支持作者
  • TA的每日心情
    开心
    2015-5-16 14:53
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2015-5-14 21:55 | 显示全部楼层
    请问奈何版主,我的空调是格力的空调,dump出来只有255,但是通过分析仪出来的数据是280位,后来我把IRremote.h里的255改成300后,dump出来的数据也是280位了和分析仪出采集出来的数据也是280位,对比后发现每位的数据都差不多,但是做成发送红外时,格力空调就没反应。之前拿老款的美的来测,可以成功开机,美的的是200位。请问是不是最大只支持255位发送?有没有办法可以让格力空调也实现开机的红外?

    该用户从未签到

    发表于 2013-8-21 22:22 | 显示全部楼层
    我在想你为什么接收到时候还要-和空格呢,自己没有-,用,隔开,就不需要接下来的替换操作了

    该用户从未签到

    发表于 2013-9-25 15:28 | 显示全部楼层
    请问下。为什么要把负号删除呢。

    点评

    已经回复  发表于 2014-11-11 23:02
    改一下问法吧,程序中(i % 2) == 1条件判断之后人为的加了一个负号,为什么要这样做那?  发表于 2013-12-18 11:23
    同问,为什么要删除负号  发表于 2013-12-18 11:20

    该用户从未签到

    发表于 2013-8-4 23:29 | 显示全部楼层
    刚好想做这个,学习了

    该用户从未签到

    发表于 2013-8-5 00:59 | 显示全部楼层

    该用户从未签到

    发表于 2013-8-5 15:59 | 显示全部楼层
    好了,现在我们再编译

    复制这个RAW code 到记事本,把第一个数字放到最后,然后用查找替换删掉横杠:“-”,剩下的数字就是真正的RAW code,通过sendRAW函数发送这个RAW code,滴,我们的高富帅空调打开了。

    点评

    记事本不能替换空格,要用word把空格替换成逗号,做成数组  详情 回复 发表于 2013-8-5 16:34
  • TA的每日心情
    郁闷
    2018-12-6 22:21
  • 签到天数: 48 天

    [LV.5]常住居民I

     楼主| 发表于 2013-8-5 16:34 | 显示全部楼层
    疯子。 发表于 2013-8-5 15:59
    好了,现在我们再编译

    复制这个RAW code 到记事本,把第一个数字放到最后,然后用查找替换删掉横杠:“-” ...

    记事本不能替换空格,要用word把空格替换成逗号,做成数组
    如果以上内容对你有帮助,你可以通过打赏支持作者

    该用户从未签到

    发表于 2013-8-5 18:39 | 显示全部楼层
    奈何col 发表于 2013-8-5 16:34
    记事本不能替换空格,要用word把空格替换成逗号,做成数组

    对哦,忘了一步。

    记事本可以替换空格的亲~~

    点评

    试了下,果然可以~~~搞错了,原来是不能搜索空格  详情 回复 发表于 2013-8-5 19:48
  • TA的每日心情
    郁闷
    2018-12-6 22:21
  • 签到天数: 48 天

    [LV.5]常住居民I

     楼主| 发表于 2013-8-5 19:48 | 显示全部楼层
    疯子。 发表于 2013-8-5 18:39
    对哦,忘了一步。

    记事本可以替换空格的亲~~

    试了下,果然可以~~~搞错了,原来是不能搜索空格
    如果以上内容对你有帮助,你可以通过打赏支持作者
  • TA的每日心情
    慵懒
    2018-10-18 14:34
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2013-8-5 22:40 | 显示全部楼层
    不错不错~~很厉害啊~

    该用户从未签到

    发表于 2013-8-5 22:43 | 显示全部楼层
    哇!原来逻辑分析仪之类的不用也能搞到事,我也要试下,不过,没有空调,电扇也不带遥控怎么办?

    该用户从未签到

    发表于 2013-8-5 22:51 | 显示全部楼层
    好东西啊
    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表