目录

Smart Band

简介

Smart Band 是一个基于 OpenVela (NuttX) + LVGL + libuv 的智能手表演示应用,模拟小米手环的核心 UI 交互。

核心特性:

  • 表盘主页(时间、步数、心率、电量)
  • 心率测量(三态状态机 + 折线图,数据跨页面持久化)
  • 9 种运动模式(跑步、骑行、瑜伽等),实时计时 + 卡路里估算
  • 运动记录历史(Activity Log 卡片列表,环形缓冲存储)
  • 虚拟宠物互动(idle / jump / sleep / stretch 帧动画)
  • 秒表、音乐控制、手电筒、睡眠追踪、设置
  • 全局通知浮层(模拟信息提醒)
  • 自适应分辨率缩放(设计基准 194×368)

演示效果 (Demo Showcase)

动态演示 功能说明
Dialplate 主表盘:实时时钟与动态步数计数
HeartRate 心率监测:动态折线图与状态机切换
Animation 宠物互动:多帧动画逻辑与资源加载
Sports 运动界面:实时传感器数据采集与运动状态统计

更多功能页面展示,请查看 docs/Smart_Band.pdf

快速开始

本项目采用脚本化工程管理,通过工具链实现“更新(拉取)-配置-编译-部署”的一键闭环。

第一步:配置环境

详见 https://doc.openvela.com/document?id=201&version=trunk&language=cn 教程

第二步:克隆本项目

git clone https://gitlink.org.cn/yiii/openvela.git
cd openvela

第三步:一键同步与配置

我们提供了一个集成脚本,它会自动执行以下任务:

  • 从 GitLink 拉取或更新最新源码。
  • 自动检查并修复 defconfig 中的关键配置项。
  • 确保开发环境符合编译要求。
  • 打开模拟器自动上传字体并运行系统。

首先需要 将脚本bu.sh移动到存放 openvela 所有源代码的根目录下 随后直接执行运行命令即可一键完成准备工作:

# 赋予脚本执行权限
chmod +x bu.sh
# 运行脚本
bash ./bu.sh

项目结构

smart_band/
├── bu.sh               # 环境配置脚本
├── smart_band_main.c      # main() 入口 → lv_init → uv_loop
├── smart_band.c            # 自适应分辨率 + page_init + resource_init
├── Makefile                # CSRCS = find *.c 全量编译
├── page/                   # 22 个 LVGL Fragment 页面
│   ├── page.h/c            # 页面管理器 (push/pop/switch)
│   ├── page.inc            # 页面注册表
│   ├── dialplate.c         # 主表盘
│   ├── heart_rate.c        # 心率监测 + 折线图
│   ├── launcher.c          # 9 宫格启动器 (flex 可滚动)
│   ├── sport.c             # 运动入口
│   ├── running.c           # 跑步 (计时+配速+距离)
│   ├── ... (共 22 页)      # 详见页面列表
│   └── _template.c         # 页面开发模板
├── hal/                    # 硬件抽象层 (模拟传感器)
├── resource/               # 字体/图片/样式 → .inc 展开为静态查找表
├── utils/                  # 动画标签 / 自动演示 / 运动数据环形缓冲
└── notification/           # 全局通知浮层 (lv_layer_top)

核心设计概览 (Architecture Overview)

Smart Band 采用了 “页面导航栈”“静态内存模型” 设计,核心设计要点如下:

  • 模块化导航:采用栈式 push/pop 机制,通过 page.inc 实现页面注册与路由解耦。
  • 内存安全性:核心业务数据采用静态内存分配,规避了嵌入式环境下的堆碎片问题。
  • 自适应适配:内置 PAGE_SCALE 缩放宏,支持一套代码适配多分辨率屏幕。

更多详细设计决策与架构图,请查看 docs/Smart Band.pdf

硬件适配 (Hardware Adaptation)

