🌂 智能速干雨衣

洪德初中 · 张梦琪 · STM32F103C8T6 · DHT22温湿度 · 双风扇PWM调速

项目背景

下雨天到学校,雨衣湿透了没处晒。普通雨衣只能自然风干,一上午都干不了。 智能速干雨衣在后背内侧缝了2个微型风扇,DHT22温湿度传感器实时监测, 湿度超标自动开始吹风,20-30分钟吹干。从外面看就是一件普通雨衣,奥秘都在里面。

硬件系统架构

18650锂电池 3.7V
TP4056充电模块
DC升压 5V
│ 供电
♥ STM32F103C8T6 主控
← 输入
DHT22温湿度
→ 输出
双风扇 PWM
OLED显示屏
蜂鸣器
↔ 工具
ST-LINK下载
TB6612电机驱动 → 130电机 ×2 → 螺旋桨扇叶

硬件实物照片

硬件模块详解

1. STM32F103C8T6 主控芯片

♥ 大脑

整个系统的核心控制器。Cortex-M3 内核@72MHz,64KB Flash。负责:TIM3双路PWM控制风扇转速、DHT22单总线通信、OLED I2C软件驱动、蜂鸣器控制、倒计时、湿度阈值判断。程序~12KB,资源充足。

2. ST-LINK/V2 下载调试器

✊ 编程工具

SWD接口(SWCLK/SWDIO/GND/3.3V)连STM32,Keil MDK一键编译+下载。支持断点调试、变量查看。4根杜邦线连接即可,不需额外配置。

3. DHT22 (AM2302) 温湿度传感器

✊ 感知层

单总线通信,精度 ±0.5°C / ±2%RH。贴在雨衣领口内侧,实时监测排出空气湿度。湿度>90%触发干燥,<78%停止。DWT硬件周期计数器纳秒级时序。

4. TB6612FNG 双路电机驱动

✊ 肌肉

双路H桥,每路1.2A,VM接5V独立供电。10kHz PWM调速(>人耳20kHz范围,运转安静)。AIN/BIN+STBY控制正反转和待机。

5. 130直流电机 ×2

✊ 执行机构

两个3.7V额定电压微型电机。上背部一个吹肩领口,中背部一个吹身体下摆,形成领口→下摆的对流空气通道。

6. 螺旋桨扇叶

✊ 风扇配件

配130电机,孔径1.9-2.0mm。必须加装网眼保护罩!高速旋转会打伤手指。两个扇叶分别缝在上背部和中背部的网眼口袋内。

7. 0.96寸 OLED显示屏 (SSD1306)

✊ 显示层

128x64分辨率,I2C接口(PB6=SCL, PB7=SDA)。三屏切换:待机(温湿度+触发阈值) → 运行中(倒计时+实时温湿度) → 完成(用时+最高温度)。

8. 有源蜂鸣器

✊ 提醒

干燥完成时自动蜂鸣6声提醒。低电平触发(PA11=0响),内置振荡器,无需PWM。开机短嘤一声表示系统就绪。

9. MB-102 面包板

✊ 电路搭建

830孔面包板,上下两排电源轨(5V/GND)。STM32插正中间,TB6612/OLED/DHT22用跳线连接。调试阶段用,正式安装时拆下装控制盒

10. 面包板跳线 + 飞线

✊ 连接线材

面包板内部连接用硬线跳线,模块到面包板用飞线。正式安装时拆下面包板,改用AWG26细导线沿雨衣接缝走线

11. 杜邦线 (母对母)

✊ 连接线材

21cm母对母杜邦线,直插OLED/DHT22/蜂鸣器模块到STM32核心板。单根对应单个引脚,方便快速试验。安装时替换为细导线+热缩管。

12. 供电方案

✊ 电源

调试时USB供电。演示时: 18650锂电池(3.7V) → TP4056充电 → DC升压模块(5V)。控制盒装腰部口袋,需防水处理。

引脚接线表

STM32引脚连接类型说明
PA3DHT22 OUTGPIO单总线温湿度
PA6TB6612 PWMATIM3_CH1风扇1 PWM (10kHz)
PA11蜂鸣器 I/OGPIO低电平触发
PB0TB6612 PWMBTIM3_CH3风扇2 PWM (10kHz)
PB6OLED SCLGPIO (软I2C)软件I2C时钟
PB7OLED SDAGPIO (软I2C)软件I2C数据
PB8TB6612 BIN1GPIO风扇2方向
PB9TB6612 BIN2GPIO风扇2方向
PB12TB6612 AIN1GPIO风扇1方向
PB13TB6612 AIN2GPIO风扇1方向
PB14TB6612 STBYGPIO使能 (高=工作)

系统工作流程

雨衣挂上衣架
DHT22 检测湿度 > 90% ?
✓ 触发干燥
✗ 继续等待
双风扇启动 · OLED显示倒计时
每2秒读DHT22 · OLED实时更新温湿度
湿度 < 78% 或 超过30分钟?
✓ 干了!
✗ 继续吹
风扇停 · 蜂鸣器6声 · OLED显示"完成"

软件系统设计

状态机设计

待机 (IDLE)OLED显示实时温湿度+触发阈值,等待湿度>90%
运行 (RUNNING)双风扇PWM全速,每秒倒计时,每2秒读DHT22
完成 (DONE)风扇停,蜂鸣6声,OLED显示用时+最高温

