目录

openvela Smartband

基于 openvela/NuttX + LVGL 开发的智能手环原生应用。项目以 336x480 自绘复古表盘为首页,提供健康数据、运动记录、睡眠摘要、秒表、手电筒、设置、自动演示和中英文切换。

应用已经在 goldfish-arm64-v8a-ap 模拟器和 DshanPixVela-Devkit V1 开发板上运行。心率、血氧和步数在未连接对应传感器时明确使用模拟数据,不将模拟值描述为真实采集值。

初赛要求覆盖

初赛要求 当前实现 验证入口
表盘与时间显示 WATCH 显示时间、日期和健康摘要;系统时间可信时读取 RTC/NTP,否则使用模拟时钟并标记数据源 smartband.c、表盘截图
健康数据展示 HEALTH 展示心率、血氧、温度和传感器状态;无传感器时使用动态模拟值 smartband.c、演示视频
基础 UI 交互 支持左右滑动、Launcher 点击、功能页右滑/按钮返回 开发板照片、演示视频
可运行与异常处理 检查 LVGL/显示初始化;真实数据源缺失时降级,不阻塞 UI smartband.c、Settings 数据源状态
工程化与合规 提供 Kconfig、Makefile、集成脚本、构建说明、LICENSE、NOTICE 和第三方声明 tools/、docs/、合规文件

扩展功能包括健走/跑步记录、睡眠阶段摘要、秒表、手电筒、自动巡航演示和中英文 UI。这些功能用于提升作品完整度,不作为真实健康传感器接入的声明。

效果展示

模拟器 开发板表盘 开发板 Launcher
模拟器表盘 开发板表盘 开发板功能菜单

查看完整演示视频(约 2 分 40 秒)

项目结构

smartband/
├── smartband.c                       # LVGL 应用主实现
├── Kconfig                           # NuttX/openvela 应用配置
├── Makefile                          # NuttX/openvela 应用编译入口
├── fonts/                            # 编译进固件的中文 LVGL 子集字体
├── tools/generate_zh_font.py         # 中文字体再生成脚本
├── tools/install_to_openvela.py      # 应用复制与注册脚本
├── docs/R528_BOARD.md                # R528 开发板编译、打包和烧录说明
├── 视频和截图/                        # 演示视频、模拟器截图和开发板照片
├── 镜像/rtos_nuttx_r528s3-velaevb1_uart0_256Mnand.img
├── LICENSE
├── NOTICE
└── THIRD_PARTY_NOTICES.md

已验证环境

项目 已验证配置
开发主机 Ubuntu 22.04 虚拟机
openvela 目录 /home/ubuntu/vela-opensource
模拟器目标 goldfish-arm64-v8a-ap,CMake + Ninja
模拟器显示 Xiaomi Smart Band 8 Pro skin,336x480
开发板目标 R528S3 Vela EVB1 / DshanPixVela-Devkit V1
开发板构建 NuttX Make 构建 + Allwinner lichee pack
烧录工具 PhoenixSuit,全盘擦除升级

本仓库只包含应用源码,不包含完整 openvela 源码和交叉工具链。推荐使用赛题手册 v1.2 配套虚拟机;该源码包没有 Git 元数据,因此无法用 commit hash 唯一标识。复现时应记录所用赛题虚拟机/源码包版本。

模拟器构建需要 python3、CMake 和 Ninja。配套虚拟机通常已经安装;缺少 Ninja 时执行:

sudo apt update
sudo apt install ninja-build

集成应用

将本仓库放在 openvela 源码树之外,在本仓库根目录执行:

python3 tools/install_to_openvela.py \
  --openvela-root /home/ubuntu/vela-opensource

脚本会:

  • 复制应用到 apps/examples/smartband
  • 在 apps/examples/Kconfig 中注册配置入口
  • 在 apps/examples/Make.defs 中注册应用构建入口

脚本可重复运行;修改本仓库源码后再次运行即可同步。它不会替代 openvela 的目标配置和固件构建步骤。

模拟器运行

1. 配置

在 vendor/openvela/boards/vela/configs/goldfish-arm64-v8a-ap/defconfig 中启用:

