
阅读提示本文完整记录我把普通晾衣架改造成智能晾晒助手的过程——雨滴传感器检测下雨自动收回、光照传感器判断晴雨自动伸出、手机远程查看状态。总成本不到50元零基础也能复刻。 开篇又一次在雨中狂奔回家收衣服上个月的一个下午我正在公司写代码窗外突然乌云密布。我脑子里“嗡”的一声——早上出门晒了被子和三件衬衫全晾在阳台。接下来的四十分钟我根本写不进任何代码满脑子都是那床被雨淋湿的蚕丝被。终于忍不住请假一路狂奔回家。跑到楼下时雨已经下了冲上阳台收衣服被子还是湿了一大片。这不是第一次了。据统计因为突然下雨来不及收衣服每年造成的直接损失被褥发霉、衣服重洗、感冒看病平均每户超过200元。更别说那种“人在外面心在阳台”的焦虑感。传统晾衣方式受天气影响大效率低下。每次下雨都赌一把“雨不会下大”结果十赌九输。作为一个物联网工程师我决定根治这个问题。花了一个周末我把阳台上的普通晾衣架改造成了智能晾晒助手——雨滴传感器检测到下雨步进电机自动把晾衣架收回雨棚下光照充足时自动伸出还能通过手机远程查看状态、手动控制。所有硬件成本加起来不到50元。用了两个月再也没有因为下雨飞奔回家过。今天我就把完整的改造方案分享出来。无论你是租房党还是 homeowner只要阳台有空间都能复刻。一、需求分析你的晾衣架需要哪些“超能力”痛点理想功能物联网方案突然下雨人不在家自动收衣雨滴传感器检测雨水 → 电机收回晾衣架阴天/天黑忘记收光线不足时自动收回光敏电阻检测光照 → 低于阈值收回不知道外面天气状况远程查看阳台状态ESP8266上传数据到手机偶尔想手动控制手机一键操作接入云平台远程控制家里没人也放心自动运行无需干预双传感器融合判断全自动模式本方案实现的核心功能✅ 雨滴传感器实时监测下雨自动收回晾衣架✅ 光敏电阻检测光照天亮自动伸出、天黑自动收回✅ 双传感器协同判断避免误触发✅ ESP8266接入机智云/阿里云手机远程查看和控制✅ 步进电机驱动运行平稳可靠✅ 全部硬件成本不到50元二、硬件清单总成本约48元组件型号单价备注主控STM32F103C8T6最小系统板18元或ESP8266/ESP32替代WiFi模块ESP8266-01S10元对接云平台步进电机28BYJ-48 ULN2003驱动板12元5V扭矩够用雨滴传感器YL-83带模拟输出5元检测雨水光敏电阻模块5516带比较器3元检测光照强度OLED显示屏0.96寸 I2C10元显示状态信息按键轻触开关 ×21元手动控制电源5V/2A充电头USB线0元家里有-滑轨/支架铝型材或木条0元DIY用于固定晾衣架移动如果你已经有ESP8266/ESP32开发板可以直接用它做主控省18元代码需要移植但逻辑完全一样。省钱提示OLED显示屏可以省略省10元状态通过手机查看即可。光敏电阻可以用普通光敏电阻10k电阻分压代替模块省2元。三、工作原理与系统设计3.1 工作流程text光照充足 无雨 → 晾衣架伸出晒衣服 ↓ 下雨 或 光照不足 → 晾衣架收回避雨/避光 ↓ 双传感器融合判断 → 避免误触发一滴水/一片云不会乱动 ↓ 状态实时上传 → 手机随时查看 ↓ 按键/手机 → 手动控制特殊需求时使用3.2 为什么需要双传感器单用雨滴传感器有个问题邻居浇花溅到、露水、甚至一阵大风带起的水雾都可能触发误报。单用光敏电阻也有问题一片乌云飘过就收回两分钟后阳光出来又伸出反复折腾电机。解决方案雨滴传感器和光敏电阻协同判断。伸出条件光照强度 阈值且无雨持续30秒以上收回条件检测到雨水或光照强度 阈值持续30秒以上30秒的延时判断有效过滤了瞬态干扰。3.3 机械结构设计最简单的实现方式在阳台天花板安装两根平行滑轨铝型材或光滑木条晾衣架两端安装滑块可以在滑轨上前后移动步进电机通过同步带或钢丝绳牵引晾衣架移动伸出位置晒衣和收回位置避雨分别设置限位开关如果不想做滑轨可以用舵机拉动晾衣绳参考之前那篇晾衣助手文章但步进电机滑轨的方案更稳定、承重更强。四、电路连接4.1 接线表STM32F103C8T6组件引脚STM32引脚步进电机驱动ULN2003IN1-IN4PA0-PA3雨滴传感器AOPA4 (ADC)光敏电阻模块DOPA5 (ADC/GPIO)OLED显示屏SDA/SCLPB7/PB6 (I2C)按键1手动伸出-PA6按键2手动收回-PA7ESP8266 WiFi模块TX/RXPA9/PA10 (USART1)4.2 雨滴传感器安装要点安装在露天位置不能被雨棚遮挡稍微倾斜放置让雨水能流走不会一直积水导致持续触发传感器表面高于晾衣架最高点避免衣服滴水误触发五、代码实现5.1 核心逻辑代码STM32 Keil MDK#include stm32f10x.h #include delay.h #include oled.h #include uart.h #include adc.h #include motor.h // 阈值定义 #define RAIN_THRESHOLD 800 // 雨滴传感器模拟值干900湿300 #define LIGHT_THRESHOLD 500 // 光敏阈值亮700暗300 #define DEBOUNCE_TIME 30000 // 30秒防抖毫秒 // 状态定义 typedef enum { STATE_EXTENDED, // 伸出晒衣 STATE_RETRACTED, // 收回避雨 STATE_MOVING // 正在移动 } ClothesLineState; ClothesLineState currentState STATE_EXTENDED; uint32_t lastChangeTime 0; // 获取传感器状态 typedef struct { uint8_t isRaining; // 是否下雨 uint8_t isLightEnough; // 光照是否充足 } SensorStatus; SensorStatus getSensorStatus(void) { SensorStatus status; // 读取雨滴传感器ADC值 uint16_t rainValue ADC_Read(ADC_CHANNEL_4); status.isRaining (rainValue RAIN_THRESHOLD); // 读取光敏传感器 uint16_t lightValue ADC_Read(ADC_CHANNEL_5); status.isLightEnough (lightValue LIGHT_THRESHOLD); return status; } // 判断是否应该收回 uint8_t shouldRetract(SensorStatus status) { // 下雨 或 光照不足 → 收回 return (status.isRaining || !status.isLightEnough); } // 判断是否应该伸出 uint8_t shouldExtend(SensorStatus status) { // 无雨 且 光照充足 → 伸出 return (!status.isRaining status.isLightEnough); } // 主循环 int main(void) { SystemInit(); delay_init(); OLED_Init(); ADC_Init(); Motor_Init(); UART_Init(115200); OLED_ShowString(0, 0, Smart Dryer v1.0); while(1) { SensorStatus status getSensorStatus(); uint8_t shouldRet shouldRetract(status); uint8_t shouldExt shouldExtend(status); // 防抖逻辑状态需要持续30秒才执行动作 if (shouldRet currentState STATE_EXTENDED) { if (getTick() - lastChangeTime DEBOUNCE_TIME) { // 收回晾衣架 Motor_Retract(); currentState STATE_RETRACTED; lastChangeTime getTick(); OLED_ShowString(0, 2, Status: RETRACTED); // 发送状态到云端 SendToCloud(RETRACTED); } } else if (shouldExt currentState STATE_RETRACTED) { if (getTick() - lastChangeTime DEBOUNCE_TIME) { // 伸出晾衣架 Motor_Extend(); currentState STATE_EXTENDED; lastChangeTime getTick(); OLED_ShowString(0, 2, Status: EXTENDED); SendToCloud(EXTENDED); } } else { // 状态没有变化重置计时器 lastChangeTime getTick(); } // 显示实时数据 char buf[20]; sprintf(buf, Rain:%d Light:%d, ADC_Read(ADC_CHANNEL_4), ADC_Read(ADC_CHANNEL_5)); OLED_ShowString(0, 4, buf); delay_ms(100); } }5.2 步进电机控制28BYJ-48 ULN2003// 四相八拍控制序列 const uint8_t stepSequence[8][4] { {1, 0, 0, 0}, {1, 1, 0, 0}, {0, 1, 0, 0}, {0, 1, 1, 0}, {0, 0, 1, 0}, {0, 0, 1, 1}, {0, 0, 0, 1}, {1, 0, 0, 1} }; void Motor_Step(uint8_t direction) { static uint8_t stepIndex 0; if (direction FORWARD) { stepIndex (stepIndex 1) % 8; } else { stepIndex (stepIndex 7) % 8; } // 输出到ULN2003的四个输入 GPIO_Write(GPIOA, stepSequence[stepIndex][0] | (stepSequence[stepIndex][1] 1) | (stepSequence[stepIndex][2] 2) | (stepSequence[stepIndex][3] 3)); delay_ms(2); // 速度控制 } void Motor_Extend(void) { // 伸出向前走500步根据实际行程调整 for (int i 0; i 500; i) { Motor_Step(FORWARD); } Motor_Stop(); } void Motor_Retract(void) { // 收回向后走500步 for (int i 0; i 500; i) { Motor_Step(BACKWARD); } Motor_Stop(); }5.3 ESP8266对接云平台ESP8266通过串口与STM32通信将状态上报到机智云或阿里云IoT平台。// 通过串口发送状态到ESP8266 void SendToCloud(char *status) { char buf[64]; sprintf(buf, ATSEND{\status\:\%s\,\time\:%ld}\r\n, status, getTimestamp()); UART_SendString(buf); }六、安装与调试6.1 传感器安装位置雨滴传感器阳台外沿朝上放置确保能直接接收雨水光敏电阻朝南或朝东方向避免被建筑物遮挡主控盒固定在阳台内侧墙壁上防水防潮6.2 步进行程校准第一次使用时需要手动设置“伸出位置”和“收回位置”的步数先手动把晾衣架推到最外伸出位置记录步数再手动拉回最内收回位置记录步数在代码中设置EXTEND_STEPS和RETRACT_STEPS6.3 阈值校准用串口监视器读取传感器数值晴天中午光敏值约700-900雨滴值约900-1000阴天光敏值约300-500滴几滴水到雨滴传感器数值降到100-300根据实际读数设置RAIN_THRESHOLD和LIGHT_THRESHOLD。七、实际使用效果7.1 测试数据一个月实测场景系统反应人工干预次数突然下雨5次30秒内自动收回0傍晚天黑每天自动收回0第二天天亮每天自动伸出0邻居浇花溅水3次未误触发30秒防抖过滤0阴天多云转晴正常伸出/收回07.2 真实体验装上后的第一个雨天我在公司开会手机收到推送“晾衣架已收回”。我继续开会完全不用分心。回家后看到晾衣架安安静静地缩在雨棚下衣服一点没湿。那一刻觉得——这个周末花得太值了。7.3 成本回收一床蚕丝被被雨淋湿后的损失至少300元。这套系统不到50元只要避免一次损失就回本了。更何况它每天都在自动工作省下的时间精力无法计价。八、扩展与升级接入HomeAssistant通过MQTT接入HA与其他智能设备联动洗衣机联动通过智能插座检测洗衣机功率变化洗完衣服自动伸出晾衣架风速监测加装风速传感器大风天自动收回太阳能供电加装太阳能板电池实现零功耗待机语音控制接入小爱/天猫精灵喊一声“晾衣架收回来”即可九、踩坑与解决❌ 坑1雨滴传感器长期外置生锈现象用了一个月后传感器表面氧化读数不准。解决买带镀金或镀镍的雨滴传感器或者在表面喷涂三防漆。不用时擦干收纳。❌ 坑2步进电机力矩不够现象挂满衣服时电机转不动。解决28BYJ-48的力矩约3kg·cm如果晾衣架负载大换用42步进电机力矩更大或者给晾衣架加滑轮减少摩擦。❌ 坑3Wi-Fi信号差现象ESP8266在阳台连不上路由器。解决把ESP8266靠近室内一侧或者用ESP32信号更强也可以加Wi-Fi中继。❌ 坑430秒防抖导致响应慢现象下雨后要等30秒才收回担心已经淋湿了。解决30秒是合理折中。如果特别在意可以缩短到10秒但误触发概率会上升。实际测试中30秒内雨量通常不足以淋透衣服。十一、写在最后智能晾衣架解决的不是什么惊天动地的大事而是生活中一个反复出现的烦恼。传统晾衣方式受天气影响大效率低下。而物联网的魅力正在于——它不需要昂贵的设备不需要专业的施工只需要一点好奇心和动手能力就能让我们的家变得更“聪明”。当你在公司开会时收到“晾衣架已收回”的推送那种“再也不怕了”的安心感会让这个周末的DIY值回一切。现在去阳台上看看你的晾衣架给它装一个“大脑”吧。