时序控制

⏰ DWT硬件周期计数器

Cortex-M3内置DWT,72MHz时钟=14ns精度。主循环计时、DHT22微秒级时序、蜂鸣器延时全用DWT,不依赖任何中断。

📡 DHT22单总线协议

自实现AM2302通信协议:启动信号→等待应答→读40bit数据。关中断保护时序,脉冲宽度采样法判0/1。每2秒读取一次。

双风扇 PWM控制

TIM3时基PSC=7, ARR=899 → 72MHz/8/900 = 10kHz
CH1 (PA6)风扇1 PWM,PWM1模式,占空比 0~899
CH3 (PB0)风扇2 PWM,同步同速
方向控制AIN1/BIN1=1, AIN2/BIN2=0 → 正转吹风
待机STBY=0 → TB6612低功耗待机

核心代码模块

DHT22 单总线读取

u8 DHT22_Read(float *t, float *h) {
    u8 i,j,b; u16 rh,rt; u32 ts;
    __disable_irq();                         // 关中断保护时序
    DQ_Out(); DQ_L(); d_us(2000);            // 主机拉低2ms
    DQ_H(); d_us(30); DQ_In();            // 释放总线,切输入
    // 等DHT22应答: 80us低+80us高
    ts=DWT_CYCCNT; while(!DQ_IN()){...}
    ts=DWT_CYCCNT; while(DQ_IN()){...}
    // 读40bit (5字节)
    for(i=0;i<5;i++){b=0;
        for(j=0;j<8;j++){
            /* 等50us低结束 */ ts=DWT_CYCCNT; while(!DQ_IN()){...}
            /* 延时40us采样 */ d_us(40); b<<=1;
            if(DQ_IN())b|=1;              // 高=1, 低=0
        } dht_raw[i]=b;
    } __enable_irq();
    // 校验+DHT22解码(2字节合成, ÷10)
    rh=((u16)dht_raw[0]<<8)|dht_raw[1];
    rt=((u16)dht_raw[2]<<8)|dht_raw[3];
    *h=rh/10.0; *t=rt/10.0;
    return 0;
}

双风扇 PWM控制

void Fan_Init(void) {
    // TIM3: PSC=7, ARR=899 → 10kHz
    TIM_TimeBaseStructInit(&ts);
    ts.TIM_Period=899; ts.TIM_Prescaler=7;
    TIM_TimeBaseInit(TIM3,&ts);
    // CH1(PA6)=风扇1, CH3(PB0)=风扇2
    oc.TIM_OCMode=TIM_OCMode_PWM1; oc.TIM_Pulse=0;
    TIM_OC1Init(TIM3,&oc); TIM_OC3Init(TIM3,&oc);
}
void Fan_Run(u16 d) {
    GPIO_SetBits(GPIOB, GPIO_Pin_14);       // STBY使能
    TIM_SetCompare1(TIM3,d);                // 风扇1 PWM
    TIM_SetCompare3(TIM3,d);                // 风扇2 PWM
}

湿度触发状态机

while (1) {
    now = millis();                          // DWT毫秒计数

    if (now - lastDHT >= 2000) {            // 每2秒读DHT22
        DHT22_Read(&t, &h);
    }
    if (now - lastSec >= 1000) {            // 每秒检查
        if (g_fanOn) {                       // 运行中
            if (h < HUMI_STOP || sec >= MAX_TIME) {
                Fan_Stop(); Buzzer_Beep(300); // 停止!
            }
        } else {                            // 待机
            if (h > HUMI_START) { Fan_Run(FAN_PWM); } // 触发!
        }
    }
    OLED_Clear(); /* 刷新显示 */
    d_us(200000);                           // 200ms
}

软件基础设置信息

IDEKeil MDK v5 (uVision V5.06)
编译器ARMCC V5.06 update 5 (build 528)
主控芯片STM32F103C8T6 (Cortex-M3, 64KB Flash, 20KB SRAM)
时钟HSE 8MHz → PLL 9x → 72MHz
标准库STM32F10x Standard Peripheral Library V3.5.0
C语言标准C99 (--c99)
MicroLIB已启用 (提供精简math库)
工程定义STM32F10X_MD, USE_STDPERIPH_DRIVER
Include路径.\user; .\start; .\library
启动文件startup_stm32f10x_md.s (中等密度)
编程器ST-LINK/V2 (SWD接口)

三重安全保护

🛡 网眼保护罩

尼龙网眼布缝成口袋,风扇装在里面。透气但阻挡手指/头发碰到螺旋桨。

🌡 温度监控

DHT22实时监测温度。若后期加装PTC加热片,超过50°C自动关闭,超过60°C紧急停机。

⏱ 定时自停

最长30分钟自动停止,避免忘关耗尽电池。时间到自动蜂鸣提醒。

技术亮点

⏰ DWT纳秒级时序

CPU内置周期计数器,14ns分辨率。替代SysTick中断,全流程无中断依赖。

📡 DHT22单总线

自实现AM2302通信协议,关中断保护时序,脉冲宽度采样法。

📊 湿度闭环控制

无需任何按键,DHT22自动检测湿度→触发干燥→达标停止,全自动。

📳 双风扇独立PWM

TIM3双路PWM,10kHz超人耳范围,运转安静无异音。占空比67%。