美的空调红外遥控解析

关于安卓发射红外信号请看:点击打开链接

一、简单介绍红外基础

1.首先要在App工程的AndroidManifest.xml中补充红外权限配置

<!-- 调用红外设备权限声明 -->
<uses-permission android:name="android.permission.TRANSMIT_IR" />
<!-- Android Market会根据uses-feature过滤所有你设备不支持的应用,即无红外功能的设备看不到此应用 -->
<uses-feature android:name="android.hardware.ConsumerIrManager" />

其次在代码中初始化红外遥控的管理器,注意红外遥控功能从Android4.4之后才开始支持。

红外遥控的管理类名ConsumerIrManager

常用方法如下:

hasIrEmitter : 检查设备是否拥有红外发射器。返回true表示有,返回false表示没有。

getCarrierFrequencies : 获得可用的载波频率范围。

transmit : 发射红外信号。

    第一个参数为信号频率,单位赫兹(Hz),家用电器的红外频率通常使用38000Hz;

    第二个参数为整型数组形式的信号格式。

2.美的的红外采用NEC格式的R05d

    该协议的红外信号编码格式为:引导码+客户码+客户反码+数据码+数据反码+结束位,

    其中引导码和结束码都是固定的,数据反码由数据码按位取反得来,真正变化的只有用户码和数据码。

3.可是前述的transmit方法,参数要传递整型数组形式的信号,并不是二进制数,这意味着二进制数还得转换成整型数组。

那么整型数组里面存放的到底是些什么数据呢?

这就要从数字电路中的电平说起了。电平是“电压平台”的简称,指的是电路中某一点电压的高低状态,在数字电路中常用高电平表示“1”,用低电平表示“0”。

  遥控器发射红外信号之时,通过“560微秒低电平+1680微秒高电平”代表“1”,通过“560微秒低电平+560微秒低电平”代表“0”。于是编写Android代码的时候,使用“560,1680”表示二进制的1,使用“560,560”表示二进制的0。(此处的560和1680只是大概的数值,也可使用580、600替换560,或者使用1600、1650替换1680。)

4.举例

用户码:4055,对应的二进制数:0100 0000 0101 0101;

数据码:44,对应的二进制数为0100 0100,

数据反码:按位取反得到数据反码的二进制数为1011 1011。

根据数字电路的电平规则,用户码4055对应的二进制数为0100 0000 0101 0101,转换成电平信号就变成了“

560,560, 560,1680, 560,560, 560,560,     560,560, 560,560, 560,560, 560,560, 

560,560, 560,1680, 560,560, 560,1680,     560,560, 560,1680, 560,560, 560,1680, ”,

数据码44及其数据反码的电平信号依此类推。

再加上NEC协议固定的引导码“9000,4500”,以及结束码“560,20000”。

具体的数组数值如下所示:

int[] pattern = {

// 开头两个数字表示引导码

9000,4500, 

// 下面两行表示用户码

560,560, 560,1680, 560,560, 560,560,     560,560, 560,560, 560,560, 560,560,

560,560, 560,1680, 560,560, 560,1680,     560,560, 560,1680, 560,560, 560,1680,

// 下面一行表示数据码

560,560, 560,1680, 560,560, 560,560,     560,560, 560,1680, 560,560, 560,560,

// 下面一行表示数据反码

560,1680, 560,560, 560,1680, 560,1680,     560,1680, 560,560, 560,1680, 560,1680,

// 末尾两个数字表示结束码

560,20000 };

接着在App代码中代入上述的信号格式数组,即调用transmit方法传递格式参数,示例如下:

    transmit.transmit(38000, pattern); // 普通家电的红外发射频率一般为38KHz

二、美的协议解析

美的说明书下载:点击打开链接

这里只简单介绍开关机

L为引导码,
S为分隔码,
A为认别码(A=10110010=B2,预留方案时A=10110111=B7),
A'为A的反码,
B'为B的反码,

C'为C的反码

B

C

B7 B6 B5

B4 B3 B2 B1 B0

C7 C6 C5 C4

C3  C2

C1  C0

风  速

(见表1)

 1   1   1   1   1

温  度

(见表2)

模 式   (见表3)

0    0

风 速

B7   B6   B5

温  度

C7    C6    C5    C4

自 动

1    0    1

17℃

0000

低 风

1    0    0

18℃

0001

中 风

0    1    0

19℃

0011

高 风

0    0    1

20℃

0010

固定风

0    0    0

21℃

0110

注:  在抽湿.自动模式及自动模式

下的经济运行,风量应为固定风,即:

B7,B6,B5=000

制冷及制热时的经济运行,风量为自

 动风,即:  B7,B6,B5=101

22℃

0111

23℃

0101

24℃

0100

25℃

1100

26℃

1101

表3(模式)

27℃

1001

28℃

1000

模式

 C3         C2 

29℃

1010

自动

 10 

30℃

1011

制冷

 00 

无定义

1110

抽湿

 01 

注:

 

在只送风模式, C7,C6,C5,C4=1110

制热

 11 

送风

 01 

注:送风和抽湿模式代码一样,但抽 

湿模式有温度代码,而送风模式无。

开机编码:L,A,A',B,B',C,C',  S, L,A,A',B,B',C,C'

/*开机
 * L,A,A',B,B',C,C',  S,  L,A,A',B,B',C,C'
 * L 4.4   4.4
 * A :1011 0010
 * A':0100 1101
 * B :0001 1111 固定風
 * B':0100 0000
 * C :1101 1000 26°自动模式
 * C':1111 0111
 * S :0.54  5.22
 * */

关机编码:(与模式、温度、风速等无关)

