基于 STM32 与 FreeRTOS 的智能晾衣架控制系统设计

#智能硬件#STM32#FreeRTOS

智能晾衣架实物

👉 硬件套件购买链接(淘宝)

视频介绍:

摘要

随着城镇化进程加快与居民生活节奏提速,晾晒衣物这一日常事务对"及时收衣、避免雨淋"提出了更高要求。传统的固定式晾衣架缺乏环境感知与远程控制能力,遇到突发降雨时,用户往往无法及时将衣物收回,且无法掌握晾晒状态。针对上述问题,本文设计并实现了一套基于 STM32 微控制器的智能晾衣架控制系统。

系统以 STM32F103C8T6 为主控核心,采用 FreeRTOS 构建多任务实时调度框架;通过 DHT11 温湿度传感器、BH1750 光照传感器与雨滴检测模块采集环境信息,以 28BYJ-48 步进电机经 ULN2003A 驱动完成晾衣杆的伸缩动作,并通过 0.96 寸 OLED 显示屏与四路按键构成本地人机交互界面。软件上引入基于事件总线的分层架构,将硬件驱动层与业务决策层解耦,使下雨收衣、自动晾晒、模式切换等业务逻辑集中于服务层统一决策。同时,系统借助 ESP-12F 模块搭建无线网关,提供网页端与移动端两种远程控制方式,并通过 MQTT 协议接入 OneNET 云平台实现环境数据上报;基于 W25Q64 外部 Flash 与自定义 Bootloader,实现了 STM32 应用程序与 ESP-12F 固件的 OTA 远程升级,使设备在现场无须拆机即可更新程序。

测试结果表明:系统上电即进入自动模式并可自主完成晾晒;雨天触发收衣的响应时间小于 2 s;电机位置控制采用步数累积与极限位置标定,定位误差小于 2%;网页端与移动端控制指令下发至电机动作的端到端时延小于 500 ms;OTA 升级流程完整可靠。系统运行稳定、成本可控,具有良好的实用价值与推广前景。

关键词:STM32;FreeRTOS;智能晾衣架;环境感知;事件总线;OTA 远程升级;物联网

1 引言

1.1 研究背景与意义

晾晒衣物是居民日常生活中高频且必要的家务活动。然而,我国大部分地区降水具有突发性强、持续时间短的特点,用户外出或夜间休息时若突遇降雨,晾晒在外的衣物极易被淋湿,甚至需要重新洗涤,既浪费水资源又影响生活体验。此外,传统晾衣架功能单一,无法感知光照、温湿度等环境变化,也无法在用户外出时报告晾晒状态,难以满足现代家庭对智能化、便捷化的需求。

随着嵌入式技术与物联网技术的成熟,将微控制器、传感器网络与无线通信相结合,构建具备环境感知、自主决策与远程交互能力的智能晾衣架,具有明确的实用价值。本课题的研究意义主要体现在两个方面:一方面,通过环境感知与自动控制,实现"下雨自动收衣、雨停自动晾晒",切实解决用户的现实痛点;另一方面,通过模块化、分层化的软硬件设计,为同类小型智能家居控制系统提供可复用的设计思路与工程实现参考。

1.2 国内外研究现状

国外智能家居产业发展较早,智能晾晒类产品多以整机形态出现,通常集成电动升降、烘干与杀菌功能,但普遍价格较高,且依赖厂商云服务,二次开发与本地化定制能力有限。国内近年来涌现出大量基于单片机的智能晾衣架设计方案,多以 STM32 或 51 单片机为控制核心,配合步进电机、雨滴传感器与 Wi-Fi 模块实现基本功能。

从已公开的文献与设计案例看,现有方案仍存在若干不足:一是软件结构多为单任务前后台架构,业务逻辑、协议解析与硬件操作混杂在一起,可维护性差;二是传感器读数普遍未经防抖处理,电机启停瞬间的电气噪声易导致雨滴误判,进而引发状态机频繁切换;三是远程升级功能缺失,产品出厂后无法在不拆机的情况下修复缺陷或升级功能。本文在实现完整功能的同时,重点针对上述问题给出分层解耦、防抖确认与 OTA 升级的解决方案。

1.3 主要研究内容

本文的主要研究内容为:设计一套以 STM32F103C8T6 为核心、具备环境感知与自动决策能力的智能晾衣架控制系统,完成硬件电路设计、FreeRTOS 多任务软件设计、串口通信协议设计、本地人机交互设计、无线网关与云平台接入设计以及 OTA 远程升级设计,并通过测试验证系统功能与性能。

2 系统总体方案设计

2.1 需求分析

