1. 项目概述
去年在社区健康中心做志愿者时,我发现传统身高测量仪存在几个痛点:机械结构易磨损、读数不够精准、数据无法数字化记录。于是萌生了用单片机改造传统测量仪的想法。这个基于单片机的身高测量仪项目,核心是用超声波传感器替代机械滑轨,通过STM32处理器实时计算并显示身高数据,最终成本控制在50元以内,测量误差±0.3cm。
相比市售产品,这个方案有三个突出优势:一是非接触式测量避免交叉感染,特别适合幼儿园和社区卫生站使用;二是可扩展蓝牙模块实现数据自动上传;三是采用OLED屏幕显示,在强光环境下依然清晰可见。整个开发过程涉及传感器选型、信号滤波算法、人机交互设计等多个技术环节,下面我就把踩过的坑和最终验证可靠的方案完整分享出来。
2. 核心硬件设计
2.1 传感器选型对比
最初测试了三种测距方案:
- 红外传感器(成本低但易受环境光干扰)
- 激光TOF传感器(精度高但价格超预算)
- HC-SR04超声波模块(最终选用方案)
实测数据对比:
| 传感器类型 | 测量范围 | 误差范围 | 单价 | 响应时间 |
|---|---|---|---|---|
| 红外 | 20-150cm | ±2cm | 8元 | 50ms |
| 激光TOF | 5-400cm | ±0.1cm | 85元 | 10ms |
| 超声波 | 2-450cm | ±0.3cm | 12元 | 30ms |
选择HC-SR04的关键考量:
- 防水防尘性能好(意外洒水不影响使用)
- 温度补偿电路内置(冬季夏季测量稳定)
- 3.3V/5V双电压兼容(方便连接不同单片机)
2.2 主控电路设计
采用STM32F103C8T6最小系统板作为主控,具体外设配置:
c复制// 引脚定义
#define TRIG_PIN PA1 // 超声波触发
#define ECHO_PIN PA2 // 回波接收
#define OLED_SDA PB7 // I2C数据线
#define OLED_SCL PB6 // I2C时钟线
电源管理特别注意:
- 单独LM1117-3.3稳压芯片给单片机供电
- 超声波模块使用5V直连(避免3.3V驱动不足)
- 添加100μF电解电容消除电机干扰
3. 关键算法实现
3.1 超声波测距原理
传感器工作时序分为三步:
- 触发信号:给TRIG引脚10μs以上高电平
- 回波检测:ECHO引脚高电平持续时间即声波往返时间
- 距离计算:distance = (echo_time * 340m/s) / 2
实际代码实现:
c复制float getDistance() {
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(15);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH);
return (duration * 0.034) / 2; // 单位转换为cm
}
3.2 数据滤波处理
原始数据存在毛刺,采用三重滤波:
- 中值滤波:连续采样5次取中间值
- 滑动平均:最近3次测量结果求平均
- 阈值限幅:超过±5cm突变视为无效数据
滤波效果对比:
| 滤波方式 | 标准差(cm) | 最大误差(cm) |
|---|---|---|
| 原始数据 | 0.82 | 2.1 |
| 中值滤波 | 0.45 | 1.3 |
| 复合滤波 | 0.18 | 0.5 |
4. 人机交互设计
4.1 OLED显示界面
使用SSD1306驱动0.96寸OLED,界面元素包括:
- 实时高度数值(72号字体)
- 测量状态图标(动态波浪线)
- 历史记录折线图
- 电池电量指示
优化显示刷新率的关键技巧:
c复制void updateDisplay() {
display.clearDisplay();
display.setTextSize(3);
display.setCursor(15,20);
display.printf("%.1fcm",height);
// 局部刷新代替全屏刷新
display.display();
}
4.2 校准模式设计
通过三个物理按键实现:
- 长按SET键3秒进入校准模式
- 用UP/DOWN键调整基准值(以标准1米刻度为参照)
- 再次按下SET键保存参数到Flash
校准参数存储结构体:
c复制typedef struct {
float offset; // 零点偏移
float factor; // 线性补偿系数
uint8_t checksum; // 校验和
} CalibData;
5. 实测问题与优化
5.1 典型故障排查
-
测量值跳变严重
- 检查电源纹波(示波器观察5V线)
- 增加传感器接地屏蔽
- 调整触发间隔≥100ms
-
低温环境误差大
- 添加DS18B20温度传感器
- 根据实测温度补偿声速:
c复制float speed = 331.4 + (0.606 * temp) + (0.0124 * humidity);
-
OLED显示残影
- 降低刷新率至10Hz
- 增加显示缓冲区
- 避免频繁全屏清屏
5.2 功耗优化方案
待机电流从25mA降至1.8mA的改进:
- 启用STM32的STOP模式
- 超声波模块动态供电(测量时上电)
- OLED关闭背光(环境光足够时)
实测续航对比:
| 工作模式 | 平均电流 | 2000mAh电池续航 |
|---|---|---|
| 持续工作 | 38mA | 52小时 |
| 间隔测量 | 12mA | 166小时 |
| 深度睡眠 | 1.2mA | 1666小时 |
6. 扩展应用方向
当前系统预留的扩展接口:
- 蓝牙4.0模块接口(可连接手机APP)
- 微型热敏打印机接口(打印测量凭条)
- 重量传感器接口(升级体检一体机)
在幼儿园实际部署时,我们增加了两个实用功能:
- 语音播报(SYN6288芯片实现)
- RFID身份识别(自动关联成长档案)
硬件成本清单(批量化版本):
| 部件 | 单价 | 备注 |
|---|---|---|
| STM32F103C8T6 | 8.5 | 国产替代型号 |
| HC-SR04 | 6.8 | 带温度补偿版本 |
| OLED屏 | 9.9 | 0.96寸I2C接口 |
| 锂电池 | 12 | 1200mAh带保护板 |
| 结构件 | 5 | 3D打印外壳 |
这个项目最让我惊喜的是超声波模块的稳定性——经过半年每天300+次的实测,精度衰减不超过0.1cm。建议初次制作时重点调试滤波算法,这是影响用户体验的关键因素。