直接回答:空调遥控器一次按键会发出一整帧状态码而不是单纯的开机码,所以抓码必须把整帧完整记录下来再用发射模块原样重放,只截取一段是控制不了的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
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

dat = t - 16
#print dat
print bin(dat)
for i in range(0, 4, 1):
x = dat & 1
#print x,
if x == 1:
tempCode += highLevel
elif x == 0:
tempCode += lowLevel
dat = dat >> 1

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 + 左右扫风 + 换气 + 节能 - 开关
# 取二进制后四位,再逆序
dat = (modeFlag - 1) + (tempFlag - 16) + 5 + fanLeftAndRightFlag + 0 + 0 - keyFlag
print(dat)
code = ()
for i in range(0, 4, 1):
x = dat & 1
if 1 == x:
code += highLevel
elif 0 == x:
code += lowLevel
dat = dat >> 1

#print code
return code

def getSecondCodeEnd():
secondCodeEnd = (550,40000)
return secondCodeEnd

if __name__ == "__main__":
print("格力空调遥控器红外编码-长码")
print("100032-格力9")
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

这篇笔记整理自我自己的实践记录,如果做法有出入,或者你踩过别的坑,欢迎到留言板一起聊聊。

站内搜索

没有找到内容!