根据智能晾衣架的使用场景,系统需求可分为功能需求与非功能需求两部分。功能需求包括:①环境感知,实时采集温度、湿度、光照强度与降雨状态;②自动控制,降雨时自动收回衣物、雨停后自动晾出衣物;③手动控制,用户可通过本地按键菜单或远程界面手动收衣、晾衣;④模式管理,支持自动与手动两种工作模式;⑤状态显示,实时显示环境数据、工作模式与电机运行状态;⑥远程交互,支持局域网内网页控制与移动端控制;⑦数据上云,将环境数据上报至云平台;⑧远程升级,支持主控程序与无线模块固件的在线升级。

非功能需求包括:实时性,雨天收衣动作应在雨滴确认后 2 s 内启动;可靠性,停电恢复后应能恢复位置与模式信息,且传感器读数需具备抗干扰能力;可维护性,软件应结构清晰、模块职责单一,便于后续功能扩展;经济性,整体物料成本应控制在合理范围内,适合小批量制作。

2.2 系统总体架构

系统由感知层、控制层、交互层与云平台四部分构成。感知层包含 DHT11 温湿度传感器、BH1750 光照传感器、雨滴检测模块与 DS3231 实时时钟,负责将环境物理量转换为数字信号;控制层以 STM32F103C8T6 为核心,运行 FreeRTOS 实时操作系统,承担环境采集、自动决策、电机控制与协议解析任务;交互层包含 0.96 寸 OLED 显示屏与四路按键,提供本地交互,同时由 ESP-12F 模块提供网页端与移动端远程交互;云平台层为 OneNET 物联网平台,通过 MQTT 协议接收设备上报的环境数据。

从数据流角度看,环境数据自感知层经控制层汇聚后,可分别用于本地自动决策、OLED 显示与经 ESP-12F 上报云平台;控制指令则来自本地按键或远程界面,最终统一汇聚到控制层的服务层进行决策,再由驱动层执行电机动作。该结构保证了"多入口、单决策、单执行"的控制一致性。

2.3 关键器件选型

器件选型遵循"满足功能、成本可控、开发便利"的原则,关键器件选型结果如下表所示。

类别器件型号关键参数选型理由
主控 MCUSTM32F103C8T6ARM Cortex-M3,72 MHz,64 KB Flash,20 KB RAM资源充足、外设丰富、生态完善、成本低
Wi-Fi 模块ESP-12FESP8266EX,4 MB Flash,802.11 b/g/n体积小、价格低、可跑 TCP/MQTT 与 OTA
外部存储W25Q6464 Mbit(8 MB),SPI 接口存储中文字库与 OTA 固件包
显示模块0.96 寸 OLEDSSD1306,128×64 像素,I2C自发光、功耗低、接口简单
按键TS665CJ4 只,带硬件消抖电容手感清晰、可靠性高
温湿度DHT11050 ℃/±2 ℃,2090 %RH/±5 %RH单总线接口、成本低
光照BH17500~65535 lx,I2C数字输出、免标定、量程宽
雨滴检测雨滴检测模块DO 数字输出,灵敏度可调响应快、可直接触发外部中断
实时时钟DS3231±2 ppm,温度补偿,带电池备份精度高、断电仍可保持时间
步进电机28BYJ-485 V 供电,减速比 1:64,步距角 5.625°/64扭矩满足需求、价格低
电机驱动ULN2003A7 路达林顿阵列,内置续流二极管可直接驱动电机线圈,外围简单
稳压芯片AMS1117-3.35 V→3.3 V,最大 1 A输出稳定、纹波低、性价比高

3 系统硬件设计

系统整机电路如下图所示,后续各节按功能模块分别阐述。

系统原理图
系统原理图

3.1 主控最小系统与电源电路

主控模块以 STM32F103C8T6 为核心。该芯片基于 ARM Cortex-M3 内核,最高工作频率 72 MHz,集成 64 KB Flash 与 20 KB SRAM,具备多路 GPIO、定时器、USART、SPI 与中断控制器等外设,能够满足本系统对实时性与外设数量的要求。最小系统包含电源、时钟、复位与调试接口四部分:电源由 5 V 经 AMS1117-3.3 线性稳压后提供 3.3 V;时钟采用片内 8 MHz RC 振荡器经 PLL 倍频至 72 MHz,同时外接 32.768 kHz 低速晶振为实时时钟提供时钟源;复位采用阻容复位电路;调试与下载通过 SWD 接口完成。

电源部分统一由 5 V DC 接口输入,经单刀双掷电源开关后分为两路:一路直接为步进电机与 ULN2003A 供电,另一路经 AMS1117-3.3 降压为 3.3 V,供 STM32、ESP-12F、W25Q64、OLED 及各传感器使用。考虑到 ESP-12F 在发射瞬间峰值电流可达 500 mA 以上,在 3.3 V 电源输出端并联了大容量滤波电容以抑制瞬态压降,避免因电压跌落导致模块复位。

3.2 步进电机驱动电路

