TencentOS tiny危险气体探测仪产品级开发

简介: TencentOS tiny危险气体探测仪产品级开发

项目展示效果:


项目开源仓库:

https://gitee.com/morixinguan/tencent-os-tiny-hazardous-gas-detector.git


640.png

欢迎大家clone。


前面我们分享了几篇文章:


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


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


表驱动+状态机法AD传感器驱动检测框架


有关版本等信息的重要性(以STM32产品开发为例)


这几篇文章都跟最终要达到的效果关联很大,但是功能并没有完善,今天分享的这个总算是有点像产品的样子了,但无奈硬件资源有限,无法完成太多功能,但我还是希望有朝一日,我能利用我身边的资源把它做成一个公模开源的手持式危险气体探测仪,并继续完善优化软件逻辑以及产品功能,甚至会加入一些标准化的东西(国标、行标、企标),让它看起来真正的像一个产品,并且希望有机会能够量产,帮助更多的工程师入门。

1、软件组成

1.1、软件架构图

640.png

1.2、软件框架图

1.2.1 整体框架图

640.jpg

1.2.2 核心软件框架

菜单部分以及传感器部分都是基于表驱动+状态机的方式实现:

640.png

640.png

1.3、相对于之前发布文章的功能差异

  • 优化UI界面
  • TencentOS tiny加持
  • 完成记录及记录逻辑
  • 完成阈值设置逻辑
  • 完成报警设置逻辑
  • 完成调试模式逻辑
  • 完成仪器信息查看

1.3.1 优化UI界面

   

1.3.2 TencentOS tiny加持

640.png

640.png

由于有TecentOS tiny RTOS的加持,使得我们编程的行为习惯不能像裸机那么随便了,所以,在多个任务并行的过程中,在一些临界区资源的地方必须要加上调度锁,以防止线程切换的过程中产生一些乱象,比如LCD显示接口,但凡是需要显示的地方,都要做好保护,如果没有做好保护,那你可能会看到类似如下的现象:

640.png

明明我的软件代码编写的逻辑就没有在这个地方做显示,为啥突然有个莫名其妙的色块产生??这就是因为任务发生切换导致显示的错乱现象;简单的可能是这样的现象,严重的话产品直接就死机了。那么如何加调度锁呢?

640.png

例如,给显示一个ASCII码字符串的地方加上调度锁:

/**
 * @brief  显示一个ASCII码字符串
 * @param   x,y  显示起始坐标
 * @param   str  需要显示的字符串
 * @param   size 字体大小(支持16/24/32号字体)
 * @return  none
 * @note  1. 需要font.h字库文件的支持
 *      2. 超过指定width不显示超过的字符
 */
void LCD_ShowCharStr(uint16_t x, uint16_t y, uint8_t max_width, char* str, uint16_t back_color, uint16_t font_color, uint8_t font_size)
{
  //锁定系统调度
 tos_knl_sched_lock();
 max_width += x;
 while((*str <= '~') && (*str >= ' ')) //判断是否非法字符
 {
   if(x >= max_width)
   {
     //x方向越界,结束
     break;
   }
   LCD_ShowChar(x,y,*str,back_color, font_color,font_size);
   x += font_size / 2;
   str++;
 }
  //解锁系统调度
 tos_knl_sched_unlock();
}

加调度锁的方法,即是在函数入口处加上tos_knl_sched_lock,在函数出口的地方tos_knl_sched_unlock解除调度锁,这样就完成了一个显示过程的保护,当然,在对SD卡文件系统读写参数的过程中,我们也需要做好保护,比如:

/*用户参数保存处理*/
void User_Para_Save_Process(void)
{
    //锁定系统调度
    tos_knl_sched_lock();
    /*write config.ini parse*/
    retUSER_SYS_CONFIG = f_open(&USER_SYS_CONFIG_File, SETTING_PARA, FA_OPEN_EXISTING | FA_WRITE);
    if(FR_OK != retUSER_SYS_CONFIG)
    {
        printf("iniparser: cannot open %s\n", SETTING_PARA);
        return ;
    }
    printf("参数设置保存成功\n");
    iniparser_dump_ini(Config_ini, &USER_SYS_CONFIG_File);
    f_close(&USER_SYS_CONFIG_File);
    iniparser_freedict(Config_ini);
    Load_Config_ini_File();
    //解锁系统调度
    tos_knl_sched_unlock();
}

如果没有做好保护,当你在写入参数到文件系统的时候,此时任务发送了切换,那么很容易就会导致写入错乱进而跳转到:

/**
  * @brief This function handles Hard fault interrupt.
  */
