💡 划重点
- 目标场景:果园、菜园、小型农场夜间防野猪、刺猬、流浪猫狗、鼠类等。
- 主控芯片:ESP32,兼顾低功耗、联网与多路控制。
- 关键模块:PIR 人体/动物红外、LDR 光敏、高频 buzzer、LED 阵列。
- 建议接线:PIR=13,LDR A0=34,buzzer PWM=25,LED 阵列=27。
- 核心逻辑:仅夜间且 PIR 触发时,先 LED 爆闪,再高频蜂鸣,持续 8 秒后冷却,避免动物快速适应。
- 目标成本:55 元内,本方案估算约 52.5 元。
需求洞察
目标用户是山区果农、城郊菜园主、小型家庭农场主。真实痛点是:夜间动物啃食果实、拱翻菜地、破坏滴灌带,传统稻草人、反光带、单一声音驱赶器很快失效;市售产品要么价格高,要么功能单一,要么需要拉电。果园往往远离稳定电源,布线和维护成本高。
为什么值得做?ESP32 自带 Wi-Fi 和低功耗能力,配合 PIR、LDR、蜂鸣器、LED 阵列,可以用较低成本做出“光+声+随机节奏”的多模态驱赶器。它不依赖农药,不伤害动物,还能记录触发次数,帮助农户判断动物活动规律。对小型种植户来说,这是低成本、可复制、可扩展的实用项目。
方案设计
感知层:PIR 检测移动动物,LDR 分压检测环境光,判断是否进入夜间模式。控制层:ESP32 读取传感器,运行状态机,设置夜间阈值、触发冷却、随机蜂鸣节奏,避免误触和适应。执行层:高频 buzzer 由 PWM 驱动,LED 阵列通过三极管扩流,实现爆闪。日志/联网层:串口输出触发日志,可选 Wi-Fi 上报触发次数到手机或服务器,支持 OTA 更新。
供电可用 18650 电池加 TP4056 充电板,也可接 5V 太阳能板。为降低功耗,可让 ESP32 定时唤醒或深睡眠加 PIR 唤醒。外壳建议防水盒,PIR 朝外,LDR 朝上,蜂鸣器朝下防雨。
物料清单
| 物料 | 数量 | 用途 | 估算单价 | 合计 |
|---|---|---|---|---|
| ESP32 开发板 | 1 | 主控与联网 | 17 元 | 17 元 |
| PIR 模块 | 1 | 动物移动检测 | 6 元 | 6 元 |
| LDR + 10k 电阻 | 1 套 | 夜间判断 | 1 元 | 1 元 |
| 高频 buzzer | 1 | 声音驱赶 | 3 元 | 3 元 |
| LED 阵列 | 1 | 爆闪驱赶 | 4 元 | 4 元 |
| S8050 三极管 | 2 | 驱动蜂鸣器/LED | 0.5 元 | 1 元 |
| 电阻电容若干 | 1 套 | 限流滤波 | 2 元 | 2 元 |
| 洞洞板与线材 | 1 套 | 焊接连接 | 5 元 | 5 元 |
| 18650 电池与座 | 1 套 | 供电 | 11 元 | 11 元 |
| 防水盒 | 1 | 户外防护 | 2.5 元 | 2.5 元 |
| 合计 | 52.5 元 |
接线与结构
按给定 GPIO 接线:PIR 输出接 GPIO13,LDR 分压中点接 A0=34,buzzer 接 PWM=25,LED 阵列控制接 GPIO27。LDR 分压:3.3V—LDR—GPIO34—10k—GND。PIR 建议 5V 供电,输出高电平通常为 3.3V,可直接接 GPIO13。buzzer 若电流较大,用 S8050 驱动,GPIO25 经 1k 电阻接基极。LED 阵列用 GPIO27 经 1k 电阻接 S8050 基极,阵列正极接 5V,负极接集电极,发射极接 GND。
结构上,防水盒底部开孔引出电源,PIR 透镜朝外,LDR 加透明胶防雨,蜂鸣器朝下并加防雨罩。整机固定在果园立柱或菜地边缘,高度约 1 米,避免遮挡。
核心代码
#include <Arduino.h>
#define PIR_PIN 13
#define LDR_PIN 34
#define BUZZER_PIN 25
#define LED_PIN 27
const int LDR_THRESHOLD = 1800;
const unsigned long COOLDOWN = 15000;
unsigned long lastTrigger = 0;
bool active = false;
unsigned long activeStart = 0;
void setup() {
Serial.begin(115200);
pinMode(PIR_PIN, INPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW);
ledcSetup(0, 4000, 8);
ledcAttachPin(BUZZER_PIN, 0);
}
void loop() {
int ldr = analogRead(LDR_PIN);
bool night = ldr > LDR_THRESHOLD;
bool motion = digitalRead(PIR_PIN) == HIGH;
unsigned long now = millis();
if (!active && night && motion && now - lastTrigger > COOLDOWN) {
active = true;
activeStart = now;
lastTrigger = now;
Serial.println("触发驱赶");
}
if (active) {
unsigned long t = now - activeStart;
if (t < 8000) {
digitalWrite(LED_PIN, (t / 120) % 2);
int freq = 3500 + random(0, 1500);
ledcWriteTone(0, freq);
ledcWrite(0, 128);
} else {
digitalWrite(LED_PIN, LOW);
ledcWriteTone(0, 0);
active = false;
}
}
delay(50);
}
说明:LDR 阈值需按实际分压方向调整,若白天数值高则改为 <。蜂鸣频率在 3.5 至 5 千赫兹间随机,降低动物适应。
调试步骤
- 串口查看 LDR 数值,分别记录白天、傍晚、全黑时的读数,确定夜间阈值。
- 手在 PIR 前晃动,观察串口是否打印触发,LED 是否爆闪,蜂鸣器是否发声。
- 调节 PIR 延时和灵敏度电位器,避免持续触发或漏触发。
- 用万用表测整机电流,确认蜂鸣器和 LED 同时工作时电源不过载。
- 户外傍晚放置,记录误触发次数,必要时增加冷却时间或调整安装角度。
- 检查防水盒密封,估算续航:触发较少时,18650 电池可支撑 3 至 5 晚。