执行机构选用 28BYJ-48 五线四相减速步进电机。该电机内置 1:64 减速齿轮箱,输出轴步距角约为 5.625°/64,配合四相八拍驱动方式可提供足够的扭矩与定位精度,适合低速往复运动场合。

由于单片机 GPIO 输出电流能力有限,无法直接驱动电机线圈,本设计采用 ULN2003A 达林顿阵列作为驱动芯片。STM32 的 PB12PB15 四路 GPIO 输出相序控制信号,分别接入 ULN2003A 的 1B4B 输入端,对应输出端接电机四相线圈;ULN2003A 内置续流二极管,可有效泄放线圈断电时产生的反向电动势,保护驱动芯片与主控。电机供电为 5 V,与逻辑电平 3.3 V 相互隔离,仅共用参考地。

在控制策略上,系统不采用外部限位开关,而是通过步数累积方式记录电机当前位置,并通过一次性标定"原点位置"与"晾晒位置"来确定运动范围,从而减少机械结构与接线复杂度,同时避免限位开关在户外环境下的可靠性问题。

3.3 环境传感器采集电路

温湿度采集采用 DHT11 数字传感器,采用单总线协议,DATA 引脚接至 PA8。DHT11 对读取时序要求较严格,驱动以微秒级延时实现起始信号、响应信号与 40 位数据的发送与接收,并校验数据完整性后再更新温湿度值。

光照采集采用 BH1750 数字光照传感器,通过软件 I2C 与主控通信,SCL、SDA 分别接 PA0、PA1。相较光敏电阻方案,BH1750 输出为数字量,无须额外标定,且测量范围覆盖 0~65535 lx,可满足室内外光照强度检测需求。

降雨检测采用雨滴检测模块,其数字输出端 DO 接至 PA2。模块比较器输出在检测到水滴时由高电平变为低电平,该电平变化通过外部中断触发,从而实现降雨事件的即时捕获;同时模块电位器可调节检测灵敏度,以适应不同安装位置。需要说明的是,模块原始输出易受电机启停瞬间的电气噪声干扰,因此软件上必须结合防抖算法使用,详见 4.4 节。

时间基准采用 DS3231 高精度实时时钟模块,其内部集成温度补偿晶振,精度可达 ±2 ppm,并支持纽扣电池备份,断电后时间仍可继续运行。模块通过软件 I2C 接入(SDA 接 PB0、SCL 接 PB1),用于为系统提供准确的日期与时间,并供网页端与移动端显示。

3.4 人机交互电路

本地人机交互由 0.96 寸 OLED 显示屏与四路按键组成。OLED 采用 SSD1306 驱动芯片,分辨率 128×64,支持 I2C 接口,SCL、SDA 分别接 PB8、PB9;其自发光特性使其在暗光环境下仍清晰可读,且功耗较低,适合常显场景。

按键采用四只 TS665CJ 轻触开关,分别接至 PB4~PB7,配置为上拉输入,并各并联 47 nF 电容形成硬件消抖。四路按键分别承担"确认、返回、上移、下移"功能,配合菜单状态机实现本地操作:在首页按确认键进入主菜单,在菜单中通过上移、下移键移动光标,按确认键执行对应功能项,按返回键返回上级界面。

3.5 无线通信与存储电路

无线通信采用 ESP-12F 模块。该模块基于 ESP8266EX,内置 4 MB Flash,支持 802.11 b/g/n 协议,可运行 TCP、HTTP 与 MQTT 协议栈,既可作为局域网网关为手机与电脑提供网页控制界面,也可作为客户端接入云平台。模块与主控通过串口相连:USART1 的 PA9(TX)接模块 RX,PA10(RX)接模块 TX,通信参数为 115200 bit/s、8 位数据位、无校验、1 位停止位。

外部存储采用 W25Q64 SPI Flash,容量 8 MB,NSS、SCK、MISO、MOSI 分别接 PA4~PA7,接入 SPI1。W25Q64 在本系统中承担两项职责:一是存储 OLED 显示所需的中文字库点阵数据,二是作为 OTA 升级固件包的缓冲存储区。升级时,新固件由 ESP-12F 通过串口分包传输并暂存至 W25Q64,待校验通过后由 Bootloader 搬运至应用程序区,从而避免升级过程中断电导致程序损坏。

3.6 引脚分配

系统 GPIO 引脚分配如下表所示,分配时兼顾了外设功能复用与布线便利性。

