Arduino Nano 人体感应延时风扇控制系统

准备工作:
材料:
配件 | 规格型号 | 数量 | 用途 |
主控 | Arduino Nano ATmega328 | 1 块 | 系统主控 |
人体传感器 | HC-SR505 微型人体红外 PIR | 1 个 | 感应人体存在 |
继电器模块 | 5V 单路继电器模块(带高低电平触发跳线) | 1 块 | 控制风扇通断 |
风扇 | 5V USB 小风扇 | 1 台 | 执行吹风 |
线材 | 杜邦线若干、USB 数据线 | 若干 | 接线、烧录程序 |
供电 | 5V 电源(电脑 USB / 手机充电头) | 1 套 | 整体供电 |
物料清单与参数说明

器件关键特性
- HC-SR505:有人输出高电平
HIGH,无人输出低电平LOW; - 红色 5V 继电器模块:默认跳线插
L,低电平触发吸合;风扇必须接COM+NO常开端子。
硬件接线

HC-SR505 人体传感器

HC-SR505 人体传感器 → Arduino Nano
SR505 引脚 | Arduino Nano 引脚 | 说明 |
VCC | 5V | 传感器供电 5V |
GND | GND | 共地 |
OUT | D2 | 人体信号输出引脚 |
5V 继电器模块 → Arduino Nano





继电器模块引脚 | Arduino Nano 引脚 | 说明 |
VCC | 5V | 继电器供电,严禁接 3.3V |
GND | GND | 共地 |
IN | D7 | 继电器控制信号引脚 |
- 此处直接在继电器的输入口5V处直接并4根线出来(2+,2-),以便之后的传感器共GND使用
风扇与继电器接线





- 风扇两根电源线,一根接继电器 COM 公共端;
- 风扇另一根电源线接继电器 NO(常开接口);(注意,此处中间多加了一个把母口,用于连接风扇的usb,避免后期单独使用风扇需要拆线的问题)
- 风扇供电取自继电器两端(整体由 5V 系统供电即可);
- 继电器跳线帽保持插在 L 位置(低电平触发)。
固定模块







临时固定,因此此处使用泡沫双面胶
程序编写与上传

- 安装 Arduino IDE,添加 Nano 开发板驱动;
- 开发板选择:
Arduino Nano,处理器:ATmega328P (Old Bootloader); - 选择对应 COM 端口。
- 完整程序:
/*
人体感应延时风扇控制系统
主控:Arduino Nano atmega328old
传感器:HC-SR505 PIR人体红外
执行器:5V继电器+5V风扇(高电平触发继电器)
规则:离开延时2秒关闭;传感器拔掉自动关风扇;仅状态切换打印串口
*/
const int PIR_PIN = 2;
const int RELAY_PIN = 7;
const unsigned long CLOSE_DELAY = 2000UL; // 人离开2秒关闭
const unsigned long PIR_STABLE_MS = 200; // PIR防抖时间
const unsigned long DISCONNECT_CHECK_MS = 800; // 判断传感器拔掉的检测周期
unsigned long lastHumanTime = 0;
bool fanRunning = false;
int lastStablePir = LOW;
// 传感器断线检测变量
int pirSampleBuf[8];
int sampleIndex = 0;
unsigned long checkDisconnectTimer = 0;
bool pirDisconnected = false;
void setup() {
Serial.begin(9600);
pinMode(PIR_PIN, INPUT);
pinMode(RELAY_PIN, OUTPUT);
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(RELAY_PIN, LOW);
digitalWrite(LED_BUILTIN, LOW);
Serial.println("============================");
Serial.println("上电预热6秒,PIR初始化中...");
delay(6000);
Serial.println("系统就绪,人离开2秒自动关风扇");
Serial.println("============================");
}
// 防抖获取稳定PIR电平
int getStablePIR() {
static int currentPir = digitalRead(PIR_PIN);
static unsigned long changeTime = millis();
int newVal = digitalRead(PIR_PIN);
if (newVal != currentPir) {
changeTime = millis();
currentPir = newVal;
}
// 电平稳定足够久才采信
if (millis() - changeTime > PIR_STABLE_MS) {
return currentPir;
}
return lastStablePir;
}
// 检测PIR是否被拔掉(悬空随机跳变则判定断开)
bool isPirDisconnect() {
int val = digitalRead(PIR_PIN);
pirSampleBuf[sampleIndex++] = val;
if (sampleIndex >= 8) sampleIndex = 0;
// 统计采样里高低电平数量
int highCnt = 0, lowCnt = 0;
for (int i = 0; i < 8; i++) {
if (pirSampleBuf[i] == HIGH) highCnt++;
else lowCnt++;
}
// 高低都存在=引脚悬空抖动 → 判定传感器拔掉
return (highCnt > 1 && lowCnt > 1);
}
void loop() {
unsigned long now = millis();
int pirVal = getStablePIR();
// 定时检测传感器是否拔掉
if (now - checkDisconnectTimer >= DISCONNECT_CHECK_MS) {
pirDisconnected = isPirDisconnect();
checkDisconnectTimer = now;
}
// 传感器拔掉,强制关闭风扇
if (pirDisconnected) {
if (fanRunning) {
digitalWrite(RELAY_PIN, LOW);
digitalWrite(LED_BUILTIN, LOW);
fanRunning = false;
Serial.println("[警告]PIR传感器已拔除,风扇关闭");
}
lastStablePir = pirVal;
delay(50);
return;
}
// 状态发生变化时才打印串口,杜绝刷屏
if (pirVal != lastStablePir) {
if (pirVal == HIGH) {
Serial.println("有人,启动");
} else {
Serial.println("无人,开始2秒倒计时");
}
}
// 检测到人:开启风扇、刷新计时
if (pirVal == HIGH) {
lastHumanTime = now;
digitalWrite(RELAY_PIN, HIGH);
digitalWrite(LED_BUILTIN, HIGH);
fanRunning = true;
}
// 无人超时2秒,关闭风扇
if (fanRunning && (now - lastHumanTime >= CLOSE_DELAY)) {
digitalWrite(RELAY_PIN, LOW);
digitalWrite(LED_BUILTIN, LOW);
fanRunning = false;
Serial.println("[超时2秒无人]风扇关闭");
}
lastStablePir = pirVal;
delay(50);
}
安装完成,测试




- 通电瞬间:风扇静止,板载 LED 熄灭,串口打印初始化文字;
- 手靠近 PIR 传感器,串口打印
有人,继电器咔哒吸合、风扇转动; - 离开传感器,串口打印
无,10 秒后风扇自动关停。
使用方法

- 摆放要求:HC-SR505 感应面朝向外,感应距离 3~7 米,感应角度约 120°;
- 日常逻辑:人进入感应区域风扇启动,离开 10 秒自动关停;
- 如需查看工作状态,连接电脑打开串口监视器(波特率 9600)查看「有人 / 无」状态。
0
0
0
qq空间
微博
复制链接
分享
0