ESP8266_12 ESP8266客戶端模式下的TCP通信
ESP8266_19MQTT協議接入ONENET平臺_訂閱主題
ESP8266_20 基於ONENET平臺的數據上傳之TCP的POST操作
遙控器,做爲和物聯網設備通信的設備之一,用途還是蠻多的。畢竟像遙控器這類設備,成本低,功能強,一次可以滿足多種需要。所以,這一節,咱們研究下用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/