开发日志
智能手表项目开发日志 002:让 RK2206 上的传感器和界面同时工作
记录 RK2206 智能手表底层搭建过程:完成传感器、LCD、蜂鸣器、RGB 灯和按键的驱动接入,并用多任务组织设备运行。
底层问题通常不是“读不到”,而是“读到了但没人接住”
把一个传感器读出数据并不难,难的是让这份数据稳定地进入业务逻辑、显示界面和通信链路。项目初期我把重点放在硬件接口和任务边界上,先确认每个模块的总线、初始化顺序和数据消费方,再开始组合功能。
硬件接口分层
温湿度传感器和 MPU6050 通过 I2C 接入,LCD 使用 SPI 显示,SU-03T 语音模块使用 UART2,蜂鸣器和电机类输出使用 PWM,RGB 灯和功能按键使用 GPIO/ADC。NFC 模块也通过 I2C 完成芯片访问和记录写入。
源码中,src/ 保存驱动和业务实现,include/ 保存模块接口。这样组织之后,smart_watch.c 不需要知道 LCD 的寄存器细节,只需要调用 lcd_set_temperature()、lcd_set_step() 之类的业务接口。
用任务把采集、显示和联网拆开
设备启动函数 smart_watch() 创建了多个任务:主事件线程负责分发按键、云端和语音事件;按键线程负责本地交互;IoT 线程负责 Wi-Fi 和 MQTT;MPU6050 线程负责加速度采样和计步;设备读取线程负责温度、显示和属性上报;久坐线程负责定时提醒;时间线程负责本地时钟更新。
这里的关键不是任务数量,而是任务之间尽量通过状态和事件交互。设备读取线程可以周期性更新温度和步数,IoT 线程只关注是否连接以及怎样上报,主线程则统一处理改变状态的命令。这样可以避免网络阻塞直接拖慢屏幕刷新。
LCD 先做成可读,再做成好看
当前 LCD 页面显示模拟智能手表标题、时间、温度、步数、网络状态、运动菜单和门禁菜单。运动菜单有未开始、暂停和继续三种状态,门禁菜单有默认、门禁 1 和门禁 2 三种状态。
我把界面元素拆成菜单和信息面板两类组件。菜单负责选中、进入和退出,信息面板负责文本和图标显示。按键线程只报告按键编号,业务层根据按键修改状态,LCD 在下一轮刷新时统一重绘。这样的流程虽然朴素,但比在按键回调中直接堆显示代码更容易维护。
阶段结果
这一阶段完成了设备端的运行骨架和主要外设接入。开发板能够在屏幕上持续显示时间、温度和步数,并通过灯光、蜂鸣器和按键提供基本反馈。下一阶段要解决的是“数据是否可信”:计步算法需要抑制误触发,报警需要明确阈值和恢复逻辑,久坐监测也要避免被系统任务阻塞。