引脚功能外设 / 模式说明
PA0 / PA1BH1750 SCL / SDA开漏输出(软件 I2C)光照采集
PA2雨滴传感器 DO上拉输入 + 外部中断降雨检测
PA4~PA7SPI1 NSS/SCK/MISO/MOSI推挽 / 复用推挽 / 上拉输入W25Q64 存储
PA8DHT11 DATA开漏输出(单总线)温湿度采集
PA9 / PA10USART1 TX / RX复用推挽 / 复用浮空输入与 ESP-12F 通信
PB0 / PB1DS3231 SDA / SCL开漏输出(软件 I2C)实时时钟
PB4~PB7按键 1~4上拉输入 + 外部中断本地人机交互
PB8 / PB9OLED SCL / SDA开漏输出(软件 I2C)显示驱动
PB10 / PB11USART3 TX / RX复用推挽 / 复用浮空输入调试串口
PB12~PB15ULN2003A 1B~4B推挽输出步进电机相序控制

PCB 实物如下图所示。

PCB 3D 渲染图
PCB 3D 渲染图

4 系统软件设计

4.1 软件总体架构与任务划分

系统软件采用分层架构,自上而下依次为用户层、服务层与硬件层,事件总线贯穿各层。用户层即 main.c,仅承担 FreeRTOS 任务创建与事件订阅接线两项职责,不包含具体业务逻辑;服务层负责任务决策、状态编排与优先级判断,如 ClotheslineService 统一决定"是否收衣、何时晾出";硬件层负责读写硬件、执行动作并上报原始事件,如 Motor 控制相序输出、Rain 采集电平、Menu 负责界面渲染。依赖方向严格单向:用户层依赖服务层,服务层依赖硬件层,硬件层不得反向调用服务层。

基于上述架构,系统在 FreeRTOS 下划分四个任务,如下表所示。任务划分遵循"职责单一"原则,一个任务只承担一类职责,避免功能混杂导致耦合。

任务名称优先级栈大小主要职责
vSensorTask3256 字环境数据采集与显示刷新;上电后自动模式的首次初始化
vUartTask4256 字串口协议解析与命令分派,将指令转发至对应服务模块
vServiceTickTask4128 字以 50 ms 周期推进 ClotheslineService_Process(),完成决策与动作下发
vIapTask1256 字升级标志检测与 OTA 流程处理

其中,vServiceTickTask 作为系统的"节拍器",以固定周期驱动服务层,使所有决策都在统一的时间基准下推进,避免在中断或其它任务中直接执行状态判断,从而保证行为的一致性与可预测性。主程序流程如下图所示。

主程序流程图(主干)
图 4-1 主程序流程图(主干)

4.2 事件总线与分层解耦设计

为解决传统前后台架构中"多入口直接调用执行层"导致的耦合问题,系统引入轻量级事件总线 AppEvent。事件总线的发布订阅机制包含三要素:发布者只描述客观事实,例如电机停止时发布 APP_EVENT_MOTOR_STOPPED;订阅关系集中注册在 main.c 中,便于一目了然地看到系统依赖;各模块自行实现事件处理函数,例如 ClotheslineService_OnMotorStopped 更新业务状态,Menu_OnMotorStopped 刷新界面显示。

该设计的收益在于:同一事件可被多个模块独立消费而不相互影响;新增订阅者只需在 main.c 增加一行注册代码,无须修改任何业务模块;驱动层不再关心"谁会用到这个事件",职责边界清晰。

与之配套的是"职责倒置"问题的纠正。改造前,界面模块在按键回调中直接判断当前模式并决定切换方向,服务层仅作为执行代理;改造后,界面模块只上报"用户按下了自动键"这一事实,由服务层根据当前模式决定切换到自动还是手动。判断标准是:若界面层代码中出现"若当前状态为某某则如何"的逻辑,即说明职责发生了倒置。

4.3 电机控制与位置管理

电机控制采用定时器中断驱动的步进输出方式。系统以 TIM2 产生约 4 ms 的定时中断,在中断服务函数中按四相八拍相序表依次输出 PB12~PB15 电平,每产生一次相序切换即视为电机前进或后退一个节拍。电机运行状态由目标步数与方向决定:调用 Motor_Run(steps, dir) 后设置目标步数并使能定时器,中断中每完成一步即将剩余步数减一,减至零时停止输出并关闭定时器,同时发布 APP_EVENT_MOTOR_STOPPED 事件。

位置管理采用步数累积方式。系统维护 motorPosition 变量记录当前相对原点的步数,配合两个标定值:原点步数 motorZeroSteps 与晾晒位置步数 motorMaxSteps。用户可在校准界面通过正向、反向微调按钮将电机移动到目标位置后,分别执行"记录原点"与"记录晾晒位置"操作,标定值写入 Flash 保存,掉电不丢失。运动范围判定即基于这两个标定值完成,例如当 motorPosition ≤ 0 时不再执行收衣动作,当 motorPosition ≥ motorMaxSteps 时不再执行晾出动作,从而在不使用限位开关的前提下避免堵转。

为满足实时性要求,所有电机动作均采用非阻塞方式发起。任务不会以死循环等待电机停转,而是采用"标志位 + 周期检查"模式:需要抢占电机时先调用 Motor_Stop() 停止当前动作并置位 pending 标志,随后由服务层周期函数检查"电机已停止"后再发起下一步动作,从而避免长时间占用 CPU 时间片、影响其它任务的响应。电机控制流程如下图所示。

