1. STM32蓝牙智能书桌项目概述
作为一名嵌入式开发工程师,我最近完成了一个很有意思的智能书桌项目。这个项目以STM32F103C8T6单片机为核心控制器,集成了蓝牙通信、坐姿检测和环境光调节三大功能模块。在实际使用中,它能有效帮助孩子纠正不良坐姿,同时提供舒适的光线环境。
这个项目的核心价值在于将传统的书桌升级为智能终端。通过超声波传感器实时监测使用者头部与桌面的距离,配合MPU6050陀螺仪检测身体倾斜角度,当检测到驼背或侧倾时,系统会立即发出提醒。同时,BH1750光照传感器会感知环境光线强度,自动调节LED台灯的亮度,避免光线过暗或过亮对眼睛造成伤害。
2. 硬件系统设计与选型
2.1 主控芯片选择
我选择STM32F103C8T6作为主控芯片主要基于以下几点考虑:
- 72MHz主频的Cortex-M3内核,性能足够处理多传感器数据
- 丰富的GPIO和外设资源(包括多个定时器用于PWM输出)
- 低功耗特性,适合长时间运行的场景
- 成熟的开发环境和丰富的库函数支持
在实际开发中,这款芯片的表现非常稳定。我使用的是标准库进行开发,虽然现在官方更推荐HAL库,但标准库的资源占用更小,运行效率更高。
2.2 传感器模块选型
2.2.1 坐姿检测方案
经过多次测试,我最终确定了以下传感器组合:
-
HC-SR04超声波模块:用于测量头部与桌面的垂直距离
- 测量范围2cm-400cm,精度0.3cm
- 触发信号控制简单,适合嵌入式系统
- 成本低廉,易于获取
-
MPU6050六轴传感器:用于检测身体倾斜角度
- 集成三轴加速度计和三轴陀螺仪
- I2C接口,与STM32通信方便
- 内置DMP(数字运动处理器),可直接输出姿态角
注意:MPU6050需要水平安装在座椅靠背或桌板下方,安装角度会影响测量精度,建议通过校准程序确定基准位置。
2.2.2 环境光检测
BH1750光照传感器是理想的选择:
- 测量范围1-65535 lux
- 直接数字输出,无需额外AD转换
- 支持高精度模式和低功耗模式
实测中发现,将传感器安装在台灯灯罩内侧,避开直射光源,可以获得更准确的环境光强度数据。
2.3 蓝牙通信模块
HC-05蓝牙模块是最经济实惠的选择:
- 支持SPP协议,兼容大多数手机
- 工作电压3.3V,与STM32直接连接
- 传输距离约10米(视环境而定)
配置时需要注意:
- 进入AT模式需要将KEY引脚拉高
- 波特率建议设置为9600或115200
- 配对密码可自定义,默认是1234
3. 系统软件设计
3.1 主程序流程
系统采用前后台架构,主循环中处理各功能模块:
c复制int main(void)
{
Hardware_Init(); // 硬件初始化
Bluetooth_Init(); // 蓝牙模块初始化
Sensor_Calibration(); // 传感器校准
while(1)
{
Posture_Detection(); // 坐姿检测
Light_Adjust(); // 光线调节
Bluetooth_Process(); // 蓝牙数据处理
LowPower_Check(); // 低功耗检测
}
}
3.2 坐姿检测算法实现
坐姿判断主要依据两个参数:
- 头部高度(超声波测量)
- 身体倾斜角度(MPU6050)
c复制#define NORMAL_HEIGHT_MIN 25 // 正常坐姿最小高度(cm)
#define NORMAL_HEIGHT_MAX 35 // 正常坐姿最大高度(cm)
#define LEAN_ANGLE_THRESHOLD 15 // 倾斜角度阈值(度)
void Posture_Detection(void)
{
float height = Ultrasonic_GetDistance();
float angle = MPU6050_GetPitchAngle();
if(height < NORMAL_HEIGHT_MIN || height > NORMAL_HEIGHT_MAX) {
Alert_Trigger(HEIGHT_ALERT);
}
if(fabs(angle) > LEAN_ANGLE_THRESHOLD) {
Alert_Trigger(ANGLE_ALERT);
}
}
3.3 PWM调光实现
台灯亮度调节使用STM32的TIM2通道1输出PWM:
c复制void PWM_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
// 时钟使能
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
// 定时器基础配置
TIM_TimeBaseStructure.TIM_Period = 999; // 自动重装载值
TIM_TimeBaseStructure.TIM_Prescaler = 83; // 预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
// PWM模式配置
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 500; // 初始占空比50%
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM2, &TIM_OCInitStructure);
// 使能预装载
TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM2, ENABLE);
// 启动定时器
TIM_Cmd(TIM2, ENABLE);
}
4. 蓝牙通信协议设计
4.1 数据帧格式
为简化开发,我设计了简单的通信协议:
| 字节位置 | 内容 | 说明 |
|---|---|---|
| 0 | 帧头 | 固定0xAA |
| 1 | 命令类型 | 0x01-数据 0x02-控制 |
| 2 | 数据长度 | 后续数据字节数 |
| 3~n | 数据内容 | 具体数据 |
| n+1 | 校验和 | 前面所有字节的累加和取反 |
4.2 手机APP交互
Android APP主要实现以下功能:
- 实时显示坐姿数据
- 台灯亮度/色温控制
- 报警阈值设置
- 使用数据统计
关键代码片段(Android端):
java复制// 蓝牙连接
BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
BluetoothDevice device = bluetoothAdapter.getRemoteDevice(DEVICE_ADDRESS);
BluetoothSocket socket = device.createRfcommSocketToServiceRecord(MY_UUID);
socket.connect();
// 数据发送
OutputStream outputStream = socket.getOutputStream();
byte[] data = new byte[]{0xAA, 0x02, 0x01, 0x32, 0x44}; // 示例控制指令
outputStream.write(data);
5. 系统优化与调试经验
5.1 电源管理优化
为延长电池续航,我采取了以下措施:
- 使用STM32的STOP模式,空闲时功耗降至微安级
- 传感器采用间歇工作模式(如每200ms采样一次)
- LED驱动电路采用高效率恒流方案
实测表明,2000mAh锂电池可支持系统连续工作约72小时。
5.2 常见问题排查
-
蓝牙连接不稳定
- 检查天线位置,避免金属屏蔽
- 确保供电电压稳定(3.3V±5%)
- 适当降低通信波特率
-
超声波测距误差大
- 确保测量表面平整且有一定反射率
- 避免测量角度过大(建议垂直测量)
- 多次测量取平均值
-
PWM调光闪烁
- 提高PWM频率(建议1kHz以上)
- 检查LED驱动电路滤波电容
- 确保电源功率足够
6. 项目扩展方向
这个基础框架还可以进一步扩展:
- 加入WiFi模块:实现远程监控和数据上传
- 增加语音交互:通过语音控制台灯和查询状态
- 集成RFID识别:识别不同使用者,保存个性化设置
- 添加温湿度传感器:监测学习环境舒适度
在硬件设计上,我建议使用模块化设计,将传感器、主控、通信等部分做成独立模块,方便后期维护和升级。