格力空调的红外控制协议被称为格力红外通讯协议或者格力红外遥控协议。这个协议定义了一系列红外信号,可以用来控制格力空调的各种操作,例如开关、温度控制、模式选择、风速控制等等。
格力空调的红外控制协议是一种自定义协议,它并没有像NEC、RC5、RC6等协议一样被广泛应用。因此,不同型号的格力空调可能会有不同的红外控制协议。如果想要使用红外发送器控制格力空调,需要先了解当前空调使用的是哪种红外控制协议。
一般来说,格力空调的红外控制协议包含一个头部和一系列数据位。头部通常由一个起始位和一个引导位组成。数据位通常包括操作码、温度、模式、风速等信息。
下面是一个格力空调红外控制信号:
Start Bit: 9000us
Lead-in: 4500us, 4500us
Data: 0x88, 0x20, 0x00, 0x02, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
在这个示例中,红外控制信号的起始位持续时间为9000微秒。接下来是一个引导位,持续时间为4500微秒和4500微秒。引导位后面是一系列数据位,包括操作码、温度、模式、风速等信息。在这个示例中,操作码为0x88,表示将空调设置为制冷模式,并把温度设置为32度。
要控制格力空调,需要使用一个红外发送器,将这个信号通过红外光线发送到空调控制器。可以使用STM32F103ZET6的GPIO引脚控制红外线发送管来发送这个信号。
#include "stm32f10x.h"
// 定义红外发送器引脚
#define IR_SENDER_GPIO_PORT GPIOA
#define IR_SENDER_GPIO_PIN GPIO_Pin_1
// 定义红外发送器协议参数
#define IR_PROTOCOL_FREQ 38000 // 红外协议频率
#define IR_PROTOCOL_START_DURATION 9000 // 红外协议起始位持续时间
#define IR_PROTOCOL_LEADIN_DURATION 4500 // 红外协议引导位持续时间
#define IR_PROTOCOL_DATA_BIT_0_DURATION 560 // 红外协议数据位0持续时间
#define IR_PROTOCOL_DATA_BIT_1_DURATION 1690 // 红外协议数据位1持续时间
// 发送一个红外协议信号
void IR_SendProtocol(uint32_t protocol)
{
uint8_t i, j;
uint32_t data_bit;
// 发送起始位
GPIO_SetBits(IR_SENDER_GPIO_PORT, IR_SENDER_GPIO_PIN);
delay_us(IR_PROTOCOL_START_DURATION);
// 发送引导位
GPIO_ResetBits(IR_SENDER_GPIO_PORT, IR_SENDER_GPIO_PIN);
delay_us(IR_PROTOCOL_LEADIN_DURATION);
GPIO_SetBits(IR_SENDER_GPIO_PORT, IR_SENDER_GPIO_PIN);
delay_us(IR_PROTOCOL_LEADIN_DURATION);
// 逐位发送协议数据
for (i = 0; i < 14; i++)
{
data_bit = (protocol >> i) & 0x01; // 获取当前位的值
// 发送数据位
GPIO_ResetBits(IR_SENDER_GPIO_PORT, IR_SENDER_GPIO_PIN);
if (data_bit)
{
delay_us(IR_PROTOCOL_DATA_BIT_1_DURATION);
}
else
{
delay_us(IR_PROTOCOL_DATA_BIT_0_DURATION);
}
GPIO_SetBits(IR_SENDER_GPIO_PORT, IR_SENDER_GPIO_PIN);
delay_us(IR_PROTOCOL_DATA_BIT_0_DURATION);
}
}
// 控制格力空调开关
void IR_ControlPower(int on_off)
{
uint32_t protocol;
if (on_off)
{
// 开机
protocol = 0x8820000200200000;
}
else
{
// 关机
protocol = 0x8820000000200000;
}
IR_SendProtocol(protocol);
}
// 控制格力空调温度
void IR_ControlTemperature(int temperature)
{
uint32_t protocol;
if (temperature < 16 || temperature > 31)
{
return; // 温度范围无效
}
// 温度码为0x20加上实际温度值
protocol = 0x8820002020000000 | (temperature - 16);
IR_SendProtocol(protocol);
}
// 控制格力空调模式
void IR_ControlMode(int mode)
{
uint32_t protocol;
switch (mode)
{
case 0: // 制冷
protocol = 0x8820000200200000;
break;
case 1: // 制热
protocol = 0x8820000400200000;
break;
case 2: // 自动
protocol = 0x8820000800200000;
break;
case 3: // 送风
protocol = 0x8820001000200000;
break;
default:
return; // 模式无效
}
IR_SendProtocol(protocol);
}
// 控制格力空调风速
void IR_ControlFanSpeed(int fan_speed)
{
uint32_t protocol;
switch (fan_speed)
{
case 0: // 自动风速
protocol = 0x8820002000200000;
break;
case 1: // 低风速
protocol = 0x8820004000200000;
break;
case 2: // 中风速
protocol = 0x8820008000200000;
break;
case 3: // 高风速
protocol = 0x8820010000200000;
break;
default:
return; // 风速无效
}
IR_SendProtocol(protocol);
}
在代码中,定义了一些常量来表示格力空调红外控制协议的参数,例如红外协议频率、起始位持续时间、引导位持续时间、数据位0和数据位1的持续时间。也定义了一些函数来控制格力空调的各种操作,例如控制开关、温度、模式和风速。这些函数调用了IR_SendProtocol()
函数来发送适当的红外信号。
在IR_SendProtocol()
函数中,先发送起始位和引导位。然后,逐位发送协议数据,根据数据位的值发送适当的红外信号。在代码中,使用delay_us()
函数来延迟一定的时间来模拟红外信号的持续时间。
以下是一些常见的格力空调红外控制协议:
// 开机
0x8820000200200000
// 关机
0x8820000000200000
// 温度16度
0x8820002020000000
// 温度17度
0x8820002120000000
// 温度18度
0x8820002220000000
// ...
// 温度31度
0x8820003F20000000
// 制冷
0x8820000200200000
// 制热
0x8820000400200000
// 自动
0x8820000800200000
// 送风
0x8820001000200000
// 自动风速
0x8820002000200000
// 低风速
0x8820004000200000
// 中风速
0x8820008000200000
// 高风速
0x8820010000200000
// 扫风开
0x8820080000200000
// 扫风关
0x8820100000200000
// 节能开
0x8820200000200000
// 节能关
0x8820400000200000
// 睡眠开
0x8821000000200000
// 睡眠关
0x8822000000200000
// 定时开机,时间为1小时
0x8824000000200000
// 定时开机,时间为2小时
0x8828000000200000
// 定时开机,时间为3小时
0x8830000000200000
// ...
// 定时开机,时间为24小时
0x8878000000200000
// 取消定时开关机
0x8820000000400000
// 清新开
0x8820000002200000
// 清新关
0x8820000004200000
// 快速冷
0x8820000080200000
// 快速热
0x8820000040200000
// 干燥开
0x8820000001200000
// 干燥关
0x8820000002200000
// 自清洁开
0x8820000008200000
// 自清洁关
0x8820000010200000
// 室内外循环开
0x8820020000200000
// 室内外循环关
0x8820040000200000