💡 划重点
- 主控选用 ESP32,成本低,自带 Wi-Fi,后续可扩展远程告警。
- PIR 负责检测动物移动,LDR 光敏判断昼夜,白天自动休眠,夜间上岗。
- 高频蜂鸣器配合 LED 阵列爆闪,形成声音加光线的双重驱赶效果。
- 全部物料控制在 55 元以内,适合家庭果园、菜园批量自制。
- 调试重点是光照阈值和触发间隔,减少误报与无效驱赶。
需求洞察
目标用户是经营小型果园、菜园的种植户,以及城市近郊的庭院种植爱好者。这类人群通常在夜间会遇到野兔、鼠类、鸟类、流浪猫等动物啃食果实、嫩芽或蔬菜,造成直接经济损失。真实痛点在于:传统稻草人或反光带效果有限;建设围栏成本高、维护麻烦;养狗守夜增加日常管理负担;人工夜间巡视不现实,尤其对面积不大但作物价值较高的园子缺乏性价比高的自动防护手段。
该方案值得做,是因为夜间动物对突然出现的高频声音和强光非常敏感,短时间刺激即可将其驱离。利用 PIR 被动红外传感器能可靠感知温血动物移动,LDR 光敏电阻可避免白天误触发,ESP32 处理逻辑简单、功耗可接受,整套成本低、装配简单。对普通种植户来说,这是一种可复制、可维护、能显著降低损失的小型自动化装置。
方案设计
系统分为感知层、控制层、执行层和日志/联网层。
感知层:使用 HC-SR501 PIR 模块检测动物经过,输出数字开关量;使用光敏电阻模块检测环境光,输出模拟电压。ESP32 读取 PIR 的高电平作为触发条件,读取 LDR 的 ADC 值判断昼夜。
控制层:ESP32 作为核心控制器,内部运行简单状态机。当环境光低于设定阈值时进入夜间模式;夜间模式下若 PIR 输出高电平,立即启动驱赶流程;同时加入 3 秒冷却时间,避免同一动物停留时持续鸣响,节省电量并降低设备疲劳。
执行层:GPIO27 控制 LED 阵列做间歇爆闪,GPIO25 通过 LEDC 输出约 3.2kHz 的 PWM 信号驱动无源蜂鸣器,产生刺耳高频变调声。两种刺激联合作用,提高驱赶成功率。
日志/联网层:首版通过串口输出触发日志,方便调试。ESP32 自带 Wi-Fi,后续可低成本接入家庭路由器,通过 MQTT 上报触发次数、环境光照和设备状态,或推送微信、手机 App 告警,无需额外通信模块。
物料清单
| 序号 | 物料 | 数量 | 用途 | 单价(元) | 小计(元) |
|---|---|---|---|---|---|
| 1 | ESP32 开发板 | 1 | 主控处理 | 22.00 | 22.00 |
| 2 | HC-SR501 PIR | 1 | 动物移动检测 | 6.50 | 6.50 |
| 3 | 光敏电阻模块 | 1 | 判断昼夜 | 2.50 | 2.50 |
| 4 | 无源蜂鸣器 | 1 | 高频声驱赶 | 2.00 | 2.00 |
| 5 | 5mm 高亮白光 LED | 4 | 爆闪警示 | 0.60 | 2.40 |
| 6 | 220Ω 电阻 | 4 | LED 限流 | 0.10 | 0.40 |
| 7 | 洞洞板 | 1 | 搭建电路 | 2.50 | 2.50 |
| 8 | 杜邦线 | 若干 | 模块连接 | 3.00 | 3.00 |
| 9 | Micro USB 线 | 1 | 烧录与供电 | 3.50 | 3.50 |
| 10 | 5V 1A 适配器或充电宝 | 1 | 户外供电 | 7.00 | 7.00 |
合计:51.80 元,低于 55 元目标成本。
接线与结构
基本接线如下:
- PIR 模块 OUT 接 GPIO13,VCC 接 5V,GND 与主控共地。GPIO13 为普通数字输入,适合读取开关量。
- LDR 模块 AO 接 GPIO34,VCC 接 3.3V,GND 共地。GPIO34 是 ESP32 的输入专用 ADC 引脚,不能作输出,正好用于模拟光照采集。
- 蜂鸣器正极接 GPIO25,负极接 GND。GPIO25 支持 LEDC PWM 输出,可产生高频方波驱动无源蜂鸣器。如需更大音量,可增加 S8550 三极管扩流。
- LED 阵列:4 只 LED 并联,每只串联 220Ω 电阻,公共正极接 GPIO27,公共负极接 GND。GPIO27 负责爆闪控制。
结构上,将主控和线路固定在防水盒内,PIR 与 LDR 探头从盒侧开孔露出,LED 与蜂鸣器朝外。安装高度约 0.8 至 1.2 米,倾斜向下感应动物通道,避免雨水直淋和阳光直射 LDR 造成误判。
核心代码
以下为 Arduino 骨架,适用于 ESP32 开发板,可在 Arduino IDE 或 PlatformIO 中编译。
#include <Arduino.h>
#define PIR_PIN 13
#define LDR_PIN 34
#define BUZZER_PIN 25
#define LED_PIN 27
#define LDR_NIGHT_THRESHOLD 1800
#define TRIGGER_INTERVAL 3000
unsigned long lastTrigger = 0;
void setup() {
Serial.begin(115200);
pinMode(PIR_PIN, INPUT);
pinMode(LDR_PIN, INPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(LED_PIN, OUTPUT);
ledcSetup(0, 3200, 8);
ledcAttachPin(BUZZER_PIN, 0);
ledcWrite(0, 0);
digitalWrite(LED_PIN, LOW);
Serial.println("系统启动");
}
void loop() {
int light = analogRead(LDR_PIN);
bool isNight = (light < LDR_NIGHT_THRESHOLD);
int motion = digitalRead(PIR_PIN);
if (isNight && motion == HIGH) {
if (millis() - lastTrigger > TRIGGER_INTERVAL) {
lastTrigger = millis();
Serial.print("夜间触发,光照值:");
Serial.println(light);
for (int i = 0; i < 8; i++) {
ledcWrite(0, 180);
digitalWrite(LED_PIN, HIGH);
delay(100);
ledcWrite(0, 0);
digitalWrite(LED_PIN, LOW);
delay(60);
}
ledcWrite(0, 0);
digitalWrite(LED_PIN, LOW);
}
} else {
ledcWrite(0, 0);
digitalWrite(LED_PIN, LOW);
}
delay(100);
}
调试步骤
- 单独测试 LDR:串口打印光照 ADC 值,分别用手遮挡和强光照射,观察数值变化。根据现场光线确定夜间阈值,通常可先设为 1800,再微调。
- 测试 PIR:上电后等待约 30 秒稳定,手在传感器前挥动,观察串口是否输出高电平触发信息。调整 PIR 上的灵敏度电位器和延时旋钮,直到反应灵敏且不误报。
- 测试蜂鸣器:单独将 GPIO25 输出 PWM,确认蜂鸣器发出刺耳高频声。如果音量不足,增加三极管扩流电路,或调整 ledcWrite 占空比。
- 整机联动:用黑布遮住 LDR 模拟夜间,手靠近 PIR,确认 LED 阵列同步爆闪、蜂鸣器间歇鸣响。观察 3 秒冷却时间是否生效,防止连续触发。
- 现场安装:选择动物经常出没的通道,将装置固定牢固,避免风雨晃动引起误触发。连续运行一天后检查触发次数和误报情况,根据实际效果调整阈值与安装角度。