格力空调遥控器(YB0F2)红外码组成如下,按解码顺序排列
起始码(S)+35位数据码+连接码(C)+32位数据码
1、各种编码的电平宽度:
数据码由“0”“1”组成:
0的电平宽度为:600us低电平+600us高电平,
1的电平宽度为:600us低电平+1600us高电平
起始码S电平宽度为:9000us低电平+4500us高电平
连接码C电平宽度为:600us低电平+20000us高电平
2、数据码的形成机制
前35位数据码形成如下图所示:
后32位数据码形成如下图所示:
上表中,大于两位的数据都是逆序递增的,各数据的意义如下:
校验码的形成机制如下:
校验码= [(模式– 1) + (温度– 16) + 5 +左右扫风+换气+节能]取二进
制后四位,再逆序;
例如:如果需要设置一下的状态,模式4,30℃,左右扫风,换气关闭,节能关闭,那么校验码为:
(4 – 1)+(30-16)+5+1+0+0 = 15,取低四位为0111,逆序后为1110
注意:为了方便编码,在编码时可以正序,解码端再逆序,解码的时候先解码低字节,再解码高字节的位。
另外定时数据对最后的校验码的影响没有测试,因为很少会用到这个功能。
下面附上格力空调红外指令的拼码程序,使用的是Python语言,温度暂时未完成拼码
#coding=utf-8 startLevel = (9000,4500) #起始码 linkLevel = (550,20000) #连接码 lowLevel = (550,550) #低电平 highLevel = (550,1660) #高电平 #模式标志 modeFlag = 4 def modeCodeFunc(m): global modeFlag modeCode = (lowLevel+lowLevel+lowLevel, #自动 highLevel+lowLevel+lowLevel, #制冷 lowLevel+highLevel+lowLevel, #加湿 highLevel+highLevel+lowLevel,#送风 lowLevel+lowLevel+highLevel) #制热 if m>modeCode.__len__()-1: print "模式参数必须小于" +str(modeCode.__len__()) return modeCode[0] modeFlag = m return modeCode[m] #开关 keyFlag = 0 def keyCodeFunc(k): global keyFlag keyCode = (lowLevel, #关 highLevel) #开 keyFlag = k return keyCode[k] #风速 fanSpeedFlag =0 def fanSpeedCodeFunc(f): global fanSpeedFlag fanSpeedCode = (lowLevel+lowLevel, #自动 highLevel+lowLevel, #一档 lowLevel+highLevel, #二档 highLevel+highLevel) #三档 if f>fanSpeedCode.__len__()-1: print "风速参数必须小于"+str(fanSpeedCode.__len__()) return fanSpeedCode[0] fanSpeedFlag = f return fanSpeedCode[f] #扫风 #fanScanFlag = 0; def fanScanCodeFunc(f): fanScanCode = (lowLevel,highLevel) fanScanFlag = f if f>fanScanCode.__len__()-1: print "扫风参数必须小于"+str(fanScanCode.__len__()) return fanScanCode[0] return fanScanCode[f] def getSleepCode(s): sleepCode = (lowLevel,highLevel) if s>sleepCode.__len__()-1: print "睡眠参数必须小于"+str(sleepCode.__len__()) return sleepCode[0] return sleepCode[s] tempFlag = 16; def tempertureCodeFunc(t): global tempFlag tempFlag = t tempCode = lowLevel+lowLevel+lowLevel+lowLevel return tempCode #定时数据 def getTimerCode(): timerCode = lowLevel+lowLevel+lowLevel+lowLevel+\ lowLevel+lowLevel+lowLevel+lowLevel return timerCode #超强、灯光、健康、干燥、换气 def getOtherCode(strong,light,health,dry,breath ): otherFuncCode = () if True==strong: otherFuncCode = highLevel else: otherFuncCode = lowLevel if True==light: otherFuncCode += highLevel else: otherFuncCode += lowLevel if True==health: otherFuncCode += highLevel else: otherFuncCode += lowLevel if True==dry: otherFuncCode += highLevel else: otherFuncCode += lowLevel if True==breath: otherFuncCode += highLevel else: otherFuncCode += lowLevel return otherFuncCode #前35位结束码后七位结束码 #所有按键都是 #000 1010 def getFirstCodeEnd(): firstCodeEnd = lowLevel+lowLevel+lowLevel+highLevel+lowLevel+highLevel+lowLevel return firstCodeEnd #连接码 def getLinkCode(): linkCode = lowLevel+highLevel+lowLevel+linkLevel return linkCode #上下扫风 fanUpAndDownFlag = 1; fanLeftAndRightFlag = 1; def fanUpAndDownCodeFunc(f): global fanUpAndDownFlag fanUpAndDownCode = (lowLevel+lowLevel+lowLevel+lowLevel, highLevel+lowLevel+lowLevel+lowLevel) fanUpAndDownFlag = f fanScanCodeFunc(fanUpAndDownFlag or fanLeftAndRightFlag) return fanUpAndDownCode[f] #左右扫风 def fanLeftAndRightCodeFunc(f): global fanLeftAndRightFlag fanLeftAndRightCode =(lowLevel+lowLevel+lowLevel+lowLevel, highLevel+lowLevel+lowLevel+lowLevel) fanLeftAndRightFlag = f fanScanCodeFunc(fanUpAndDownFlag or fanLeftAndRightFlag) return fanLeftAndRightCode[f] #0000 #0100 #0000 #0000 #0000 def getOtherFunc2(): otherFunc2 = lowLevel+lowLevel+lowLevel+lowLevel otherFunc2 += lowLevel+highLevel+lowLevel+lowLevel otherFunc2+= lowLevel+lowLevel+lowLevel+lowLevel+\ lowLevel+lowLevel+lowLevel+lowLevel+\ lowLevel+lowLevel+lowLevel+lowLevel return otherFunc2 def getCheckoutCode(): #校验码=[(模式–1)+(温度–16)+5+左右扫风+换气+节能]取二进制后四位,再逆序 tempc = (modeFlag-1)+(tempFlag-16)+5+fanLeftAndRightFlag+0+0 print(tempc) j = tempc & 0x0f print(j) j_bin = bin(j) print "j_bin:" +j_bin checkout = [] for i in range(0,4,1): checkout.append(j & 0x01) j = j>>1 print checkout code = () for i in range(0,4,1): if(1==checkout[i]): code +=(highLevel) else: code +=(lowLevel) return code def getSecondCodeEnd(): secondCodeEnd = (550,40000) return secondCodeEnd if __name__ == "__main__": print("格力空调遥控器红外编码-长码") code = startLevel code += modeCodeFunc(1) #模式:0自动,1制冷,2加湿,3送风,4加热 code += keyCodeFunc(1) #开关:0关,1开 code += fanSpeedCodeFunc(0) #风速:0自动,1一档,2二档,3三档 code += fanScanCodeFunc(0) #扫风:0关,1开-设置上下扫风和左右扫风的时候会自动设置为1 code += getSleepCode(0) #睡眠 code += tempertureCodeFunc(16) #温度 code += getTimerCode() #定时 code += getOtherCode(False,True,False,False,False) #其他-超强、灯光、健康、干燥、换气 code += getFirstCodeEnd() #剩余的编码 code += getLinkCode() #连接码 code += fanUpAndDownCodeFunc(0) #上下扫风 code += fanLeftAndRightCodeFunc(1) #左右扫风 code += getOtherFunc2() code += getCheckoutCode() code += getSecondCodeEnd() print "电平码:" print code code2 = "{"+str(code[0])+"," for i in range(1,len(code),1): code2 += "*"+str(code[i])+',' code2 += "*0,}" print(code2)