TA的每日心情 | 开心 2019-6-25 09:54 |
---|
签到天数: 216 天 连续签到: 1 天 [LV.7]常住居民III
|
最近打算用树莓派制作一个可以遥控空调的功能,尝试了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脚控制红外发射管来发送数据。用示波器和原遥控信号对比:
这是用红外接收头接收到的原始遥控信号,
这个是用单片机构建的信号
把两个信号放在一起进行对比
可以看到信号基本上是一致的。所以,打算用树莓派或者直接用单片机制作一个遥控器的话,可以参考这篇经验来制作自己的空调遥控~ |
|