/*
功能说明:
SR602人体红外 + 两脚光敏电阻
白天:有人也不亮灯
夜晚:检测到人,D5输出高电平,持续10秒;期间再次感应到人,计时重置
*/
#define PIR_PIN 2 // SR602信号输出
#define LDR_PIN A0 // 两脚光敏电阻分压采样
#define LIGHT_PIN 5 // 控制输出D5
unsigned long lightStartTime = 0;
const unsigned long LIGHT_DURATION = 10000UL; // 亮灯10秒
boolean lightOnFlag = false;
// 光线阈值【重点!上电打开串口监视器,自行校准】
// 数值>阈值=白天;数值<阈值=天黑
int LIGHT_THRESHOLD = 450;
void setup() {
pinMode(PIR_PIN, INPUT);
pinMode(LIGHT_PIN, OUTPUT);
digitalWrite(LIGHT_PIN, LOW);
Serial.begin(9600);
}
void loop() {
// 读取光线数值
int lightValue = analogRead(LDR_PIN);
// 读取人体信号
bool humanDetect = digitalRead(PIR_PIN);
unsigned long now = millis();
// 判断:天黑环境
if(lightValue < LIGHT_THRESHOLD)
{
// 检测到人,刷新计时
if(humanDetect == HIGH)
{
lightStartTime = now;
lightOnFlag = true;
}
// 判断是否还在10秒时长内
if(lightOnFlag && (now - lightStartTime < LIGHT_DURATION))
{
digitalWrite(LIGHT_PIN, HIGH);
}
else
{
digitalWrite(LIGHT_PIN, LOW);
lightOnFlag = false;
}
}
else
{
// 白天:强制关灯,清除计时
digitalWrite(LIGHT_PIN, LOW);
lightOnFlag = false;
}
// 串口调试,用来校准光敏阈值
Serial.print("光线值:");
Serial.print(lightValue);
Serial.print(" 人体检测:");
Serial.println(humanDetect?"有人":"无人");
delay(200);
}