0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

STM32設(shè)計智能居家-萬能紅外遙控器

DS小龍哥-嵌入式技術(shù) ? 來源:DS小龍哥-嵌入式技術(shù) ? 作者:DS小龍哥-嵌入式技 ? 2022-03-12 13:30 ? 次閱讀

?

一、環(huán)境介紹

MCU: STM32F103ZET6

編程軟件環(huán)境: keil5

紅外線傳輸協(xié)議:NEC協(xié)議---38KHZ載波:。NEC協(xié)議是紅外遙控協(xié)議中常見的一種。

編碼發(fā)送思路:延時函數(shù)模擬38KHZ + PWM產(chǎn)生38KHZ兩種方式

代碼風(fēng)格:模塊化編程,寄存器直接操作方式

二、NEC協(xié)議與相關(guān)硬件介紹

2.1 NEC協(xié)議介紹

NEC協(xié)議在上篇入門開發(fā):>文章里已經(jīng)詳細(xì)介紹過了。這篇文章和上篇文章內(nèi)容是連貫的,上篇文章完成NEC紅外線協(xié)議解碼,這篇文章就當(dāng)做遙控器發(fā)送端,發(fā)送自定義數(shù)據(jù)給接收端,完成自定義的數(shù)據(jù)傳輸;也可以模擬家電遙控器,對電視機(jī)、投影儀、空調(diào)等設(shè)備進(jìn)行遙控操作。

紅外線協(xié)議有很多,本章節(jié)主要是針對NEC協(xié)議講解,只要把NEC協(xié)議原理搞懂了,其他協(xié)議都是一樣的使用;如果想要模擬空調(diào)遙控器,去控制美的空調(diào)、格力空調(diào)這些設(shè)備,就需要按照美的、格力空調(diào)的協(xié)議發(fā)送;如果不知道協(xié)議長什么樣,可以將邏輯分析儀插在紅外線接收頭的引腳上,拿個正常的空調(diào)遙控器對著接收頭按一下,然后采集數(shù)據(jù)分析,即可得到協(xié)議規(guī)律,然后網(wǎng)絡(luò)上也有空調(diào)按鍵值功能的說明文檔,調(diào)試一下即可。

2. 2 使用的相關(guān)硬件

因為要模擬紅外線遙控器,就需要一個紅外線發(fā)射管;在學(xué)習(xí)階段,如果不想自己搭建電路,可以買現(xiàn)成的模塊。 買模塊連接也是比較穩(wěn)定,接線也比較簡單,VCC和GND接好之后,把DAT引腳接到STM32任意一個IO口上即可,如果想用硬件PWM控制發(fā)送,那么引腳接到STM32的PWM輸出腳即可。

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

2.3 完成NEC協(xié)議編碼發(fā)送

先看一段紅外線接收頭引腳上采集的NEC協(xié)議的電平: 這是接收端采集的。

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

紅外線接收頭的硬件特性: 注意: 這里是針對NEC遙控器協(xié)議來說明),下圖就是當(dāng)前使用的紅外線接收頭。

?

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

收到38KHZ的紅外光,IN引腳就輸出低電平;沒有收到IN引腳就輸出高電平。

NEC紅外線協(xié)議說明:(這是站在接收端解碼的角度分析的)

一段獨(dú)立的NEC協(xié)議數(shù)據(jù)包由引導(dǎo)碼+32位數(shù)據(jù)組成。

引導(dǎo)碼: 9ms的高電平 + 4.5ms 低電平組成。

32位數(shù)據(jù)就是: 8位用戶碼+ 8位用戶反碼+ 8位按鍵碼+8位按鍵反碼

每個數(shù)據(jù)位之間的間隔時間是0.56ms(低電平)

NEC協(xié)議是依靠收到的高電平持續(xù)時間來判斷數(shù)據(jù)0和數(shù)據(jù)1;高電平持續(xù)時間是0.56ms表示數(shù)據(jù)0,高電平持續(xù)時間是1.68ms表示數(shù)據(jù)1。

只要明白上面說的兩個特點,就可以寫程序,按照NEC協(xié)議驅(qū)動紅外線發(fā)射管,發(fā)送數(shù)據(jù)了。

編寫發(fā)送程序之前,得先明白這個38KHZ的紅外光如何產(chǎn)生?

STM32支持硬件PWM功能,可以配置38KHZ方波輸出;如果沒有硬件PWM功能的單片機(jī),也可以使用延時的方式產(chǎn)生38KHZ方波,差那么一點點問題也不到,解碼端適當(dāng)調(diào)整一下時間范圍即可。

