一、格力空調(diào)協(xié)議介紹
格力空調(diào)的紅外控制協(xié)議被稱為格力紅外通訊協(xié)議或者格力紅外遙控協(xié)議。這個(gè)協(xié)議定義了一系列紅外信號(hào),可以用來控制格力空調(diào)的各種操作,例如開關(guān)、溫度控制、模式選擇、風(fēng)速控制等等。
格力空調(diào)的紅外控制協(xié)議是一種自定義協(xié)議,它并沒有像NEC、RC5、RC6等協(xié)議一樣被廣泛應(yīng)用。因此,不同型號(hào)的格力空調(diào)可能會(huì)有不同的紅外控制協(xié)議。如果想要使用紅外發(fā)送器控制格力空調(diào),需要先了解當(dāng)前空調(diào)使用的是哪種紅外控制協(xié)議。
一般來說,格力空調(diào)的紅外控制協(xié)議包含一個(gè)頭部和一系列數(shù)據(jù)位。頭部通常由一個(gè)起始位和一個(gè)引導(dǎo)位組成。數(shù)據(jù)位通常包括操作碼、溫度、模式、風(fēng)速等信息。
下面是一個(gè)格力空調(diào)紅外控制信號(hào):
Start Bit: 9000us
Lead-in: 4500us, 4500us
Data: 0x88, 0x20, 0x00, 0x02, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
在這個(gè)示例中,紅外控制信號(hào)的起始位持續(xù)時(shí)間為9000微秒。接下來是一個(gè)引導(dǎo)位,持續(xù)時(shí)間為4500微秒和4500微秒。引導(dǎo)位后面是一系列數(shù)據(jù)位,包括操作碼、溫度、模式、風(fēng)速等信息。在這個(gè)示例中,操作碼為0x88,表示將空調(diào)設(shè)置為制冷模式,并把溫度設(shè)置為32度。
要控制格力空調(diào),需要使用一個(gè)紅外發(fā)送器,將這個(gè)信號(hào)通過紅外光線發(fā)送到空調(diào)控制器。可以使用STM32F103ZET6的GPIO引腳控制紅外線發(fā)送管來發(fā)送這個(gè)信號(hào)。
二、代碼實(shí)現(xiàn)
2.1 代碼實(shí)現(xiàn)
#include "stm32f10x.h"
// 定義紅外發(fā)送器引腳
#define IR_SENDER_GPIO_PORT GPIOA
#define IR_SENDER_GPIO_PIN GPIO_Pin_1
// 定義紅外發(fā)送器協(xié)議參數(shù)
#define IR_PROTOCOL_FREQ 38000 // 紅外協(xié)議頻率
#define IR_PROTOCOL_START_DURATION 9000 // 紅外協(xié)議起始位持續(xù)時(shí)間
#define IR_PROTOCOL_LEADIN_DURATION 4500 // 紅外協(xié)議引導(dǎo)位持續(xù)時(shí)間
#define IR_PROTOCOL_DATA_BIT_0_DURATION 560 // 紅外協(xié)議數(shù)據(jù)位0持續(xù)時(shí)間
#define IR_PROTOCOL_DATA_BIT_1_DURATION 1690 // 紅外協(xié)議數(shù)據(jù)位1持續(xù)時(shí)間
// 發(fā)送一個(gè)紅外協(xié)議信號(hào)
void IR_SendProtocol(uint32_t protocol)
{
uint8_t i, j;
uint32_t data_bit;
// 發(fā)送起始位
GPIO_SetBits(IR_SENDER_GPIO_PORT, IR_SENDER_GPIO_PIN);
delay_us(IR_PROTOCOL_START_DURATION);
// 發(fā)送引導(dǎo)位
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);
// 逐位發(fā)送協(xié)議數(shù)據(jù)
for (i = 0; i < 14; i++)
{
data_bit = (protocol >> i) & 0x01; // 獲取當(dāng)前位的值
// 發(fā)送數(shù)據(jù)位
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);
}
}
// 控制格力空調(diào)開關(guān)
void IR_ControlPower(int on_off)
{
uint32_t protocol;
if (on_off)
{
// 開機(jī)
protocol = 0x8820000200200000;
}
else
{
// 關(guān)機(jī)
protocol = 0x8820000000200000;
}
IR_SendProtocol(protocol);
}
// 控制格力空調(diào)溫度
void IR_ControlTemperature(int temperature)
{
uint32_t protocol;
if (temperature < 16 || temperature > 31)
{
return; // 溫度范圍無效
}
// 溫度碼為0x20加上實(shí)際溫度值
protocol = 0x8820002020000000 | (temperature - 16);
IR_SendProtocol(protocol);
}
// 控制格力空調(diào)模式
void IR_ControlMode(int mode)
{
uint32_t protocol;
switch (mode)
{
case 0: // 制冷
protocol = 0x8820000200200000;
break;
case 1: // 制熱
protocol = 0x8820000400200000;
break;
case 2: // 自動(dòng)
protocol = 0x8820000800200000;
break;
case 3: // 送風(fēng)
protocol = 0x8820001000200000;
break;
default:
return; // 模式無效
}
IR_SendProtocol(protocol);
}
// 控制格力空調(diào)風(fēng)速
void IR_ControlFanSpeed(int fan_speed)
{
uint32_t protocol;
switch (fan_speed)
{
case 0: // 自動(dòng)風(fēng)速
protocol = 0x8820002000200000;
break;
case 1: // 低風(fēng)速
protocol = 0x8820004000200000;
break;
case 2: // 中風(fēng)速
protocol = 0x8820008000200000;
break;
case 3: // 高風(fēng)速
protocol = 0x8820010000200000;
break;
default:
return; // 風(fēng)速無效
}
IR_SendProtocol(protocol);
}
在代碼中,定義了一些常量來表示格力空調(diào)紅外控制協(xié)議的參數(shù),例如紅外協(xié)議頻率、起始位持續(xù)時(shí)間、引導(dǎo)位持續(xù)時(shí)間、數(shù)據(jù)位0和數(shù)據(jù)位1的持續(xù)時(shí)間。也定義了一些函數(shù)來控制格力空調(diào)的各種操作,例如控制開關(guān)、溫度、模式和風(fēng)速。這些函數(shù)調(diào)用了IR_SendProtocol()
函數(shù)來發(fā)送適當(dāng)?shù)募t外信號(hào)。
在IR_SendProtocol()
函數(shù)中,先發(fā)送起始位和引導(dǎo)位。然后,逐位發(fā)送協(xié)議數(shù)據(jù),根據(jù)數(shù)據(jù)位的值發(fā)送適當(dāng)?shù)募t外信號(hào)。在代碼中,使用delay_us()
函數(shù)來延遲一定的時(shí)間來模擬紅外信號(hào)的持續(xù)時(shí)間。
2.2 常見的控制碼
以下是一些常見的格力空調(diào)紅外控制協(xié)議:
【1】控制開關(guān)
// 開機(jī)
0x8820000200200000
// 關(guān)機(jī)
0x8820000000200000
【2】控制溫度
// 溫度16度
0x8820002020000000
// 溫度17度
0x8820002120000000
// 溫度18度
0x8820002220000000
// ...
// 溫度31度
0x8820003F20000000
【3】控制模式
// 制冷
0x8820000200200000
// 制熱
0x8820000400200000
// 自動(dòng)
0x8820000800200000
// 送風(fēng)
0x8820001000200000
【4】控制風(fēng)速
// 自動(dòng)風(fēng)速
0x8820002000200000
// 低風(fēng)速
0x8820004000200000
// 中風(fēng)速
0x8820008000200000
// 高風(fēng)速
0x8820010000200000
【5】控制掃風(fēng)
// 掃風(fēng)開
0x8820080000200000
// 掃風(fēng)關(guān)
0x8820100000200000
【6】控制節(jié)能模式
// 節(jié)能開
0x8820200000200000
// 節(jié)能關(guān)
0x8820400000200000
【7】控制睡眠模式
// 睡眠開
0x8821000000200000
// 睡眠關(guān)
0x8822000000200000
【8】控制定時(shí)開關(guān)機(jī)
// 定時(shí)開機(jī),時(shí)間為1小時(shí)
0x8824000000200000
// 定時(shí)開機(jī),時(shí)間為2小時(shí)
0x8828000000200000
// 定時(shí)開機(jī),時(shí)間為3小時(shí)
0x8830000000200000
// ...
// 定時(shí)開機(jī),時(shí)間為24小時(shí)
0x8878000000200000
// 取消定時(shí)開關(guān)機(jī)
0x8820000000400000
【9】控制清新功能
// 清新開
0x8820000002200000
// 清新關(guān)
0x8820000004200000
【10】控制快速冷熱
// 快速冷
0x8820000080200000
// 快速熱
0x8820000040200000
【11】控制干燥功能
// 干燥開
0x8820000001200000
// 干燥關(guān)
0x8820000002200000
【12】控制自清潔功能
// 自清潔開
0x8820000008200000
// 自清潔關(guān)
0x8820000010200000
【13】控制室內(nèi)外循環(huán)功能
// 室內(nèi)外循環(huán)開
0x8820020000200000
// 室內(nèi)外循環(huán)關(guān)
0x8820040000200000