电机控制与执行流程图
图 4-4 电机控制与执行流程图

4.4 环境感知与自动晾晒决策

降雨感知采用"中断触发 + 周期轮询"相结合的方式。雨滴模块 DO 引脚电平变化触发外部中断,中断服务函数仅释放一个信号量,不做任何业务判断;服务节拍任务每周期尝试获取信号量,若无事件则每 500 ms 主动读取一次电平作为兜底,保证中断丢失时仍能感知状态变化。

为抑制电气噪声引起的误判,系统引入连续一致性防抖算法:只有当连续三次读取结果一致时,才确认降雨状态发生变化,即由干燥变为降雨或由降雨变为干燥,整个确认过程约耗时 1.5 s。该算法有效解决了"电机启停瞬间电平抖动导致雨滴误判"的问题,避免了状态机因瞬时噪声而反复切换。防抖后的稳定状态量 isRaining 是服务层进行业务判断的唯一依据,服务层不再直接调用原始读取接口。雨滴检测与防抖流程如下图所示。

雨滴检测与防抖流程图
图 4-2 雨滴检测与防抖流程图

自动晾晒决策由 ClotheslineService_Process() 统一完成,其决策规则如下:①当检测到降雨且衣物处于晾晒状态时,调用 Motor_RetractForRain() 收回衣物;②当降雨停止、系统处于自动模式且衣物已收回时,启动延时计时器(默认 5 s,可通过串口配置),计时结束后调用 Motor_DryOutForAuto() 重新晾出衣物,延时设置用于避免短时阵雨造成的反复动作;③当存在用户待办命令 pendingUserOpen 或 pendingUserClose 时,按命令发起相应动作。

需要强调的是动作来源与模式的关系:由传感器触发的自动动作(降雨收衣、雨停晾出)不改变当前工作模式,仅在手动模式下由用户命令触发的动作才切换至手动模式。这一约束避免了"降雨自动收衣后系统被意外切换为手动、导致雨停后无法自动晾出"的逻辑缺陷。

此外,系统在自动模式下的上电行为也做了专门处理:设备上电后默认进入自动模式,服务层复用上述"雨停延时确认"窗口——若当前无雨且衣物处于收回状态,延时确认环境稳定后即自动晾出衣物,使用户上电后无须任何操作即可进入正常晾晒状态。自动晾晒决策流程如下图所示。

自动晾晒决策流程图
图 4-3 自动晾晒决策流程图

4.5 串口通信协议

STM32 与 ESP-12F 之间采用自定义的文本行协议。所有下行命令以"@命令名"起始、以回车换行结束,例如 @CLOSE、@AUTO、@MOTOR_QUERY;STM32 侧在串口中断中以状态机方式接收,识别到起始符后开始缓存字符,接收到回车换行时置位接收完成标志,交由 vUartTask 取出并按命令路由表分派。上行响应不带"@"前缀,采用"键:值"形式,便于上位机解析。该协议文本化、可读性强,便于使用串口助手直接调试。主要命令如下表所示。

命令方向说明响应
@CLOSEESP → STM32手动收衣电机动作
@OPENESP → STM32手动晾衣(降雨时被拦截)电机动作
@AUTO / @MANUALESP → STM32切换自动 / 手动模式MODE:AUTO 或 MODE:MANUAL
@MOTOR_QUERYESP → STM32查询电机状态MOTOR_STATUS:zero=,max=,pos=,mode=
@MOTOR_FWD:n / REV:nESP → STM32正 / 反向移动 n 步(校准用)无
@MOTOR_SAVE_ZEROESP → STM32记录当前位置为原点MOTOR_SAVED:0
@MOTOR_SAVE_MAXESP → STM32记录当前位置为晾晒位置MOTOR_SAVED:n
@TIME_QUERY / TIME_SET:…ESP → STM32查询 / 设置 DS3231 时间TIME_NOW:… 或 TIME_SET_OK
@MQTT_ON / @MQTT_OFFESP → STM32开启 / 关闭传感器上报SENSOR_REPORT:ON / OFF
@STM32_UPGRADEESP → STM32启动 OTA 升级流程OTA:PROGRESS 等

上行数据方面,STM32 在开启上报后以 500 ms 周期发送环境数据行 SENSOR:温度,湿度,光照,降雨,并在升级过程中发送 OTA:PROGRESS|进度、OTA:DONE|结果等状态行;ESP-12F 侧解析这些数据行并更新内部状态,供网页查询与云端上报使用。串口命令解析与分派流程如下图所示。

串口命令解析与分派流程图
图 4-6 串口命令解析与分派流程图

4.6 OLED 菜单与按键交互

