1. 项目背景与核心功能
每次坐在书桌前工作学习,总是不知不觉就过了好几个小时,等到腰酸背痛才想起来该活动一下。这种场景是不是很熟悉?基于STM32的智能书桌就是为了解决这个问题而设计的。它不仅能监测你的久坐时间,还能自动调节环境光线,甚至通过语音提醒你该起来活动了。
这个项目的核心在于通过WiFi模块将书桌的各种传感器数据上传到云端,再通过MQTT协议实现设备与手机APP的实时交互。最终在阿里云IoT Studio上构建可视化看板,让你一眼就能看到自己的健康数据。我做过好几个类似的项目,实测下来这种方案既稳定又容易上手,特别适合作为物联网入门练手。
2. 硬件设计与选型要点
2.1 主控芯片选择
STM32F103C8T6是这个项目的最佳选择,江湖人称"蓝色小药丸"的它性价比超高。我对比过ESP32和Arduino方案,最后还是选了STM32,原因有三:一是GPIO资源丰富,能同时接多个传感器;二是功耗控制优秀,长时间工作不发烫;三是开发资料多,遇到问题容易找到解决方案。
这里有个小技巧:买开发板时一定要选带SWD调试接口的版本。我第一次做的时候为了省几块钱买了最小系统板,结果调试时只能靠串口打印日志,效率低到怀疑人生。
2.2 传感器配置方案
书桌需要监测两个关键指标:用户存在检测和环境光强度。经过多次测试,我推荐这样的传感器组合:
- 薄膜压力传感器(FSR402):铺在桌垫下方,检测用户是否就坐
- 光敏电阻(GL5528):装在桌角,监测环境光照
- DHT11温湿度传感器:可选配置,监测工作环境舒适度
压力传感器的安装位置很有讲究。我试过放在椅子坐垫下,但发现有人起身拿东西时会误触发。后来改在桌面左右各放一个,只有两个传感器都检测到压力才判定为就坐状态,准确率提升到95%以上。
2.3 WiFi模块选型
ESP8266-01S是性价比之王,8块钱就能搞定联网功能。但要注意这两个坑:
- 固件必须刷AT指令固件,出厂带的可能版本太旧
- 供电要稳定,最好单独接个470μF电容
连接WiFi时建议这样处理:
AT+CWJAP="SSID","password" // 连接路由器 AT+CIPSTART="TCP","mqtt.aliyuncs.com",1883 // 连接MQTT服务器3. 云端平台搭建实战
3.1 阿里云IoT平台配置
首先在阿里云IoT平台创建产品,关键配置如下:
- 节点类型:直连设备
- 联网方式:Wi-Fi
- 数据格式:Alink JSON
添加三个功能定义:
- sitting_status(就坐状态)
- light_intensity(光照强度)
- alert_threshold(久坐提醒阈值)
创建好设备后,记下这三要素:ProductKey、DeviceName、DeviceSecret。这些就像设备的身份证,后续编程都要用到。
3.2 MQTT主题设计
MQTT通信需要设计合理的主题结构。我推荐这样的格式:
/user/[userId]/desk/[deviceId]/upload /user/[userId]/desk/[deviceId]/control上传数据用JSON格式:
{ "id": "123", "params": { "sitting_status": 1, "light_intensity": 300 } }4. 数据可视化实现
4.1 IoT Studio看板配置
在阿里云IoT Studio中新建Web应用,添加这些组件:
- 数字翻牌器:显示当前就坐时长
- 仪表盘:实时光照强度
- 曲线图:历史久坐数据
- 开关组件:远程控制LED提示灯
配置数据源时要注意:设备数据→物模型数据→选择对应的功能标识符。我第一次做的时候选成了设备属性,结果数据死活出不来。
4.2 自定义报警规则
在规则引擎中设置两条关键规则:
- 连续就坐超过30分钟 → 触发语音提醒
- 环境光低于100lux → 自动开启台灯
这里有个实用技巧:可以设置阶梯式提醒。比如第一次提醒后如果用户还在就坐,每隔10分钟再提醒一次,提醒强度逐渐增加。
5. 移动端开发要点
5.1 APP基础功能
使用Android Studio开发控制APP,核心功能包括:
- 实时数据显示(MQTT订阅)
- 久坐阈值设置(MQTT发布)
- 历史数据查询(调用API)
关键代码片段:
// MQTT连接 client = new MqttAndroidClient(this, "tcp://mqtt.aliyuncs.com:1883", deviceId); client.connect(connOpts, null, new IMqttActionListener() { @Override public void onSuccess(IMqttToken asyncActionToken) { subscribeToTopic(); } });5.2 用户体验优化
在开发过程中发现几个值得注意的细节:
- 添加本地缓存,网络中断时仍能显示最近数据
- 采用Material Design的Snackbar提示控制指令状态
- 使用WorkManager处理后台定时任务
测试时发现如果直接在主线程操作UI,APP容易卡死。后来改用RxJava处理异步操作,流畅度提升明显。
6. 系统整合与调试
6.1 联调常见问题
把硬件、云端、APP三部分联调时,我踩过这些坑:
- MQTT频繁断连 → 原来是心跳间隔设置太短,改成60秒后稳定了
- 数据上传延迟 → 调整ESP8266的TCP缓冲区大小解决
- APP收不到通知 → 发现阿里云规则引擎没有正确配置消息转发
调试时建议先用MQTT.fx工具模拟设备上下线,确认云端配置正确后再接真实设备。
6.2 功耗优化技巧
如果想让设备电池供电,这些措施很有效:
- STM32进入STOP模式,通过传感器中断唤醒
- ESP8266仅在传输数据时上电
- 降低ADC采样频率到1Hz
实测下来,2000mAh的锂电池可以坚持两周左右。如果换成LoRa通信,续航还能更长,但开发复杂度会提高。
7. 项目扩展方向
完成基础功能后,可以考虑这些增强功能:
- 增加超声波测距模块,实现坐姿检测
- 接入天猫精灵,支持语音控制
- 开发微信小程序版本控制端
- 增加RFID识别,实现多用户个性化设置
最近我在书桌侧面加了个舵机控制的储物盒,久坐提醒后自动弹出,里面放着缓解疲劳的小物件。这种小惊喜能让项目更有趣味性。