1. 项目概述:用超声波守护你的视力健康
盯着电脑屏幕工作三小时后,我的视线开始模糊——这个场景恐怕每个程序员都经历过。视力保护器这个看似简单的设备,实际上融合了距离检测、环境光感知和智能提醒三大核心功能。市面上大多数同类产品仅靠定时提醒,而我们的设计通过STM32单片机驱动HC-SR04超声波模块实时监测人眼到屏幕的距离,配合BH1750光强传感器检测环境亮度,实现真正的智能防护。
这个项目的独特价值在于:当检测到用户持续近距离(<50cm)使用屏幕超过设定时长,或环境光线低于150lux时,系统会通过蜂鸣器和LED组合提醒。相比商业产品动辄数百元的售价,我们采用STC89C52单片机作为控制核心,整套硬件成本可控制在30元以内。实测数据显示,在60cm标准使用距离下,测距误差可控制在±0.5cm以内,完全满足日常防护需求。
2. 硬件系统架构设计
2.1 核心控制器选型对比
在STM32F103C8T6与STC89C52之间的选择需要权衡性能与成本:
- STM32方案(约25元):
- 72MHz主频,20KB RAM
- 支持硬件PWM生成
- 需外接ST-Link调试器
- STC89C52方案(约8元):
- 11.0592MHz主频,512B RAM
- 需软件模拟PWM
- 直接USB-TTL下载
考虑到本项目不需要复杂运算,最终选用STC89C52+Keil C51开发环境,既满足需求又大幅降低成本。
2.2 传感器模块关键参数
- HC-SR04超声波模块:
- 工作电压:5V DC
- 探测角度:15°
- 量程:2cm-400cm
- 精度:3mm(需温度补偿)
- BH1750光照传感器:
- 量程:1-65535 lux
- 分辨率:1lux
- I2C接口
实测中发现HC-SR04在高温环境下测距会偏大,需在代码中添加温度补偿公式:实际距离=测得距离×(1+0.0006×(当前温度-25))
2.3 电路设计要点
电源部分采用AMS1117-3.3V为BH1750供电,主控和超声波模块共用5V电源。特别注意:
- 超声波模块的VCC与GND间需并联100μF电容
- 蜂鸣器驱动电路要加1N4148续流二极管
- 所有数字地模拟地单点连接
3. 软件实现与算法优化
3.1 超声波测距核心代码
c复制// STC89C52定时器1初始化
void Timer1_Init() {
TMOD &= 0x0F; // 清除T1控制位
TMOD |= 0x10; // 设置T1为16位定时器
TH1 = 0;
TL1 = 0;
}
float Get_Distance() {
Trig = 1;
delay_us(20); // 触发脉冲宽度≥10μs
Trig = 0;
while(!Echo); // 等待回波高电平
TR1 = 1; // 启动计时
while(Echo);
TR1 = 0; // 停止计时
uint time = (TH1<<8)|TL1;
TH1 = TL1 = 0;
return (time*0.017); // 340m/s声速换算
}
3.2 动态阈值调整算法
传统固定阈值在环境变化时易误报,我们采用滑动窗口算法:
c复制#define SAMPLE_SIZE 10
uint32_t lux_samples[SAMPLE_SIZE];
uint16_t Get_Adaptive_Threshold() {
static uint8_t index = 0;
lux_samples[index++] = BH1750_Read();
if(index >= SAMPLE_SIZE) index = 0;
uint32_t sum = 0;
for(uint8_t i=0; i<SAMPLE_SIZE; i++) {
sum += lux_samples[i];
}
return (sum/SAMPLE_SIZE) * 0.7; // 取平均值的70%作为阈值
}
3.3 状态机设计
系统采用有限状态机模式管理:
mermaid复制stateDiagram-v2
[*] --> IDLE
IDLE --> MEASURING: 定时器中断
MEASURING --> WARNING: 距离<50cm持续5分钟
WARNING --> IDLE: 用户按下确认键
MEASURING --> NORMAL: 距离恢复正常
4. 制作与调试实战
4.1 PCB布局注意事项
- 超声波模块应远离MCU的晶振电路
- BH1750的光敏窗口避免被结构件遮挡
- 蜂鸣器与麦克风距离需>3cm防止声反馈
4.2 校准流程
- 在标准距离60cm处放置白纸
- 调节HC-SR04的接收增益电位器
- 运行校准程序:
bash复制$ python calibrate.py --port COM3 --distance 60
- 根据输出调整代码中的声速参数
4.3 功耗优化技巧
- 将BH1750设置为单次测量模式
- 超声波模块间隔采样(如500ms一次)
- 空闲时MCE进入掉电模式
实测可使整机工作电流从35mA降至8mA
5. 常见问题解决方案
5.1 超声波模块无响应
检查清单:
- 确认VCC电压≥4.8V
- 测量Trig引脚是否有10μs以上脉冲
- 用示波器观察Echo信号
- 检查GND共地连接
5.2 光照数据跳动严重
- 在BH1750的VCC引脚加0.1μF去耦电容
- I2C线上拉电阻改为4.7kΩ
- 软件端采用中值滤波:
c复制uint16_t Median_Filter(uint16_t new_val) {
static uint16_t buffer[5];
static uint8_t idx = 0;
buffer[idx++] = new_val;
if(idx >=5) idx=0;
// 排序取中值
uint16_t temp[5];
memcpy(temp, buffer, sizeof(temp));
Bubble_Sort(temp);
return temp[2];
}
5.3 误报问题处理
当出现以下情况时系统会误报:
- 桌面放置反光物体
- 突然的环境光变化(如开关灯)
解决方案: - 增加红外人体感应模块
- 采用双重确认机制(距离+持续时间)
这个项目最让我惊喜的是STC89C52的性能表现——在精心优化后,它不仅能流畅处理超声波测距,还能同时管理光照检测和用户界面。有个细节值得分享:在PCB上为HC-SR04设计一个45度倾角的安装支架,可使检测范围更符合人眼到屏幕的实际距离变化曲线。
