硬件清单
线路连接
视频介绍
代码
#include<Servo.h>
// 定义引脚
constint INFRARED_SENSOR = 6; // 红外传感器连接到数字引脚6
constint SERVO_PIN = 5; // 舵机连接到数字引脚5
constint RAIN_SENSOR = A0; // 雨滴传感器连接到模拟引脚A0
constint LIGHT_SENSOR = A1; // 光照传感器连接到模拟引脚A1
constint MOTOR_IN1 = 2; // L298N IN1连接到数字引脚2
constint MOTOR_IN2 = 3; // L298N IN2连接到数字引脚3
// 定义阈值
constint LIGHT_THRESHOLD = 500; // 光照阈值,可根据实际环境调整
constint RAIN_THRESHOLD = 500; // 雨滴阈值,可根据实际环境调整
// 定义状态
bool isClotheslineOut = false; // 晾衣架是否已伸出
bool isRaining = false; // 是否检测到雨
int servoPosition = 0; // 舵机当前角度
unsignedlong rainStopTime = 0; // 雨停时间
constunsignedlong RAIN_DELAY = 3000; // 雨后延迟伸出时间(毫秒)
bool initialCheckDone = false; // 初始化检查完成标志
Servo servo; // 创建舵机对象
voidsetup(){
// 初始化引脚模式
pinMode(INFRARED_SENSOR, INPUT);
pinMode(RAIN_SENSOR, INPUT);
pinMode(LIGHT_SENSOR, INPUT);
pinMode(MOTOR_IN1, OUTPUT);
pinMode(MOTOR_IN2, OUTPUT);
// 初始化舵机
servo.attach(SERVO_PIN);
servo.write(servoPosition);
// 初始化电机状态
digitalWrite(MOTOR_IN1, LOW);
digitalWrite(MOTOR_IN2, LOW);
// 启动串口通信(用于调试)
Serial.begin(9600);
Serial.println("智能晾衣架系统已启动,正在进行初始化检查...");
// 设备开机初始化检查
initializeSystem();
}
voidloop(){
// 检测是否下雨
detectRain();
// 只有在初始化检查完成后才控制晾衣架
if (initialCheckDone) {
// 第一优先级:光照检测控制晾衣架(考虑雨水状态)
controlClotheslineByLight();
// 第三优先级:人体检测控制舵机(独立功能)
controlServoByHuman();
}
delay(100); // 短暂延时,避免循环过快
}
// 设备开机初始化检查
voidinitializeSystem(){
// 读取当前光照值
int lightValue = analogRead(LIGHT_SENSOR);
Serial.print("初始化检查 - 光照值: ");
Serial.println(lightValue);
// 读取当前雨水值
int rainValue = analogRead(RAIN_SENSOR);
Serial.print("初始化检查 - 雨水值: ");
Serial.println(rainValue);
// 判断是否应该伸出晾衣架
if (lightValue > LIGHT_THRESHOLD && rainValue >= RAIN_THRESHOLD) {
Serial.println("初始化检查 - 光照充足且无雨,伸出晾衣架");
runMotorForward(4000); // 正转4秒
isClotheslineOut = true;
} else {
Serial.println("初始化检查 - 条件不满足,保持晾衣架收回状态");
isClotheslineOut = false;
}
// 记录雨停时间(如果未检测到雨)
if (rainValue >= RAIN_THRESHOLD) {
isRaining = false;
rainStopTime = millis();
} else {
isRaining = true;
}
// 标记初始化检查完成
initialCheckDone = true;
Serial.println("初始化检查完成,开始正常运行");
}
// 检测是否下雨
voiddetectRain(){
int rainValue = analogRead(RAIN_SENSOR);
if (rainValue < RAIN_THRESHOLD) { // 检测到雨水
if (!isRaining) {
isRaining = true;
Serial.println("检测到雨水");
// 如果晾衣架伸出,立即收回
if (isClotheslineOut) {
Serial.println("检测到雨水,收回晾衣架");
runMotorBackward(4000); // 反转4秒
isClotheslineOut = false;
}
}
} else { // 雨停了
if (isRaining) {
isRaining = false;
rainStopTime = millis(); // 记录雨停时间
Serial.println("雨已停,记录时间");
}
}
}
// 光照控制晾衣架(考虑雨水状态)
voidcontrolClotheslineByLight(){
int lightValue = analogRead(LIGHT_SENSOR);
Serial.print("光照值: ");
Serial.println(lightValue);
if (lightValue > LIGHT_THRESHOLD) { // 光照充足
if (!isClotheslineOut) {
// 只有在以下条件都满足时才伸出晾衣架:
// 1. 没有在下雨
// 2. 雨停后已经过了足够的时间(避免短时阵雨反复触发)
if (!isRaining && (millis() - rainStopTime > RAIN_DELAY)) {
Serial.println("光照充足,且雨停足够长时间,伸出晾衣架");
runMotorForward(4000); // 正转4秒
isClotheslineOut = true;
} elseif (isRaining) {
Serial.println("光照充足,但仍在下雨,不伸出晾衣架");
} else {
Serial.print("光照充足,但雨停时间不足 ");
Serial.print((RAIN_DELAY - (millis() - rainStopTime)) / 1000);
Serial.println(" 秒,不伸出晾衣架");
}
}
} else { // 光照弱,收回晾衣架(无论是否下雨)
if (isClotheslineOut) {
Serial.println("光照弱,收回晾衣架");
runMotorBackward(4000); // 反转4秒
isClotheslineOut = false;
}
}
}
// 人体检测控制舵机
voidcontrolServoByHuman(){
int humanDetected = digitalRead(INFRARED_SENSOR);
if (humanDetected == HIGH) { // 检测到人
if (servoPosition == 0) {
Serial.println("检测到人,舵机转动到80度");
servo.write(80);
servoPosition = 80;
delay(1000); // 等待舵机转动到位
}
} else { // 人离开
if (servoPosition == 80) {
Serial.println("人已离开,舵机回到0度");
servo.write(0);
servoPosition = 0;
delay(1000); // 等待舵机转动到位
}
}
}
// 电机正转函数
voidrunMotorForward(int duration){
digitalWrite(MOTOR_IN1, HIGH);
digitalWrite(MOTOR_IN2, LOW);
delay(duration);
digitalWrite(MOTOR_IN1, LOW);
digitalWrite(MOTOR_IN2, LOW);
}
// 电机反转函数
voidrunMotorBackward(int duration){
digitalWrite(MOTOR_IN1, LOW);
digitalWrite(MOTOR_IN2, HIGH);
delay(duration);
digitalWrite(MOTOR_IN1, LOW);
digitalWrite(MOTOR_IN2, LOW);
}
还没有评论,来说两句吧...