CONFIG_LV_USE_NUTTX=y
CONFIG_LV_USE_NUTTX_TOUCHSCREEN=y
CONFIG_INPUT_TOUCHSCREEN=y
CONFIG_EXAMPLES_SMARTBAND=y
CONFIG_EXAMPLES_SMARTBAND_PROGNAME="smartband"
CONFIG_EXAMPLES_SMARTBAND_PRIORITY=100
CONFIG_EXAMPLES_SMARTBAND_STACKSIZE=65536
CONFIG_EXAMPLES_SMARTBAND_INPUT_DEVPATH="/dev/input0"

同一显示环境不要同时自动启动另一个 LVGL Demo:

# CONFIG_EXAMPLES_LVGLDEMO is not set

按硬件能力选配:

# 使用 libuv 驱动 LVGL 事件循环
CONFIG_LV_USE_NUTTX_LIBUV=y

# 读取注册为 /dev/temp0 的 SHT3x 温度设备
CONFIG_SENSORS_SHT3X=y

# 仅在排查触摸坐标时打开
CONFIG_EXAMPLES_SMARTBAND_TOUCH_DEBUG=y

2. 编译

cd /home/ubuntu/vela-opensource
./build.sh \
  vendor/openvela/boards/vela/configs/goldfish-arm64-v8a-ap/ \
  --cmake -j$(nproc)

成功标志:

#### build completed successfully

从 R528 的传统 Make 构建切换到 CMake 时,如果提示 Please distclean previous make build,先执行:

make -C nuttx distclean
rm -rf cmake_out/vela_goldfish-arm64-v8a-ap

然后重新运行上面的构建命令。

3. 启动

./emulator.sh cmake_out/vela_goldfish-arm64-v8a-ap/

出现 NSH 提示符后运行:

goldfish-armv8a-ap> smartband

需要从 SSH 会话启动图形模拟器时,先确认 echo $DISPLAY 非空;否则应在 Ubuntu 图形桌面的终端中运行。

开发板运行

R528 开发板不能使用 goldfish 的 CMake 产物,需要使用板级 Make 构建和 lichee 打包:

cd /home/ubuntu/vela-opensource
./build.sh \
  vendor/allwinnertech/boards/r528/r528s3-velaevb1/configs/nsh/ \
  -e -Wno-error -j$(nproc)

然后进入 lichee 环境执行 lunch_nuttx 2 和 pack。最终镜像通常位于:

vendor/allwinnertech/lichee/out/r528s3/velaevb1_nand/
rtos_nuttx_r528s3-velaevb1_uart0_256Mnand.img

完整的安全显示配置、.note.gnu.build-id 稀疏镜像处理、打包、PhoenixSuit 烧录和串口验证步骤见 R528 开发板说明。

仓库提供的预构建镜像仅适用于对应的 R528S3 Vela EVB1 NAND 配置:

文件:镜像/rtos_nuttx_r528s3-velaevb1_uart0_256Mnand.img
大小:22491136 bytes(约 21.4 MiB)
SHA256:5E2B736571BEC5E2C0B079858C0D6AE98F45706D9F05081B090F3E270FDE38A6

不要将该镜像烧录到型号或存储布局不一致的开发板。

操作方式

  • 左右滑动主流程:WATCH -> LAUNCHER -> HEALTH -> SPORT
  • Launcher 点击进入健康、运动、睡眠、秒表、手电筒和设置
  • 功能页右滑或点击底部按钮返回 Launcher
  • Settings 打开“自动演示”后,每 3 秒巡航一个页面
  • Settings 点击“语言”切换中文/英文 UI

数据来源

应用采用“真实数据优先、模拟数据兜底”的策略:

数据 当前来源 无数据时行为
时间/日期 time() / CLOCK_REALTIME 从 2026-07-01 09:30 开始递增的模拟时钟
温度 启用 CONFIG_SENSORS_SHT3X 后读取 /dev/temp0 模拟温度
内存和运行时间 /proc/meminfo、/proc/uptime 模拟状态值
心率、血氧 当前未接入 PPG 传感器 动态模拟值
步数、运动 当前未接入 IMU/计步传感器 动态模拟值
睡眠摘要 当前没有持久化健康数据 演示数据

