欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ESP8266_23基于硬件定时器的红外遥控器解码

程序员文章站 2022-07-13 23:19:55
...

遥控器,做为和物联网设备通信的设备之一,用途还是蛮多的。毕竟像遥控器这类设备,成本低,功能强,一次可以满足多种需要。所以,这一节,咱们研究下用ESP8266,连接一体式红外接收头,然后做红外解码的用法。

首先说需要准备什么:一个红外遥控器,一个一体式红外接收头(这里我用的是VS1838,你可以用你擅长的)就够了。如下所示。

ESP8266_23基于硬件定时器的红外遥控器解码

      

       要用这个遥控器,就要了解红外遥控编码的原理,因为这部分内容比较基础,这里就不再浪费时间了。不懂红外遥控器原理的童鞋,只能说明基础太薄弱,建议先把基础打好。

 

       然后是接线,这个就比较简单了。ESP8266的所有GPIO都可以用来进行红外解码,这里我随便选了一个GPIO5。也就是说VS1838的数据输出脚,接到ESP8266的GPIO5。

ESP8266_23基于硬件定时器的红外遥控器解码

       然后是程序部分。

       这里比较尴尬,因为根据我了解到的信息,安信可官方是有这部分源码的,我找了一下,确实也找到了。但是在编译的时候,出了一些莫名其妙的问题。总之,就是编译不过,为此,我还找了安信可的论坛发帖咨询,结果等了5天,毫无反应……………

ESP8266_23基于硬件定时器的红外遥控器解码

       老夫很是郁闷,于是一气之下,把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秒,判断一下红外数据的接收是否完成,如果完成了,那就进行相应的处理。

 

       很简单,基本没有涉及到新的知识。

程序修改完成,保存、清理、编译、下载一条龙,然后重新上电。这里借助串口助手来查看效果。设备上电之后,效果如下所示:

ESP8266_23基于硬件定时器的红外遥控器解码

       如图所示,上电后先进行相应的初始化配置,然后就是解码的过程。我依次按下了2、4、6、8这几个安静,解码得到的值如上所示。怎么知道解码的对不对?看遥控器的键值表。

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

ESP8266_23基于硬件定时器的红外遥控器解码

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

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

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