#include <SoftwareSerial.h> // 导入软件串口库
SoftwareSerial mySerial(2, 3); // 创建软件串口对象,连接在数字引脚2和3上
// 定义传感器引脚
#define LIGHT_SENSOR_PIN A0 // 光线传感器连接在A0引脚上
#define PERSON_SENSOR_PIN A1 // 人体传感器连接在数字引脚A1上
#define LIGHT_BULB_PIN 9 // 灯连接在数字引脚9上
int lightThreshold = 500; // 光线阈值,根据实际情况调整
unsigned long lastPersonDetectedTime = 0; // 上一次检测到人的时间
unsigned long lightBulbTimeout = 120000; // 灯的自动关闭超时时间(2分钟,单位:毫秒)
bool lightBulbIsOn = false; // 灯的状态(开/关)
void setup() {
pinMode(LIGHT_SENSOR_PIN, INPUT);
pinMode(PERSON_SENSOR_PIN, INPUT);
pinMode(LIGHT_BULB_PIN, OUTPUT);
Serial.begin(9600);
}
void loop() {
int lightLevel = analogRead(LIGHT_SENSOR_PIN); // 读取光线传感器值
bool isNight = (lightLevel < lightThreshold); // 判断是否是夜晚
bool personDetected = digitalRead(PERSON_SENSOR_PIN) == HIGH; // 读取人体传感器值,判断是否有人
if (personDetected) { // 如果检测到人
lastPersonDetectedTime = millis(); // 更新最后检测到人的时间
if (!lightBulbIsOn) { // 如果灯之前是关的
lightBulbIsOn = true; // 打开灯
digitalWrite(LIGHT_BULB_PIN, HIGH); // 执行开灯动作
if (isNight) {
Serial.println("夜晚有人,开灯");
} else {
Serial.println("白天有人,开灯");
}
}
// 如果灯已经是开的,则不做任何操作,保持灯亮状态
} else if (lightBulbIsOn) { // 如果灯是开的,但是没有检测到人
unsigned long currentTime = millis(); // 获取当前时间
if (currentTime - lastPersonDetectedTime >= lightBulbTimeout) { // 判断是否超过灯的自动关闭超时时间
lightBulbIsOn = false; // 关闭灯
digitalWrite(LIGHT_BULB_PIN, LOW); // 执行关灯动作
if (isNight) {
Serial.println("夜晚无人,关灯");
} else {
Serial.println("白天无人,关灯");
}
}
// 如果未超过超时时间,则保持灯亮状态
}
// 如果灯是关的,并且没有检测到人,则不做任何操作,保持灯关状态
}