Arduino 超声波安防系统:HC-SR04 实时测距 + 多级声光报警
项目概览
基于 Arduino UNO 与 HC-SR04 超声波测距模块,构建分级安防演示系统:绿灯(>50 cm 安全) → 黄灯(20~50 cm 警戒) → 红灯+蜂鸣器(<20 cm 入侵)。适合初学者理解超声波测距原理、pulseIn() 计时、非阻塞 LED/蜂鸣器控制。
元件清单
| 元件 | 数量 | 接线 |
|---|---|---|
| Arduino UNO | 1 | |
| HC-SR04 超声波模块 | 1 | VCC→5V, Trig→D2, Echo→D3, GND→GND |
| 红/黄/绿 LED | 各 1 | 阳极接 D4/D5/D6,阴极串 220 Ω 接 GND |
| 无源蜂鸣器 | 1 | 正极接 D7,负极接 GND(建议串 220 Ω 降音量) |
| 面包板、跳线 | 1套 |
接线图解
HC-SR04 Arduino UNO
┌─────────┐ ┌───────────┐
│ VCC ────┼─────────────────│ 5V │
│ Trig ───┼─────────────────│ D2 │
│ Echo ───┼─────────────────│ D3 │
│ GND ────┼─────────────────│ GND │
└─────────┘ └───────────┘
LED 阳极 → D4(红) / D5(黄) / D6(绿) → 220Ω → GND
Buzzer + → D7 → (220Ω) → GND
核心代码(已修复原文变量名错误)
#define TRIG_PIN 2
#define ECHO_PIN 3
#define LED_GREEN 4
#define LED_YELLOW 5
#define LED_RED 6
#define BUZZER_PIN 7
void setup() {
Serial.begin(9600);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(LED_GREEN, OUTPUT);
pinMode(LED_YELLOW, OUTPUT);
pinMode(LED_RED, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
}
void loop() {
// 1. 触发测距
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
// 2. 读取回波脉宽
long duration = pulseIn(ECHO_PIN, HIGH, 30000); // 30 ms 超时 ≈ 5 m
float distance_cm = duration * 0.0343 / 2; // 声速 343 m/s
// 3. 分级逻辑
bool inRange = (distance_cm > 0 && distance_cm <= 400); // HC-SR04 有效量程
digitalWrite(LED_GREEN, inRange && distance_cm > 50);
digitalWrite(LED_YELLOW, inRange && distance_cm <= 50 && distance_cm > 20);
digitalWrite(LED_RED, inRange && distance_cm <= 20);
// 4. 蜂鸣器:入侵区间内发声,频率随距离升高
if (inRange && distance_cm <= 20) {
int freq = map(distance_cm, 1, 20, 2000, 500); // 1 cm→2kHz, 20 cm→500Hz
tone(BUZZER_PIN, freq);
} else {
noTone(BUZZER_PIN);
}
// 5. 串口调试
if (inRange) {
Serial.print(distance_cm); Serial.println(F(" cm"));
} else {
Serial.println(F("Out of range"));
}
delay(100); // 10 Hz 刷新率
}
关键知识点解析
- 超声波测距公式:
distance = duration * 0.0343 / 2(单位 cm),0.0343= 声速 343 m/s 转 cm/µs。 - pulseIn() 超时参数:第三个参数防止死锁,30000 µs 对应 5.14 m,超出量程直接返回 0。
- 分级阈值滞回:实际部署建议在 20/50 cm 增加 ±2 cm 滞回,避免临界点灯光闪烁。
- 蜂鸣器保护:无源蜂鸣器直驱电流大,**必须串联 220 Ω** 或用三极管驱动,否则烧毁 GPIO。
- 供电稳定性:HC-SR04 工作电流峰值 ~15 mA,UNO 5V 引脚可直接供电;若接多模块请外接 5V 稳压。
常见故障排查
| 现象 | 可能原因 | 对策 |
|---|---|---|
| 串口持续打印 0 / Out of range | Echo 引脚未接触良好 / 超时 | 检查杜邦线、焊点;增大 pulseIn 超时 |
| 读数跳变 > 10 cm | 供电纹波 / 多径反射 | 模块 VCC/GND 并联 10 µF 电解 + 0.1 µF 陶瓷电容 |
| 蜂鸣器无声/极弱 | 无源蜂鸣器极性反 / 无限流电阻 | 确认正负极,串联 220 Ω |
| LED 全亮/全灭 | 公共阴极/阳极接线错误 | 万用表二极管档测 LED 极性 |
进阶扩展
- 加入 OLED 显示实时距离波形图。
- 接入 ESP8266/ESP32 推送微信/钉钉报警。
- 改用 VL53L0X ToF 激光测距,精度 ±3 mm、抗干扰强。
- 增加舵机云台实现 180° 扫描雷达,配合 Processing 绘制极坐标地图。
安全提示:蜂鸣器音量可达 85 dB,近距离测试请佩戴耳塞;HC-SR04 盲区 < 2 cm,勿用于精密避障。
制造工艺
- ESP32-CAM 运动检测安防相机,推送照片到 Discord
- Arduino 数字骰子:LCD 显示随机点数的电子骰子
- 用 Arduino Nano 自制 37 灯珠轮盘赌游戏机
- ATtiny85 迷你街机:贪吃蛇 — 打造掌上 OLED 游戏机
- 便携测距仪 DIY 套件:Arduino Nano + HC-SR04 + 18650 电池 + 3D 打印外壳
- 基于 1Sheeld 的智能家居安防系统:语音/短信控制与入侵报警
- Arduino Nano 驱动的智能家居植物自动浇水系统
- 铜电镀智能系统:基于 Arduino UNO 的可控电解装置
- Arduino Nano 驱动 NeoPixel 矩阵:自制霓虹乒乓游戏
- 使用 Arduino 移位寄存器创建绚丽灯光序列
- 智能插座:基于 Arduino 与 RTC 的 120V 定时开关插座
- DIY 双轴太阳能跟踪系统——基于 Arduino UNO