遥控器,做为和物联网设备通信的设备之一,用途还是蛮多的。毕竟像遥控器这类设备,成本低,功能强,一次可以满足多种需要。所以,这一节,咱们研究下用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,即可获取。