描述
<div class="document">
<h3 class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height:1.8;">1、项目功能介绍</h3>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height:1.8;"> 本作品基于瑞萨 RA6M5 微控制器,结合 OpenMV 机器视觉模块与多传感器 融合技术,构建了一套智能坐姿监测与健康管理系统。系统通过 OpenMV 摄像头实时采集用户坐姿图像,能够准确识别驼背、侧倾等不良姿势,检测精度达到 92%。当检测到异常坐姿时,系统立即通过蜂鸣器与振动马达提供触觉反馈,同时控制 RGB LED 灯带切换至红色警示状态,实现多模态实时提醒。 在环境感知方面,系统集成高精度温湿度传感器(AHT20)和数字光照传感器(BH1750),可动态监测工作环境参数。采集的环境数据通过Wi-Fi 模块3 (ESP8266)上传至云端服务器以及小程序,结合预设的舒适度阈值,自动调节智能灯具的亮度和色温,创造适宜的光环境。系统还具备久坐监测功能,采用硬件定时器记录用户静止时长,当连续坐姿保持超过1h 阈值时,触发分级报警机制,从温和的灯光提示逐步升级至强制性的振动提醒。 数据处理与分析能力是本系统的核心优势。瑞萨 RA6M5 的硬件DSP加速器显著提升了图像处理效率,使系统响应延迟控制在 200ms 以内。所有监测数据通过 TLS 加密传输至云端,在服务器端进行深度分析与可视化处理,生成包含坐姿异常次数、久坐时长分布、环境质量评估等维度的健康报告。用户可通过微信小程序查看历史数据趋势和个性化改善建议,形成完整的健康管理闭环。</p>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height:1.8;"> </p>
<h3 class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height:1.8;">2、项目属性</h3>
<hr class="horizontal-splitline normal-bold-2">
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height:1.8;">项目是首次公开,是原创,未在其他比赛中获奖,没有在学校参加过答辩。</p>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height:1.8;"> </p>
<h3 class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height:1.8;">3、开源协议</h3>
<p>本项目采用 <span class="token bold"><span class="token punctuation">**</span><span class="token content">GNU General Public License v3.0</span><span class="token punctuation">**</span></span> 开源协议。</p>
<p><span class="token list punctuation">-</span> 您可以自由使用、修改和分发本项目</p>
<p><span class="token list punctuation">-</span> 如果您分发修改后的版本,必须<span class="token bold"><span class="token punctuation">**</span><span class="token content">开源您的修改</span><span class="token punctuation">**</span></span></p>
<p><span class="token list punctuation">-</span> 必须保留原始版权声明</p>
<p><span class="token list punctuation">-</span> 详细条款请参阅 <a title="licenses" href="http://www.gnu.org/licenses/" target="_blank"><span class="token url">[<span class="token content">LICENSE</span>](LICENSE)</span></a> 文件</p>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height:1.8;"> </p>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height:1.8;"> </p>
<h3 class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height:1.8;">4、硬件部分</h3>
<hr class="horizontal-splitline normal-bold-2">
<p>4.1 硬件整体介绍</p>
<p><img style="margin-left:auto;margin-right:auto;" src="//image.lceda.cn/pullimage/SGqJkGiLF4KTfTXBpjXC5ZYzXv1FRxVtaA0oMtRo.png" alt="" width="680" height="382"></p>
<p align="center"> <strong>图</strong><strong> 6 </strong><strong>硬件框图</strong></p>
<p> 本系统采用模块化硬件架构设计,以瑞萨RA6M5微控制器为核心构建多模态感知与控制系统。硬件系统由控制层、采集层和执行层三个主要部分组成,各模块间通过标准电气接口实现高效数据交互。采集层包含高精度环境传感器阵列和视觉感知模块,其中AHT20温湿度传感器通过I2C接口实现环境参数监测,测量精度达到±0.3℃和±2%RH;BH1750数字光照传感器提供1-65535lux范围内的光照强度检测;HC-SR04超声波测距模块则通过脉冲触发方式实现距离探测,在2cm至400cm的有效量程内,其测距精度最高可达±3mm;Vision Board视觉模块基于瑞萨RA8D1主控芯片,通过单总线以8.8fps的帧率向主控系统传输经处理的姿态数据。</p>
<p>控制层采用瑞萨RA6M5微控制器作为核心处理单元,该芯片搭载240MHz Cortex-M33内核,具备丰富的板载资源,为系统提供强大的数据处理能力。执行层集成了三类反馈装置:机械矫正机构采用SG90舵机驱动行星齿轮组,可完成±30°范围内的精确角度调节;数据显示系统通过LCD屏幕实时呈现各类监测参数;语音提示模块基于JQ8900芯片实现MP3格式的语音播报功能,采样率为16kHz。所有执行器件均通过光耦隔离电路与主控系统连接,确保运行稳定性。</p>
<p>在通信接口方面,系统采用HC-06蓝牙模块和ESP-01s Wi-Fi模块,分别支持近场与远程无线数据连接。蓝牙模块支持蓝牙2.1+EDR协议,采用串行透传方式进行数据传输,平均工作电流约为30mA@3.3V;ESP-01s Wi-Fi模块支持802.11 b/g/n协议,可通过AT指令或串行通信进行配置与数据传输,适用于多种网络应用场景。为便于设备调试与配置,保留了SWD在线编程接口和UART指令交互端口。电源管理系统设计支持5V/2A直流供电和3.7V锂电池双供电模式,待机功耗可低至3mW。该硬件架构通过优化的射频布局与电源完整性设计,有效抑制Wi-Fi与蓝牙共存的同频干扰,确保了无线模块与主控单元间的稳定通信,为系统的可靠运行奠定了坚实的硬件基础。</p>
<p> </p>
<p>4.2 机械设计介绍</p>
<table style="border-collapse:collapse;width:96.3512%;height:393px;">
<tr style="height:393px;">
<td style="width:48.3099%;height:393px;"><img style="margin-left:auto;margin-right:auto;" src="//image.lceda.cn/pullimage/8VYWB08Z6mqqI7vj5qDhViBlzEriRllAbAsJhxhq.jpeg" alt="" width="690" height="647"></td>
<td style="width:48.3099%;height:393px;"><img style="margin-left:auto;margin-right:auto;" src="//image.lceda.cn/pullimage/SwVci2w8PMGMCs173f3RrSw2g77Xv5CkNekWc213.jpeg" alt="" width="730" height="690"></td>
</tr>
</table>
<p align="center"> </p>
<p align="center"><strong>图</strong><strong>8 </strong><strong>机械结构部分示意图</strong></p>
<p> 左图是我们机械系统的支撑部分,最下面使用螺杆调节,垫片部分进行固定,通过旋转下面的固定螺母,调整垫片与支撑部分的距离,方便适应不同厚度的桌子,接着是固定的主体部分,中部有按钮可控制机架的升降,满足不同身高的要求,接着最上面的部分是支撑头部的地方,在此基础上,我们在支撑部分加入了舵机和矫正板(右图),使得用户在头部姿势不正确时被OpenMV检测到,并通过机械结构(矫正板)对用户的姿势进行矫正。</p>
<p> </p>
<p>4.3 电路各模块介绍</p>
<p> 基于OpenMV的视觉检测模块开发,根据摄像头采集画面,使用中值滤波,以及二值化掩码,将图像二值化,利用OpenMV中的find_blobs方法,以及使用面积大小,宽高比来限制查找到的blob块,实现精确的人体头部识别,并使用blob对象的rotation方法获得偏转值,以此实现对头部的追踪以及判定。</p>
<p> 通过超声波测距模块与视觉检测模块的协同检测,解决了单纯图像识别难以检测身体前后位置的弱点,从而能对更多不良坐姿进行识别检测和实时矫正。</p>
<p> 控制系统开发,将中断任务放在主循环中,使用非阻塞式的中断任务调度,防止中断函数占用CPU过多资源,实现多任务和谐平稳运行。</p>
<p> 智能调光模块:基于光照传感器获取当前环境的光照值,并利用互补算法获取当前环境的最佳光照值,利用脉宽调制技术,输出PWM波形,控制台灯,以达到最佳的光照环境。</p>
<p> 温湿度模块:基于温湿度模块,获取当前环境的温度以及湿度,显示到LCD屏幕上,提醒用户环境的温湿度,提醒及时加减衣物,以及注意保湿,为坐姿矫正系统提供舒适的环境保障。</p>
<p> 通信模块:系统利用HC-06蓝牙模块与手机建立近场连接,实时上传坐姿数据至手机端软件;同时,通过ESP-01S Wi-Fi模块将数据同步至云平台,支持多端访问与长期存储。手机软件对接收到的数据进行分析与可视化处理,自动生成直观的可视化报告,用户可通过App或小程序实时查看坐姿状态与历史趋势,从而实现坐姿矫正数据的远程监测与个性化健康管理</p>
<p> RTC模块:使用RTC模块进行现实时间的显示,将数据在LCD屏幕中显示出来,与坐姿矫正提醒系统联动,实现定时健康提醒功能。</p>
<p> 机械结构设计,运用SolidWorks进行三维建模和运动仿真,确定最佳传动比和力矩参数。</p>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt pap-left-indent-1.6em" style="line-height:1.8;"> </p>
<h3 class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height:1.8;">5、软件部分</h3>
<hr class="horizontal-splitline normal-bold-2">
<p>5.1 软件整体介绍</p>
<p> 本系统整体软件框图如上图所示,RA6M5作为主控芯片,负责接收外设提供的数据,统筹处理数据,输出数据处理结果。</p>
<p align="center"><img src="//image.lceda.cn/pullimage/EwUrcrV2qY1DJRBYwpgPDC7zG8QY6n5zeaxjcBjR.png" alt="" width="775" height="531"></p>
<p align="center"><strong>图</strong> <strong>12 </strong><strong>软件系统整体框图</strong></p>
<p> 其中输入部分用到的外设主要有:基于瑞萨RA8D1,搭载OpenMV的Vision board,负责视觉检测人体坐姿,并在检测到坐姿异常时,向主控芯片RA6M5发送信号;光照传感器BH1750,负责检测环境光照,并将光照值通过IIC通信发送到主控芯片;温湿度传感器AHT20,负责检测环境温湿度,通过IIC与主控芯片通信;超声波模块HC-SR04,负责获取用户与装置之间的距离,用于判断用户是否处在合适的距离下,以此检测用户的前后姿态是否出现问题;现实时钟RTC负责记录现实的时间信息,并将时间信息保存在主控芯片上,提供准确的时间信息;板载系统定时器,负责准确定时,实现喝水以及久坐提醒,实行健康守护。</p>
<p> 输出部分用到的重要外设有:SG90舵机,负责对不正确的坐姿进行机械矫正;LED小灯,负责在光照传感器检测到环境光照变化时,智能调光,使得使用者能够处于最佳的光照环境中,保护视力健康;ST7796LCD屏幕,负责进行数据显示,将温湿度,关照,以及时间信息显示到屏幕上,实现直观可视化监测;JQ8900语音芯片,负责在久坐,喝水提醒计时器溢出时(系统定时器溢出中断时),播报语音提醒,并且在坐姿不正确时播报语音配合机械结构主动矫正,达到双重提醒的目的;HC-06蓝牙模块,通过蓝牙透传,将数据上传到做好的APP上面,进行数据的储存以及提醒,并统计用户的体验数据,帮助更好地做到姿态矫正。</p>
<p> </p>
<p>5.2 软件各功能模块介绍</p>
<table>
<tr>
<td width="576">
<p>软件代码部分</p>
</td>
</tr>
<tr>
<td width="576">
<p align="left">#include "hal_data.h"</p>
<p align="left">#include "sensor.h"</p>
<p align="left">#include "esp01.h"</p>
<p align="left">#include "stdio.h"</p>
<p align="left">FSP_CPP_HEADER</p>
<p align="left">void R_BSP_WarmStart(bsp_warm_start_event_t event);</p>
<p align="left">FSP_CPP_FOOTER</p>
<p align="left"> </p>
<p align="left"> extern uint8_t water_flag, sit_flag;</p>
<p align="left"> </p>
<p align="left">void hal_entry(void)</p>
<p align="left">{</p>
<p align="left"> </p>
<p align="left"> //初始化模块</p>
<p align="left"> uint32_t CT_data[2];</p>
<p align="left"> int c1, t1;</p>
<p align="left"> uint8_t led_light = 0;</p>
<p align="left"> float light;</p>
<p align="left"> Sensor_Init();</p>
<p align="left"> Sit_timer_Init();</p>
<p align="left"> Water_timer_Init();</p>
<p align="left"> </p>
</td>
</tr>
</table>
<p> </p>
<p> 以上代码是初始化部分,包含头文件引入,”hal_data.h”是瑞萨Smart Configurator 配置数据的头文件,”sensor.h”是所用到的所有传感器以及一些系统定时器的初始化头文件,”esp01.h”是WIFI芯片esp01芯片通信的头文件,”stdio.h”是c语言标准输入输出头文件。</p>
<p> extern uint8_t water_flag, sit_flag;是两个外部返回变量,用于记录喝水,久坐提醒定时器的中断标志位,用于在主函数中完成本该在中断回调函数中完成的任务。hal_entry()是主函数入口,函数开始执行是一些值的定义以及喝水,久坐定时器的初始化, CT_data[2]是温湿度读取时的缓冲区数组,其中CT_data[0]是湿度数据,CT_data[1]是温度数据。t1,c1分别是由CT_data[2]计算得出的真实温度,湿度数据。led_light是小灯的PWM波的占空比,用于后续智能调光,light是为了后续储存光照传感器传递的光照值的变量,Sensor_Init()是包含了所有传感器的初始化函数,Sit_timer_Init(),Water_timer_Init()是喝水,久坐提醒定时器的初始化函数。</p>
<p align="left"> </p>
<table>
<tr>
<td width="576">
<p>软件代码部分</p>
</td>
</tr>
<tr>
<td width="576">
<p align="left">while(1){</p>
<p align="left"> </p>
<p align="left"> //坐姿检测</p>
<p align="left"> POSE_case();</p>
<p align="left"> </p>
<p align="left"> </p>
<p align="left"> </p>
<p align="left">void POSE_case(void)</p>
<p align="left">{</p>
<p align="left"> bsp_io_level_t statue;</p>
<p align="left"> R_IOPORT_PinRead(&g_ioport_ctrl,BSP_IO_PORT_04_PIN_00,&statue);</p>
<p align="left"> if(statue==BSP_IO_LEVEL_HIGH){</p>
<p align="left"> duoji_SetAngle(90);</p>
<p align="left"> SysTick_Delay(1,S);</p>
<p align="left"> R_GPT_DutyCycleSet(&PWM_timer_ctrl, 0, GPT_IO_PIN_GTIOCA_AND_GTIOCB);</p>
<p align="left"> }</p>
<p align="left"> </p>
<p align="left">} </p>
<p align="left"> </p>
</td>
</tr>
</table>
<p> 以上是坐姿检测的代码,由引脚P400获得电平信息,高电平生效,生效时会驱动舵机矫正姿势,并且延时1s后将舵机驱动引脚占空比调为0(使舵机失能)。</p>
<p> </p>
<table>
<tr>
<td width="576">
<p>软件代码部分</p>
</td>
</tr>
<tr>
<td width="576">
<p align="left">//喝水提醒(不使用中断,防止打断主程序,非阻塞式中断)</p>
<p align="left">if (water_flag) {</p>
<p align="left"> R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_02_PIN_07, BSP_IO_LEVEL_HIGH);</p>
<p align="left"> SysTick_Delay(300, MS);</p>
<p align="left"> R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_02_PIN_07, BSP_IO_LEVEL_LOW);</p>
<p align="left"> </p>
<p align="left"> water_flag = 0;</p>
<p align="left">}</p>
<p align="left">//久坐提醒(使用查询,不使用中断,防止打断主程序)</p>
<p align="left">if (sit_flag) {</p>
<p align="left"> R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_02, BSP_IO_LEVEL_HIGH);</p>
<p align="left"> SysTick_Delay(300, MS);</p>
<p align="left"> R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_02, BSP_IO_LEVEL_LOW);</p>
<p align="left"> </p>
<p align="left"> sit_flag = 0;</p>
<p align="left">}</p>
<p align="left"> </p>
<p align="left"> </p>
<p align="left">void water_callback(timer_callback_args_t *p_args)</p>
<p align="left">{</p>
<p align="left"> water_flag=1;</p>
<p align="left">}</p>
</td>
</tr>
</table>
<p> 以上是喝水久坐提醒的代码,两个代码很相似,以喝水提醒的代码为例子,首先会判断喝水提醒定时器的中断溢出标志water_flag是否为1(water_flag=1则认为触发了中断),中断触发后,并不是在中断回调函数中进行处理,而是在中断回调函数中将标志位置1,并将处理代码放在主函数中,避免因为中断处理时间太长而影响主函数进程,进入喝水提醒函数后,首先将引脚P102拉高(初始化为低电平),后经继电器导通,将语音芯片引脚接地,触发语音提醒,延时300ms后,将引脚P102恢复为低电平。</p>
<table>
<tr>
<td width="576">
<p>软件代码部分</p>
</td>
</tr>
<tr>
<td width="576">
<p align="left">//RTC获取时间并显示到LCD</p>
<p align="left">LCD_ShowChinese(0, 0, "日期", BLUE, WHITE, 32, 0);</p>
<p align="left">LCD_ShowChinese(0, 35, "时间", RED, WHITE, 32, 0);</p>
<p align="left">RTC_Show();</p>
<p align="left"> </p>
<p align="left">void RTC_Show(void){</p>
<p align="left"> </p>
<p align="left"> R_RTC_CalendarTimeGet (RTC.p_ctrl, &get_time);</p>
<p align="left"> LCD_ShowIntNum(80,0,get_time.tm_year+1900,4,LIGHTGREEN,WHITE,32);</p>
<p align="left"> LCD_ShowString(150,0,"-",LIGHTGREEN,WHITE,32,0);</p>
<p align="left"> LCD_ShowIntNum(170,0,get_time.tm_mon+1,2,LIGHTGREEN,WHITE,32);</p>
<p align="left"> LCD_ShowString(200,0,"-",LIGHTGREEN,WHITE,32,0);</p>
<p align="left"> LCD_ShowIntNum(220,0,get_time.tm_mday,2,LIGHTGREEN,WHITE,32);</p>
<p align="left"> LCD_ShowIntNum(80,40,get_time.tm_hour,2,RED,WHITE,32);</p>
<p align="left"> LCD_ShowString(110,40,":",RED,WHITE,32,0);</p>
<p align="left"> LCD_ShowIntNum(130,40,get_time.tm_min,2,RED,WHITE,32);</p>
<p align="left"> </p>
<p align="left">}</p>
<p align="left">tatic rtc_time_t set_time =</p>
<p align="left"> { .tm_sec = RTC_SEC_SET, //秒(0-59)</p>
<p align="left"> .tm_min = RTC_MIN_SET, //分(0-59)</p>
<p align="left"> .tm_hour = RTC_HOUR_SET, //小时(0-24)</p>
<p align="left"> .tm_mday = RTC_MDAY_SET, //日(0-30)</p>
<p align="left"> .tm_wday = RTC_WDAY_SET, //星期</p>
<p align="left"> .tm_mon = RTC_MON_SET - 1, //月份,0~11代表11~12月</p>
<p align="left"> .tm_year = RTC_YEAR_SET-1900, //年份</p>
<p align="left"> };</p>
</td>
</tr>
</table>
<p> 以上是RTC时钟的显示代码,前两个LCD_ShowChinese函数显示了中文日期和时间,RTC_Show是封装过后的函数,原型在图中,首先由R_RTC_CalendarTimeGet函数将时间信息赋值给结构体get_time,get_time的结构如图中rtc_time_t所示,获得信息后,依次在LCD屏幕中进行显示。</p>
<p> </p>
<table>
<tr>
<td width="576">
<p>软件代码部分</p>
</td>
</tr>
<tr>
<td width="576">
<p align="left">//光照显示</p>
<p align="left"> </p>
<p align="left">light = Med_Bh1750_GetLightIntensity();</p>
<p align="left">LCD_ShowChinese(0, 70, "光照", RED, WHITE, 32, 0);</p>
<p align="left">LCD_ShowFloatNum1(80, 70, light, 6, RED, WHITE, 32);</p>
<p align="left">SysTick_Delay(100, MS);</p>
<p align="left"> </p>
<p align="left">//灯光调节</p>
<p align="left">led_light = 600 - light;</p>
<p align="left">led_light = led_light/6;</p>
<p align="left">if (led_light == 100) { led_light = 0; }</p>
<p align="left">LED_PWM_SetDuty(led_light);</p>
</td>
</tr>
</table>
<p> 以上是光照部分的控制代码,首先用Med_Bh1750_GetLightIntensity函数,将光照信息保存到变量light中,并将光照信息显示到LCD屏幕上。查资料可得,人眼最佳的光照环境为500-750lx,因此让变量led_light与light互补,并对led_light做归一化处理,使之变为占空比,使用LED_PWM_SetDuty函数,调节LED驱动的脉宽,达到智能调光的效果。</p>
<p> </p>
<table>
<tr>
<td width="576">
<p>软件代码部分</p>
</td>
</tr>
<tr>
<td width="576">
<p align="left">//显示温度,湿度数据</p>
<p align="left"> </p>
<p align="left">//读取 ATH20 传感器数据</p>
<p align="left"> </p>
<p align="left">ATH20_Init();</p>
<p align="left">ATH20_Read_CTdata(CT_data);</p>
<p align="left">c1 = CT_data[0] * 1000 / 1024 / 1024;</p>
<p align="left">t1 = CT_data[1] * 200 * 10 / 1024 / 1024 - 500;</p>
<p align="left">LCD_ShowChinese(0, 100, "温度", RED, WHITE, 32, 0);</p>
<p align="left">LCD_ShowChinese(0, 130, "湿度", RED, WHITE, 32, 0);</p>
<p align="left">LCD_ShowFloatNum1(80, 100, t1 / 10, 4, RED, WHITE, 32);</p>
<p align="left">LCD_ShowFloatNum1(80, 130, c1 / 10, 4, RED, WHITE, 32);</p>
<p align="left"> </p>
<p align="left">//坐姿检测</p>
<p align="left">POSE_case();</p>
<p align="left">SysTick_Delay(100, MS);</p>
</td>
</tr>
</table>
<p> 以上是温湿度传感器的读取部分,首先对ATH20进行初始化,初始化包含两个部分(向AHT20发送读取信号,等待AHT20响应),接着将读取的数据赋值给缓冲区数组CT_data,将温湿度数据根据数据手册里面的公式分别计算赋值给c1和t1,接着将温湿度数据显示到LCD屏幕上,但是此时计算出来的值是真实温湿度的10倍,因此显示数据是会缩小10倍。执行完上述代码后主循环代码执行完毕,结尾时重新进行坐姿检测,提高系统响应速度,并延迟100ms,使得cpu有缓冲时间。</p>
<p> </p>
<p> </p>
<table>
<tr>
<td width="576">
<p>软件代码部分</p>
</td>
</tr>
<tr>
<td width="576">
<p align="left">void ble_jdy31_send_data(float temp, float humidity, uint32_t light, const char* pose, uint8_t angle) {</p>
<p align="left"> // 生成符合格式的数据字符串</p>
<p align="left"> snprintf(tx_buffer, sizeof(tx_buffer), "T:%.1f;H:%.1f;L:%lu;P:%s;A:%u\r\n", temp, humidity, light, pose, angle);</p>
<p align="left"> </p>
<p align="left"> // 发送数据</p>
<p align="left"> uint32_t len = strlen(tx_buffer);</p>
<p align="left"> ble_send_string((uint8_t*)tx_buffer, len);</p>
<p align="left">}</p>
<p align="left">//整合数据并发送</p>
<p align="left">ble_jdy31_send_data(t2,c2,light,pose,angle);</p>
<p align="left">//坐姿检测</p>
<p align="left">POSE_case();</p>
<p align="left">SysTick_Delay(100, MS);</p>
</td>
</tr>
</table>
<p> 最后,将数据量统合到函数ble_jdy31_send_data(t2,c2,light,pose,angle)中,并由此函数直接用串口发送到蓝牙芯片HC-06中,并由蓝牙芯片透传到手机APP中,由APP做计算处理,并执行姿态检测后完成一次主程序循环。</p>
<p> 至此代码执行完毕。</p>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt pap-left-indent-1.6em" style="line-height:1.8;"> </p>
<h3 class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height:1.8;">6、BOM清单</h3>
<hr class="horizontal-splitline normal-bold-2">
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height:1.8;">见项目详情。</p>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height:1.8;"> </p>
<h3 class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height:1.8;">7、大赛LOGO验证</h3>
<hr class="horizontal-splitline normal-bold-2">
<p style="line-height:1.8;">见项目详情。</p>
<h3 class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height:1.8;"> </h3>
<h3 class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height:1.8;">8、演示您的项目并录制成视频上传</h3>
<hr class="horizontal-splitline normal-bold-2">
<p style="line-height:1.8;">见下。</p>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height:1.8;"> </p>
</div>
评论(2)