查看: 1527|回复: 0

51单片机构建格力红外遥控数据

[复制链接]
  • TA的每日心情
    开心
    2019-6-25 09:54
  • 签到天数: 216 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2016-10-8 09:00:08 | 显示全部楼层 |阅读模式
    分享到:
    最近打算用树莓派制作一个可以遥控空调的功能,尝试了lirc这个库,但是只能进行数据学习,空调的数据是所有的按键都打包发送的,如果只是需要进行单独的控制还得自己进行数据构建,否则学习到的遥控数据也只能进行那一个单一的操作,就比如说,如果记录了空调遥控的温度+1按键,把记录到的红外数据重新发送出去的话其实只能设定一个温度,而不能一直让空调去增加温度。
    因为空调遥控器发出的数据结构是这样的,就拿格力空调来说:
    它是由 1组起始码+35位数据码+1组连接码+32位数据码和一个结束码组成。
    具体的数据构建参考如下:

    (数据来源:https://blog.csdn.net/yannanxiu/article/details/481...
    根据这篇帖子的解释,来构建遥控器的各组数据。并且,红外遥控是通过方波信号发送的(也就是0和1)
    0的电平宽度为:600us低电平+600us高电平,
    1的电平宽度为:600us低电平+1600us高电平
    起始码电平宽度为:9000us低电平+4500us高电平
    连接码电平宽度为:600us低电平+20000us高电平
    之前我尝试用bash来构建数据,直接操作树莓派的GPIO,但是由于效率问题,sleep没办法达到us甚至ms级都很难达到,所以我最后是用单片机来进行数据构建和发送。
    代码如下:
    #include <stc15f104e.H>#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit IR=P3^4;uchar data1[] = {        //351,1,1,                //模式1,                //开关0,0,                //风速1,                //扫风0,                //睡眠0,0,0,0,        //温度0,0,0,0,        //定时数据0,0,0,0,0,                //加湿0,                //灯光0,                //负离子0,                //节电0,                //换气0,0,0,1,0,1,0,0,1,0};uchar data2[] = {        //320,                //上下扫风0,0,0,0,                //左右扫风0,0,0,1,0,                //温度显示0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,                //节能0,0,1,0,1                //校验};void Delayus(int t)                //@11.0592MHz{        unsigned char i, j;        while(t--){                _nop_();                _nop_();                i = 2;                j = 15;                do                {                        while (--j);                } while (--i);        }}void Delayms(int t)                //@11.0592MHz{        unsigned char i, j, k;        while(t--)        {        _nop_();        _nop_();        i = 5;        j = 52;        k = 195;        do        {                do                {                        while (--k);                } while (--j);        } while (--i);        }}void Hdata(){                //1        IR=0;        Delayus(6);        IR=1;        Delayus(16);}void Ldata(){                //0        IR=0;        Delayus(6);        IR=1;        Delayus(6);}void Sdata(){                //起始码        IR=0;        Delayus(90);        IR=1;        Delayus(45);}void Cdata(){                //连接码        IR=0;        Delayus(6);        IR=1;        Delayus(200);}void Edata(){                //结束码        IR=0;        Delayus(6);        IR=1;        Delayus(400);}void mkdata(){                //数据构建        uchar i;        Sdata();        for(i=0;i<35;i++)        {                if (data1 == 1) Hdata();                else Ldata();        }        Cdata();        for(i=0;i<32;i++)        {                if (data2 == 1) Hdata();                else Ldata();        }        Edata();}void main(){        IR=1;        while(1)        {                mkdata();                Delayms(20);        }}这里我使用的是STC15F104单片机,用单片机的P34脚控制红外发射管来发送数据。用示波器和原遥控信号对比:

    这是用红外接收头接收到的原始遥控信号,

    这个是用单片机构建的信号
    把两个信号放在一起进行对比

    可以看到信号基本上是一致的。所以,打算用树莓派或者直接用单片机制作一个遥控器的话,可以参考这篇经验来制作自己的空调遥控~
    回复

    使用道具 举报

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

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-4-19 14:07 , Processed in 0.118330 second(s), 18 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.