Arduino 雨水感应自动晾衣架(学校项目完整教程)

Jemuran automatik dengan sensor hujan menarik pakaian ke bawah bumbung semasa hujan

要做一个雨水感应的自动晾衣架,你只需要三个部分:负责检测水滴的 LM393 雨滴传感器模块、读取信号的 Arduino UNO,以及一颗 SG90 舵机——一检测到雨水,就把晾衣绳卷进屋檐下。照下面的表格接线,上传我们的示例代码,你的晾衣架模型就能自己抢救衣服了。

雨水感应自动晾衣架是怎么工作的?

原理很简单。雨滴传感器模块的感应板上有交错的铜条——水滴落在板上时,水把这些铜条连通,LM393 模块就会向 Arduino UNO 发送信号。

Arduino 读到信号后指挥舵机转动。我们把舵机当绞盘(winch)用——晾衣绳的一端绑在舵机摆臂上,舵机一转,绳子被卷起,晾衣架就被拉进屋檐下。等感应板重新干透,舵机往反方向转,晾衣架又出去了。

这是马来西亚 RBT 课和 FYP 的经典项目——特别配我们这种下午三点说下就下的暴雨天气。所有元件都在下面的清单里。

雨滴传感器模块的 AO 和 DO 输出有什么区别?

雨滴传感器模块有两个输出引脚,很多学生就是在这里搞混的:

输出 信号类型 读数含义
AO 模拟信号,0–1023 分级数值 — 感应板越湿,数值越低/变化越大。想知道潮湿程度就用它。
DO 数字信号,HIGH 或 LOW 只有是/否两种答案。在大多数模块上,感应板变湿时 DO 输出 LOW — 逻辑和多数人的预期正好相反。

这个项目我们只用 DO——我们只想知道“下雨还是没下雨”。牢牢记住:LOW 代表湿。这就是下面要讲的晾衣架“自己乱动”的头号原因。模块上的小电位器则用来调节灵敏度。

沾着水滴的雨水感应板连接到带灵敏度电位器的比较器板
感应板(左)+ 比较器板(右)。蓝色电位器用来调灵敏度。

传感器和舵机怎么接线?

如果这是你第一次拿杜邦线,别担心——全部加起来只有六个连接点。用面包板杜邦线,连烙铁都不用碰。

元件 引脚 / 线 接到 Arduino
雨滴传感器模块 VCC 5V
GND GND
DO Pin 2
SG90 舵机 棕 / 黑 GND
5V
橙 / 黄 Pin 9
接线布局:雨滴传感器板经面包板接到 Arduino UNO 和舵机绞盘
完整布局:雨滴传感器 → Arduino UNO → 舵机绞盘。只有六个连接点。

如果你的模块到货时排针还没焊上,先看看我们的排针焊接教程——很轻松的活。

供电小贴士:像这样的轻量模型,USB 或电池供电就够了。别从 Arduino 的 5V 引脚拉重负载——如果舵机抖动或板子自己重启,那就是需要独立 5V 电源的信号。

为什么 SG90 360° 舵机适合当绞盘?

SG90 360° 舵机是连续旋转(continuous rotation)舵机——它不会转到某个固定角度,而是像电机一样持续旋转。

在代码里,write(0)write(180) 表示朝各自方向全速旋转,write(90) 表示停止。卷绳的距离靠旋转时间控制——比如转 3 秒,然后停。

下雨时舵机绞盘卷起晾衣绳,把衣物拉进屋檐下
绞盘原理:舵机卷绳,晾衣架被拉进屋檐下。

如果你手上拿的是 180° 定位舵机,控制方式改用角度:write(0) 是晾衣架伸出的位置,write(180) 是收回的位置。不确定自己的是哪种舵机?下单前先读我们的舵机 180° vs 270° vs 360° 区别指南

完整 Arduino 代码(带防抖)

这段代码会间隔 500ms 确认两次读数——避免溅到一滴水就触发系统。晾衣架收进来之后,它会等一分钟才重新检查。

#include <Servo.h>

const int PIN_SENSOR = 2;   // 雨滴传感器模块的 DO
const int PIN_SERVO  = 9;   // 舵机信号线(橙/黄)

Servo winch;                // SG90 360 度舵机当卷绳绞盘
bool jemuranDalam = false;  // 当前状态:true = 晾衣架已收进

void setup() {
  pinMode(PIN_SENSOR, INPUT);
  winch.attach(PIN_SERVO);
  winch.write(90);          // 对 360 度舵机来说 90 = 停止
  Serial.begin(9600);
}

