ESP8266_23基於硬件定時器的紅外遙控器解碼

ESP8266_01搭建開發環境

ESP8266_02程序的編譯與下載

ESP8266_03SDK與Makefile的基本用法

ESP8266_04管腳控制與軟件定時器

ESP8266_05 ESP8266有幾個串口?

ESP8266_06硬件定時器與IO中斷

ESP8266_07基於PWM的呼吸燈

ESP8266_08基於flash的數據掉電保護

ESP8266_09基於IIC控制的OLED屏幕

ESP8266_10 ESP8266的STATION模式

ESP8266_11 ESP8266的UDP廣播

ESP8266_12 ESP8266客戶端模式下的TCP通信

ESP8266_13服務器端模式下的TCP通信

ESP8266_14 SOFTAP模式下的服務器端和客戶端

ESP8266_15天氣預報之TCP的GET操作

ESP8266_16天氣預報之JSON數據的生成與解析

ESP8266_17簡單網絡時間協議-SNTP

ESP8266_18 MQTT協議接入ONENET平臺

ESP8266_19MQTT協議接入ONENET平臺_訂閱主題

ESP8266_20 基於ONENET平臺的數據上傳之TCP的POST操作

ESP8266_21基於ESP8266的一鍵配網

ESP8266_22基於自身ADC的電壓採樣

ESP8266_23基於硬件定時器的紅外遙控器解碼

遙控器,做爲和物聯網設備通信的設備之一,用途還是蠻多的。畢竟像遙控器這類設備,成本低,功能強,一次可以滿足多種需要。所以,這一節,咱們研究下用ESP8266,連接一體式紅外接收頭,然後做紅外解碼的用法。

首先說需要準備什麼:一個紅外遙控器,一個一體式紅外接收頭(這裏我用的是VS1838,你可以用你擅長的)就夠了。如下所示。

      

       要用這個遙控器,就要了解紅外遙控編碼的原理,因爲這部分內容比較基礎,這裏就不再浪費時間了。不懂紅外遙控器原理的童鞋,只能說明基礎太薄弱,建議先把基礎打好。

 

       然後是接線,這個就比較簡單了。ESP8266的所有GPIO都可以用來進行紅外解碼,這裏我隨便選了一個GPIO5。也就是說VS1838的數據輸出腳,接到ESP8266的GPIO5。

       然後是程序部分。

       這裏比較尷尬,因爲根據我瞭解到的信息,安信可官方是有這部分源碼的,我找了一下,確實也找到了。但是在編譯的時候,出了一些莫名其妙的問題。總之,就是編譯不過,爲此,我還找了安信可的論壇發帖諮詢,結果等了5天,毫無反應……………

       老夫很是鬱悶,於是一氣之下,把51單片機裏常用的紅外解碼程序移植了過來。因爲這部分比較簡單,看一下關鍵部分的源碼就行了,如下:

void ICACHE_FLASH_ATTR system_done()

{

       wifi_station_disconnect();

       //配置PERIPHS_IO_MUX_GPIO5_U爲GPIO模式

       PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO5_U,FUNC_GPIO5);

       GPIO_DIS_OUTPUT(GPIO_ID_PIN(5));          //設置爲輸入

       ETS_GPIO_INTR_DISABLE();                        //關閉中斷

       ETS_GPIO_INTR_ATTACH(GPIO_intr_handler,NULL);   //設置中斷處理函數

       //配置GPIO5爲下降沿觸發的方式

       gpio_pin_intr_state_set(GPIO_ID_PIN(5),GPIO_PIN_INTR_NEGEDGE);

       ETS_GPIO_INTR_ENABLE();                                //使能中斷

       os_printf("inter init done!\r\n");



       //參數1:0,使用 FRC1 中斷源,1,使用 NMI 中斷源;參數2:0,不自動填充,1,自動填充

       hw_timer_init(0,1);

       hw_timer_set_func(HW_IRTIME);             //設置回調函數

       hw_timer_arm(278);                                  //啓動定時器,設置定時時間,單位us

       os_printf("hw_timer init done!\r\n");



       os_timer_disarm(&PROCESS_timer);  //使用之前先關閉,設置回調函數

       os_timer_setfn(&PROCESS_timer, (os_timer_func_t *)IF_PROCESS, NULL);

       os_timer_arm(&PROCESS_timer, 500, 1);  //啓動軟件定時器,每隔0.5秒調用一次回調函數

}

 

       這是系統初始化完成函數調用的回調函數,該函數中主要實現了三個功能:

       1、端口初始化。選擇GPIO5做爲紅外接收管腳,設置爲輸入、下降沿中斷。設置中斷相應的處理函數,跟51裏面一樣,就是irtime的一些處理。

       2、硬件定時器初始化。單片機做紅外解碼的時候,用的比較多的一種方法就是設置一個定時器,讓它每隔0.278ms中斷一次,依次做爲檢測引導碼和0、1信號的時間基準。這裏初始化定時器的目的是一樣的,讓它每隔278us中斷一次。

       3、軟件定時器初始化。前面的章節強調過,ESP8266裏面不建議使用while循環。所以通過軟件定時器,每隔0.5秒,判斷一下紅外數據的接收是否完成,如果完成了,那就進行相應的處理。

 

       很簡單,基本沒有涉及到新的知識。

程序修改完成,保存、清理、編譯、下載一條龍,然後重新上電。這裏藉助串口助手來查看效果。設備上電之後,效果如下所示:

       如圖所示,上電後先進行相應的初始化配置,然後就是解碼的過程。我依次按下了2、4、6、8這幾個安靜,解碼得到的值如上所示。怎麼知道解碼的對不對?看遙控器的鍵值表。

       還是那句話,不同廠家的遙控器,鍵值表很有可能是不一樣的,找賣家要。我這裏的如下所示:

       由此可見,紅外解碼沒有問題。本節內容結束。

單片機愛好者

      本文轉自:http://www.mcublog.cn/esp8266/2019_11/hongwaiyaokongjiema/

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章