Smart Band 最初基于 OpenVela (NuttX) 模拟器(Goldfish)开发,所有外设均使用模拟数据。决赛阶段团队将应用从模拟器迁移到真实硬件(全志 R528 芯片、Gemini-S1 开发板)。

目标硬件平台

项目 规格
主控芯片 全志 R528 (ARM Cortex-A7)
开发板 R528-S3 Gemini-S1
显示屏 ILI9341 (240×320, SPI)
触摸屏 GT911 (I2C) + TPADC
蓝牙/WiFi Realtek 8723fs
操作系统 OpenVela (基于 NuttX)

适配总览

模块 模拟器状态 硬件适配状态 适配方式
背光 (Backlight) 无(模拟器不控制背光) ✅ 已完成 sunxi PWM HAL,通道4 (PD20)
系统时钟 (Clock) 模拟器系统时间 ✅ 已完成 WiFi +NuttX RTC 驱动 (sunxi RTC) 实现时间同步
电源管理 (Power Manager) ✅ 已完成 三态电源管理 + PWM 背光联动
蓝牙通知 (BLE Notify) 模拟器定时模拟通知弹窗 ✅ 已完成 BLE GATT Server (UUID: 0xFF01/0xFF02)实现通知同步

HAL 层架构

Smart Band 的 HAL(硬件抽象层)位于 hal/ 目录,通过统一的伞形头文件 hal/hal.h 暴露给上层应用。各模块内部封装了具体的硬件操作,上层页面代码通过 HAL API 访问硬件,无需关心底层实现细节。

hal/
├── hal.h                  # 伞形头文件(统一入口)
├── backlight.c/h          # 背光控制
├── clock.c/h              # 系统时钟
├── power.c/h              # 电池电量
├── power_mgr.c/h          # 电源管理
├── ble_notify.c/h         # 蓝牙通知
├── imu.c/h                # 计步传感器
├── particle_sensor.c/h    # 心率传感器
├── health_record.c/h      # 健康数据持久化
└── storage.c/h            # 底层二进制存储

应用入口 smart_band.csmart_band_create() 按以下顺序初始化各模块:

resource_init()    → 字体/图片/样式加载
health_record_init() → 持久化存储 (/data/smart_band.db)
notification_init()  → 全局通知浮层
ble_notify_init()    → BLE GATT 服务注册
pm_init()            → 电源管理状态机

已适配模块概述

背光控制 (Backlight)

  • GPIO 引脚: PD20 (GPIO 编号 116)
  • PWM 通道: 通道 4(与 PD20 复用)
  • 引脚复用: Function5 = PWM4, Function1 = GPIO Output
  • 关键参数: PWM 频率 50kHz,占空比范围 0-100
  • 容错机制: 若 PWM 初始化失败,自动回退到 GPIO 开关模式

系统时钟 (Clock)

  • 通过 NuttX 内核 RTC 子系统,无需芯片特定的代码
  • 时区硬编码 UTC+8(中国标准时间)
  • 硬件启动后通过 NTP 自动同步网络时间
  • clock_set_value() 也支持通过蓝牙从手机同步时间

电源管理 (Power Manager)

实现三态电源管理状态机,与背光 PWM 联动实现逐级降功耗:

状态 背光亮度 刷新率 超时时间 说明
PM_STATE_ACTIVE 100% ~33 fps - 正常使用状态
PM_STATE_DIM 20% ~4 fps 30 秒无操作 降低亮度与刷新率
PM_STATE_SLEEP 0% 暂停 50 秒无操作 关闭背光,暂停刷新
  • 唤醒机制: 注册所有 LVGL 输入设备的触摸事件,任意触摸操作立即恢复到 ACTIVE 状态
  • 抬腕唤醒: 框架已预留(pm_simulate_raise() 可正常唤醒屏幕),待接入真实 IMU 传感器后即可激活

