你的浏览器禁用了JavaScript, 请开启后刷新浏览器获得更好的体验!
首页
热门
推荐
精选
登录
|
注册
乐鑫esp8266的 基于Nonos移植红外线1883,实现遥控器控制
立即下载
用AI写一个
金额:
10
元
支付方式:
友情提醒:源码购买后不支持退换货
立即支付
发布时间:2018-03-09
32人
|
浏览:8088次
|
收藏
|
分享
技术:c语言 + 硬件知识+乐鑫SDK
运行环境:安信可一体化环境+乐鑫SDK
概述
乐鑫esp8266移植红外实现红外遥控器来控制三盏灯的亮灭情况,同时用遥控器进去配网模式,使8266进去一键配网模式!
详细
---------- ### 一、前言。 > 距离上篇的8266进阶博文有那么一段时间了,那么本文带来的是基于Nonos的红外线H1838的NEC协议的移植小案例,浏览博文前,需要知道以下常识: > >- 1、 红外遥控的原理是什么? > > >- 2、红外遥控的协议有哪些?NEC? > > >- 3、红外遥控的电路组成?8266的最小系统搭搭建! ---------- - ![这里写图片描述](/contentImages/image/rep/ggtA51PHfACaRc0kSc7.jpg) ---------- ### 二、本博文实现的现象。 ---------- #### 1. 实现的现象; ---------- > 遥控器来控制三盏灯的亮灭情况,同时用遥控器进去配网模式,使8266进去一键配网模式!
有些人问我的这个哪里买的,本文购买的红外线整套元器件,博文后面有某宝购买链接。 - 三盏灯(红灯、绿灯、蓝灯),分别连接8266的
**GPIO12、GPIO13、GPIO15;** - 红外接收模块1883的输出端接8266的
**GPIO14**
,其余看图接 ! ---------- ![这里写图片描述](/contentImages/image/rep/Y7Eal9kHdctyNZr1HCo.jpg) ---------- #### 2. 使用说明; ---------- ![这里写图片描述](/contentImages/image/rep/Lnv5eD50tdWTtmzb1et.jpg) ---------- #### 3. 遥控器对应的码值; ---------- - 下面仅仅列了本文所需的按键的键值,其他请自行查询; ---------- | 按键 | 键值 | | -------- | --------| | 1| 0x45 | | 2| 0x46 | | 3| 0x47 | | 9| 0x09 | | #| 0x0d| ---------- ### 三、esp8266的GPIO口中断使用。 ---------- - 接收短脚使用官方推荐的GPIO14 ,见下图; ---------- ![这里写图片描述](/contentImages/image/rep/eEyFm4hvHxeGXf2GfgM.jpg) ---------- - GPIO14中断初始化 ; ---------- ``` //中断停止 ETS_GPIO_INTR_DISABLE(); //设置中断回调函数 ETS_GPIO_INTR_ATTACH(hongwai, NULL); //设置短脚14,低电平触发; gpio_pin_intr_state_set(GPIO_ID_PIN(14), GPIO_PIN_INTR_LOLEVEL); //中断使能 ETS_GPIO_INTR_ENABLE(); ``` ---------- ### 四、中断回调函数。 ---------- - 见下图可见 (图片来自网络), 当GPIO14为低电平时候,说明有信号过来了,所以我们上面代码设置为低电平触发中断回调,进一步的剖析电平状态: ---------- ![这里写图片描述](/contentImages/image/rep/rRzjvPkYVn9zQ4WGEZQ.jpg) ---------- ``` //开始判断是否为NEC波形引导码的前9MS和后4.5MS uint32 gpio_status = GPIO_REG_READ(GPIO_STATUS_ADDRESS); if (gpio_status & BIT(hwx)) { GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, gpio_status & BIT(hwx)); gpio_pin_intr_state_set(GPIO_ID_PIN(hwx), GPIO_PIN_INTR_DISABLE); } //计数时间清0 while (!GPIO_INPUT_GET(hwx)) { os_delay_us(100); ly_ct++; } if (ly_ct < 80 || ly_ct > 100) { gpio_pin_intr_state_set(GPIO_ID_PIN(hwx), 4); return; } //NEC引导码前9MS,ly_ct约等于90,给个误差值,用80-100之间来判断 ly_ct = 0; while (GPIO_INPUT_GET(hwx)) { os_delay_us(100); ly_ct++; } if (ly_ct < 40 || ly_ct > 50) { gpio_pin_intr_state_set(GPIO_ID_PIN(hwx), 4); return; } //NEC引导码引导码的后4.5MS,ly_ct约45 for (i = 0; i < 4; i++) { for (ia = 0; ia < 8; ia++) { while (!GPIO_INPUT_GET(hwx)); ly_ct = 0; while (GPIO_INPUT_GET(hwx)) { os_delay_us(100); ly_ct++; } if (ly_ct > 20) { gpio_pin_intr_state_set(GPIO_ID_PIN(hwx), 4); return; } ly_lhj[i] >>= 1; if (ly_ct > 10) ly_lhj[i] |= 0x80; //时间量TH1高于10,即高于1MS判断为1 } } //ly_lhj[2]就是我们要的数据,因为数组第3个就是上面的第三个数据码 //重新设置中断 gpio_pin_intr_state_set(GPIO_ID_PIN(hwx), GPIO_PIN_INTR_LOLEVEL); ``` ---------- ### 五、LED初始化以及回调函数。 ---------- ``` //LED初始化,默认全部灭 PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U, FUNC_GPIO15); GPIO_OUTPUT_SET(GPIO_ID_PIN(15), 1); PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, FUNC_GPIO13); GPIO_OUTPUT_SET(GPIO_ID_PIN(13), 1); PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, FUNC_GPIO12); GPIO_OUTPUT_SET(GPIO_ID_PIN(12), 1); //因为指示灯是连接到GPIO2,所以把其灭掉,否则会常亮;我也不知道为啥会常亮 PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U, FUNC_GPIO2); GPIO_OUTPUT_SET(GPIO_ID_PIN(2), 1); ``` ---------- - 回调函数: -
特别强调的是:1-9-1-9-1 才进去一键配网等待,我这利用一个标志位`scFlag `自加来做,当进去配网模式,全部灯会先亮再灭再亮! ---------- ``` static int scFlag = 0; char tempData[8]; os_sprintf(tempData, "%s", data); os_printf("redCallBackFun : %s\n", tempData); os_printf("redCallBackFun scFlag : %d\n", scFlag); //键值判断 if (os_strcmp(tempData, "45") == 0) { GPIO_OUTPUT_SET(GPIO_ID_PIN(12), 0); GPIO_OUTPUT_SET(GPIO_ID_PIN(13), 1); GPIO_OUTPUT_SET(GPIO_ID_PIN(15), 1); scFlag++; if (scFlag == 2 || scFlag == 4) { scFlag = 0; } } else if (os_strcmp(tempData, "46") == 0) { GPIO_OUTPUT_SET(GPIO_ID_PIN(13), 0); GPIO_OUTPUT_SET(GPIO_ID_PIN(12), 1); GPIO_OUTPUT_SET(GPIO_ID_PIN(15), 1); scFlag = 0; } else if (os_strcmp(tempData, "47") == 0) { GPIO_OUTPUT_SET(GPIO_ID_PIN(15), 0); GPIO_OUTPUT_SET(GPIO_ID_PIN(12), 1); GPIO_OUTPUT_SET(GPIO_ID_PIN(13), 1); scFlag = 0; } else if (os_strcmp(tempData, "9") == 0) { GPIO_OUTPUT_SET(GPIO_ID_PIN(12), 1); GPIO_OUTPUT_SET(GPIO_ID_PIN(13), 1); GPIO_OUTPUT_SET(GPIO_ID_PIN(15), 1); scFlag++; if (scFlag == 1 || scFlag == 3 || scFlag == 5) { scFlag = 0; } } else if (os_strcmp(tempData, "d") == 0) { scFlag = 0; GPIO_OUTPUT_SET(GPIO_ID_PIN(12), 0); GPIO_OUTPUT_SET(GPIO_ID_PIN(13), 0); GPIO_OUTPUT_SET(GPIO_ID_PIN(15), 0); } //标志位为5,说明进去一键配网等待,灯光闪烁 if (scFlag == 5) { scFlag = 0; GPIO_OUTPUT_SET(GPIO_ID_PIN(12), 1); GPIO_OUTPUT_SET(GPIO_ID_PIN(13), 1); GPIO_OUTPUT_SET(GPIO_ID_PIN(15), 1); os_delay_us(60000); GPIO_OUTPUT_SET(GPIO_ID_PIN(12), 0); GPIO_OUTPUT_SET(GPIO_ID_PIN(13), 0); GPIO_OUTPUT_SET(GPIO_ID_PIN(15), 0); os_delay_us(60000); GPIO_OUTPUT_SET(GPIO_ID_PIN(12), 1); GPIO_OUTPUT_SET(GPIO_ID_PIN(13), 1); GPIO_OUTPUT_SET(GPIO_ID_PIN(15), 1); os_printf("----------开始进去SmartConfig配网 \n\n-----"); smartconfig_init(); } ``` ---------- ### 六、编译烧录固件。 ---------- - 编译成功; ---------- ![这里写图片描述](/contentImages/image/rep/nlUOyBr19RaZrMQUWGV.jpg) ---------- - 烧录,注意我使用的是4M flash的8266-12f ,也就是4*8 =32Mbit的size; ---------- ![这里写图片描述](/contentImages/image/rep/CpvtMnYH1cVCKFm1a1D.jpg) ---------- - 串口打印: ![这里写图片描述](/contentImages/image/rep/O3jLfBdOvDu1IEQMznb.jpg) ---------- ### 七、项目文件目录截图; ![](/contentImages/image/20180309/kUphrq2nFkbkuLZaRgC.jpg) ### 八、后记; ---------- - 头文件使用; ``` //注册红外线使能 comhwx_init(); //注册红外线回调函数 funRedInfra_CallBack(redCallBackFun); ``` ---------- - 本博文的硬件购买地址,仅供参考:[1883红外遥控一套件](https://item.taobao.com/item.htm?ut_sk=1.WUkrsEFpRbEDAP5QmqHElQa1_21380790_1520563562895.Copy.1&id=542758201315&sourceType=item&price=2.65&suid=1FE919EA-0026-4720-81AB-A121109CF283&un=f71ca9196848b19bfba7b0828e520322&share_crt_v=1&cpp=1&shareurl=true&spm=a313p.22.17g.936238983424&short_name=h.WFcZ3p7&app=chrome) ----------
本实例支付的费用只是购买源码的费用,如有疑问欢迎在文末留言交流,如需作者在线代码指导、定制等,在作者开启付费服务后,可以点击“购买服务”进行实时联系,请知悉,谢谢
感谢
4
手机上随时阅读、收藏该文章 ?请扫下方二维码
相似例子推荐
评论
作者
半颗心脏
13
例子数量
740
帮助
127
感谢
评分详细
可运行:
4.5
分
代码质量:
4.5
分
文章描述详细:
4.5
分
代码注释:
4.5
分
综合:
4.5
分
作者例子
基于Android的rgb七彩环颜色采集器
企业者的福音之8266接入阿里智能,点亮一盏灯。
乐鑫esp8266的 基于Nonos移植红外线1883,实现遥控器控制
Android开发SDK接入机智云,智能家居实现APP远程控制多设备
实现乐鑫esp8266的无线OTA升级,实现远程在线升级固件。
乐鑫esp8266基于freeRtos实现私有服务器本地远程OTA升级
乐鑫esp8266的串口通讯驱动源文件,nonos和rtos版本
esp8266烧录Html文件,实现内置网页控制设备!
动起来做一个微信小程序Mqtt协议控制智能硬件的框架,支持短线重连!
乐鑫esp8266使用 SPI 驱动Max7219芯片的驱八位数码管!
在支付宝小程序上websocket实现mqtt协议连接服务器控制硬件。
乐鑫esp32 sdk编程驱动ws2812灯珠,实现彩虹光彩夺目效果。
微信小程序ble蓝牙控制esp32,实现无需网络也可以控制亮度;