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这几个安静,解码得到的值如上所示。怎么知道解码的对不对?看遥控器的键值表。

       还是那句话,不同厂家的遥控器,键值表很有可能是不一样的,找卖家要。我这里的如下所示:

       由此可见,红外解码没有问题。本节内容结束。

      完整工程源码,请关注下方公众号:单片机爱好者,回复关键字:ESP8266,即可获取。

单片机爱好者

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

 

发布了27 篇原创文章 · 获赞 7 · 访问量 5186

猜你喜欢

转载自blog.csdn.net/lazyduck/article/details/103271518