蓝牙通知 (BLE Notify)

  • 使用 OpenVela 蓝牙框架 API,注册 GATT Server
  • Service UUID: 0xFF01,Characteristic UUID: 0xFF02 (WRITE_NR)
  • 手机通过 nRF Connect 等工具写入通知内容,手环弹出通知卡片
  • 蓝牙芯片初始化通过启动脚本自动完成(固件部署 + BLE 广播)

驱动层修改

为支持硬件运行,对 OpenVela 官方代码中以下文件进行了修改:

rcS.nsh 启动脚本

  • 蓝牙固件部署: 自动复制 Realtek 8723fs 固件到 /data/misc/bt/,启动 bluetoothd 并开启 BLE 广播
  • NTP 网络预检: 先 ping 检测网络连通性再启动 NTP,避免 Wi-Fi 未就绪导致同步失败
  • WiFi 前台启动: 确保 Wi-Fi 连接完成后再继续后续初始化

TPADC 触摸驱动

  • 取消 X/Y 坐标交换,适配竖屏显示(240×320)
  • 触摸坐标与竖屏 UI 布局正确对应

NTP 客户端

  • 延长连通性检测超时至 5 秒,重试次数增至 3 次,适配嵌入式设备 Wi-Fi 连接较慢的场景

构建系统适配

  • 编译依赖: 新增蓝牙框架头文件路径和 sunxi HAL 头文件路径
  • 栈空间配置: 栈空间增加到 131072 字节,以容纳蓝牙协议栈和 BLE GATT 服务的运行需求
  • Kconfig 依赖: 需要额外启用 CONFIG_SYSTEM_NTPCCONFIG_SYSTEM_ADBDCONFIG_KVDB_SERVER 等配置项

更多详细硬件适配设计与修改,请查看 docs/hardware_adaptation.md

操作手册

启动与桌面导航

应用启动后进入主表盘界面,显示当前时间、日期、步数、心率和电池电量。

  • 左右滑动:在表盘、心率、计步、宠物猫四个页面间切换
  • 从表盘向下滑动进入启动器:显示 9 宫格应用列表,包含心率、音乐、秒表、手电筒、睡眠、运动、活动记录、宠物猫、设置
  • 启动器可上下滚动:如果屏幕高度不足以显示全部 9 个应用图标,向上滑动查看更多

表盘 (Dialplate)

操作 效果
查看时间 中央大字显示时:分(96px 字体),下方显示日期与星期
查看状态 顶部图标栏显示蓝牙连接状态和电池电量
查看快捷信息 底部显示天气温度、当日步数、实时心率
左滑 进入心率监测页
右滑 进入计步器页

心率 (Heart Rate)

操作 效果
进入页面 中央显示当前心率值(BPM),红色心跳动画
点击 “Measure” 按钮 开始 30 秒心率测量,进度条实时更新
测量进行中 圆弧进度环旋转,每 10 秒记录一次采样点
测量完成 显示平均心率 + 评估文字(Low HR / Normal HR / High HR)
上滑 进入心率分析图表页(折线图 + 较大实时数值)
下滑 返回测量主页
左滑 / 右滑 切换页面(计步器 / 表盘)

心率折线图数据存储在全局数组中,退出页面后重新进入数据依然保留。

计步器 (Step Counter)

操作 效果
进入页面 中央显示当日步数(大字),圆弧显示目标完成度(目标 10000 步)
查看进度 百分比数值 + 距离换算(km) + 卡路里估算
左滑 / 右滑 切换页面(表盘 / 心率 /宠物猫)

启动器 (Launcher)

操作 效果
点击 “Heart” 进入心率监测页
点击 “Music” 进入音乐控制页
点击 “StWatch” 进入秒表页
点击 “Light” 进入手电筒页
点击 “Sleep” 进入睡眠追踪页
点击 “Sport” 进入运动模式选择页
点击 “Activity” 进入运动记录历史
点击 “Pet Cat” 进入虚拟宠物互动页
点击 “Settings” 进入设置页
右滑 返回表盘

运动模式 (Sport / Running / 及其他)

运动入口页 (Sport) :显示 9 种运动类型列表,点击进入对应运动。

