Arduino 激光对射入侵报警器:从原理到成品的完整教程
项目概述
本项目指导读者利用 Arduino UNO、激光二极管、两只光敏电阻(一路对射检测、一路环境光补偿)、无源蜂鸣器与按键,构建一套低成本、高可靠性的激光对射入侵检测系统。系统具备“设置/布防/触发”三态机,支持串口调试输出、激光瞄准指示、自适应阈值计算、多级报警逻辑,适合门窗防护、展柜监护、科教演示等场景。
核心元器件清单
| 组件 | 规格/型号 | 关键参数 | 数量 |
|---|---|---|---|
| 主控板 | Arduino UNO R3 | ATmega328P,14数字/6模拟口 | 1 |
| 发射端 | 激光二极管模块(650nm/5mW) | 工作电压 5V,直径 6mm,带聚焦透镜 | 1 |
| 接收端 | 光敏电阻 (LDR) / 光电二极管 | 暗电阻 >1MΩ,亮电阻 <10kΩ,峰值响应 550nm | 2 |
| 分压电阻 | 10kΩ 1% 精密电阻 | 与 LDR 组成分压桥,接 A0/A1 | 3 |
| 报警器 | 无源蜂鸣器 | 5V 方波驱动,频率 2-4kHz 最响 | 1 |
| 模式按键 | 轻触开关 12mm | 接 D4,内部上拉/外接 10kΩ 下拉 | 1 |
| 指示灯 | 板载 LED (D13) | 指示激光对准状态 | 1 |
| 辅助材料 | 面包板、杜邦线、反射镜/定向支架 | 用于光路折返与固定 | 若干 |
光学与电路设计要点
差分检测原理
两只 LDR 分别构成分压电路:
- 信号通道 (A0):正对激光光斑,受激光照射电阻骤降,分压电压升高。
- 参考通道 (A1):背光放置,仅感受环境光变化。
- 自适应阈值:
threshold = ambient + (signal - ambient) / 2,动态跟踪环境光漂移,抑制误报。
激光驱动电路
激光模块自带恒流驱动,直接由 D2 控制(高电平发光)。为安全起见,建议串联 100Ω 电阻限流,并加装防反接二极管。实际部署时需确保激光等级符合 Class II (<1mW) 标准,避免直视伤眼。
机械结构建议
- 发射端与接收端对向安装,距离 0.5-10m,中间可加平面镜折返,实现单侧布线。
- 使用可调角度支架(如云台、磁性底座),便于精细对准。
- 户外应用需加装遮光罩、防雨罩,防止强光直射与水汽凝结。
软件状态机设计
三态定义
| 状态 | 模式值 | 进入条件 | 行为描述 |
|---|---|---|---|
| 设置模式 | 0 | 按键按下(从布防/触发态切换) | 激光常亮,串口高频输出三通道 ADC 值,D13 亮指示对准完成 |
| 布防模式 | 1 | 设置模式下再次按键 | 激光常亮,3s 周期串口心跳,实时比较信号通道与阈值,跌破即触发 |
| 触发模式 | 2 | 布防态下光束被遮断 | 蜂鸣器响 3 声,串口报警,1s 后自动回布防态 |
核心代码片段
// 状态机核心逻辑
enum Mode { SETUP, ARMED, TRIP };
Mode mode = SETUP;
unsigned long lastBeep = 0, lastReport = 0;
int tripVal = 1000, minLight = 900; // 经验初值
void loop() {
// 按键消抖与状态切换
if (digitalRead(BTN_PIN) == HIGH) {
delay(300); // 简单消抖
mode = (Mode)((mode + 1) % 3);
beep(1);
}
switch (mode) {
case SETUP:
digitalWrite(LASER_PIN, HIGH);
ambient = analogRead(AMB_PIN);
trip = analogRead(TRIP_PIN);
threshold = ambient + (trip - ambient) / 2;
debugPrint();
digitalWrite(LED_PIN, trip >= minLight);
break;
case ARMED:
digitalWrite(LASER_PIN, HIGH);
digitalWrite(LED_PIN, LOW);
ambient = analogRead(AMB_PIN);
threshold = ambient + (trip - ambient) / 2;
if (analogRead(TRIP_PIN) < threshold) mode = TRIP;
if (millis() - lastReport >= 3000) { debugPrint(); lastReport = millis(); }
break;
case TRIP:
if (millis() - lastBeep >= 1000) { debugPrint(); beep(3); mode = ARMED; lastBeep = millis(); }
break;
}
delay(1);
}
调试与部署指南
- 硬件自检:上传
Blink测试 D13/D3,用万用表验证 LDR 分压电压随遮光变化(亮 <1V,暗 >4V)。 - 光路对准:进入设置模式,调整发射/接收端角度,直到 D13 常亮且串口
T值稳定 >minLight。 - 阈值微调:观察串口
AT(自适应阈值)与T(实时值)关系,必要时修改minLight或引入滑动平均滤波。 - 布防测试:切换至布防模式,用手遮断光束,确认蜂鸣器 3 声报警、串口输出
MODE:TRIP、1s 后自动恢复布防。 - 环境适应性测试:日照变化、灯光开关、烟雾干扰下连续运行 24h,记录误报/漏报率。
进阶扩展方案
- 多区域扩展:利用 Mega 多路 ADC,单主控管理 8-16 路对射区,区域编号报警。
- 无线联网:接入 ESP8266/LoRa 模块,报警推送至手机/中控平台。
- 视频联动:触发时唤醒摄像头抓拍/录像,配合 AI 人形检测过滤误报。
- 电池供电:低功耗设计(睡眠模式+看门狗定时唤醒),配合太阳能板实现离网部署。
- 激光调制:对激光进行 kHz 方波调制,接收端锁相放大,大幅提升抗环境光干扰能力与通讯距离。
安全合规提示
- 激光输出功率必须 <1mW(Class II),并贴警示标签“避免直视光束”。
- 公共区域部署需符合当地安防工程规范,报警输出应接入消防/安保联动系统。
- 定期清洁光学窗口,检查激光功率衰减(建议每半年校准)。
制造工艺
- 自制《鱿鱼游戏》主题互动娃娃——Arduino UNO DIY项目
- 自制 Arduino 伊斯兰祷告时间实时时钟
- 基于 Arduino Uno 的人体检测救援机器人:传感器集成分步指南
- Arduino Uno WiFi 网页服务器:通过浏览器控制 LED 开关
- Arduino 串口简易计算器:两数四则运算演示
- Arduino UNO 驱动 1.17 英寸 TFT 屏显示图片 (SD 卡读取)
- 自制便携式视觉暂留显示器:Arduino UNO 与 ATtiny85
- Arduino Uno驱动MAX7219级联8×8 LED矩阵:从入门到动画显示
- Wi-Servo:基于 ESP8266 的 Wi-Fi 网页端舵机远程控制系统
- Arduino + 继电器 + 安卓 App 远程控制灯泡
- Arduino 激光雕刻机:GRBL 固件 + Universal Gcode Sender 全流程实战
- Arduino Uno 控制 25kHz 4 针 PWM 风扇 - 硬件、代码与测试