基于事件型表驱动法菜单框架之小熊派简易气体探测器实战项目开发(上)

废话不多说,先上视频,配合个人简单的讲解,看看具体的展示效果:

关于表驱动,之前也分享过一篇文章:

C语言表驱动法编程实践(精华帖,建议收藏并实践)

两年前,我也曾在Github上开源过一个基于结构体数组的表驱动菜单框架,如下:

这个框架应付一些与按键、LCD交互的案子可以说是非常简单且高效,所以这些年,凡是自己副业或者主业公司做的任何一个项目只要涉及到类似的思想,那么我基本都会沿用这套框架来做,可以说这套框架已经给我挣了不少项目钱了;收获还是蛮大的!Github上还放置了我当时写的PPT,是我当时根据项目大致的需求写的,但是由于产品需求的不确定性,老是变来变去(说实话我真的非常讨厌这样子,以前很讨厌,现在极度讨厌,因为没有明确的需求却还要干着低效率且没有意义的活,简直是浪费资源&&浪费时间&&浪费生命),后面直接舍弃了这个框架,沿用最简单的思维去做,因为可能当事人他自己都不知道要做成什么样子,毕竟没有明确需求的东西不值得提复用性把它做得高逼格,所以只能用简单的思路去做了;简单的框架思维当然就没有这个好,这个PPT也就闲置下来了。当然不同的产品可以根据自己的需求定制修改,这么好用的东西难道不分享?肯定要分享啦!

总结

没有明确需求的产品,别提什么复用性和高逼格!因为那最终修修补补写出来的代码会比屎还难看!我相信你的前同事技术如果真的很菜的话,当项目需求明确且项目时间充足的时候,你甚至希望花10天时间将他的代码推倒重写也不会继续去维护他的垃圾代码。

1、当时写的PPT分享

前几天我还在世伟兄的开源群上分享了这个框架,有群友希望我用这个框架写一个小项目,于是我就突发奇思妙想,在1-2天内设计规划了这个一个课题:基于小熊派简易气体探测仪。

该项目复用了之前写小熊派例程相关的代码,至于是怎么实现的,请自行阅读代码或者翻看以前的文章了解。

2、核心框架结构

先来看下这个框架的核心数据结构与操作方法,位于该项目的menu.h、menu.c

menu.h

typedef void (*menu_op_func)(uint8_t);
typedef struct OP_STRUCT
{
 int op_menu ;         /*操作菜单*/
 menu_op_func opfun ;  /*带参数的操作方法*/
}OP_MENU_PAGE;


void Enter_Page(uint8_t index,uint8_t KeyValue);
void Menu_Select_Item(uint8_t current_index, uint8_t KeyValue);

menu.c

/*菜单操作表定义*/
static OP_MENU_PAGE g_opStruct[] = 
{
 {SLEEP_PAGE     , sleep_page_process},
 {MAIN_PAGE      , main_page_process}, 
 {TEST_PAGE      , test_page_process},
 {VERSION_PAGE   , version_info_page_process},
};

/*跳转到表所对应的页面*/
static int JUMP_Table(int8_t op , uint8_t KeyValue)
{
 assert(op >= sizeof(g_opStruct)/sizeof(g_opStruct[0]));
 assert(op < 0);
 g_opStruct[op].opfun(KeyValue);
 return 0 ;
}

/*菜单选择项*/
void Menu_Select_Item(uint8_t current_index, uint8_t KeyValue)
{
 JUMP_Table(current_index , KeyValue);
}

这个框架比网上现有的一些菜单框架好就好在它更灵活,因为它多了一个uint8_t的形参,该形参可以作为事件值进行传递,每个页面都可以响应当前收到的某个事件值然后执行相应的应用逻辑,事实上它就是这么做的。

对比下之前我发的一篇文章(开源按键组件MultiButton支持菜单操作(事件驱动型))里某个写得杂乱无章的通用菜单框架,是不是觉得我的这个更加灵活呢?当然结合这个框架,我们是否还能将MultiButton也与它绑定在一起呢?