本地交互采用基于状态机的菜单显示方案,共定义四种显示模式:首页模式、菜单模式、执行模式与升级模式。首页模式显示温度、湿度、光照情况、是否下雨以及当前工作模式;菜单模式以三行列表显示"收衣、晾衣、自动"三个功能项,并以">"符号标识当前光标位置;执行模式显示 Working、Retracting、Extending 等动作提示,或在降雨被拦截时显示 Rain! Wait 提示;升级模式则显示升级进度百分比。

按键处理在外部中断回调中完成,且回调函数只做界面跳转与命令上报,不作业务判断。以确认键为例:在首页按下后进入菜单模式;在菜单中按下后根据光标位置向服务层上报对应命令(收衣上报收衣命令、晾衣上报晾衣命令、自动上报切换自动模式命令),若晾衣时当前正在下雨,则界面提示并延时返回菜单;在执行模式下按下则停止电机并返回首页。返回键用于返回上级界面,执行模式下按下会先停止电机。上移、下移键仅在菜单模式下生效,用于移动光标。

界面刷新由事件驱动完成。电机停止后,Motor 模块发布 MOTOR_STOPPED 事件,界面模块在事件回调中返回首页并刷新显示;工作模式变化后发布 MODE_CHANGED 事件,界面模块据此更新首页的模式字段。该机制使得界面模块无须轮询硬件状态,降低了耦合度与 CPU 占用。按键与菜单交互流程如下图所示。

按键与菜单交互流程图
图 4-5 按键与菜单交互流程图

4.7 OTA 远程升级设计

为提升设备的可维护性,系统实现了主控程序与无线模块固件的双通道远程升级。整体方案为:ESP-12F 作为网络侧代理负责从服务器下载固件,STM32 侧通过 Bootloader 负责将固件写入并搬运至应用程序区,两者通过串口协同完成升级。

主控程序升级流程如下:用户在网页端或移动端发起升级请求后,ESP-12F 通过 HTTP 协议从指定地址下载新版应用固件,随后向 STM32 发送 @STM32_UPGRADE 命令启动升级流程;STM32 收到命令后,先执行安全动作——若衣物处于晾晒状态则先收回,避免升级过程中机械意外动作;随后进入升级状态,以 YMODEM 协议接收 ESP-12F 分包发送的固件数据,逐包写入 W25Q64 的固件缓冲分区,并实时向上位机回报升级进度。全部数据接收完成后写入升级标志,由 Bootloader 在下次启动时校验固件完整性,校验通过后将固件从缓冲分区搬运至应用程序区,并跳转执行,从而实现完整升级。

无线模块升级流程相对简单:ESP-12F 收到升级请求后,自行从服务器下载新固件并写入其内部 Flash 的 OTA 分区,重启后由 ESP8266 引导程序完成切换;升级过程中向 STM32 上报进度,以便 OLED 同步显示。

采用"先缓存、后搬运"的两阶段升级策略,其价值在于:即使升级过程中发生断电或网络中断,应用程序区仍保持原固件完整,设备重启后可正常运行,不会出现"变砖"现象,显著提升了升级过程的可靠性。OTA 升级流程如下图所示。

OTA 远程升级流程图
图 4-7 OTA 远程升级流程图

4.8 无线网关、上位机与云平台

ESP-12F 在本系统中承担无线网关与上位机双重角色。作为无线网关,它将 STM32 的串口协议转换为网络服务:一方面内置轻量级 HTTP 服务器,向局域网内设备提供网页控制界面;另一方面作为 MQTT 客户端接入 OneNET 云平台,将环境数据打包为 OneJSON 格式按 15 s 周期上报,同时接收云端下发命令。

网页控制界面的数据来源分为三类:一是 ESP-12F 本地配置数据,如 OneNET 平台参数与 MQTT 开关状态,通过读取本地存储获得;二是实时硬件状态,如电机标定值与当前位置,由 ESP-12F 经串口向 STM32 查询后获得;三是实时时钟数据,由 STM32 从 DS3231 读取后经串口返回。上述数据在页面加载后按既定顺序异步获取,避免因串口查询耗时导致的界面卡顿。

网页端提供的操作包括:控制区的收衣、晾衣、自动模式按钮;校准区的正反向微调与原点、晾晒位置标定按钮;实时时钟的同步与设置;环境数据上报开关;主控与无线模块的升级入口;固件与网络配置信息。用户在网页或移动端点击某一按钮后,浏览器或 App 向 ESP-12F 发起 HTTP 请求,ESP-12F 将请求转换为对应的串口命令下发给 STM32,STM32 在服务层完成决策后驱动电机或更新状态,并将结果经串口回传至 ESP-12F,最终反馈到界面。移动端应用复用同一套 HTTP 接口,因而与网页端行为完全一致。

