💡 划重点
- 只在夜间工作:LDR 光敏判断天黑,白天自动休眠,减少误触和耗电。
- PIR 检测动物热源移动,ESP32 双条件确认后触发,避免风吹草动就报警。
- 高频蜂鸣器扫频 + LED 阵列爆闪,利用声光组合驱赶,不伤害动物。
- 目标成本 55 元内,实际物料约 52.4 元,适合小果园、菜园、家庭农场复制。
- 可选 WiFi 上报触发次数,帮助判断动物活动规律。
需求洞察
目标用户是小型果园种植户、菜园管理者、家庭农场主和庭院种植爱好者。真实痛点很集中:夜间野猪、兔子、刺猬、流浪猫狗、部分鸟类会啃食果实、幼苗和菜叶,一夜之间可能毁掉一片地。人力值守不现实,传统围栏成本高,电网有安全风险,毒饵不环保也可能违法。市售驱赶器要么价格高,要么功能单一,要么对动物逐渐失效。
这个项目值得做,因为 ESP32 开发板便宜、生态成熟,PIR 和光敏模块极易获取。声光组合对多数夜行动物有即时威慑,且不造成实质伤害。设备可记录触发次数,后续还能接太阳能和 WiFi,形成低维护的长期防护节点。
方案设计
感知层由 PIR 和 LDR 组成。PIR 接 GPIO13,检测动物移动产生的红外变化;LDR 模块 AO 接 GPIO34,读取环境光,判断是否进入夜间。控制层是 ESP32,采用“夜间 + PIR 高电平 + 冷却时间”三重逻辑,减少误触发。执行层包括高频蜂鸣器和 LED 阵列:蜂鸣器接 GPIO25,用 PWM 生成 4kHz 到 8kHz 扫频,避免动物快速适应;LED 阵列接 GPIO27,通过三极管驱动,实现爆闪。日志/联网层用 ESP32 的 NVS 保存触发计数,可选 WiFi 连接 MQTT 或 HTTP 接口上报。供电可用 5V 电源,户外可换 18650 电池加太阳能板。
物料清单
| 物料 | 数量 | 用途 | 估算单价 | 小计 |
|---|---|---|---|---|
| ESP32 开发板 | 1 | 主控与联网 | 18 元 | 18 元 |
| HC-SR501 PIR | 1 | 动物移动检测 | 6 元 | 6 元 |
| 光敏电阻模块 | 1 | 昼夜判断 | 2 元 | 2 元 |
| 无源蜂鸣器 | 1 | 高频声波驱赶 | 2 元 | 2 元 |
| 高亮 LED 5mm | 6 | 爆闪阵列 | 0.3 元 | 1.8 元 |
| 220Ω 电阻 | 6 | LED 限流 | 0.1 元 | 0.6 元 |
| S8050 三极管 | 2 | 驱动蜂鸣器/LED | 0.5 元 | 1 元 |
| 洞洞板与杜邦线 | 1 套 | 焊接与连接 | 5 元 | 5 元 |
| 防水盒 | 1 | 户外防护 | 8 元 | 8 元 |
| 5V 2A 电源 | 1 | 供电 | 8 元 | 8 元 |
| 合计 | 52.4 元 |
接线与结构
按给定引脚接线:PIR 的 VCC 接 5V,GND 接 GND,OUT 接 GPIO13;LDR 模块 AO 接 GPIO34,VCC 接 3.3V,GND 接 GND;无源蜂鸣器正极经 100Ω 接 GPIO25,负极接 GND;LED 阵列由 GPIO27 经 1kΩ 电阻接 S8050 基极,LED 串 220Ω 后接 5V,三极管发射极接 GND。GPIO34 是输入专用脚,适合 ADC 读取光敏。LED 阵列电流较大,不能直接由 GPIO 拉载,因此用三极管驱动,GPIO27 保持原定不变。结构上使用防水盒,PIR 透镜朝外,LDR 朝上但避开 LED 直射,蜂鸣器开孔朝外,电源线用防水接头。
核心代码
#include <Arduino.h>
#define PIR_PIN 13
#define LDR_PIN 34
#define BUZZER_PIN 25
#define LED_PIN 27
const int LDR_NIGHT_THRESHOLD = 1800; // 按实测调整
int triggerCount = 0;
void setup() {
Serial.begin(115200);
pinMode(PIR_PIN, INPUT);
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW);
ledcSetup(0, 4000, 10);
ledcAttachPin(BUZZER_PIN, 0);
}
bool isNight() {
int ldr = analogRead(LDR_PIN);
return ldr > LDR_NIGHT_THRESHOLD; // 越黑值越大
}
void driveAway() {
triggerCount++;
Serial.printf("触发第 %d 次\n", triggerCount);
unsigned long start = millis();
while (millis() - start < 8000) {
for (int f = 4000; f <= 8000; f += 200) {
ledcWriteTone(0, f);
digitalWrite(LED_PIN, (f / 200) % 2);
delay(25);
}
}
ledcWriteTone(0, 0);
digitalWrite(LED_PIN, LOW);
}
void loop() {
if (isNight() && digitalRead(PIR_PIN) == HIGH) {
delay(50);
if (digitalRead(PIR_PIN) == HIGH) {
driveAway();
delay(3000); // 冷却,避免连续触发
}
}
delay(100);
}
调试步骤
- 单独测 PIR:串口观察 0/1 变化,调节灵敏度和延时旋钮。
- 测 LDR:遮光与光照下打印 ADC 值,确定夜间阈值。
- 测蜂鸣器:上电验证扫频声音,确认音量不刺耳但有效。
- 测 LED 阵列:检查三极管驱动和爆闪节奏。
- 联调:遮光模拟夜晚,手挥模拟动物,观察是否触发 8 秒驱赶。
- 调冷却:根据误触情况修改 3000ms 冷却时间。
- 户外测试:装防水盒,检查固定、供电和防雨。