如果您更好的优化思路或者更好的框架思想,欢迎与我一起共同学习交流分享。

3、小熊派简易气体探测器实战项目框架

项目基于开源软件定时器multi_timer进行维护管理:

  • (1)Key_Timer定时器用于按键长短按的扫描

  • (2)DataTime_Timer定时器用于实时时钟显示

  • (3)Test_Timer定时器用于核心检测逻辑实现

3.1、按键交互逻辑

其中,在主页面中,通过短按按键可以横向切换菜单项,通过短按右键可以进入菜单项,分别为:

  • 测试(核心检测逻辑)

  • 上传(未实现)

  • 版本(查看版本信息)

在不同页面中,可以根据界面提示退出回到主菜单。

在主页面中,长按左键可以让设备进入低功耗模式(关背光),继续长按左键可以点亮屏(开背光)

3.2、核心检测逻辑

其中核心检测逻辑主要由四部分组成,分别是:

  • 基准

  • 检测

  • 安全

  • 危险

基准

那么什么是基准呢?基准在这里的含义是为了判断当前传感器的状态是否稳定,能够进行检测的条件,在这里我设置的气体基准条件为阈值的1/2,阈值的定义在test_ui.h中:

#define ALARM_THRESHOLD 600 //600ppm

基准通过的条件:

当前获取的气体传感器ppm < 1/2阈值,连续计数自加超过10次,则认为此时传感器已经稳定了,这时候可以进入检测状态,当前这个次数可以通过参数设置进行调节,后续可以继续在本项目中拓展该功能。

检测

当进入检测状态以后,继续读取气体传感器的ppm值,如果在10s内,也就是进度条跑满了以后,ppm值仍小于自定义阈值,那么就跳转为安全的状态。

当进入检测状态以后,继续读取气体传感器的ppm值,如果在10s内,ppm值大于于自定义阈值连续20次,那么就跳转为危险的状态。

安全

画面显示安全,当重新按下左键即回到基准的流程。

危险

画面危险闪烁,LED报警灯以100ms频率闪烁,蜂鸣器以100ms频率交替响灭。

在测试页面任一状态下,长按左键直接显示安全,短按右键退出回到主菜单。

事实上,市面上大部分类似的仪器仪表检测产品都是差不多的实现逻辑,我们只要明白了基本原理,把整个项目功能框架搭出来,后续就可以根据实际需求进行随意拓展了。

其余功能:后续还可以做报警记录存储、数据上传到OneNet或者华为云等平台、参数设置等等,总之这个项目可拓展性非常强,这些功能将在本项目开发的下一章节持续进行拓展并分享,欢迎及时关注我的码云仓库与微信公众号文章更新。

本节代码已同步到码云的代码仓库中:

获取方法如下:

1、新建一个文件夹

2、使用git clone远程获取小熊派所有案例代码

我还将之前做的一些项目以及练习例程在近期内全部上传完毕,与大家一起分享交流:

公众号粉丝福利时刻

这里我给大家申请到了福利,本公众号读者购买小熊派开发板可享受9折优惠,有需要购买小熊派以及腾讯物联网开发板的朋友,淘宝搜索即可,跟客服说你是公众号:嵌入式云IOT技术圈 的粉丝,立享9折优惠!

往期精彩

TencentOS tiny RTOS快速入门

"结构体"和"共用体"在单片机中的妙用

记一个OLED编程中文显示函数的坑(留意变量数据类型的范围)

上海出差之行--领略外滩美景、RT-Thread总部之旅、嵌友面基、返程记录

觉得本次分享的文章对您有帮助,随手点[在看]并转发分享,也是对我的支持。

Engineer-Bruce_Yang CSDN认证博客专家 嵌入式硬件 单片机 arm开发
本科毕业于华南理工大学,现美国卡罗尔工商管理硕士研究生在读,曾就职于世界名企伟易达、联发科技等,多年嵌入式产品开发经验,在智能玩具、安防产品、平板电脑、手机开发有丰富的实战开发经验,现任深圳市云之手科技有限公司副总经理、研发总工程师。
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页