资讯动态

Arduino雨滴传感器自动关窗系统:从硬件连接到代码实现的完整指南

发布时间:2026/9/3 5:50:33 来源:尧图企业网站定制
这次我们来看一个非常实用的 Arduino 创客项目下雨自动关窗系统。这个项目的核心不是复杂的算法而是如何用最基础的硬件和代码解决一个生活中的实际问题——下雨天忘记关窗。对于大中小学的创客作业、青少年科创比赛或者 DIY 爱好者来说这是一个既能学习电子知识又能做出实用作品的绝佳选择。项目基于 Arduino 开发板通过一个雨滴传感器来检测是否下雨一旦检测到雨水就会自动控制舵机或电机来关闭窗户。整个过程完全自动化无需人工干预。它的硬件门槛极低成本可控代码逻辑清晰非常适合作为入门到进阶的实践案例。本文将带你从零开始完成整个系统的硬件搭建、代码编写、调试到最终部署让你亲手打造一个属于自己的“智能雨控门窗卫士”。1. 核心能力速览在动手之前我们先快速了解这个项目的核心规格和所需资源让你对整体工作量有个把握。能力项说明核心功能检测雨水并自动触发关窗动作核心控制器Arduino Uno / Nano / ESP32 等主流开发板关键传感器雨滴传感器 / 雨水检测模块执行机构SG90 / MG996R 舵机或直流电机继电器编程环境Arduino IDE 或 PlatformIO代码复杂度初级到中级涉及数字信号读取与舵机控制硬件成本约 50 - 150 元人民币视具体配件而定供电方式USB 供电或外部 5V/7-12V 适配器适合场景家庭窗户、阳台、创客教育、科创作品、DIY 智能家居入门扩展潜力可增加蓝牙/Wi-Fi 远程状态查看、手动开关模式、湿度阈值调节等2. 适用场景与使用边界这个智能关窗系统最适合哪些人、哪些场景又有哪些需要注意的边界呢适用人群与场景学生与教育者非常适合作为大中小学的 STEM 教育、创客社团活动或青少年科技创新大赛的作品。它涵盖了传感器应用、自动控制和嵌入式编程等多个知识点。DIY 爱好者与智能家居新手如果你想入门智能硬件这是一个目标明确、成果可见的练手项目。完成后可以直接用于家庭环境。解决实际痛点适用于经常忘记关窗的家庭、办公室或者需要保护室内设备如靠窗的书桌、电器免受雨淋的场合。使用边界与注意事项机械结构限制本项目的核心是电子控制和逻辑窗户的机械改造如安装导轨、连接舵机与窗扇需要根据自家窗户的实际情况推拉窗、平开窗自行设计。确保机械部分牢固、安全避免窗户意外跌落。传感器精度常见的雨滴传感器模块是通过板载导电图形的电阻变化来检测可能对雾气、溅水产生误报。对于要求极高的场景可能需要更专业的传感器或增加滤波算法。供电安全如果使用大扭矩舵机或电机瞬间电流较大务必确保电源如适配器或电池能提供足够电流并注意接线牢固防止发热。环境适应性雨滴传感器需要暴露在室外需考虑其防水性和耐久性。可以为传感器制作简单的防水外壳但不要完全密封影响检测。法律责任与安全这是一个自动化装置务必确保其在任何情况下都不会对人员特别是儿童造成夹伤等风险。建议增加手动优先开关或在系统异常时能自动断电/进入安全模式。3. 环境准备与前置条件开始制作前请准备好以下软硬件环境。硬件清单这是完成本项目所需的最低配置你也可以根据需求升级。组件型号/规格数量备注主控板Arduino Uno R31最通用入门首选。也可用 Nano、ESP32等。雨滴传感器雨滴/雨水检测模块1通常带有模拟和数字输出。舵机SG90 9g 舵机1用于驱动小窗户。若窗户重需 MG996R 等大扭矩舵机。连接线杜邦线公对公、公对母若干用于连接各模块。电源USB 数据线 或 5V/2A 适配器1为整个系统供电。舵机耗电大时建议用外部电源。面包板400孔或830孔1方便搭建测试电路。窗户机械结构连杆、支架、胶带等1套需根据窗户类型DIY将舵机旋转运动转化为关窗动作。软件环境准备安装 Arduino IDE访问 Arduino 官网下载并安装最新版 IDE。安装过程中会自动安装 USB 驱动如 CH340。驱动检查将 Arduino 通过 USB 线连接电脑。打开设备管理器查看端口是否出现新的 COM 口如 COM3, COM4。如果显示黄色叹号需要手动安装 CH340 或 CP2102 等 USB 转串口芯片驱动。IDE 配置打开 Arduino IDE在工具-开发板中选择你使用的板子如 Arduino Uno。在工具-端口中选择对应的 COM 口。4. 硬件连接与电路搭建正确的硬件连接是成功的第一步。我们按照信号流来连接传感器 - Arduino - 舵机。连接示意图文字描述雨滴传感器连接传感器VCC引脚 - Arduino5V引脚。传感器GND引脚 - ArduinoGND引脚。传感器DO数字输出引脚 - Arduino数字引脚 2或其他任意数字引脚。我们使用数字信号简化判断逻辑。可选传感器AO模拟输出引脚 - ArduinoA0引脚。可用于检测雨量大小本项目暂不使用。舵机连接舵机红色线电源 - Arduino5V引脚。注意如果舵机扭矩大强烈建议将此外接到独立的 5V 电源上并与 Arduino 共地避免 Arduino 板载稳压器过载。舵机棕色线地线- - ArduinoGND引脚。舵机橙色线信号线 - Arduino数字引脚 9支持 PWM用于控制角度。电路搭建步骤将 Arduino 板、面包板固定好。使用杜邦线按照上述描述将雨滴传感器和舵机连接到 Arduino 和面包板上。检查所有连接是否牢固避免虚接。最后连接 USB 线或外部电源。安全提示在通电前再次确认电源正负极没有接反特别是舵机的接线。接反可能瞬间损坏舵机或 Arduino。5. 代码编写与上传硬件连接好后我们来编写控制逻辑。代码的核心是循环读取雨滴传感器的数字信号当检测到雨水信号由高变低时控制舵机转动到“关窗”角度当传感器变干后可以控制舵机回到“开窗”角度。完整示例代码// 定义引脚 const int rainSensorPin 2; // 雨滴传感器数字输出接 Arduino 引脚 2 const int servoPin 9; // 舵机信号线接 Arduino 引脚 9 // 定义舵机角度需根据你的窗户实际安装情况调整 const int openAngle 0; // 窗户“打开”对应的舵机角度 const int closeAngle 90; // 窗户“关闭”对应的舵机角度 // 引入舵机库 #include Servo.h Servo myServo; // 创建舵机对象 // 变量声明 int sensorState 0; // 存储传感器当前状态 int lastSensorState HIGH; // 存储传感器上一次状态初始为高因为干燥时输出高电平 bool windowClosed false; // 标记窗户当前是否已关闭 void setup() { // 初始化串口通信用于调试 Serial.begin(9600); // 配置传感器引脚为输入模式 pinMode(rainSensorPin, INPUT_PULLUP); // 使用内部上拉电阻确保未连接时引脚为高电平 // 将舵机连接到指定引脚 myServo.attach(servoPin); // 初始化窗户为打开状态 myServo.write(openAngle); windowClosed false; Serial.println(系统启动窗户初始状态打开); delay(1000); // 等待舵机运动到位 } void loop() { // 1. 读取雨滴传感器状态 // 注意大多数模块干燥时输出高电平(HIGH)检测到雨水时输出低电平(LOW) sensorState digitalRead(rainSensorPin); // 2. 打印传感器状态到串口监视器调试用 Serial.print(雨滴传感器状态: ); Serial.println(sensorState LOW ? 检测到雨水 : 天气干燥); // 3. 判断状态是否发生变化从干燥到下雨 if (sensorState LOW lastSensorState HIGH) { // 检测到开始下雨 Serial.println( 开始下雨触发关窗动作); closeWindow(); } // 4. 可选判断雨是否停了从下雨到干燥并自动开窗 else if (sensorState HIGH lastSensorState LOW windowClosed) { // 检测到雨停且窗户是关着的 Serial.println( 雨停了触发开窗动作); openWindow(); } // 5. 更新上一次的状态 lastSensorState sensorState; // 6. 延时一段时间再检测避免过于频繁的检测和动作 delay(500); // 检测间隔500毫秒 } // 关窗函数 void closeWindow() { if (!windowClosed) { Serial.println(正在关闭窗户...); myServo.write(closeAngle); // 舵机转动到关窗角度 delay(1000); // 等待舵机运动到位时间根据舵机速度和窗户阻力调整 windowClosed true; Serial.println(窗户已关闭。); } } // 开窗函数 void openWindow() { if (windowClosed) { Serial.println(正在打开窗户...); myServo.write(openAngle); // 舵机转动到开窗角度 delay(1000); // 等待舵机运动到位 windowClosed false; Serial.println(窗户已打开。); } }代码上传步骤打开 Arduino IDE将以上代码复制粘贴到新窗口中。再次确认工具菜单下的开发板和端口选择正确。点击验证对勾图标编译代码确保没有语法错误。点击上传右箭头图标将代码烧录到 Arduino 板中。上传成功后打开工具-串口监视器设置波特率为 9600。你应该能看到“系统启动窗户初始状态打开”的提示信息。6. 功能测试与效果验证代码上传后我们进入关键的测试环节。测试的目的是验证整个系统能否按预期工作。测试准备模拟雨水准备一个小喷壶或滴管装上清水。机械联动暂时不安装到真实窗户上。可以将舵机臂用胶带粘上一根小棍或指针直观观察其转动。串口监视器保持打开用于查看系统状态。分步测试流程6.1 传感器基础测试目的验证雨滴传感器能否正确响应。操作向雨滴传感器的检测区域滴几滴水。预期串口监视器中打印的状态应从“天气干燥”变为“检测到雨水”。成功标准状态变化灵敏、准确。排查如果状态不变检查传感器接线、传感器板载电位器可能调节了灵敏度、代码中引脚号是否正确。6.2 关窗动作触发测试目的验证检测到雨水后舵机能否执行关窗动作。操作在传感器干燥状态下向其喷水。预期串口打印“开始下雨触发关窗动作”和“正在关闭窗户…”随后舵机应转动到closeAngle定义的角度默认为90度。成功标准舵机准确转动到预设的“关窗”位置。排查如果舵机不转检查舵机接线特别是信号线、电源是否充足。尝试在setup函数中直接写myServo.write(90)测试舵机本身是否正常。6.3 状态保持与防抖测试目的验证窗户不会因为传感器的微小波动而反复开合。操作持续向传感器喷水保持其湿润状态。预期舵机只转动一次到关闭位置之后即使传感器状态持续为“雨水”也不会重复执行关窗动作。串口应持续打印“检测到雨水”。成功标准系统状态稳定无多余动作。排查这由代码中的windowClosed状态变量和逻辑判断保证。如果反复触发检查逻辑判断条件。6.4 雨停开窗测试可选功能目的验证雨停后自动开窗功能。操作停止喷水并用纸巾轻轻吸干传感器检测区域。预期串口打印“雨停了触发开窗动作”和“正在打开窗户…”舵机应转回openAngle定义的角度默认为0度。成功标准系统能正确检测到“雨停”事件并恢复开窗状态。注意自动开窗功能是否启用取决于你的实际需求。如果希望一直保持关窗直到手动打开可以注释掉代码中相关的else if判断。7. 机械安装与系统集成电子部分测试成功后最挑战的部分来了——将电子装置与真实的窗户结合。设计原则力量传递舵机的旋转运动需要通过连杆、摇臂等机构转化为窗户的直线推拉或旋转。可以使用3D打印件、激光切割亚克力板或者用现成的材料如角铁、连杆套件制作。牢固固定舵机和支架必须牢固地固定在窗框或墙壁上防止动作时脱落。避免卡死确保机械运动路径顺畅没有死点。舵机在到达极限位置时如果被堵转电流会急剧增大导致损坏。可以在代码中避免让舵机转到物理极限角度留有余量。手动优先务必确保在自动系统失灵或需要紧急开关窗时可以轻松地手动操作窗户。不要设计成纯自动锁死结构。安装步骤建议确定关窗逻辑测量你的窗户从全开到全关需要的行程距离或旋转角度。制作连接机构设计一个将舵机臂与窗户把手或窗扇连接的机构。例如对于推拉窗可以用一根杆子一头连接舵机臂另一头连接窗扇。固定舵机将舵机用螺丝或强力胶如热熔胶、AB胶固定在窗框附近稳固的位置。连接与调试将连接机构安装好但先不要完全锁死。上传一个简单的舵机摆动测试程序手动调整连接点和舵机初始角度确保窗户能平滑地从“全开”移动到“全关”。调整代码角度根据上一步调试出的实际有效角度修改代码中的openAngle和closeAngle值。整体测试安装好雨滴传感器注意其位置应能有效收集雨水又不会被轻易误触发进行最终的通电淋水测试。8. 优化与扩展功能基础功能实现后你可以考虑以下优化和扩展让项目更完善、更智能。8.1 增加灵敏度调节与状态指示灯硬件增加一个电位器连接到模拟引脚 A1用于调节触发雨量阈值。增加一个 LED 灯如接引脚 13作为状态指示常亮开窗闪烁关窗中熄灭异常。代码在loop中读取电位器值映射为判断雨水信号的阈值。根据windowClosed状态控制 LED。8.2 增加手动/自动切换开关硬件增加一个拨动开关或按钮接数字引脚并启用上拉电阻。代码读取开关状态。当处于“手动”模式时屏蔽雨滴传感器的触发可以通过另一个按钮控制开关窗。这增加了系统的安全性和可控性。8.3 升级为物联网版本使用 ESP32硬件将主控更换为 ESP32如 ESP32 DevKitC它内置 Wi-Fi 和蓝牙。功能远程状态监控通过 Wi-Fi 连接家庭路由器将窗户状态开/关、传感器数据上传到物联网平台如 Blynk、ThingsBoard或自建服务器在手机 App 上查看。远程控制即使不在家也可以通过手机 App 手动触发关窗或开窗。天气预报联动通过网络 API 获取实时天气预报在降雨概率高时提前关窗而不仅仅是响应实际雨水。8.4 增加多种传感器融合判断硬件增加温湿度传感器如 DHT11、风速传感器。逻辑实现更复杂的判断逻辑。例如只有同时满足“检测到雨水”和“风速低于某值”时才关窗防止大风大雨天气强行关窗导致机械损坏。9. 常见问题与排查方法在制作过程中你可能会遇到以下问题这里提供排查思路。问题现象可能原因排查方式解决方案Arduino IDE 无法上传程序1. 端口选择错误2. 驱动未安装3. 开发板类型选错1. 检查设备管理器中的 COM 口2. 检查开发板类型是否与实物一致3. 尝试按一下板子上的复位键再上传1. 安装正确的 CH340/CP2102 驱动2. 在工具-端口和开发板中正确选择串口监视器无输出或乱码1. 波特率设置错误2. 代码中Serial.begin()波特率不匹配3. 串口被其他软件占用1. 检查 IDE 波特率是否与代码中一致如96002. 关闭可能占用串口的其他软件1. 统一波特率为 9600 或 1152002. 重启 Arduino IDE雨滴传感器始终显示“干燥”1. 接线错误VCC/GND2. 传感器灵敏度电位器未调节3. 传感器损坏1. 用万用表测量传感器供电电压2. 调节板载蓝色电位器3. 将 DO 引脚直接短接到 GND看状态是否变化1. 重新检查接线2. 顺时针/逆时针调节电位器用螺丝刀滴水上板测试3. 更换传感器舵机不转动或抖动1. 电源功率不足2. 信号线接触不良3. 机械负载过重卡死1. 观察 Arduino 板载电源指示灯是否变暗2. 单独测试舵机用示例代码Sweep3. 断开机械负载测试1. 为舵机提供独立的外部 5V/2A 以上电源2. 检查并固定信号线连接3. 减轻机械负载或更换更大扭矩舵机窗户关不严或关过头1. 舵机角度 (closeAngle) 设置不准确2. 机械连接存在虚位或弹性变形1. 在机械安装完成后通过串口发送指令单独测试舵机角度2. 观察机械传动是否牢固1. 精细调整代码中的角度值找到刚好关严的位置2. 加固机械连接件系统误触发无雨关窗1. 传感器灵敏度太高2. 传感器表面有灰尘、冷凝水3. 电气干扰1. 清洁传感器表面2. 逆时针调节灵敏度电位器3. 在代码中增加“延时确认”逻辑1. 调整灵敏度2. 修改代码连续检测到多次雨水信号后再触发动作软件防抖10. 最佳实践与项目总结最佳实践建议分阶段测试永远遵循“先软件后硬件先模块后集成”的原则。先在桌面上测试所有电子模块功能正常再安装到窗户上。电源隔离驱动电机/舵机的电源最好与逻辑控制部分Arduino的电源隔离或使用独立电源模块避免干扰导致单片机复位。做好防水为室外部分的传感器制作一个小的防水罩如用塑料瓶裁剪确保电路板不被淋湿同时让感应面朝下暴露。保留调试接口在最终版本中也保留串口打印功能并将调试信息输出级别调低。这样在出现问题时可以快速定位。安全第一确保自动关窗不会夹伤人或宠物。可以在窗边安装红外或超声波避障传感器在检测到障碍物时停止关窗动作。项目总结这个 Arduino 下雨自动关窗项目成功地将一个简单的物理传感器雨滴传感器和一个执行器舵机通过一块开源硬件Arduino和几十行代码组合成了一个解决实际生活问题的智能装置。它的价值不仅在于最终的成果更在于完整的实践过程从需求分析、硬件选型、电路搭建、编程逻辑、机械设计到系统调试。对于初学者你掌握了数字信号读取、舵机控制、状态机编程等核心技能。对于进阶者你可以在此基础上扩展出网络功能、多传感器融合、更复杂的决策逻辑。这个项目就像一个“乐高底座”为你打开了智能家居和物联网世界的大门。建议你将所有代码、电路图、机械设计图妥善保存并记录下遇到的问题和解决方案这本身就是一份宝贵的创客学习笔记。现在你可以自信地将它展示给你的同学、老师或者真正地安装在家里的窗户上了。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价