运动类型 支持的功能
跑步 (Running) 配速、距离、卡路里
骑行 (Riding) 速度、距离
瑜伽 (Yoga) 时间、心率
拉伸 (Stretching) 时间、心率
滑雪 (Skiing) 速度、距离
乒乓球 (Table Tennis) 时间、心率
篮球 (Basketball) 时间、心率
排球 (Volleyball) 时间、心率
更多运动 (More Sports) 时间、心率

运动页面通用操作

操作 效果
点击 Start / ▶️ 开始计时
点击 Pause / ⏸️ 暂停计时
点击 Resume / ▶️ 继续计时
点击 🚩 旗帜按钮 结束运动并保存记录
点击 ↺ 重置按钮 重置当前运动(不保存)
点击 + / - 按钮 调整目标时长(仅在暂停时可用)
右滑 返回上一页

运动结束后计时 > 10 秒即可保存到 Activity Log。保存的记录包括运动类型、时长、卡路里。

运动记录 (Activity Log)

操作 效果
进入页面 显示历史运动记录列表,每条显示图标、名称、时长、卡路里
卡片颜色 不同运动类型自动分配不同颜色标识
无记录时 显示 “No activities yet. Go for a run!”
右滑 返回上一页

最多保存 10 条记录,超出后自动淘汰最旧的。

虚拟宠物 (Pet Cat)

操作 效果
进入页面 显示猫咪 idle 动画(三帧 ping-pong + 呼吸缩放)
点击猫咪 随机触发一个动作并显示对应文字
动作 - Jump 6 帧快速跳跃动画(0.72 秒),文字 "Meow~" "Purr~"
动作 - Sleep 8 帧慢速睡眠动画(1.6 秒),文字 "Zzz..." "=w="
动作 - Stretch 8 帧中速伸展动画(1.2 秒),文字 "Mmm~" "Stretch!"
右滑 未在主屏轮播时返回启动器、主屏轮播时返回表盘页面

动作播放期间点击无效,播放结束后自动恢复 idle 状态。

秒表 (Stop Watch)

操作 效果
点击 Start 开始计时(mm:ss.ms 格式)
点击 Pause 暂停计时
点击 Resume 继续计时
点击 Reset 重置归零
右滑 返回上一页

音乐控制 (Music)

操作 效果
查看曲目 显示当前播放曲目名称
点击 ▶️ / ⏸️ 播放 / 暂停
点击 ⏮️ / ⏭️ 上一曲 / 下一曲
拖动进度条 调整播放进度
右滑 返回上一页

手电筒 (Flashlight)

操作 效果
进入页面 屏幕切换为白色背景并调至最高亮度
点击屏幕任意位置 关闭手电筒,返回上一页
右滑 返回上一页

睡眠追踪 (Sleep)

操作 效果
进入页面 显示睡眠时间段可视化图表
查看详情 显示深睡/浅睡时长及占比

设置 (Settings)

操作 效果
进入页面 显示系统设置选项

通知提醒

事件 效果
手机收到信息 屏幕中央弹出通知卡片(模拟来电提醒),5 秒后自动消失

文档中心 (Documentation)

本项目详细的架构设计以及模块说明,请参考 docs/ 目录:

  • docs/Smart_Band.pdf :项目目录结构详细说明与组件职责分析。
  • docs/Incremental document.pdf :决赛相较于初赛新增实现内容说明。
  • docs/hardware_adaptation.md :项目硬件适配文档。
  • docs/Final_materials.zip :决赛材料压缩包(包含答辩材料、技术报告、演示材料)。

许可证

Apache License 2.0

关于
168.4 MB
邀请码
    Gitlink(确实开源)
  • 加入我们
  • 官网邮箱:gitlink@ccf.org.cn
  • QQ群
  • QQ群
  • 公众号
  • 公众号

版权所有:中国计算机学会技术支持:开源发展技术委员会
京ICP备13000930号-9 京公网安备 11010802047560号