
#第九届立创电赛#便携式多功能助手
简介
集成多种传感器的数据采集与显示系统,基于LVGL图形库实现用户界面,提供高效、直观的数据展示和操作体验。系统涵盖温湿度、方位角、气压、VOC浓度检测,并具备热成像功能
简介:集成多种传感器的数据采集与显示系统,基于LVGL图形库实现用户界面,提供高效、直观的数据展示和操作体验。系统涵盖温湿度、方位角、气压、VOC浓度检测,并具备热成像功能开源协议
:GPL 3.0
描述
* 1、项目功能介绍
** 主要功能**
1. 温湿度测量
2. 方位角测量
3. 气压与海拔计算
4. VOC浓度检测
5. 热成像功能
用户界面设计
未来扩展功能
热成像在LVGL显示功能(未来计划)

系统框图
* 2、项目属性
首次公开,未曾在比赛中获奖
* 3、开源协议
GPL3.0开源
*4、硬件部分
** 硬件设计**
MCU选型:
- 明确项目需求:如时钟,内存等。STM32F411CEU6作为主控芯片,其具备512KB Flash和128KB RAM
- 明确项目所需的IO和外设
因本项目界面采用LVGL来进行编写,因此对于主控的内存有一定要求,此次选取,完全满足需求,为了更好的适配热成像功能,本次采取增设外部FLASH来存储图片芯片选型为W25Q128
PCB设计:
对于本设计,没有高速信号,也没有高精度采样场合,更没有大电压的走线,因此对Layout,无需进行特殊的手段处理,满足基本走线规范即可。
1.充电电路设计与选型
对于便携式设备来说,一直连接USB接口显然是不合适的,如果选取干电池,那么体积和重量无疑也会增加,并且无法充电,因此设计采用锂电池,并设计了电路选择和充电电路
对于充电电路,选取常见的TP4056,这款芯片设计简单,价格便宜非常适合与小型化设备的开发中,但是它也有一个非常明显的问题,就是发热比较严重,因此需要对充电电流进行限制和选择,经过多次的设计验证后发现,对于充电电流以0.2A为好,虽然会降低充电速度但是至少发热不在明显。
2.电源选择设计
采用MOS管来进行切换,一般锂电池电压为4.2V左右,当锂电池接入时usb没有接入时,锂电池流过Q1的体二极管压降,此时源极电压为3.5V,所以此时Pmos导通,体二极管短路,源极电压4.2V。
当usb接入时,Q1的栅极为5V,此时漏极电压为4.2V,而USB经过二极管压降为4.7V也就是此时源极电压,Pmos不导通。对于Q2,Q2的源极此时可能是4.7或者4.2V,而此时的栅极接到了开关上,如果开关断开,那么此时Q2不导通,开关闭合则导通供电(为什么要采用两个二极管?看起来帅气)
3.降压电路设计
此为芯片整体3V3电源
此为心率传感器1V8电源
*5、软件部分
** 软件设计**
软件架构如图所示:
系统流程框图如图所示:
对于编写程序,需要养成良好习惯,而非是想到哪里写到哪里,全局变量满天飞,整篇代码中充满了0和1等定义,这样编写的代码,可读性极差且逻辑非常混乱,不易于维护和排错,因此在设计程序之前,设计好程序的流程以及架构才是代码水平提升的关键。
传感器驱动:
设计采用软件IIC驱动,对于传感器按照数据手册对应的时序和寄存器编写命令即可。如SGP40数据手册:
对于软件IIC,在设计中将EEPROM和SERSOR的区分开了,因此在编写程序时候,采用结构体的框架来编写,这样只需要一份IIC的代码
在使用FreeRtos时,创建不同任务的信号量,需要注意优先级问题,对于执行任务时,IIC代码需要加入互斥锁,在每次执行时,调用互斥锁。
按键和WIFI:
对于按键检测,如果采用延时死等的方式,非常不可取,尤其是图形界面和多任务系统中,因此在此处介绍状态机,将按键的多种时态表述成为多种状态,对于每种状态进行处理.
其中获取系统运行时间,在系统中断或者定时器中断中获取即可。wifi同理
LVGL:
因采用了FreeRtos,因此对于LVGL来说虽然支持操作系统,但是存在线程不安全问题,对于一些操作需要注意,而移植LVGL到Rtos中也非常简单,只需要将LVGL当成一个任务创建即可:
在任务中创建while(1)循环,来调度LVGL计时器即可。
如果遇到LVGL卡死的情况,基本就是内存泄露的问题,因此对于界面管理,采用栈的操作是不错的方式,入栈界面指针。
电池驱动:
电池电量通过ADC获取,然后数据进行软件滤波,滤波算法采用中位值滤波。
电池开路电压的容量关系:如下所示,对于恒流放电,其对应关系相应减去0.15左右即可
100%----4.20V 40%-----3.79V
90%-----4.06V 30%-----3.77V
80%-----3.98V 20%-----3.74V
70%-----3.92V 10%-----3.68V
60%-----3.87V 5%------3.45V
50%-----3.82V 0%------3.00V
但对于电量采集,随着使用时间的增加,比例一定会失调,因此,采取分段设计充电状态,以设备的实际功耗,设置对应挡位
如何计算?对于片上ADC,采样最大3.3V,对应0xfff,所以计算公式:(3.3/0xfff)*V*(分压)。需要注意的是,采取中位值滤波,需要去掉头尾,因为要对数据不够三个的情况进行处理,相应伪代码:if(s_Num < 3) { V = g_adcVal[0] }
中位值平均滤波
最后电池管理分为两个状态,没有充电和正在充电的状态,需要分开处理,并且由于在非开路情况下,电池电压会有波动,因此我们需要控制电池上述的状态中不能回升,即未充电时,数值只可以下降不可以上升,反之同理。
总结:
参加了两期训练营了,分别是泰山派和示波器,感觉收获满满。立创的工程师们非常专业,整个学习和参加过程也清晰流畅。之前因为科研任务繁重,一直没时间进行独立的创造,基本上就是复刻,没进行独立的设计。这次趁着暑假的小假期,碰巧又遇到了训练营,这不的毫不犹豫地加入。
本设计整体比较简单,但是有一些地方也有一定的难度,比如热成像的显示框架,和尚未实现的心率传感器,其数据需要进行FIR滤波算法的处理还需要各种舍弃和前移等操作,让人头大,暂且搁置。还有对于MQTT协议,虽然操作比较简单,但是本次训练营时间有限(我要放假了),准备对下一版在重新构造界面时,在完成这个模块的实现。
问题:本以为使用SPI+DMA可以对热成像的刷新率进行一些提升,但是刷新还是比较慢,因此最好采用8080并口的屏幕。此外还没有成功实现LVGL和热城乡的结合,基本想法就是采用文件系统然后去刷新图片,不知道是否可行,待下段时间进行研究一下。
最后,感谢立创提供的支持,和立创的工程师们提供的帮助,这次训练营让我学到了很多,未来,我会继续努力,不断提升自己的技能水平。
* 6、演示您的项目并录制成视频上传
图1:插上电池后,电池指示变化
图2:热成像
图3:温湿度对比
视频要求:请横屏拍摄,分辨率不低于1280×720,格式Mp4/Mov,单个视频大小限100M内;
视频标题:立创电赛:{项目名称}-{视频模块名称};如立创电赛:《自动驾驶》-团队介绍。
设计图

BOM


评论