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













整个系统的核心控制器。Cortex-M3 内核@72MHz,64KB Flash。负责:TIM3双路PWM控制风扇转速、DHT22单总线通信、OLED I2C软件驱动、蜂鸣器控制、倒计时、湿度阈值判断。程序~12KB,资源充足。
SWD接口(SWCLK/SWDIO/GND/3.3V)连STM32,Keil MDK一键编译+下载。支持断点调试、变量查看。4根杜邦线连接即可,不需额外配置。
单总线通信,精度 ±0.5°C / ±2%RH。贴在雨衣领口内侧,实时监测排出空气湿度。湿度>90%触发干燥,<78%停止。DWT硬件周期计数器纳秒级时序。
双路H桥,每路1.2A,VM接5V独立供电。10kHz PWM调速(>人耳20kHz范围,运转安静)。AIN/BIN+STBY控制正反转和待机。
两个3.7V额定电压微型电机。上背部一个吹肩领口,中背部一个吹身体下摆,形成领口→下摆的对流空气通道。
配130电机,孔径1.9-2.0mm。必须加装网眼保护罩!高速旋转会打伤手指。两个扇叶分别缝在上背部和中背部的网眼口袋内。
128x64分辨率,I2C接口(PB6=SCL, PB7=SDA)。三屏切换:待机(温湿度+触发阈值) → 运行中(倒计时+实时温湿度) → 完成(用时+最高温度)。
干燥完成时自动蜂鸣6声提醒。低电平触发(PA11=0响),内置振荡器,无需PWM。开机短嘤一声表示系统就绪。
830孔面包板,上下两排电源轨(5V/GND)。STM32插正中间,TB6612/OLED/DHT22用跳线连接。调试阶段用,正式安装时拆下装控制盒。
面包板内部连接用硬线跳线,模块到面包板用飞线。正式安装时拆下面包板,改用AWG26细导线沿雨衣接缝走线。
21cm母对母杜邦线,直插OLED/DHT22/蜂鸣器模块到STM32核心板。单根对应单个引脚,方便快速试验。安装时替换为细导线+热缩管。
调试时USB供电。演示时: 18650锂电池(3.7V) → TP4056充电 → DC升压模块(5V)。控制盒装腰部口袋,需防水处理。
| STM32引脚 | 连接 | 类型 | 说明 |
|---|---|---|---|
| PA3 | DHT22 OUT | GPIO | 单总线温湿度 |
| PA6 | TB6612 PWMA | TIM3_CH1 | 风扇1 PWM (10kHz) |
| PA11 | 蜂鸣器 I/O | GPIO | 低电平触发 |
| PB0 | TB6612 PWMB | TIM3_CH3 | 风扇2 PWM (10kHz) |
| PB6 | OLED SCL | GPIO (软I2C) | 软件I2C时钟 |
| PB7 | OLED SDA | GPIO (软I2C) | 软件I2C数据 |
| PB8 | TB6612 BIN1 | GPIO | 风扇2方向 |
| PB9 | TB6612 BIN2 | GPIO | 风扇2方向 |
| PB12 | TB6612 AIN1 | GPIO | 风扇1方向 |
| PB13 | TB6612 AIN2 | GPIO | 风扇1方向 |
| PB14 | TB6612 STBY | GPIO | 使能 (高=工作) |
| 待机 (IDLE) | OLED显示实时温湿度+触发阈值,等待湿度>90% |
| 运行 (RUNNING) | 双风扇PWM全速,每秒倒计时,每2秒读DHT22 |
| 完成 (DONE) | 风扇停,蜂鸣6声,OLED显示用时+最高温 |
Cortex-M3内置DWT,72MHz时钟=14ns精度。主循环计时、DHT22微秒级时序、蜂鸣器延时全用DWT,不依赖任何中断。
自实现AM2302通信协议:启动信号→等待应答→读40bit数据。关中断保护时序,脉冲宽度采样法判0/1。每2秒读取一次。
| 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低功耗待机 |
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;
}
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
}
| IDE | Keil 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分钟自动停止,避免忘关耗尽电池。时间到自动蜂鸣提醒。
CPU内置周期计数器,14ns分辨率。替代SysTick中断,全流程无中断依赖。
自实现AM2302通信协议,关中断保护时序,脉冲宽度采样法。
无需任何按键,DHT22自动检测湿度→触发干燥→达标停止,全自动。
TIM3双路PWM,10kHz超人耳范围,运转安静无异音。占空比67%。