最近,杭州迎来了一波冷空气,加之疫情影响,很多人都无法出门运动,大家纷纷选择居家健身。
涂鸦“攻城狮”小张平时都在抱怨自己的小肚腩,听隔壁女同事推荐:“转呼啦圈不仅可以甩掉小肚腩,瘦身塑形,还能为久坐后的上班族缓解疲劳,舒缓筋络!”
这不,小张立马亲手 DIY 了智能呼啦圈~
01
功能展示
功能定义 | 说明 |
运动模式选择(支持本地与App) | 普通模式(默认) 目标模式 |
运动目标设定(支持App) | 支持设定运动目标 |
智能计数(支持本地与App) | 支持计算圈数、运动时间、卡路里 |
运动完成提醒(支持本地) | 支持运动目标完成提醒 |
运动记录(支持App) | 支持记录30天内运动数据 |
02
硬件方案
1.硬件方案框架
2.硬件方案介绍
我们常用的手机上有Wi-Fi和蓝牙2种连接方式 ,Wi-Fi连接速度快、范围广,但是耗电量过大,还会占用手机Wi-Fi通道。而蓝牙连接低功耗、低成本连接方便,适合短距离连接。恰好可以满足呼啦圈这类运动设备的数据传输和距离要求。
由于定制液晶屏的费用略高,对显示没有很高要求的开发者可以自行购买一块偏压比为1/2,供电电压为3V的3位数字显示液晶屏。
外围需要在COM和PIN口上加上拉、下拉各一个电阻,阻值选择了100K,IO口可设置为推挽输出和浮空输入的状态。
由于液晶屏只有现实3位数字信息,因此在液晶屏显示旁边增加3个指示灯,用来指示液晶屏显示的是时间值,计数值还是能量值。界面上有两个按键,用于模式选择和数据复位。
原理图如下:
点击,即可查看完整开发资料!
https://developer.tuya.com/cn/demo/smart-hula-loop?_source=e807d3bfba73c7f4fada59e31d0952a3
( 注:开发资料文末,点击〖一键创建产品〗即可复制割草机产品。)
03
嵌入式方案
1.模块划分
根据呼啦圈功能设定,将程序划分为以下七大模块:
No. | 模块 | 处理内容 |
1 | 外设驱动组件 | 按键、霍尔传感器、指示灯、段码液晶屏的驱动程序 |
2 | 设备基础服务 | 设备状态迁移处理、模式切换、本地定时等 |
3 | 显示处理服务 | 段码液晶屏显示内容更新和状态控制、LED状态控制 |
4 | 数据处理服务 | 运动数据(计时、圈数、卡路里)的更新和存储 |
5 | 用户事件处理 | 按键事件检测和处理、霍尔传感器事件检测和处理 |
6 | 定时事件处理 | 各定时事件的判断和处理 |
7 | 联网相关处理 | 配网相关处理、数据上报与接收处理、云端时间获取 |
2.软件框图
为方便后续程序扩展,可以先将各外设驱动部分的代码分别编写成组件。
本demo所使用外设的基本情况如下:
外设 | 数量&规格 | 驱动方式 |
按键 | 2个 | 开关量检测 |
霍尔传感器 | 1个;开关型 | 开关量检测 |
发光二极管 | 3个;红色 | 电平或PWM驱动 |
段码液晶屏 | 1个;3位数字“8”,4个COM口,6个SEG口 | COM口和SEG口两端施加一定压差的交流电,压差大于阈值时对应笔段点亮 |
设备基础服务模块包括设备状态迁移、模式选择、模式切换、本地定时等功能处理。功能需求中已经对可选的运动模式即模式迁移方式进行了定义,这里再对设备状态进行如下定义:
设备状态 | 含义 | 处理 |
未使用 | 用户未使用呼啦圈 | 保持熄屏,实时数据清除 |
使用中 | 用户未转动呼啦圈 | 保持亮屏 |
转动中 | 用户转动呼啦圈 | 开始转动时点亮屏幕,转动过程:亮屏6秒,熄屏5分钟 |
复位 | 设备复位 | 所有数据清除 |
显示处理模块包括显示屏内容的设定、显示屏状态控制和指示灯状态控制。
根据功能设定,显示内容可以分为以下4个部分:
显示模式 | 段码液晶屏显示 | LED显示 |
普通模式界面 | 显示实时数据,按”实时计时->实时圈数->实时卡路里“顺序切换 | 点亮数据对应指示灯 |
目标模式界面 | 当日目标剩余时长≠0时,显示该数据,否则显示”---“ | 点亮计时指示灯 |
模式选择界面 | 普通模式显示”010“,目标模式显示”020“ | 全灭 |
复位提示界面 | 显示”000“ | 全灭 |
智能呼啦圈相关的运动数据设定如下:
No. | 数据 | 类别 | 数值范围 | 说明 |
1 | 实时计时 | 实时 | 0-999 | 可上报 |
2 | 实时圈数 | 实时 | 0-999 | 可上报 |
3 | 实时卡路里 | 实时 | 0-999 | 可上报 |
4 | 当日累计计时 | 累计 | 0-1440 | 可上报 |
5 | 当日累计圈数 | 累计 | 0-99999 | 可上报 |
6 | 当日累计卡路里 | 累计 | 0-999 | 可上报 |
7 | 当月累计计时 | 累计 | 0-44640 | 仅用于计算当月剩余 |
8 | 30天累计计时 | 累计 | 0-43200 | 可上报 |
9 | 30天累计圈数 | 累计 | 0-9999999 | 可上报 |
10 | 30天累计卡路里 | 累计 | 0-99999 | 可上报 |
11 | 当日目标时长 | 目标 | 0-45 | 云端下发 |
12 | 当月目标时长 | 目标 | 0-1350 | 云端下发 |
13 | 当日目标剩余 | 剩余 | 0-45 | 可上报 |
14 | 当月目标剩余 | 剩余 | 0-1350 | 可上报 |
15 | 每日累计时长 | 累计 | 0-1440 | 30个数据,仅用于计算30天累计 |
16 | 每日累计圈数 | 累计 | 0-99999 | 30个数据,仅用于计算30天累计 |
17 | 每日累计卡路里 | 累计 | 0-999 | 30个数据,仅用于计算30天累计 |
用户可触发的部件有按键和霍尔传感器,前者用于模式切换、配网请求和设备复位,后者用于检测呼啦圈转动圈数。
根据功能需求描述,用户事件处理模块的处理内容梳理如下:
事件 | 事件类型 | 限制条件 | 处理内容 |
触发模式键 | 短按 | 模式选择界面 | 切换“预选模式” |
其他 | 进入“模式选择”处理 |
长按2秒 | 模式选择界面 | 模式更新为“预选模式”,数据上报 |
长按5秒 | - | 允许配网 |
触发复位键 | 短按 | 模式选择界面 | 退出“模式选择”处理 |
长按2秒 | 【使用中】 | 切换到复位提示界面 |
触发任意键 | 任意类型 | 熄屏状态 | 点亮屏幕 |
亮屏状态 | 复位“熄屏计时”和“停用计时” |
磁铁接触霍尔 | 短触 | - | 数据更新,→【转动中】,“复位停转计时” |
本demo的功能设定中涉及较多的定时需求,具体情况整理如下:
No. | 定时器名称 | 执行条件 | 定时时间 | 超时处理内容 |
1 | 屏幕熄灭确认 | 亮屏状态、【转动中】、无按键事件 | 6秒 | 熄灭屏幕 |
2 | 屏幕点亮确认 | 熄屏状态、【转动中】 | 5分钟 | 点亮屏幕 |
3 | 停止转动确认 | 【转动中】、无霍尔事件 | 3秒 | 设置设备状态为【使用中】 |
4 | 停止使用确认 | 【使用中】、无按键事件 | 30秒 | 设置设备状态为【未使用】 |
5 | 数据显示切换 | 普通模式界面 | 2秒 | 切换显示数据 |
6 | 计时数据更新 | 【转动中】 | 1分钟 | 更新计时数据并上报 |
7 | 本地时间更新 | - | 1秒 | 更新本地时间、检查日期变更 |
8 | 数据上报更新 | - | 5秒 | 上报圈数&卡路里数据 |
9 | 配网等待结束 | 设备未被用户绑定且正在等待配网 | 1分钟 | 禁止配网 |
要实现和云端进行数据交互,首先要使设备配网。配网功能已经通过Bluetooth SDK实现,配网等待处理和配网提醒机制如下:
No. | 设备状态 | 执行动作 | 配网指示灯 |
1 | 上电时,检测到已被用户绑定 | 不等待配网(保持蓝牙广播) | 不闪烁 |
2 | 上电时,检测到未被用户绑定 | 开始等待配网(保持蓝牙广播) | 开始闪烁 |
3 | 长按模式键5秒时 | 开始等待配网,打开蓝牙广播 | 开始闪烁 |
4 | 开始等待配网1分钟后,检测到仍未被用户绑定 | 停止等待配网,关闭蓝牙广播 | 停止闪烁 |
5 | 开始等待配网后1分钟内,检测到已被用户连接 | 停止等待配网(保持蓝牙广播) | 停止闪烁 |
6 | 检测到被用户解绑 | 不等待配网,关闭蓝牙广播 | 不闪烁 |
1.关闭日志
由于I/O资源有限,在完成功能调试后,需关闭日志打印功能,可通过将tuya_ble_app_init()函数中的elog_set_output_enabled(true);语句修改为elog_set_output_enabled(false);来实现禁止调试信息输出,同时还可以将custom_tuya_ble_config.h中TUYA_APP_LOG_ENABLE的值修改为0来关闭应用日志,以减少代码空间。
2.低功耗处理
由于呼啦圈使用电池供电,为避免电量消耗过快,需对设备进行低功耗处理。
BTU模组原厂芯片的电源管理模块提供了3种低功耗工作模式:
工作模式 | 特点 | 唤醒方式 |
暂停模式 | MCU暂停,PM 模块处于活动状态,所有 SRAM 仍可访问,RF 收发器、音频和 USB 等模块断电,唤醒后从暂停处继续执行 | PAD/32k Timer/RESET Pin |
SRAM保留的深度睡眠模式 | PM 模块处于活动状态,除两个 8KB 和一个 16KB 保留 SRAM 外,大多数模拟和所有数字模块都掉电 | PAD/32k Timer/RESET Pin |
深度睡眠模式 | 只有 PM 模块处于活动状态,而包括保持 SRAM 在内的大多数模拟和所有数字模块都处于断电状态 | PAD/32k Timer/RESET Pin |
对于BTU模组来说,这里的SRAM保留指的是 0x840000 - 0x847FFF 的存储空间,目前协议栈和应用都是默认优先使用这块空间,从编译生成的.lst文件中也可以看到相关数据都存储在该范围内。
为了不影响呼啦圈的本地定时功能,这次选择了SRAM保留的深度睡眠模式作为低功耗模式,基本处理思路如下:
点击,即可查看完整开发资料!
https://developer.tuya.com/cn/demo/smart-hula-loop?_source=e807d3bfba73c7f4fada59e31d0952a3
( 注:开发资料文末,点击〖一键创建产品〗即可复制割草机产品。)
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。