为降低交互时延,ESP-12F 在后台以 10 s 周期主动向 STM32 查询电机状态并缓存于内存,网页查询时直接返回缓存结果,避免了每次都触发串口往返;同时,页面初始化后按 1 s、1.5 s、2 s 的错峰时序分别获取 MQTT 状态、电机状态与实时时钟,使关键信息优先呈现。

本系统通过上述设计,实现了"端—网关—主控"三级的数据与指令通路:感知数据由主控经网关上行至网页、App 与云平台,控制指令由网页、App 或本地按键下行至主控,形成完整的闭环交互体系。

5 系统测试与结果分析

5.1 测试环境与方案

测试环境为室内常温环境,测试工具包括 5 V/2 A 直流电源、ST-Link 下载器、USB-TTL 串口模块、串口调试助手以及处于同一局域网内的电脑与手机。测试对象为装配完成的智能晾衣架样机。测试内容分为功能测试与性能测试两部分:功能测试逐项验证本地按键交互、自动晾晒、远程控制、数据上报与远程升级是否正常;性能测试重点考察雨滴响应时间、电机定位误差、指令端到端时延以及长时间运行的稳定性。

5.2 功能测试

功能测试用例及结果如下表所示。测试采用"构造条件—执行操作—观察现象"的方法,逐项确认预期行为与实际表现是否一致。

测试项操作步骤测试结果
首页显示上电后在首页模式观察显示内容正常显示温湿度、光照、降雨状态与工作模式
按键菜单按确认键进入菜单,上下键移动光标,确认键执行光标移动正确,各功能项均按要求执行
手动收衣 / 晾衣在菜单选择收衣或晾衣,观察电机动作电机按指定方向运行,动作完成后回到首页
自动模式进入选择自动模式,观察系统行为无雨且衣物在原点时自动晾出;有雨时保持收衣状态
雨天自动收衣将雨滴传感器打湿,观察电机动作电机自动收回衣物,OLED 仍显示自动模式
雨停自动晾出擦干传感器,观察系统动作延时 5 s 后电机自动晾出衣物,模式保持不变
网页远程控制在网页点击收衣、晾衣、自动按钮电机按要求动作,界面状态同步更新
移动端控制在 App 中执行相同操作行为与网页端一致
数据上报开启上报功能,观察云平台数据环境数据按周期正确上报,曲线连续
主控远程升级在网页发起主控升级并等待完成进度正常回报,重启后运行新版本程序
无线模块升级在网页发起 ESP-12F 升级自助下载并切换固件,OLED 同步显示进度

测试结果表明,全部功能项均通过验证,系统在本地交互、自动决策与远程控制三方面的行为保持一致,未出现状态冲突或功能失效现象。

5.3 性能测试

性能测试重点针对实时性、控制精度与稳定性三项指标,测试数据如下表所示。

测试指标测试方法测试结果
降雨响应时间记录传感器确认降雨至电机启动的时间平均 1.6 s(含 1.5 s 防抖确认),最大 1.8 s
电机定位误差在标定范围内往复运动后比对目标与实测位置最大误差约 1.6%,小于 2%
指令端到端时延记录网页点击至电机启动的时间平均 320 ms,最大 480 ms
按键响应时延记录按键按下至界面切换的时间小于 100 ms
连续运行稳定性连续运行 72 小时,观察异常复位与误动作无异常复位,无雨滴误判导致的误动作
待机功耗电机停止且屏幕常亮状态下测量整机电流约 95 mA(5 V 供电)

从测试数据可以看出:引入 1.5 s 的防抖确认虽使降雨响应时间略有增加,但换来的是雨中误判率的大幅下降,综合考虑环境干扰与机械磨损,该折衷是合理的;电机定位误差主要由步进电机的累积误差与传动间隙造成,1.6% 的误差在晾晒场景中完全可接受,且可通过标定功能进一步修正;端到端时延主要由 Wi-Fi 链路与串口查询构成,平均 320 ms 的时延在远程控制场景中无明显迟滞感。

5.4 结果分析

综合功能与性能测试结果,系统达到了设计目标,主要体现在三个方面。第一,控制一致性良好:本地按键、网页端与移动端三处入口下发同一动作时,最终受同一套服务层规则约束,行为完全一致,未出现"同一操作多种结果"的问题。第二,抗干扰能力增强:通过传感器防抖、非阻塞动作发起与事件驱动的界面刷新,系统在电机启停、传感器抖动等工况下仍能保持稳定,72 小时连续运行未出现异常复位。第三,可维护性显著提升:两级固件均支持远程升级,现场设备无须拆机即可更新程序,为后续修复缺陷与迭代功能提供了便利。

测试中也发现了若干可改进之处:一是 DHT11 的测量精度与响应速度有限,在高湿度环境下读数存在一定滞后;二是当前未采集电机电流,缺少堵转检测能力;三是云端仅做数据透传,尚未实现基于历史数据的智能预测。这些问题将在后续工作中逐步完善。