// 确认两次读数 - 避免一滴溅水直接触发
bool hujanDisahkan() {
  if (digitalRead(PIN_SENSOR) == LOW) {     // 大多数模块上 LOW = 湿
    delay(500);                             // 等半秒
    if (digitalRead(PIN_SENSOR) == LOW) {   // 还是湿的?才算真的下雨
      return true;
    }
  }
  return false;
}

void tarikMasuk() {
  winch.write(0);     // 朝一个方向全速旋转
  delay(3000);        // 转 3 秒 = 卷绳距离
  winch.write(90);    // 停止
  jemuranDalam = true;
  Serial.println("Hujan dikesan - jemuran masuk");
}

void keluarSemula() {
  winch.write(180);   // 反方向旋转
  delay(3000);        // 时间相同 = 距离相同
  winch.write(90);    // 停止
  jemuranDalam = false;
  Serial.println("Dah kering - jemuran keluar");
}

void loop() {
  if (!jemuranDalam && hujanDisahkan()) {
    tarikMasuk();
    delay(60000);     // 等 1 分钟再重新检查
  }
  else if (jemuranDalam && !hujanDisahkan()) {
    keluarSemula();
    delay(60000);     // 给感应板时间彻底干透
  }
  delay(200);
}

通过 Arduino IDE 上传,然后打开串口监视器(9600 baud)看状态。往感应板上滴几滴水就能测试——不用等真的下雨。

真实客户最常踩的坑

“没碰到水,晾衣架就自己收进来了”

“project anak saya ada masalah — bila power on, jemuran terus masuk walaupun tak kena air. kemungkinan apa masalahnya ya… wiring cable ataupun code yang salah?”

这是我们 WhatsApp 上收到最多的问题——上面就是一位家长的马来语原话:一通电,晾衣架没碰到水就自己收进来了。通常是这三个原因之一:

  1. 代码里 DO 逻辑写反了。很多人写 if (digitalRead(PIN_SENSOR) == HIGH) 来判断下雨,但在大多数模块上 LOW 才代表湿。上面的代码已经用了正确的逻辑。
  2. 灵敏度电位器调得太高。模块变得过度敏感——在我们这种潮湿的空气里很常见。慢慢转动电位器,直到感应板干燥时读数稳定。
  3. 感应板受潮或有脏污——上一场雨留下的。先用布把感应板擦干,再重新测试。

分不清是接线还是代码的问题?用万用表检查滴水时 DO 引脚的信号有没有变化——有变化就说明接线没问题,问题出在代码上。

对接线没信心?放心,你可以的

“cikgu saya cakap kalau tak tahu nak sambung wayar semua ni, tak payah buat”

有位学生用马来语告诉我们:老师说不会接线就干脆别做了。别放弃——这个项目总共只有六个接线点。照上面的接线表一行一行接,接好一行就做个记号,通电前再整体检查一遍。很多零基础的学生第一次尝试就成功了。

这套系统能用在家里真正的晾衣架上吗?

说实话:这是一个学习用的模型,不是真正的晾衣系统。SG90 舵机只卷得动轻量模型——真正的湿衣服远远超出它的能力范围。

要做真实规格,你需要大功率直流电机、电机驱动器和独立电源——不能再从 Arduino 引脚取电。如果电源电压偏高,用降压模块降下来——参考LM2596 降压模块调到 5V 教程

想在 RBT 拿更高分?

呈现方式也算分。3D 打印外壳比纸皮箱加胶带看起来专业得多——如果你的学校有 3D 打印机,为 Arduino 和传感器支架打印一个外壳。在老师面前演示晾衣架自动进出,绝对印象加分。

FAQ

为什么没下雨,我的晾衣架也会自己收进来?

三大嫌疑犯:代码里 DO 逻辑写反了(LOW 才代表湿,不是 HIGH)、灵敏度调得太高,或者感应板还残留着上一场雨的水汽。把板擦干,逐一排查。

普通的 180° 舵机能用吗?

能用,只是控制方式不同——改用角度,比如 write(0) 是伸出位置、write(180) 是收回位置,而不是像 360° 舵机那样靠旋转时间。

雨滴传感器的灵敏度怎么调?

一边滴几滴水测试,一边一点一点转动模块上的小电位器。目标:感应板干燥时 DO 稳定,碰到水滴时快速翻转。

可以用 AO 输出代替 DO 吗?

可以——AO 给出 0 到 1023 的模拟读数,你可以自己设定潮湿阈值。但对学校项目来说,DO 已经够用,代码也更简单。

为什么代码要等一分钟才重新检查?

因为雨停之后,感应板通常还会湿上一阵子。没有这个间隔,读数每次短暂变化,舵机就会反复地收进又放出。

最后更新:2026年7月。有问题?WhatsApp 联系我们

Leave a Reply

Your email address will not be published. Required fields are marked *