L,A,A',B,B',C,C',  S, L,A,A',B,B',C,C',  S, L,A,A',Q,Q',Y,Y'

Q7  Q6  Q5  Q4  Q3  Q2  Q1  Q0

小时时刻

Y7  Y6  Y5  Y4  Y3  Y2  Y1  Y0

分钟时刻

0  0  0  0  0  0  0  0

0

0  0  0  0  0  0  0  0

0

0  0  0  0  0  0  0  1

1

0  0  0  0  0  0  0  1

1

0  0  0  0  0  0  1  0

2

0  0  0  0  0  0  1  0

2

0  0  0  0  0  0  1  1

3

0  0  0  0  0  0  1  1

3

0  0  0  0  0  1  0  0

4

0  0  0  0  0  1  0  0

4

……

……

……

……

0  0  0  1  1  0  0  0

24

0  0  0  1  1  0  0  0

24

 

 

……

……

          

 

0  0  1  1  1  1  0  0

60

/*
 * 关机编码:(与模式、温度、风速等无关)关机编码:(与模式、温度、风速等无关)
 * L,A,A',B,B',C,C',  S,  L,A,A',B,B',C,C',  S, L,A,A',Q,Q',Y,Y'
 * L 4.4   4.4
 * A=1011 0010
 * a=0100 1101
 * B=0111 1011
 * b=1000 0100
 * C=1110 0000
 * c=0001 1111
 * S :0.54  5.22
 * Q:0000 0000-0 0h
 * Y:0000 0000-0 0m
 * */

补充:





三、部分红外编码代码

开机数据:

int zeroLow = 559;
int zeroHigh = 531;
int oneLow = 561;
int oneHigh = 1578;
// 一种交替的载波序列模式,通过毫秒测量,发射红外, pattern要和所用的红外码对应
//先打开1000微秒再关闭500微秒int[] pattern = { 1000,500,1000,1000 };
//脚码偶数 开 奇数 关
//开对应的是示波器上的低电平,关对应的高电平
int[] back = {
        4400,4400,  //L
        //1011 0010 A
        oneLow,oneHigh,zeroLow,zeroHigh,oneLow,oneHigh,oneLow,oneHigh,          zeroLow,zeroHigh,zeroLow,zeroHigh,oneLow,oneHigh,zeroLow,zeroHigh,           //A
        //0100 1101 a
        zeroLow,zeroHigh,oneLow,oneHigh,zeroLow,zeroHigh,zeroLow,zeroHigh,      oneLow,oneHigh,oneLow,oneHigh,zeroLow,zeroHigh,oneLow,oneHigh,         //A'
        //1011 1111 B
        oneLow,oneHigh,zeroLow,zeroHigh,oneLow,oneHigh,oneLow,oneHigh,          oneLow,oneHigh,oneLow,oneHigh,oneLow,oneHigh,oneLow,oneHigh,        //B
        //0100 0000 b
        zeroLow,zeroHigh,oneLow,oneHigh,zeroLow,zeroHigh,zeroLow,zeroHigh,       zeroLow,zeroHigh,zeroLow,zeroHigh,zeroLow,zeroHigh,zeroLow,zeroHigh,            //B'
        //1011 1111 C
        zeroLow,zeroHigh,zeroLow,zeroHigh,zeroLow,zeroHigh,zeroLow,zeroHigh,    oneLow,oneHigh,zeroLow,zeroHigh,zeroLow,zeroHigh,zeroLow,zeroHigh,           //C
        //0100 0000 c
        zeroLow,zeroHigh,oneLow,oneHigh,zeroLow,zeroHigh,zeroLow,zeroHigh,      zeroLow,zeroHigh,zeroLow,zeroHigh,zeroLow,zeroHigh,zeroLow,zeroHigh,//C'
        540,5220,   //S
        4400,4400,  //L
        //1011 0010 A
        oneLow,oneHigh,zeroLow,zeroHigh,oneLow,oneHigh,oneLow,oneHigh,          zeroLow,zeroHigh,zeroLow,zeroHigh,oneLow,oneHigh,zeroLow,zeroHigh,           //A
        //0100 1101 a
        zeroLow,zeroHigh,oneLow,oneHigh,zeroLow,zeroHigh,zeroLow,zeroHigh,      oneLow,oneHigh,oneLow,oneHigh,zeroLow,zeroHigh,oneLow,oneHigh,         //A'
        //1011 1111 B
        oneLow,oneHigh,zeroLow,zeroHigh,oneLow,oneHigh,oneLow,oneHigh,          oneLow,oneHigh,oneLow,oneHigh,oneLow,oneHigh,oneLow,oneHigh,        //B
        //0100 0000 b
        zeroLow,zeroHigh,oneLow,oneHigh,zeroLow,zeroHigh,zeroLow,zeroHigh,       zeroLow,zeroHigh,zeroLow,zeroHigh,zeroLow,zeroHigh,zeroLow,zeroHigh,            //B'
        //1011 1111 C
        zeroLow,zeroHigh,zeroLow,zeroHigh,zeroLow,zeroHigh,zeroLow,zeroHigh,    oneLow,oneHigh,zeroLow,zeroHigh,zeroLow,zeroHigh,zeroLow,zeroHigh,           //C
        //0100 0000 c
        zeroLow,zeroHigh,oneLow,oneHigh,zeroLow,zeroHigh,zeroLow,zeroHigh,      zeroLow,zeroHigh,zeroLow,zeroHigh,zeroLow,zeroHigh,zeroLow,zeroHigh,//C'
        540     //end
};


猜你喜欢

转载自blog.csdn.net/jinmie0193/article/details/80396701