基于SOC方案的嵌入式开发-远程定时设备
Soc方案实现简单的定时开关灯
http://club.gizwits.com/forum.php?mod=viewthread&tid=7787&highlight=%E5%AE%9A%E6%97%B6
<ignore_js_op>
步骤②:定义三个数据点:
灯的总开关 (lightOpenOff): 布尔值类型 可写
定时器的总开关(isTimerOpen):布尔值 可写
定时开的时间(timerOpen):数值 0~3660 单位:秒
<ignore_js_op>
步骤③:选择MCU开发,选择硬件平台:esp8266-32M Product Secret不用我多说了。
<ignore_js_op>
二:电路图的设计与程序编写。
电路图:
按键S1长按就是进入airlink配网模式了
按键S2按下接通时候就是烧录模式了
LED是接在GPIO12和VCC之间的。
<ignore_js_op>
程序篇:
步骤一:先搭建8266的开发环境,我这使用的是安信可的集成环境,并且导入工程。如果有不懂的,可以看这篇:http://blog.csdn.net/xh870189248/article/details/77985541
步骤二:我们先修改我们程序的进入 “配网模式”的按键程序,首先我们打开工程的 app --> user --> user_main.c 文件,修改过程如下:
修改第①处:
我们先把按键定义改下,我们这个是只有一个按键,所以key的数量为1,见下面的修改。
修改前:
- #define GPIO_KEY_NUM 2 ///< Defines the total number of key members
- #define KEY_0_IO_MUX PERIPHS_IO_MUX_GPIO0_U ///< ESP8266 GPIO function
- #define KEY_0_IO_NUM 0 ///< ESP8266 GPIO number
- #define KEY_0_IO_FUNC FUNC_GPIO0 ///< ESP8266 GPIO name
- #define KEY_1_IO_MUX PERIPHS_IO_MUX_MTMS_U ///< ESP8266 GPIO function
- #define KEY_1_IO_NUM 14 ///< ESP8266 GPIO number
- #define KEY_1_IO_FUNC FUNC_GPIO14 ///< ESP8266 GPIO name
- LOCAL key_typedef_t * singleKey[GPIO_KEY_NUM]; ///< Defines a single key member array pointer
- LOCAL keys_typedef_t keys; ///< Defines the overall key module structure pointer
复制代码
修改后: (我们在电路图看到是GPIO4触发配网模式,所以该为GPIO4)
- #define GPIO_KEY_NUM 1 ///< Defines the total number of key members
- #define KEY_0_IO_MUX PERIPHS_IO_MUX_GPIO4_U ///< ESP8266 GPIO function
- #define KEY_0_IO_NUM 4 ///< ESP8266 GPIO number
- #define KEY_0_IO_FUNC FUNC_GPIO4 ///< ESP8266 GPIO name
复制代码
修改第②处:
把以下的代码删除:
- **
- * Key2 key to short press processing
- * @param none
- * @return none
- */
- LOCAL void ICACHE_FLASH_ATTR key2ShortPress(void)
- {</p><p>GIZWITS_LOG("#### key2 short press, soft ap mode \n");
- gizwitsSetMode(WIFI_SOFTAP_MODE);
- }
- /**
- * Key2 button long press
- * @param none
- * @return none
- */
- LOCAL void ICACHE_FLASH_ATTR key2LongPress(void)
- {
- GIZWITS_LOG("#### key2 long press, airlink mode\n");
- gizwitsSetMode(WIFI_AIRLINK_MODE);
- }
复制代码
同时把 ICACHE_FLASH_ATTR 函数里面以下代码去掉:
singleKey[1] = keyInitOne(KEY_1_IO_NUM, KEY_1_IO_MUX, KEY_1_IO_FUNC, key2LongPress, key2ShortPress);
最后得到的按键初始化函数 ICACHE_FLASH_ATTR 如下代码:
- /**
- * Key to initialize
- * @param none
- * @return none
- */
- LOCAL void ICACHE_FLASH_ATTR keyInit(void)
- {
- singleKey[0] = keyInitOne(KEY_0_IO_NUM, KEY_0_IO_MUX, KEY_0_IO_FUNC,
- key1LongPress, key1ShortPress); //key1LongPress方法回调对应上面的,key1shortPress同样也是
- keys.singleKey = singleKey;
- keyParaInit(&keys);
- <strong><font color="seagreen">}</font></strong>
复制代码
修改第③处:
我们把按键短按和长按的方法修改下,让按键短按进入 AirLink配网模式,长按进入softAP配网模式,修改如下:
- /**
- * Key1 key short press processing
- * @param none
- * @return none
- */
- LOCAL void ICACHE_FLASH_ATTR key1ShortPress(void)
- {
- gizwitsSetMode(WIFI_SOFTAP_MODE);
- }
- /**
- * Key1 key presses a long press
- * @param none
- * @return none
- */
- LOCAL void ICACHE_FLASH_ATTR key1LongPress(void)
- {
- gizwitsSetMode(WIFI_AIRLINK_MODE);
- }
复制代码
修改第④处: 因为我们是只有一个功能,并且只有使用到一个GPIO口,所以我们仅仅初始化一个就好了,我这在user_init()主函数直接加入以下代码:
- PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, FUNC_GPIO12); //GPIO12初始化
- GPIO_OUTPUT_SET(GPIO_ID_PIN(12), 0);//GPIO12 低电平输出
复制代码
修改第五处:我们现在把目标转到 app --->Gizwits_product.c 文件(下同),修改我们8266收到指令后作出动作的代码:
修改前:
- case EVENT_lightOnOff :
- currentDataPoint.valuelightOnOff = dataPointPtr->valuelightOnOff;
- GIZWITS_LOG("Evt: EVENT_lightOnOff %d \n", currentDataPoint.valuelightOnOff);
- if(0x01 == currentDataPoint.valuelightOnOff)
- {
- //user handle
- }
- else
- {
- //user handle
- }
- break;
复制代码
修改后: 收到0x01(true)开灯,0x00(false)关灯,因为8266的内部GPIO是默认上拉,所以选择高电平输出,反而灯会亮!!博主也是从这篇文章了解到的:http://blog.csdn.net/jackhuang2015/article/details/50839401
- case EVENT_lightOnOff :
- currentDataPoint.valuelightOnOff = dataPointPtr->valuelightOnOff;
- GIZWITS_LOG("Evt: EVENT_lightOnOff %d \n", currentDataPoint.valuelightOnOff);
- if(0x01 == currentDataPoint.valuelightOnOff)
- {
- GPIO_OUTPUT_SET(GPIO_ID_PIN(12), 1); //开灯
- }
- else
- {
- GPIO_OUTPUT_SET(GPIO_ID_PIN(12), 0); //关灯
- }
- break;
复制代码
修改第⑥处:
我们在文件新增一个定时器使能的bool类型、一个软件定时器结构体和一个定时时间。
- //布尔值,定时器开关的状态
- bool isTimer ;
- //定时时间
- uint16_t timer_timers;
- /** 定时器结构体 */
- static os_timer_t os_timer;
复制代码
我们在收到app发来的 isTimerOpen数据点(开关定时器的指令)的方法处理这样做:
- <p> case EVENT_isTimerOpen :
- currentDataPoint.valueisTimerOpen = dataPointPtr->valueisTimerOpen;
- if(0x01 == currentDataPoint.valueisTimerOpen)
- {
- isTimer=true;
- } else {
- /** 关闭该定时器 */
- os_timer_disarm( &os_timer ); </p><p> /** 定时器使能为false */
- isTimer=false;
- }
- break;</p>
复制代码
我们在收到app发来的 TimerOpen数据点(定时时间)的方法处理这样做: 注意,每次开启定时器,要先把其关闭掉,再重新初始化使能。
- case EVENT_timerOpen:
- currentDataPoint.valuetimerOpen= dataPointPtr->valuetimerOpen; </p><p> //只有当使能状态为true就可以开启定时器
- if(isTimer){
- /** 关闭该定时器 */
- os_timer_disarm( &os_timer );
- // 配置该定时器回调函数,指定的执行方法是: Led_Task_Run (),下面会提供代码
- os_timer_setfn( &os_timer, (ETSTimerFunc *) (<font color="red"> Led_Task_Run</font> ), NULL );
- /** 开启该定时器 :下发的是秒数,这里的单位是毫秒,要乘1000* ,后面false表示仅仅执行一次**/
- os_timer_arm( &os_timer, currentDataPoint.valuetimerOpen*1000, false );
- /**赋值给timer_timers,方便会调用 */
- timer_timers=currentDataPoint.valuetimerOpen;
- }
- break;
复制代码
定时任务函数这样做:
- /**
- * 定时任务函数
- */
- void Led_Task_Run(void){
- //开灯
- GPIO_OUTPUT_SET(GPIO_ID_PIN(12), 1);
- //执行完毕,我们要把定时时间设置0 ,定时使能状态为false
- timer_timers=0;
- isTimer=false;
- }
复制代码
修改⑦:改变上报数据的方法:
- void ICACHE_FLASH_ATTR userHandle(void)
- {
- //获取GPIO12的高低电平,因为高电平是触发开灯,所以ture就是开灯
- currentDataPoint.valuelightOnOff = GPIO_INPUT_GET(12) ;
- //是否开启定时器的回调
- currentDataPoint.valueisTimerOpen =isTimer ;
- //定时时间回调,如果用戶設置了定時器关闭,那么我们返回0,否则返回定时时间,注意这个定时时间是固定的。不是倒计时时间。
- if(isTimer){
- currentDataPoint.valuetimerOpen =timer_timers ;
- }else{
- currentDataPoint.valuetimerOpen =0;
- }
- system_os_post(USER_TASK_PRIO_2, SIG_UPGRADE_DATA, 0);
- }
复制代码
基于SOC方案的嵌入式开发-远程定时设备的更多相关文章
- Mac下搭建基于PlatformIO的嵌入式开发环境(STM32开发)
PlatformIO简介 PlatformIO是开源的物联网开发生态系统.提供跨平台的代码构建器.集成开发环境(IDE),兼容 Arduino,ESP8266和mbed等 支持在Windows.Lin ...
- 【嵌入式开发】嵌入式 开发环境 (远程登录 | 文件共享 | NFS TFTP 服务器 | 串口连接 | Win8.1 + RedHat Enterprise 6.3 + Vmware11)
作者 : 万境绝尘 博客地址 : http://blog.csdn.net/shulianghan/article/details/42254237 一. 相关工具下载 嵌入式开发工具包 : -- 下 ...
- 【推荐图书】+ 基于Nios II的嵌入式SoPC系统设计与Verilog开发实例+C#入门经典等
[推荐图书]+ 基于Nios II的嵌入式SoPC系统设计与Verilog开发实例+C#入门经典等 3赞 发表于 2016/7/4 21:14:12 阅读(1921) 评论(3) 初次接触FPGA,到 ...
- 基于Vivado的嵌入式开发 ——PS+PL实践
基于Vivado的嵌入式开发 ——PS走起 硬件平台:ZedBoard 开发工具:Vivado 2014.2 1.规划 废话不多说,依然是流水灯,这次是采用PS+PL实现. 功能依旧简单,目标是为了学 ...
- CLion远程调试嵌入式开发板程序
CLion远程调试嵌入式开发板程序 目录 CLion远程调试嵌入式开发板程序 1. 目的 2. 前提条件 3. CLion设置 3.1 设置一个Deployment 3.2 上传需要的目录到目标板子 ...
- 基于IAP和Keil MDK的远程升级设计
写在前面:三个周之前,我突然想写一个远程升级的程序.那个时候我只是大概知道IAP的意思是在应用编程,但怎么编,我还一无所知.我给自己定下一个个阶段目标,从最基础的代码一点点写起,解决一个又一个的问题. ...
- 【嵌入式开发】写入开发板Linux系统-模型S3C6410
笔者 : 万境绝尘 转载请著名出处 最终拿到板子了, 嵌入式开发正式开启. 板子型号 : 三星 S3C6410 基于ARM11, 指令集基于arm6指令集; 为毛不是 Cortext A9的板子; 烧 ...
- 应聘linux/ARM嵌入式开发岗位
**************************************************************** 因为发在中华英才和智联招聘没有人采我所以我 在这里发布我的个人简历希望 ...
- 【嵌入式开发】向开发板中烧写Linux系统-型号S3C6410
作者 : 万境绝尘 转载请著名出处 终于拿到板子了, 嵌入式开发正式开启. 板子型号 : 三星 S3C6410 基于ARM11, 指令集基于arm6指令集; 为毛不是 Cortext A9的板子; 烧 ...
随机推荐
- easyui webuploader 文件上传演示
webuploader 上传首页 webuploader 上传前页面 webuploader 上传中页面 图就不上传了,状态会编程上传中 webuploader 已上传页面
- python函数值传递还是引用传递
c/c++中有值传递引用传递的区别.但是python中是值传递还是引用传递呢?首先看python中对变量的定义 "python中变量是指向某个内存的, 而内存中的内容是不可变的." ...
- 用Java开发50个棋类游戏
眼下已经开发完了两个 1A2B 24点 打算开发以下的.直接在QQ上玩. QQ机器人已经有了.我们直接写业务即可.有兴趣的參与.机器人婷婷体验群 Java技术交流 207224939 四棋 小枪大炮 ...
- Jmeter技巧
Jmeter参数化的4种方法 用Jmeter测试时包含两种情况的参数,一种是在url中,一种是请求中需要发送的参数. URL中的参数,如:http://blog.da-fang.com/index.p ...
- 第二十七篇:Windows驱动中的PCI, DMA, ISR, DPC, ScatterGater, MapRegsiter, CommonBuffer, ConfigSpace
近期有些人问我PCI设备驱动的问题, 和他们交流过后, 我建议他们先看一看<<The Windows NT Device Driver Book>>这本书, 个人感觉, 这本书 ...
- train_action
# 导入数值计算模块 import numpy as np import tensorflow as tf # 创建计算会话 sess = tf.Session() # 生成数据,创建占位符和变量A ...
- HDU5806 NanoApe Loves Sequence Ⅱ
NanoApe Loves Sequence Ⅱ Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/131072 K (Ja ...
- sql%found sql%notfound sql%rowcount sql%isopen
原文引入:http://blog.csdn.net/mh942408056/article/details/6949325 sql%found sql%notfound sql%rowcount sq ...
- oracle type类型
转载 http://blog.sina.com.cn/s/blog_6cfb6b090100ve92.html 转自网络,具体用法我会再细化 1.概念 方法:是在对象类型说明中用关键字 MEM ...
- flask g对象
g对象 一次请求中使用 下面用redirect重定向,不是同一次请求了 g:global 1. g对象是专门用来保存用户的数据的. 2. g对象在一次请求中的所有的代码的地方,都是可以使用的. 使用 ...