DIY 数字身高仪:Arduino Nano + VL53L0X 激光测距 + OLED 显示
项目概述
本项目基于 Arduino Nano 与 ST VL53L0X (Time-of-Flight) 激光测距传感器,构建非接触式数字身高仪。安装于门框顶部,人员站立其下即可自动测量身高,结果显示于 128×64 OLED 屏,蜂鸣器播放提示音。旋钮编码器用于设置安装高度偏移量 (Offset),参数存入 EEPROM 掉电保持。适合家庭记录儿童生长、学校体检、诊所分诊等场景。
所需组件与物料
- Arduino Nano R3 × 1
- CJMCU-530 (VL53L0X) 激光测距模块 × 1
- KY-040 旋转编码器 (带按键) × 1
- SSD1306 OLED 128×64 (I2C) × 1
- 无源蜂鸣器 × 1
- 10kΩ 电阻 × 2 (I2C 上拉)
- 3D 打印外壳 (STL 文件提供)
核心原理:VL53L0X ToF 测距
VL53L0X 发射 940nm 不可见激光脉冲,SPAD 阵列接收回波,测量光子飞行时间 (ToF) 直接换算距离,量程 0~2m,精度 ±3% (典型 ±1cm)。优势:不受目标反射率影响、抗环境光干扰、Class 1 激光安全、I2C 接口易集成。本项目配置 **高精度 + 长距离模式** (Timing Budget 200ms),牺牲速度换取稳定性。
硬件接线指南
| 模块引脚 | Arduino Nano | 备注 |
|---|---|---|
| VL53L0X VCC | 5V | 板载 LDO 输出 2.8V |
| VL53L0X GND | GND | |
| VL53L0X SDA | A4 | 共享 I2C,需 10kΩ 上拉至 3.3V |
| VL53L0X SCL | A5 | 共享 I2C,需 10kΩ 上拉至 3.3V |
| OLED VCC | 3.3V | |
| OLED GND | GND | |
| OLED SDA | A4 | 共享 I2C |
| OLED SCL | A5 | 共享 I2C |
| 编码器 CLK | D2 | 中断脚 |
| 编码器 DT | D3 | |
| 编码器 SW | D4 | 内部上拉 |
| 蜂鸣器 + | D5 | PWM 驱动 |
| 蜂鸣器 - | GND |
安装与校准指南
安装位置
设备固定于门框顶部**正中**,避免侧壁干扰激光束 (Crosstalk 串扰)。若门框较宽,可用延长杆将传感器伸出远离侧壁。测量并记录 **传感器发射面至地面垂直距离 (Offset)**,单位厘米。
Offset 校准流程
- 长按编码器按键 (>1s) 进入校准模式,OLED 显示 "CALIBRATION" 与当前 Offset。
- 旋转编码器调整数值 (顺时针 +1cm,逆时针 -1cm),范围 0~255cm。
- 再次按下按键确认,蜂鸣器发出两音确认音,参数写入 EEPROM 地址 0~1。
- 1 分钟无操作自动退出不保存。
软件库依赖
Wire.h(内置)Adafruit_SSD1306.h+Adafruit_GFX.h(OLED)VL53L0X.h(Pololu 版,轻量易用)EEPROM.h(内置)
核心代码逻辑
测量状态机
- IDLE:持续测距,OLED 实时显示当前距离 (cm)。
- STABLE:连续 2.5 秒 (可调) 读数波动 < 5mm,判定为有效测量,锁定显示,蜂鸣器播放《小星星》片段,进入 HOLD 状态。
- HOLD:显示锁定身高值 (Offset - Distance),5 秒后自动回 IDLE。
- CALIBRATE:编码器调整 Offset,实时预览。
关键代码片段
// Pololu VL53L0X 初始化
VL53L0X sensor;
sensor.init();
sensor.setTimeout(500);
sensor.setSignalRateLimit(0.1);
sensor.setVcselPulsePeriod(VL53L0X::VcselPeriodPreRange, 18);
sensor.setVcselPulsePeriod(VL53L0X::VcselPeriodFinalRange, 14);
sensor.setMeasurementTimingBudget(200000); // 200ms 高精度
sensor.startContinuous();
// 主循环测量
uint16_t dist = sensor.readRangeContinuousMillimeters();
if (sensor.timeoutOccurred()) { /* 错误处理 */ }
float height = offset_cm - dist / 10.0; // mm 转 cm
3D 打印外壳
作者设计一体化外壳 (STL 文件 `HTAY.stl`),包含:传感器窗口 (无盖玻璃避免串扰)、OLED 显示窗、编码器旋钮孔、蜂鸣器声孔、Nano USB 口预留、背部安装槽 (适配门框螺丝/胶带)。建议 PETG 材料打印,耐热耐用。
使用注意事项
- 激光安全:Class 1 不伤眼,但避免直视发射口。
- 串扰消除:传感器四周 >10cm 无遮挡物,必要时按 ST 文档做盖玻璃校准。
- 供电稳定:VL53L0X 峰值电流 ~40mA,Nano USB 供电通常足够,长线供电建议加 100μF 电解电容。
- 温度漂移:极端温度下可加入温度传感器补偿。
项目文件
- Arduino 代码:`HTAY.ino` (文末下载)
- 3D 模型:`HTAY.stl`
- 原理图:`schematic.png`
- GitHub:Pololu VL53L0X Library
制造工艺
- 树莓派对接HDC2010:I²C温湿度传感器完整接线与编程指南
- 使用 OpenSensors 监测空气质量:Arduino 与 Python 实战指南
- 树莓派接入 TGS2600 气体传感器检测有毒气体:电阻阶梯模拟数字转换
- 验证并校准湿度传感器以实现精准测量
- 用 Arduino 制作万能红外遥控器:分步指南
- K30 CO₂ 传感器:室内空气质量实时监测
- DFRobot 电容指纹传感器 (ID809) 接入 Arduino/ESP8266 完整教程
- Arduino Cloud 传感器塔:温度、动作与气体监测
- 基于 Arduino Nano 的智能运动感应水枪
- 热敏电阻测温轻松上手:Arduino 分步实战教程
- 破解用工难题:紧缺人才市场下的招聘与留才策略
- 评估您的工业物联网就绪度:您准备好迎接工业4.0成功了吗?