ZSWatch——一个基于Zephyr RTOS的开源智能手表项目。

项目概览
ZSWatch不是简单的DIY项目,而是一个真正可用的智能手表。从项目名称就能看出作者的野心——Zephyr Smart Watch,基于业界领先的Zephyr实时操作系统构建。
项目地址:https://github.com/jakkra/ZSWatch
官方网站:https://zswatch.dev/
Discord社区:https://discord.gg/8XfNBmDfbY
核心亮点
- 完全开源:硬件设计、软件代码、3D打印外壳全部开源
- 专业级硬件:nRF5340双核芯片 + 240×240圆形触摸屏
- 丰富传感器:IMU、环境传感器、气压计、磁力计等
- 智能互联:支持Android GadgetBridge和iOS原生通信
- 模块化设计:应用系统、表盘系统完全可定制
系统架构图
ZSWatch的整体设计:

从架构图可以看出,ZSWatch采用了分层设计:
- 硬件层:各种传感器和核心处理器
- 系统层:Zephyr RTOS提供实时调度和驱动支持
- 应用层:各种管理器负责不同功能模块
- 界面层:LVGL提供流畅的图形界面
硬件架构
核心处理器选择
ZSWatch采用了Nordic nRF5340(u-blox NORA-B10模块),这是一个超级明智的选择:
// 主要硬件规格
- 128MHz 双核ARM Cortex-M33处理器
- 512KB RAM + 1MB Flash
- 内置蓝牙5.2 + 30MHz SPI接口
显示系统
240×240像素的圆形IPS触摸屏,支持16位色彩,配合LVGL图形库实现流畅的用户界面。
传感器阵列
ZSWatch集成了丰富的传感器生态:

软件架构
系统初始化流程
让我们看看ZSWatch的启动过程,这展现了嵌入式系统设计的精髓:
static void run_init_work(struct k_work *item)
{
// 1. 核心转储系统初始化
zsw_coredump_init();
// 2. 显示控制器初始化
zsw_display_control_init();
zsw_display_control_sleep_ctrl(true);
// 3. 通知管理器
zsw_notification_manager_init();
// 4. 蓝牙通信启动
enable_bluetooth();
// 5. 传感器系统初始化
zsw_imu_init();
zsw_magnetometer_init();
zsw_pressure_sensor_init();
zsw_light_sensor_init();
zsw_environment_sensor_init();
// 6. UI控制器启动
zsw_ui_controller_init();
LOG_INF("ZSWatch application started");
}
这个初始化流程展现了分层架构的优势:从底层硬件到上层应用,每个模块职责清晰,便于维护和扩展。
事件驱动架构
ZSWatch采用Zephyr的ZBus消息总线实现组件间通信:
// 传感器数据发布
struct environment_event evt = {
.temperature = temperature,
.humidity = humidity,
.pressure = pressure,
.iaq = iaq
};
zbus_chan_pub(&environment_data_chan, &evt, K_MSEC(250));
这种设计让各个模块松耦合,新增功能时只需订阅相应的消息通道即可。
蓝牙通信
Android端:GadgetBridge集成
ZSWatch巧妙地伪装成GadgetBridge支持的设备,实现了与Android的无缝连接:
static void enable_bluetooth(void)
{
int err = bt_enable(NULL);
#ifdef CONFIG_SETTINGS
settings_load();
#endif
if (err != 0) {
LOG_ERR("Failed to enable Bluetooth, err: %d", err);
return;
}
// 初始化通信协议
__ASSERT_NO_MSG(ble_comm_init() == 0);
bleAoaInit(); // AoA定位功能
#ifdef CONFIG_BT_AMS_CLIENT
ble_ams_init(); // Apple Media Service
ble_cts_init(); // Current Time Service
#endif
#ifdef CONFIG_BT_ANCS_CLIENT
ble_ancs_init(); // Apple Notification Center
#endif
}
iOS端:原生协议支持
对于iOS设备,ZSWatch直接实现了苹果的标准协议:
- ANCS(Apple Notification Center Service):通知管理
- AMS(Apple Media Service):音乐控制
传感器融合
IMU数据处理
ZSWatch的IMU系统展现了嵌入式的魅力:
static void bmi270_trigger_handler(const struct device *dev,
const struct sensor_trigger *trig)
{
zsw_imu_evt_t evt;
switch ((int)trig->type) {
case SENSOR_TRIG_SIG_MOTION: {
evt.type = ZSW_IMU_EVT_TYPE_SIGNIFICANT_MOTION;
break;
}
case SENSOR_TRIG_STEP: {
struct sensor_value sensor_val;
if (sensor_channel_get(bmi270, SENSOR_CHAN_STEPS, &sensor_val) == 0) {
evt.type = ZSW_IMU_EVT_TYPE_STEP;
evt.data.step.count = sensor_val.val1;
LOG_DBG("Steps counted: %u", evt.data.step.count);
}
break;
}
case SENSOR_TRIG_WRIST_WAKE: {
evt.type = ZSW_IMU_EVT_TYPE_WRIST_WAKEUP;
break;
}
}
// 发布传感器事件
zbus_chan_pub(&accel_data_chan, &evt, K_MSEC(100));
}
这段代码实现了:
- 智能唤醒:抬腕自动点亮屏幕
- 步数统计:实时计步功能
- 运动检测:识别用户活动状态
环境传感器数据融合
static void zbus_periodic_slow_callback(const struct zbus_channel *chan)
{
float temperature, pressure, humidity, iaq = -1.0;
if (zsw_environment_sensor_get(&temperature, &humidity, &pressure)) {
return;
}
// IAQ(室内空气质量)是可选功能
zsw_environment_sensor_get_iaq(&iaq);
struct environment_event evt = {
.temperature = temperature,
.humidity = humidity,
.pressure = pressure,
.iaq = iaq
};
zbus_chan_pub(&environment_data_chan, &evt, K_MSEC(250));
}
LVGL图形系统
ZSWatch基于LVGL构建用户界面,配置文件展现了性能优化的细节:
# LVGL核心配置
CONFIG_LVGL=y
CONFIG_LV_Z_FLUSH_THREAD=y
CONFIG_LV_Z_FLUSH_THREAD_PRIORITY=0
# 显示优化
CONFIG_LV_Z_DOUBLE_VDB=y
CONFIG_LV_Z_VDB_SIZE=10
CONFIG_LV_DEF_REFR_PERIOD=30
# 颜色深度与性能平衡
CONFIG_LV_COLOR_16_SWAP=y
CONFIG_LV_COLOR_DEPTH_16=y
应用管理系统
ZSWatch实现了类似智能手机的应用管理系统:
static void async_app_start(lv_timer_t *timer)
{
application_t *app = (application_t *)timer->user_data;
if (app && app->app_start_func) {
LOG_DBG("Starting app: %s", app->name);
// 启动应用
app->app_start_func(root_obj, group_obj);
current_app = app->private_list_index;
// 清理应用选择器
delete_application_picker();
}
lv_timer_del(timer);
async_app_start_timer = NULL;
}
传感器数据流程
下图展示了ZSWatch的传感器数据处理流程:

这个流程图展现了ZSWatch的数据驱动架构:
- 数据采集:各传感器通过中断或定时采样收集数据
- 事件分发:ZBus系统负责消息分发和解耦
- 数据融合:传感器管理器进行多传感器数据融合
- 功能实现:基于融合数据实现具体功能
- 用户交互:通过UI系统向用户展示结果

















- 最新
- 最热
只看作者