Settings 页面显示数据源状态:

  • SIM:主要使用模拟或兜底数据
  • MIXED:系统/板卡真实数据与模拟数据混合
  • REAL:主要健康数据源均为真实数据;当前未接入 PPG/计步传感器时通常不会出现

模拟时间用于保证无 RTC 环境下界面完整,不应当作为“正确当前时间”的证据。

通过 WiFi + NTP 获取真实时间

这里的“真实时间”来自 NTP 校准后的系统实时时钟 CLOCK_REALTIME,不是开发板上可断电保持的硬件 RTC。当前 R528 开发板没有可持久保持时间的硬件 RTC 时,每次断电重启后都需要重新联网同步,或通过串口手动设置时间。

首先在 R528 板级 defconfig 中启用 NTP 客户端并重新编译、打包、烧录:

CONFIG_NETUTILS_NTPCLIENT=y
CONFIG_SYSTEM_NTPC=y

烧录后,在串口 NSH 中连接 2.4 GHz WiFi。下面命令已经在赛题配套虚拟机和 R528 开发板流程中验证;把 SSID 和密码替换为实际值:

ifup wlan0
wapi mode wlan0 2
wapi psk wlan0 "你的WiFi密码" 3
wapi essid wlan0 "你的WiFi名称" 1
renew wlan0
ifconfig

ifconfig 中看到 wlan0 获得 IP 后,分别检查外网和 DNS:

ping 8.8.8.8
ping pool.ntp.org
  • 两个地址都不通:优先检查 WiFi 名称、密码、信号和 DHCP。
  • IP 地址能通但域名不通:说明 DNS 尚未正常工作,NTP 域名也无法解析。
  • 如果系统中不存在 ntpcstart:说明 NTP 配置尚未编进当前镜像,需要重新检查 defconfig 和构建产物。

网络正常后启动 NTP,并查看同步状态和系统时间:

ntpcstart
ntpcstatus
date

NTP 成功更新 CLOCK_REALTIME 后,smartband 会在下一次定时刷新时自动切换为真实系统时间,Settings 数据源状态也会相应更新。如果显示时间与北京时间相差 8 小时,需要在板级系统中设置 TZ=CST-8;时区设置和持久化方式取决于所用 openvela 源码版本。

没有网络时,可以通过串口临时设置系统时间:

date -s "Jul 10 12:30:00 2026"
date

手动设置同样只在当前上电周期有效;断电后是否保留取决于开发板是否存在并启用了硬件 RTC。

异常处理

  • 启动时通过 lv_is_initialized() 防止重复初始化 LVGL
  • lv_nuttx_init() 后检查 result.disp,失败时记录错误、释放资源并退出
  • RTC、温度设备和 procfs 节点不可用时自动降级,不阻塞 UI
  • SIM / MIXED / REAL 使降级状态可观察
  • 触摸事件在子控件间冒泡,保证从页面大部分区域开始滑动都能翻页

常见问题

现象 处理
CMake 提示先 distclean 执行 make -C nuttx distclean,删除对应 cmake_out 后重编
找不到 Ninja 安装 ninja-build
模拟器无图形窗口 在 Ubuntu 桌面终端运行,或配置有效的 DISPLAY
开发板花屏 关闭并发 LVGL Demo、G2D 和启动 logo,延迟启动应用;见 R528 文档
点击分页点可用但滑动无效 确认使用当前版本源码;当前版本已补齐事件冒泡
表盘显示模拟日期 板卡没有可信 RTC/NTP,先用 date -s 或 NTP 设置系统时间

字体维护

中文 UI 使用编译进固件的 LVGL C 子集字体,不依赖 /data/font、Freetype 或运行时 TTF。修改中文文案后重新生成:

python3 tools/generate_zh_font.py \
  --font /usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc

Windows 示例:

python tools/generate_zh_font.py --font C:/Windows/Fonts/NotoSansSC-VF.ttf

字体和依赖的许可证信息见 THIRD_PARTY_NOTICES.md。

开源说明

本项目采用 Apache License 2.0,详见 LICENSE、NOTICE 和 THIRD_PARTY_NOTICES.md。

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

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