6 总结与展望

6.1 全文总结

本文围绕"晾晒衣物遇雨难以及时收回"这一实际问题,设计并实现了一套基于 STM32 的智能晾衣架控制系统,完成了从需求分析、总体方案、硬件电路、软件架构到系统测试的完整设计过程。主要工作可归纳为以下四点。

第一,完成了系统硬件平台设计。以 STM32F103C8T6 为主控,配合 DHT11、BH1750、雨滴模块与 DS3231 构成环境感知单元,以 28BYJ-48 步进电机与 ULN2003A 构成执行单元,以 OLED 与四路按键构成交互单元,并以 W25Q64 与 ESP-12F 构成存储与无线通信单元,给出了完整的引脚分配方案。

第二,完成了基于 FreeRTOS 的软件架构设计。采用用户层—服务层—硬件层的分层架构,以事件总线完成模块间解耦,将四个任务按职责单一原则划分,使业务决策与硬件驱动彻底分离,显著提升了代码的可读性与可维护性。

第三,解决了工程实现中的若干关键问题。针对电机噪声导致的雨滴误判,设计了连续一致性防抖算法;针对阻塞等待影响任务响应的问题,采用标志位与周期检查的非阻塞模式;针对界面层职责倒置问题,明确了"界面只报告事实、服务层负责决策"的分工原则;针对升级可靠性问题,采用"先缓存、后搬运"的两阶段 OTA 策略。

第四,实现了完整的远程交互与云平台接入。通过 ESP-12F 提供网页端与移动端控制界面,实现了页面数据的分源异步加载与后台状态缓存;通过 MQTT 协议接入 OneNET 平台完成环境数据上报,形成了端到端的物联网闭环。测试结果表明系统功能完备、运行稳定,达到预期设计目标。

6.2 不足与展望

尽管系统已实现设计功能,但仍存在以下改进方向:一是提升感知精度,后续可选用 SHT30 等高精度数字温湿度传感器,并增加风速、紫外线强度等环境量,为晾晒决策提供更充分的依据;二是增强执行安全,增加电机电流采样电路以实现堵转与过流保护,并引入限位开关或编码器实现位置闭环;三是深化数据分析,利用云平台积累的环境与使用数据,结合天气预测实现"提前收衣"的预测性决策;四是完善产品化设计,优化外观结构、防水性能与供电方式,并考虑采用太阳能充电以进一步降低能耗。

总体而言,本系统以较低的成本实现了智能晾晒的核心功能,其分层解耦的软件架构与两阶段升级策略对同类小型智能家居控制系统具有一定的参考价值。

参考文献

  1. 刘火良, 杨森. STM32 库开发实战指南[M]. 第 2 版. 北京: 机械工业出版社, 2017.
  2. 张洋, 刘军, 严松. 原子教你玩 STM32[M]. 第 2 版. 北京: 北京航空航天大学出版社, 2015.
  3. 何宾, 张艳辉. STM32 嵌入式系统开发[M]. 北京: 电子工业出版社, 2018.
  4. 周航慈. 嵌入式系统软件设计中的常用算法[M]. 北京: 北京航空航天大学出版社, 2010.
  5. 王伟, 李强. 基于 STM32 的智能家居控制系统设计[J]. 电子设计工程, 2020, 28(15): 110-114.
  6. 陈明, 赵磊. 基于物联网的智能晾衣架系统设计[J]. 物联网技术, 2021, 11(4): 45-48.
  7. 李宁. 基于 ESP8266 的无线数据传输系统设计[J]. 单片机与嵌入式系统应用, 2019, 19(8): 60-63.
  8. 孙晓明. 基于 FreeRTOS 的嵌入式多任务调度优化研究[J]. 计算机工程与设计, 2021, 42(6): 1620-1626.
  9. STMicroelectronics. RM0008 Reference Manual: STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx and STM32F107xx Advanced ARM-based 32-bit MCUs[Z]. 2021.
  10. Espressif Systems. ESP8266EX Datasheet[Z]. 2020.
  11. Maxim Integrated. DS3231 Extremely Accurate I2C-Integrated RTC/TCXO/Crystal Datasheet[Z]. 2015.
  12. Winbond Electronics. W25Q64FV 3V 64M-Bit Serial Flash Memory with Dual/Quad SPI Datasheet[Z]. 2017.
  13. 中国移动物联网有限公司. OneNET 物联网平台开发文档[EB/OL]. https://open.iot.10086.cn, 2023.
  14. Analog Devices. ULN2003A High-Voltage High-Current Darlington Transistor Arrays Datasheet[Z]. 2018.
  15. FreeRTOS. FreeRTOS Kernel Reference Manual[EB/OL]. https://www.freertos.org, 2023.