void HardFault_Handler(void)
{
    /* USER CODE BEGIN HardFault_IRQn 0 */
    /* USER CODE END HardFault_IRQn 0 */
    while (1)
    {
        /* USER CODE BEGIN W1_HardFault_IRQn 0 */
        /* USER CODE END W1_HardFault_IRQn 0 */
    }
}

系统有时候就莫名其妙的卡死了;以上这些都是我个人对于RTOS的学习和使用经验,如有说得不合理地方,欢迎大佬指点迷津。

1.3.3 记录及记录逻辑


记录存储相关数据结构如下:

/*文件名大小限制*/
#define FILE_NAME_LEN 20
/*检测数据大小限制*/
#define DETECT_DATA_LEN 50
/*一个文件存储检测记录的条数*/
#define DETECT_DATA_INDEX 100
typedef struct 
{
    int serial_number ;      //序号
    int year ;               //2019-
    uint8_t month ;          //0-12
    uint8_t day ;            //0-31
    uint8_t hour ;           //0-24
    uint8_t minute ;         //0-59
    uint8_t detect_result ;  //检测结果
    /*当前位于文件的哪一行*/
    int Current_Line;
    /*当前文件编号查询索引*/
    int file_number_index ;
    /*当前流水号,每次记录初始化的时候会赋值一次*/
    int Current_Serial_Number ;
} Record_Data;
extern Record_Data csv_file_record ;

记录逻辑采用分文件csv存储,将csv文件序号存放在ini文件中,然后通过文件序号快速定位到具体是哪个csv文件的哪一行,该策略支持10000条数据实时查询并能保证流程不卡顿,已在相关产品中量产应用。

1.3.4 完成阈值设置逻辑


640.png

该设置逻辑分为三档,分别是低、中、高灵敏度,分别对应1000、300、200三档阈值设定,该灵敏度对应的阈值与检测逻辑相关联,对应逻辑关系如下:

640.png

640.png

阈值设置是系统配置参数的其中一项,数据结构如下:

640.png

当SD卡中如果没有配置文件,它有一个默认的结果,用于表示它开机的状态,这个状态是存储在INI文件里的:

640.png

1.3.5 完成警设置逻辑


它是系统配置参数的其中一项,数据结构如下:

640.png

当SD卡中如果没有配置文件,它有一个默认的结果,用于表示它开机的状态,这个状态是存储在INI文件里的:

640.png

该设置逻辑分为开关,当打开报警,则检测逻辑跳转到危险时,蜂鸣器会发出响声,否则不会发出响声,它的过程是通过一个标志volume进行控制的。

640.png


1.3.6 完成调试模式逻辑


它是系统配置参数的其中一项,数据结构如下:

640.png

当SD卡中如果没有配置文件,它有一个默认的结果,用于表示它开机的状态,这个状态是存储在INI文件里的:

640.png

该设置逻辑分为开关,当打开调试,则检测逻辑中显示烟感值,否则不会显示烟感值,它的过程是通过一个标志debug_flag进行控制的。

640.png

1.3.7 完成仪器信息查看



这个功能在上一篇文章其实已经提及了,这里就不再重复说了,详细请看上一篇推文


有关版本等信息的重要性(以STM32产品开发为例)

640.png

2、其它

另外要注意的地方,SD卡内存放的UI为显示界面一些图标存放的地方,其它的文件由软件自动生成:


  • Para.ini(配置文件)
  • 640.png
  • BearPi_Log0.csv(检测记录存储文件)

640.png

640.png

本节代码已同步到码云的代码仓库中,获取方法如下:

1、新建一个文件夹

640.png

2、使用git clone远程获取文初的代码仓库

项目开源仓库:

https://gitee.com/morixinguan/tencent-os-tiny-hazardous-gas-detector.git


640.png

640.png

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

640.png

往期精彩

C语言三剑客之《C专家编程》一书精华提炼


C语言三剑客之《C陷阱与缺陷》一书精华提炼


有关版本等信息的重要性(以STM32产品开发为例)


移植uc/OS-III最新版到小熊派开发板(STM32L431)

