格力空调红外码(短码)解析

格力空调的红外码有长码和短码,这篇文章是红外短码的解析。

 

 

首先上一段电平码:

 

9000, 4500,

550, 550, 550, 550, 550, 550, 550, 550,550, 550, 550, 550, 550, 1660, 550, 550,

550, 550, 550, 550, 550, 550, 550, 550,550, 550, 550, 550, 550, 550, 550, 550,

550, 550, 550, 550, 550, 550, 550, 550,550, 550, 550, 550, 550, 550, 550, 550,

550, 550, 550, 550, 550, 550, 550, 550,550, 1660, 550, 550, 550, 1660, 550, 550,

550, 550, 550, 1660, 550, 550,

550, 20000

 

由此可知,格力空调红外码(短码)是这样构成的:起始码+32位数据码+010+结束码

 

起始码:高电平9000us+低电平4500us

数值0:高电平550us+低电平550us

数值1:高电平550us+低电平1660us

结束码:高电平5500us+低电平20000us

 

红外编码格式:

 

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

 

 

 

 

 

 

 

 

 

 

0

0

1

0

1

0

定时数据

加湿

灯光

负离子

节电

换气

所有按键均显示此值

 

 

之后自己写了一段脚本程序对码库进行分析,分析结果如下:

 

开关位置:[4]

开:       1

关:       0

 

模式位置:[1, 2, 3]

自动: 0 0 0

制冷: 1 0 0

制热: 0 0 1

抽湿: 0 1 0

送风: 1 1 0

 

温度位置:[9, 10,11, 12]

16度: 0 0 0 0

17度: 1 0 0 0

18度: 0 1 0 0

19度: 1 1 0 0

20度: 0 0 1 0

21度: 1 0 1 0

22度: 0 1 1 0

23度: 1 1 1 0

24度: 0 0 0 1

25度: 1 0 0 1

26度: 0 1 0 1

27度: 1 1 0 1

28度: 0 0 1 1

29度: 1 0 1 1

30度: 0 1 1 1

 

风速位置:[5, 6]

自动:     0 0

1档:      1 0

2档:      0 1

3档:      1 1

 


格力空调遥控信号的编码格式为自定义格式,需要先进行信号录制和解,然后根据解结果来编写解析程序。以下是基于 STM32 的格力空调遥控信号解析程序: ```c #include "stm32f10x.h" #define IR_PIN GPIO_Pin_0 #define IR_GPIO GPIOA #define IR_EXTI EXTI_Line0 #define IR_EXTI_PORT_SOURCE GPIO_PortSourceGPIOA #define IR_EXTI_PIN_SOURCE GPIO_PinSource0 #define IR_TIM TIM2 volatile uint32_t irData[128]; volatile uint8_t irCount = 0; volatile uint8_t irState = 0; void IR_TIM_Config(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); TIM_TimeBaseStructure.TIM_Period = 8999; // 90us TIM_TimeBaseStructure.TIM_Prescaler = 71; // 1MHz TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; TIM_TimeBaseInit(IR_TIM, &TIM_TimeBaseStructure); TIM_Cmd(IR_TIM, ENABLE); } void IR_EXTI_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); GPIO_InitStructure.GPIO_Pin = IR_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(IR_GPIO, &GPIO_InitStructure); GPIO_EXTILineConfig(IR_EXTI_PORT_SOURCE, IR_EXTI_PIN_SOURCE); EXTI_InitStructure.EXTI_Line = IR_EXTI; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } void EXTI0_IRQHandler(void) { static uint16_t lastValue = 0; uint16_t duration = (uint16_t)(IR_TIM->CNT); IR_TIM->CNT = 0; if (duration < 10000) { // ignore noise if (irState == 0 && duration > 8000 && duration < 9000) { // start bit irCount = 0; irState = 1; } else if (irState == 1 && duration > 400 && duration < 600) { // 0 bit irData[irCount++] = 0; irState = 2; } else if (irState == 1 && duration > 1200 && duration < 1400) { // 1 bit irData[irCount++] = 1; irState = 2; } else if (irState == 2) { // next bit irState = 1; } else { // invalid bit irData[irCount++] = lastValue; // use previous value } lastValue = irData[irCount-1]; } else { // stop bit irState = 0; } EXTI_ClearITPendingBit(IR_EXTI); } int main(void) { IR_TIM_Config(); IR_EXTI_Config(); while(1) { if (irState == 0 && irCount == 70) { // valid data if (irData[0] == 0 && irData[1] == 1 && irData[2] == 0 && irData[3] == 1) { // check start code uint16_t addr = 0; uint16_t cmd = 0; for (int i = 0; i < 8; i++) { addr = (addr << 1) | irData[4+i]; } for (int i = 0; i < 8; i++) { cmd = (cmd << 1) | irData[20+i]; } // do something with addr and cmd } irCount = 0; } } } ``` 此程序可以解析格力空调遥控信号,使用了 TIM2 定时器和 EXTI 外部中断来计时和捕获信号。当接收到有效的红外线信号时,会将信号值存储在 `irData` 数组中,并根据信号格式和状态机来判断是否解析完整个数据包。如果解析成功,可以获取地址和命令并执行相应的操作。 需要注意的是,格力空调遥控信号的编码格式可能存在差异,此程序只是一个简单的解析例程,实际使用时需要根据具体的遥控器型号和编码格式进行修改和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值