采用延時函數(shù)實現(xiàn)方法如下:

/*
函數(shù)功能: 發(fā)送38KHZ的載波
函數(shù)參數(shù):
u32 time_us 持續(xù)的時間
u8 flag 1表示發(fā)送38KHZ載波,0表示不發(fā)送
*/
void InfraredSend38KHZ(u32 time_us,u8 flag)
{
    u32 i;
    if(flag)
    {
        //發(fā)送38KHZ載波
        for(i=0;i
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

為了方便發(fā)送指定的用戶碼和按鍵碼,可以封裝成一個函數(shù)調(diào)用。

/*
函數(shù)功能: NEC協(xié)議編碼發(fā)送
函數(shù)參數(shù): 
				u8 user 用戶碼
				u8 key  按鍵碼
先發(fā)低位
按鍵反碼+按鍵碼+用戶反碼+用戶碼
*/
void InfraredNECSend(u8 user,u8 key)
{
	u32 i;
	 /*1. 組合發(fā)送的數(shù)據(jù)*/
	u32 data=((~key&0xFF)<<24)|((key&0xFF)<<16)|((~user&0xFF)<<8)|((user&0xFF)<<0);
		
	 /*2. 發(fā)送引導(dǎo)碼*/
	InfraredSend38KHZ(9000,1);//發(fā)送38KHZ載波
	InfraredSend38KHZ(4500,0);//不發(fā)送
	
	/*3. 發(fā)送32位數(shù)據(jù)*/
	 for(i=0;i<32;i++)
	 {
			InfraredSend38KHZ(560,1); //間隔時間
			if(data&0x01)InfraredSend38KHZ(1685,0); //發(fā)送1
			else InfraredSend38KHZ(560,0); //發(fā)送0
		  data>>=1;
	 }
	 InfraredSend38KHZ(560,1); //間隔時間
}
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

這是使用邏輯分析儀采集的發(fā)送端波形: 和協(xié)議對應(yīng)了一下,沒有問題。

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

對比一下解碼端采集的波形圖:

三、核心代碼

如果需要整個keil工程源碼,可以在這里下載(解壓即可編譯運(yùn)行測試):

https://download.csdn.net/download/xiaolong1126626497/19863305

3.1 main.c

#include "stm32f10x.h"
#include "beep.h"
#include "delay.h"
#include "led.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include 
#include 
#include "exti.h"
#include "timer.h"
#include "rtc.h"
#include "adc.h"
#include "ds18b20.h"
#include "ble.h"
#include "esp8266.h"
#include "wdg.h"
#include "oled.h"
#include "rfid_rc522.h"
#include "infrared.h"

int main()
{   
  LED_Init();
  KEY_Init();
  BEEP_Init();
  TIM1_Init(72,20000); //輔助串口1接收,超時時間為20ms
	USART_X_Init(USART1,72,115200);
	//InfraredDecodeInit(); //紅外線解碼初始化
	InfraredCodingInit();   //紅外線編碼初始化
  printf("UART1 OK.....\n");
	
  while(1)
  {
		InfraredNECSend(13,14); //發(fā)送紅外線數(shù)據(jù)
		DelayMs(500);
		LED0=!LED0;
  }
}
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

3.2 紅外線.c

#include "infrared.h"

/*
函數(shù)功能: 紅外線編碼初始化
硬件連接: PG11
編碼思路: 采用延時函數(shù)實現(xiàn)38KHZ
*/
void InfraredCodingInit(void)
{
	  RCC->APB2ENR|=1<<8; //PG
	  GPIOG->CRH&=0xFFFF0FFF;
	  GPIOG->CRH|=0x00003000;
	  GPIOG->ODR|=1<<11;
}

/*
函數(shù)功能: 發(fā)送38KHZ的載波
函數(shù)參數(shù):
u32 time_us 持續(xù)的時間
u8 flag 1表示發(fā)送38KHZ載波,0表示不發(fā)送
*/
void InfraredSend38KHZ(u32 time_us,u8 flag)
{
    u32 i;
    if(flag)
    {
        //發(fā)送38KHZ載波
        for(i=0;i>=1;
	 }
	 InfraredSend38KHZ(560,1); //間隔時間
}
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

四、格力空調(diào)遙控協(xié)議介紹

4.1 協(xié)議解析

報頭脈沖:9ms

報頭間距:4.5ms

載波頻率:37.9KHz(38KHz)

碼段1與碼段2間距:20ms

“1”:脈寬,656us。間距,1640us。

“0”:脈寬,656us。間距,544us。

4.2 編碼定義

1-3位:模式

送風(fēng):圖標(biāo):風(fēng)扇。代碼:110。

自動:圖標(biāo):循環(huán)箭頭。代碼:000。

除濕:圖標(biāo):水滴。代碼:010。

制冷:圖標(biāo):雪花。代碼:100。

制熱:圖標(biāo):太陽。代碼:001。

4位(加68位):開機(jī)關(guān)機(jī)

開機(jī):1。

關(guān)機(jī):0。第68位取反。

5-6位:風(fēng)速

一級:10

二級:01

三級:11

自動:00

7、37、41位(加65位):掃風(fēng)

上下掃風(fēng):110。第65位取反

左右掃風(fēng):101。

上下左右:111

無掃風(fēng):000

8位:睡眠

睡眠:1

不睡眠:0

9-12位與65-68位:溫度

制冷模式下:

溫度

9-12位

65-68位

30

0111

1000

29

1011

0000

28

0011

1111

27

1101

0111

26

0101

1011

25

1001

0011

24

0001

1101

23

1110

0101

22

0110

1001

21

1010

0001

20

0010

1110

19

1100

0110

18

0100

1010

17

1000

0010

16

0000

1100

制熱模式:

溫度

9-12位

65-68位

30

0111

0010

29

1011

1100

28

1101

0100

27

1101

1000

26

0101

0000

25

1001

1111

24

0001

0111

23

1110

1011

22

0110

0011

21

1010

1101

20

0010

0101

19

1100

1001

18

0100

0001

17

1000

1110

16

0000

0110

吸濕模式:

溫度

9-12位

65-68位

30

0111

0100

29

1011

1000

28

0011

0000

27

1101

1111

26

0101

0111

25

1001

1011

24

0001

0011

23

1110

1101

22

0110

0101

21

1010

1001

20

0010

0001

19

1100

1110

18

0100

0110

17

1000

1010

16

0000

0010

送風(fēng)模式:

溫度

9-12位

65-68位

30

0111

1100

29

1011

0100

28

0011

1000

27

1101

0000

26

0101

1111

25

1001

0111

24

0001

1011

23

1110

0011

22

0110

1101

21

1010

0101

20

0010

1001

19

1100

0001

18

0100

1110

17

1000

0110

16

0000

1010

13-20位:睡眠定時

時間

13-20位

0.5

10010000

1

00011000

1.5

10011000

2

00010100

2.5

10010100

3

00011100

3.5

10011100

4

00010010

4.5

10010010

5

00011010

5.5

10011010

6

00010110

6.5

10010110

7

00011110

7.5

10011110

8

00010001

8.5

10010001

9

00011001

9.5

10011001

10

01010000

10.5

11010000

11

01011000

11.5

11011000

12

01010100

12.5

11010100

13

01011100

13.5

11011100

14

01010010

14.5

11010010

15

01011010

15.5

11011010

16

01010110

16.5

11010110

17

01011110

17.5

11011110

18

01010001

18.5

11010001

19

01011001

19.5

11011001

20

00110000

20.5

10110000

21

00111000

21.5

10111000

22

00110100

22.5

10110100

23

00111100

23.5

10111100

24

00110010

0

00000000

21位:超強(qiáng)

超強(qiáng):1

普通:0

22位:燈光

亮:1

滅:0

23位與25位:健康,換氣

健康:10

換氣:01

健康+換氣:11

普通:00

24位:制冷模式下-干燥;制熱模式下-輔熱;

干燥:1

普通:0

45-46位:顯示溫度

不顯示:00

顯示:10

顯示室內(nèi)溫度:01

顯示室外溫度:11

其他位:

除了29、31、34位為“1”外,均為“0”。其他位功能不詳(遙控器無對應(yīng)項)。

第36位和69位分別是碼段1和碼段2的最后一位,無所謂“0”“1”。

4.3 其他說明

在自動模式下只可以設(shè)置的項目有:風(fēng)速1、2、3級、自動;上上下左右掃風(fēng);顯示溫度;燈光;睡眠定時(非睡眠)。其他項均不可以設(shè)置。此時溫度不可設(shè)置,溫度段的代碼為:10011101。

在關(guān)機(jī)狀態(tài)下,可以設(shè)置定時開機(jī),代碼與睡眠定時關(guān)機(jī)一樣。也可以設(shè)置燈光。

在制冷模式下,可以設(shè)置的項有:溫度;掃風(fēng);健康換氣,節(jié)能(僅在此狀態(tài)下可以設(shè)置);風(fēng)速;定時;超強(qiáng);睡眠;燈光;溫度顯示。

在除濕模式下,可以設(shè)置的項有:溫度;掃風(fēng);健康換氣;干燥;溫度顯示;定時;睡眠;燈光。

在送風(fēng)模式下,可以設(shè)置的項有:溫度;風(fēng)速;健康換氣;掃風(fēng);溫度顯示;定時;燈光。

在制熱模式下,可以設(shè)置的項有:溫度;風(fēng)速;掃風(fēng);輔熱;溫度顯示;定時;超強(qiáng);睡眠;燈光。

MGQ 2012-04-141、格力YB0F2紅外信號命令格式

紅外信號主要包括CMD1和CMD2兩部分,其中CMD1包括35 位的命令 和一位停止位,CMD2包括32位的命令和一位停止位。

表格 1 CMD1

Bit:1~3

4

5~6

7

8

模式

開關(guān)機(jī)(CMD2 32bit取反)

風(fēng)速

是否掃風(fēng)

是否睡眠

9~12

13~16

溫度

睡眠1

17~20

21

22

23

24

睡眠2

超強(qiáng)

燈光

健康

干燥/輔熱

25

26

27

28

29

30

31

32

換氣

0

0

0

1

0

1

0

33

34

35

0

1

0

表格 2 CMD2

Bit:1

2

3

4

5

6

7

8

上下掃風(fēng)

0

0

0

左右掃風(fēng)

0

0

0

9~10

11

12

13

14

15

16

顯示溫度

0

0

0

0

0

0

17

18

19

20

21

22

23

24

0

0

0

0

0

0

0

0

25

26

27

28

29~32

0

0

0

0

溫度

五、美的空調(diào)協(xié)議介紹

L為引導(dǎo)碼,

S為分隔碼,

A為認(rèn)別碼(A=10110010=B2,預(yù)留方案時A=10110111=B7),

A'為A的反碼,

B'為B的反碼,

C'為C的反碼

遙控器發(fā)射紅外信號之時,通過“560微秒低電平+1680微秒高電平”代表“1”,通過“560微秒低電平+560微秒低電平”代表“0”。

美的的紅外采用NEC格式的R05d

該協(xié)議的紅外信號編碼格式為:引導(dǎo)碼+客戶碼+客戶反碼+數(shù)據(jù)碼+數(shù)據(jù)反碼+結(jié)束位,

其中引導(dǎo)碼和結(jié)束碼都是固定的,數(shù)據(jù)反碼由數(shù)據(jù)碼按位取反得來,真正變化的只有用戶碼和數(shù)據(jù)碼。

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

??審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • STM32
    +關(guān)注

    關(guān)注

    2263

    文章

    10846

    瀏覽量

    353773
  • 硬件
    +關(guān)注

    關(guān)注

    11

    文章

    3164

    瀏覽量

    66004
  • 紅外遙控器
    +關(guān)注

    關(guān)注

    3

    文章

    133

    瀏覽量

    21613
收藏 人收藏

    評論

    相關(guān)推薦

    遙控器解碼怎么使用

    夠接收和解碼遙控器發(fā)出的紅外(IR)信號。這些信號通常用于控制電視、空調(diào)、音響等家用電器。解碼可以復(fù)制這些信號,從而允許用戶使用新的遙控器智能
    的頭像 發(fā)表于 09-30 14:23 ?245次閱讀

    藍(lán)牙語音遙控器方案

    ,使用非常方便,徹底擺脫傳統(tǒng)紅外遙控器在節(jié)目搜索時的繁瑣操作和低效。 一、方案介紹: 藍(lán)牙語音遙控器一般是通過按下語音鍵,遙控器會發(fā)送一個 HID 編碼通知
    的頭像 發(fā)表于 08-29 14:37 ?335次閱讀
    藍(lán)牙語音<b class='flag-5'>遙控器</b>方案

    萬能斷路跳閘后如何復(fù)位

    萬能斷路是一種廣泛應(yīng)用于電力系統(tǒng)中的保護(hù)裝置,其主要作用是在電路發(fā)生故障時,能夠迅速切斷電路,以保護(hù)電氣設(shè)備和人身安全。然而,在實際使用過程中,萬能斷路可能會出現(xiàn)跳閘現(xiàn)象,這時候就
    的頭像 發(fā)表于 07-31 15:24 ?996次閱讀

    萬能斷路參數(shù)如何設(shè)置

    萬能斷路是一種廣泛應(yīng)用于電力系統(tǒng)、工業(yè)自動化和建筑電氣領(lǐng)域的電氣設(shè)備,其主要功能是在電路中起到過載、短路、欠壓等保護(hù)作用。正確設(shè)置萬能斷路參數(shù)對于確保設(shè)備安全運(yùn)行和提高系統(tǒng)可靠性具
    的頭像 發(fā)表于 07-31 15:19 ?1099次閱讀

    星閃挑戰(zhàn)UWB,指向遙控方案迎來新成員

    的使用體驗打了折扣。目前紅外遙控器品類里以萬能遙控器、學(xué)習(xí)遙控器更受關(guān)注;射頻遙控器品類如藍(lán)牙
    的頭像 發(fā)表于 06-28 08:05 ?219次閱讀
    星閃挑戰(zhàn)UWB,指向<b class='flag-5'>遙控</b>方案迎來新成員

    基于T5L智能屏的萬能紅外控制

    ——來自迪文開發(fā)者論壇本期為大家推送迪文開發(fā)者論壇獲獎開源案例——基于T5L智能屏的萬能紅外控制。工程師通過T5L串口與紅外傳感器模塊進(jìn)行
    的頭像 發(fā)表于 06-22 08:13 ?247次閱讀
    基于T5L<b class='flag-5'>智能</b>屏的<b class='flag-5'>萬能</b><b class='flag-5'>紅外</b>控制<b class='flag-5'>器</b>

    用STM8做紅外遙控器,需要量產(chǎn),請問用什么型號合適?

    想用STM8做紅外遙控器,需要量產(chǎn),請問用什么型號合適? 最好價格上能有優(yōu)勢
    發(fā)表于 05-15 07:13

    如何提高紅外線發(fā)射管在遙控器上的發(fā)射距離

    如何提高紅外線發(fā)射管在遙控器上的發(fā)射距離? 遙控器成為了我們?nèi)粘I钪胁豢苫蛉钡囊徊糠?,我們通過遙控器可以控制電視、空調(diào)、音響等大量設(shè)備。而遙控器
    的頭像 發(fā)表于 01-31 14:47 ?2644次閱讀

    萬能遙控器的設(shè)置和使用方法

    萬能遙控器是一種能夠控制不同品牌電器的設(shè)備,它可以將多個遙控器的功能整合到一個遙控器上,方便用戶操作。在本文中,我將詳細(xì)介紹萬能
    的頭像 發(fā)表于 01-24 10:57 ?1.4w次閱讀

    2.4G無線遙控器方案開發(fā),穩(wěn)定性強(qiáng),可用于多種應(yīng)用

    2.4G遙控器是一種使用2.4GHz頻段的無線遙控器,常用于遙控玩具、航模和家電等電子設(shè)備上。相比于傳統(tǒng)的紅外遙控器,2.4G
    的頭像 發(fā)表于 01-18 15:44 ?2085次閱讀

    基于51單片機(jī)的紅外遙控器設(shè)計

    電子發(fā)燒友網(wǎng)站提供《基于51單片機(jī)的紅外遙控器設(shè)計.rar》資料免費(fèi)下載
    發(fā)表于 01-12 09:22 ?9次下載

    基于51單片機(jī)的紅外遙控器設(shè)計

    電子發(fā)燒友網(wǎng)站提供《基于51單片機(jī)的紅外遙控器設(shè)計.rar》資料免費(fèi)下載
    發(fā)表于 01-03 11:23 ?4次下載

    低功耗藍(lán)牙模塊取代遠(yuǎn)紅外技術(shù)遙控器廣泛應(yīng)用于市場

     藍(lán)牙技術(shù)的出現(xiàn)對于遙控器來說似乎是一個質(zhì)變,那些曾經(jīng)很常見的紅外遙控器也隨著老電視逐漸退出了市場。雖然萬能遙控器曾經(jīng)火熱過一段時間,但是隨
    的頭像 發(fā)表于 12-21 11:18 ?711次閱讀

    紅外遙控器使用方法

    紅外遙控器是一種常見的電子設(shè)備,廣泛應(yīng)用于家庭、商業(yè)和工業(yè)領(lǐng)域。它可以通過紅外線信號與相應(yīng)的設(shè)備進(jìn)行通信,實現(xiàn)控制和操作。本文將詳細(xì)介紹紅外遙控
    的頭像 發(fā)表于 12-20 11:31 ?4443次閱讀

    請問能用單片機(jī)加上紅外做一個空調(diào)遙控器嗎?

    能用單片機(jī)加上紅外做一個空調(diào)遙控器嗎?該怎么實現(xiàn)?
    發(fā)表于 11-07 06:28