首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Arduino智能衣架 可做毕设 (已开源)

Arduino智能衣架 可做毕设 (已开源)

作者头像
逍遥子大表哥
发布2026-05-18 11:00:30
发布2026-05-18 11:00:30
1810
举报
文章被收录于专栏:kali blogkali blog

本文为大家分享基于Arduino的智能晾衣架。详细描述可参考视频介绍。

硬件清单

  • 红外传感器
  • 舵机
  • 雨滴传感器
  • 光照传感器
  • L298N
  • 减速马达

线路连接

硬件组件

连接类型

Arduino引脚

红外传感器

数字

6

舵机

数字

5

雨滴传感器

模拟

A0

光照传感器

模拟

A1

L298N IN1

数字

2

L298N IN2

数字

3

视频介绍

代码

代码语言:javascript
复制
#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;                      // 创建舵机对象

void setup() {
// 初始化引脚模式
  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();
}

void loop() {
// 检测是否下雨
  detectRain();

// 只有在初始化检查完成后才控制晾衣架
if (initialCheckDone) {
    // 第一优先级:光照检测控制晾衣架(考虑雨水状态)
    controlClotheslineByLight();
    
    // 第三优先级:人体检测控制舵机(独立功能)
    controlServoByHuman();
  }

  delay(100);  // 短暂延时,避免循环过快
}

// 设备开机初始化检查
void initializeSystem() {
// 读取当前光照值
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("初始化检查完成,开始正常运行");
}

// 检测是否下雨
void detectRain() {
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("雨已停,记录时间");
    }
  }
}

// 光照控制晾衣架(考虑雨水状态)
void controlClotheslineByLight() {
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;
    }
  }
}

// 人体检测控制舵机
void controlServoByHuman() {
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);  // 等待舵机转动到位
    }
  }
}

// 电机正转函数
void runMotorForward(int duration) {
  digitalWrite(MOTOR_IN1, HIGH);
  digitalWrite(MOTOR_IN2, LOW);
  delay(duration);
  digitalWrite(MOTOR_IN1, LOW);
  digitalWrite(MOTOR_IN2, LOW);
}

// 电机反转函数
void runMotorBackward(int duration) {
  digitalWrite(MOTOR_IN1, LOW);
  digitalWrite(MOTOR_IN2, HIGH);
  delay(duration);
  digitalWrite(MOTOR_IN1, LOW);
  digitalWrite(MOTOR_IN2, LOW);
}

更多好玩项目 关注我们

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-05-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 kali笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 硬件清单
  • 线路连接
  • 视频介绍
  • 代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档