目录
相关文章
|
移动开发 数据格式 XML
Http协议中的Header与Body
Http协议中的Header与Body Header的每行最后要加\r\n Header与Body之间要用\r\n隔开 Body后无需加\r\n ACSII码中 '\n' 10 换行 '\r' 13 回车 也可以表示为'\x0a'和'\x0d'.(16进制) 示例:HTTP开始部分为header,部分为body。
3149 0
|
5月前
|
人工智能 运维 安全
2026年阿里云计算巢部署OpenClaw(原Clawdbot)零基础喂饭级教程
在2026年AI Agent全民普及的浪潮中,OpenClaw(原Clawdbot,曾用名Moltbot)凭借开源免费、功能强大、插件丰富的核心优势,成为零基础用户与中小企业搭建专属AI助手的首选工具。这款由奥地利开发者主导的开源项目,截至2026年2月,GitHub星标已突破18.6万,Fork数超3.2万,是年度增长最快的开源AI自动化项目之一。它并非传统的聊天机器人,而是一款具备“思考+执行”能力的AI自动化代理框架,可通过自然语言指令完成办公自动化、网页抓取、代码开发、内容创作等各类任务,搭配ClawHub技能市场的3000+款模块化技能,能轻松适配个人办公、团队协作、业务提效等全场景
522 8
|
28天前
|
供应链 安全 Linux
2026 年 5 月网络安全威胁复盘:Linux 漏洞、防御工具 0day 与供应链风险治理研究
本文剖析2026年5月全球网络空间五大高危威胁:Linux内核集中爆发CopyFail等漏洞、防御软件自身0day缺陷、路由器规模化僵尸网络、开发工具供应链投毒、高级精准钓鱼攻击。基于真实事件与PoC代码,提出覆盖终端、网络、供应链、人员的一体化主动防御框架,助力关键基础设施提升复合攻击抵御能力。(239字)
240 2
|
3月前
|
存储 文件存储 Docker
用 Docker 一键部署 Filestash:打造你的全能 Web 文件管理器
还在为不同存储协议装一堆客户端?SFTP、FTP、WebDAV、S3、云盘……每次都要切换工具,传个文件像“打地鼠”?今天给大家安利一个神器——Filestash,一个开源的 Web 文件管理器,把所有存储协议都收进浏览器里,用 Docker 几分钟就能搭好,运维、开发、日常用都超爽!
524 0
用 Docker 一键部署 Filestash:打造你的全能 Web 文件管理器
|
3月前
|
传感器 数据采集 物联网
别再瞎选了!LoRa、Wi-Fi、蓝牙3种无线技术选型指南,看完再也不踩坑
LoRa、Wi-Fi、蓝牙看起来都能无线传输,实际用起来天差地别,选错了轻则项目延期,重则直接推倒重来。今天就用最通俗易懂的方式讲清三者的核心差异,帮你一次性搞懂不同场景该怎么选。
|
机器学习/深度学习 人工智能 网络架构
Transformer原理解析——一种Open AI和DeepMind都在用的神经网络架构
Transformer模型是一种日益流行的神经网络结构。它最近被OpenAI用于他们的语言模型中。与此同时,近期也被DeepMind用于它们的程序“星际争霸”中击败了一名顶级职业星际玩家。 Transformer模型的开发是为了解决序列转换及神经机器翻译问题。
9711 0
|
4月前
|
数据可视化
Visual Basic 6.0 开发安装教程:详细步骤+注意事项
Visual Basic 6.0 是微软推出的经典可视化编程语言,支持事件驱动、面向对象开发。本文详述其本地安装全流程:从网盘下载、解压、管理员运行SETUP,到路径设置(禁用中文)、典型安装及快捷方式创建,助你快速部署开发环境。(239字)
1072 2
|
C#
WPF自定义TabControl样式
原文:WPF自定义TabControl样式 WPF自定义TabControl,TabControl美化 XAML代码: ...
5232 0
|
存储 SQL Windows
Excel 表格怎么秒变 latex 格式?
写论文很多小伙伴会使用 latex 作为排版工具,但是实验数据结果却存储在 excel 中。怎么高效的将 excel 中大篇幅的数据一键导入到 latex 中呢?这个问题肯定困扰很多科研人员,今天小编给你推荐一个常用的表格转换网站。
1102 0
Excel 表格怎么秒变 latex 格式?
|
机器学习/深度学习 人工智能 并行计算
PyTorch 深度学习实战 | 基于 ResNet 的花卉图片分类
本期将提供一个利用深度学习进行花卉图片分类的案例,并使用迁移学习的方法解决训练数据较少的问题。图片分类是根据图像的语义信息对不同的图片进行区分,是计算机视觉中的基本问题,也是图像检测、图像分割、物体跟踪等高阶视觉任务的基础。在深度学习领域,图片分类的任务一般基于卷积神经网络来完成,如常见的卷积神经网络有 VGG、GoogleNet、ResNet 等。而在图像分类领域,数据标记是最基础和烦琐的工作。有时由于条件限制,往往得不到很多经过标记的、用于训练的图片,其中一个解决办法就是对已经预训练好的模型进行迁移学习。 本文是以 ResNet 为基础,对花卉图片进行迁移学习,从而完成对花卉图片的分类任
1284 0
PyTorch 深度学习实战 | 基于 ResNet 的花卉图片分类

热门文章

最新文章