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


头像
3D打印试炼者
原创
发布时间: 2026-08-03 16:22:58 | 阅读数 0收藏数 0评论数 0
封面
本项目基于 Arduino Nano 主控与 HC‑SR505 人体红外传感器,打造全自动感应风扇装置。依靠红外感应检测人体存在,有人进入感应范围时继电器导通、风扇自动开启,同时串口实时输出 “有人” 状态;人体离开后开始倒计时,10 秒无人员活动便切断风扇电源,串口打印 “无”,实现人来风开、人走延时关停的智能效果。系统解决了上电风扇常转的常见问题,搭配 5V 继电器安全驱动风扇,结构简洁、接线简易,可用于桌面散热、卫生间排风等场景。整体功耗低、改装便捷,还能自由修改延时时长,兼具实用性与 DIY 学习价值。

准备工作:

材料:

配件

规格型号

数量

用途

主控

Arduino Nano ATmega328

1 块

系统主控

人体传感器

HC-SR505 微型人体红外 PIR

1 个

感应人体存在

继电器模块

5V 单路继电器模块(带高低电平触发跳线)

1 块

控制风扇通断

风扇

5V USB 小风扇

1 台

执行吹风

线材

杜邦线若干、USB 数据线

若干

接线、烧录程序

供电

5V 电源(电脑 USB / 手机充电头)

1 套

整体供电


1

物料清单与参数说明

器件关键特性

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


2

硬件接线


3

HC-SR505 人体传感器

HC-SR505 人体传感器 → Arduino Nano


SR505 引脚

Arduino Nano 引脚

说明

VCC

5V

传感器供电 5V

GND

GND

共地

OUT

D2

人体信号输出引脚


4

5V 继电器模块 → Arduino Nano

继电器模块引脚

Arduino Nano 引脚

说明

VCC

5V

继电器供电,严禁接 3.3V

GND

GND

共地

IN

D7

继电器控制信号引脚

  1. 此处直接在继电器的输入口5V处直接并4根线出来(2+,2-),以便之后的传感器共GND使用
5

风扇与继电器接线

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


6

固定模块

临时固定,因此此处使用泡沫双面胶

7

程序编写与上传

  1. 安装 Arduino IDE,添加 Nano 开发板驱动;
  2. 开发板选择:Arduino Nano,处理器:ATmega328P (Old Bootloader)
  3. 选择对应 COM 端口。
  4. 完整程序:

/*

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

主控: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);

}



INO
fan.ino
3.33KB
8

安装完成,测试

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


9

使用方法

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


阅读记录0
点赞0
收藏0
禁止 本文未经作者允许授权,禁止转载
猜你喜欢
评论/提问(已发布 0 条)
头像
评论 评论
收藏 收藏
分享 分享
pdf下载 下载
pdf下载 举报