新闻详情

新闻详情

首页 / 资讯中心 / 详情

基于STM32的智能除湿衣柜DIY:从硬件选型到代码调试全记录

发布时间:2026/9/25 1:54:03来源:尧图网络
基于STM32的智能除湿衣柜DIY:从硬件选型到代码调试全记录
1. 为什么我要做这个智能除湿衣柜南方回南天那段时间我家衣柜里的衣服摸上去总是潮乎乎的有几件羊毛衫甚至长了霉点。市面上带除湿功能的衣柜动辄三四千而一个普通的半导体除湿模块才几十块钱。我本身是做嵌入式开发的手头常备STM32F103C8T6最小系统板就想着干脆自己搭一套控制系统把普通衣柜改造成能自动控湿的智能衣柜。这个项目的核心思路很直接用DHT11采集衣柜内部的温湿度STM32根据设定的湿度阈值决定是否启动除湿模块和风扇OLED屏实时显示当前状态按键用来调整目标湿度。整套东西成本不到一百块代码、原理图、仿真全部开源。适合有STM32基础、想找一个完整小项目练手的同学也适合想低成本解决衣柜潮湿问题的动手派。我前后花了大概两周的业余时间从画原理图到打板焊接再到调代码中间踩了不少坑。下面把整个项目的设计思路、关键电路、代码架构和调试经验完整梳理一遍你照着做基本能复现出来。2. 系统整体方案与硬件选型逻辑2.1 为什么选STM32F103C8T6而不是其他MCU这个项目对算力要求极低DHT11是单总线协议OLED是I2C继电器是普通GPIO控制随便一个8位单片机都能胜任。选STM32F103C8T6主要考虑三点第一这颗芯片资料极其丰富网上随便一搜就有大量参考设计出了问题容易找到答案第二它的GPIO驱动能力足够直接驱动继电器模块的光耦输入端不需要额外加三极管第三我手头囤了好几块最小系统板零成本。如果你手头只有STC89C52或者合泰的单片机也完全可以做逻辑是一样的只是代码要重新适配。选型这件事没有绝对的对错关键看你手上有什么、熟悉什么。2.2 除湿方案对比半导体制冷片 vs 压缩机 vs 干燥剂这是整个项目最关键的决策点。我一开始考虑过用压缩机除湿除湿量大、效率高但体积太大衣柜里根本塞不下而且噪音和震动都不适合放在卧室。干燥剂方案最简单但需要频繁更换谈不上智能。最终选了半导体制冷片方案。它的原理是帕尔贴效应通电后一面制冷一面发热冷面温度降到露点以下空气中的水蒸气就会在冷面凝结成水滴。优点是体积小、无噪音、无震动、控制简单缺点是除湿量有限、效率比压缩机低。但对于衣柜这种密闭小空间大约0.5立方米半导体制冷片完全够用。我用的是一片TEC1-1270612V供电最大温差能到60度以上。实际使用中冷面温度大概在5到10度之间配合一个小风扇把潮湿空气吹过冷面除湿效果很明显。热面必须加散热片和风扇否则热量散不出去制冷效率会急剧下降。2.3 传感器选型DHT11够不够用DHT11的湿度测量范围是20%到90%RH精度正负5%RH温度精度正负2度。有人觉得精度太差想换DHT22或者SHT30。我的看法是对于衣柜除湿这个场景你只需要知道湿度是不是超过60%这一个判断正负5%的误差完全可以接受。DHT22精度更高但价格贵好几倍SHT30是I2C接口精度最好但成本更高。DHT11最大的问题是采样频率不能太快 datasheet要求两次读取间隔至少1秒实际使用中我建议间隔2秒以上否则容易读到0或者校验失败。这一点在后面代码部分会详细说。2.4 整体硬件框图系统由五个部分组成STM32主控、DHT11温湿度传感器、OLED显示模块、按键输入、继电器驱动模块。继电器控制两个负载半导体制冷片和散热风扇。另外还有一个状态指示灯用来快速判断系统是否在除湿状态。供电方面STM32和OLED用3.3VDHT11用3.3V或5V都可以继电器模块用5V半导体制冷片和风扇用12V。所以需要一个12V电源适配器然后通过降压模块得到5V和3.3V。我用的是一块LM2596降压模块调到5V再用AMS1117-3.3得到3.3V。3. 原理图设计与关键电路细节3.1 STM32最小系统与引脚分配我用的是STM32F103C8T6最小系统板上面已经包含了晶振、复位电路和稳压芯片所以原理图部分只需要画外围电路的连接。引脚分配如下功能引脚说明DHT11数据PA0单总线需要4.7K上拉OLED SCLPB6I2C1时钟OLED SDAPB7I2C1数据按键1加PA1内部上拉按下为低按键2减PA2内部上拉按下为低按键3确认PA3内部上拉按下为低继电器1制冷片PA4高电平触发继电器2风扇PA5高电平触发状态指示灯PC13低电平点亮这里有个细节要注意PA0作为DHT11的数据线必须接一个4.7K到10K的上拉电阻到3.3V。DHT11的数据线是开漏输出没有上拉电阻的话读不到数据。我一开始忘了加上拉调试了半天以为是时序问题后来用示波器一看数据线一直是低电平才反应过来。3.2 继电器驱动电路与隔离设计继电器模块我直接买的是成品模块上面已经带了光耦隔离和续流二极管。但即使是成品模块也要注意几点第一继电器模块的VCC和GND要单独走线到电源不要和MCU共用一条细线否则继电器吸合瞬间的电流冲击可能导致MCU复位第二控制信号线最好串联一个100欧姆的电阻限流保护光耦输入端第三如果继电器模块是低电平触发代码里的逻辑要反过来。我用的模块是高电平触发所以PA4和PA5输出高电平时继电器吸合。半导体制冷片和风扇分别由两个继电器控制这样可以独立控制先开风扇再开制冷片关的时候先关制冷片再关风扇让风扇多转一会儿把残余冷量吹出来也保护制冷片不会因为热量积聚而损坏。3.3 电源部分12V转5V转3.3V电源是整个系统最容易出问题的地方。半导体制冷片TEC1-12706的额定电流是6A启动瞬间电流更大。如果用普通的12V 1A适配器根本带不动。我一开始用了一个12V 2A的适配器结果制冷片一启动电压就掉到8VMCU直接复位。后来换了一个12V 5A的适配器才稳定下来。这里给个经验值TEC1-12706实际工作电流在3到4A左右取决于散热条件加上风扇和MCU总电流至少需要5A余量。适配器选12V 6A或更大比较稳妥。5V部分用LM2596降压模块输入接12V输出调到5V给继电器和DHT11供电。3.3V用AMS1117-3.3从5V降压得到给STM32和OLED供电。注意AMS1117的压差要求至少1V5V转3.3V没问题但如果输入低于4.3V输出就不稳定了。3.4 嘉立创画图注意事项原理图我用嘉立创EDA画的这个工具对个人用户免费元件库也比较全。画图时有几个点要注意第一DHT11的封装要确认清楚有的是三脚直插有的是四脚买之前先看数据手册第二OLED模块的I2C地址通常是0x78或0x3C画图时不用管代码里扫描一下就知道第三继电器模块如果是外接的原理图上只需要画一个排针接口就行不用把继电器线圈和触点都画出来。PCB布局时12V大电流走线要尽量宽我用了2mm线宽。制冷片和风扇的接线端子要靠近继电器输出端减少走线长度。DHT11的走线要远离电源线和继电器避免干扰。4. 代码架构与核心模块实现4.1 工程目录结构与开发环境我用Keil MDK 5开发工程目录结构如下SmartWardrobe/ ├── Core/ │ ├── main.c │ ├── stm32f1xx_it.c │ └── system_stm32f1xx.c ├── Drivers/ │ ├── STM32F1xx_HAL_Driver/ │ └── CMSIS/ ├── Hardware/ │ ├── dht11.c / dht11.h │ ├── oled.c / oled.h │ ├── key.c / key.h │ └── relay.c / relay.h ├── App/ │ ├── app_control.c / app_control.h │ └── app_display.c / app_display.h └── MDK-ARM/ └── SmartWardrobe.uvprojx分层原则Hardware层只负责硬件驱动App层负责业务逻辑main.c只做初始化和主循环调度。这样后面如果要换传感器或者改控制逻辑只需要改对应的层不会牵一发动全身。4.2 DHT11驱动时序是最大的坑DHT11的单总线协议对时序要求很严格。STM32F103C8T6主频72MHz一个时钟周期约13.9ns。DHT11的时序要求是主机拉低至少18ms然后拉高20到40us然后释放总线等待DHT11响应。我用的是HAL库的微秒延时函数但HAL_Delay只能做到毫秒级所以需要自己写一个微秒延时。可以用SysTick或者DWT。我用的是DWT方案代码如下void DWT_Delay_Init(void) { CoreDebug-DEMCR | CoreDebug_DEMCR_TRCENA_Msk; DWT-CYCCNT 0; DWT-CTRL | DWT_CTRL_CYCCNTENA_Msk; } void DWT_Delay_us(uint32_t us) { uint32_t start DWT-CYCCNT; uint32_t ticks us * (SystemCoreClock / 1000000); while ((DWT-CYCCNT - start) ticks); }读取DHT11的完整流程是主机拉低至少18ms拉高20到40us然后切换为输入模式等待DHT11拉低80us作为响应信号再拉高80us然后开始传输40位数据。每一位数据以50us低电平开始高电平持续26到28us表示0持续70us表示1。这里有个大坑如果在中断里调用DWT_Delay_us而中断优先级又比较高可能会打断时序导致读取失败。我的做法是在读取DHT11期间关闭全局中断读完再打开。虽然会稍微影响系统实时性但DHT11读取只需要几毫秒影响可以忽略。4.3 OLED显示I2C驱动与界面布局OLED我用的是0.96寸128x64的I2C模块驱动芯片是SSD1306。I2C地址通常是0x788位地址或0x3C7位地址。HAL库的I2C函数用的是7位地址所以代码里填0x3C。显示界面我设计了四行内容第一行显示当前温度和湿度第二行显示设定的目标湿度第三行显示除湿状态工作中/待机第四行显示运行时间。字体用的是6x8和8x16两种标题用8x16数据用6x8。OLED刷新频率不需要太高我每500ms刷新一次。如果刷新太快I2C总线占用时间过长可能影响DHT11的读取。另外OLED的I2C速率我设的是400kHz实际测试100kHz也够用但400kHz刷新更流畅。4.4 继电器控制逻辑与状态机控制逻辑用一个简单的状态机实现状态定义如下typedef enum { STATE_IDLE, // 待机湿度低于阈值 STATE_DEHUMID, // 除湿中制冷片和风扇都开 STATE_COOLDOWN, // 制冷片关闭风扇继续运行 STATE_ERROR // 传感器读取失败 } SystemState_t;状态转换条件当湿度大于目标湿度加3%时进入DEHUMID状态先开风扇延时500ms再开制冷片。当湿度小于目标湿度减3%时进入COOLDOWN状态先关制冷片风扇继续运行30秒后关闭然后回到IDLE。这个3%的迟滞区间是为了防止湿度在阈值附近波动导致继电器频繁吸合。传感器读取失败时进入ERROR状态关闭所有负载OLED显示错误信息每2秒重试一次。如果连续10次失败就认为传感器故障保持ERROR状态并闪烁指示灯。4.5 按键处理与参数存储三个按键分别对应加、减、确认。短按加/减调整目标湿度每次1%范围30%到80%。长按加/减可以快速调整每200ms变化一次。确认键用来保存设置到Flash。参数存储我用的是STM32内部的Flash地址选在0x0801F800最后一页。写入前要先擦除整页然后按半字写入。读取时直接指针访问。注意Flash写入期间CPU会暂停所以不要在中断里写Flash。#define FLASH_SAVE_ADDR 0x0801F800 void SaveTargetHumidity(uint8_t humidity) { HAL_FLASH_Unlock(); FLASH_EraseInitTypeDef erase; erase.TypeErase FLASH_TYPEERASE_PAGES; erase.PageAddress FLASH_SAVE_ADDR; erase.NbPages 1; uint32_t pageError; HAL_FLASHEx_Erase(erase, pageError); HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, FLASH_SAVE_ADDR, humidity); HAL_FLASH_Lock(); }5. 仿真验证与实物调试中的真实踩坑记录5.1 Proteus仿真能验证什么、不能验证什么我在打板之前先用Proteus做了仿真。Proteus里有DHT11的模型也有OLED和继电器模型可以验证基本的逻辑是否正确。但仿真有几个局限第一DHT11的时序在仿真里是理想化的实际硬件的时序偏差仿真体现不出来第二继电器的电流冲击仿真不了第三I2C总线的实际波形仿真看不到。所以我的建议是仿真用来验证代码逻辑和状态机是否正确硬件时序和电源问题必须实物调试。不要因为仿真跑通了就以为万事大吉。5.2 DHT11读取失败的三种典型情况和排查方法调试期间我遇到过三种DHT11读取失败的情况排查过程如下第一种读到的全是0。用示波器看数据线发现主机拉低之后DHT11根本没有响应。检查后发现是上拉电阻没焊数据线一直是低电平。补焊4.7K上拉电阻后解决。第二种偶尔读到校验和错误。这种情况通常是时序偏差导致的。我用逻辑分析仪抓了波形发现高电平持续时间在临界值附近波动。原因是DWT延时在中断干扰下不准确。解决办法是读取期间关中断并且把两次读取间隔从1秒增加到2秒。第三种刚开始正常运行几小时后读取失败。用手摸DHT11发现有点热怀疑是供电问题。测量VCC发现只有2.8V原来是AMS1117-3.3发热导致输出下降。在AMS1117上加了一个小散热片并把输入电压从5V降到4.5V用LM2596调问题解决。5.3 继电器吸合导致MCU复位的电源问题这是我最头疼的一个问题。每次继电器吸合MCU就复位OLED黑屏重启。一开始以为是继电器模块的光耦隔离没做好换了模块还是一样。后来用示波器看3.3V电源轨发现继电器吸合瞬间3.3V上有一个很大的负向尖峰。根本原因是继电器线圈和MCU共用同一个5V电源继电器吸合瞬间电流突变在电源线上产生感应电动势通过AMS1117耦合到3.3V。解决办法有三个第一继电器模块的VCC单独从12V经过一个独立的LM2596降压得到不和MCU共用第二在继电器模块的VCC和GND之间并联一个1000uF电解电容和一个0.1uF陶瓷电容第三在MCU的3.3V电源引脚旁边加一个10uF钽电容。三个措施一起上之后继电器吸合时3.3V纹波从原来的300mV降到了50mV以内MCU再也不复位了。5.4 半导体制冷片的散热与凝露处理半导体制冷片的热面散热非常关键。我一开始只加了一个小散热片没有风扇结果制冷片工作5分钟后热面温度超过80度冷面反而不冷了。后来换了一个大散热片加12V风扇热面温度稳定在45度左右冷面能到5度。凝露处理也很重要。冷面上凝结的水滴如果直接滴到电路板上会短路。我在冷面下方放了一个小接水盘并且把制冷片和电路板用塑料隔板隔开。另外衣柜本身不是完全密封的湿度降下来之后要记得关掉制冷片否则会过度除湿衣服变得太干。5.5 代码诊断与调试技巧调试STM32代码时我主要用三种手段第一用ST-Link Utility查看Flash内容确认参数是否正确写入第二用串口打印调试信息把DHT11的原始数据、状态机状态、继电器状态都打印出来第三用逻辑分析仪抓DHT11和I2C的波形。串口打印我建议用DMA方式不要用阻塞发送否则会影响时序。我用的波特率是115200每500ms打印一次状态信息量足够又不至于刷屏太快。另外Keil的Debug模式里可以实时查看变量值配合断点使用很方便。但要注意在Debug模式下DHT11的时序会被打断所以不要在全速运行DHT11读取的时候设断点。6. 开源资料说明与复现建议6.1 代码、原理图、仿真文件的组织方式开源包我按以下结构组织SmartWardrobe_OpenSource/ ├── Hardware/ │ ├── Schematic.pdf // 原理图 │ ├── PCB_Layout.pdf // PCB布局图 │ └── BOM.xlsx // 物料清单 ├── Firmware/ │ ├── SmartWardrobe.uvprojx // Keil工程 │ └── Source/ // 所有源码 ├── Simulation/ │ ├── Proteus/ // Proteus仿真文件 │ └── Screenshots/ // 仿真截图 ├── Docs/ │ ├── 调试记录.md │ └── 常见问题.md └── README.mdBOM表里我标注了每个元件的型号、封装、数量和参考购买渠道。半导体制冷片和散热片建议买成套的省得自己配。6.2 复现时的物料采购避坑采购时有几个坑要注意第一DHT11买带PCB板的模块版比裸传感器好焊接而且自带上拉电阻第二继电器模块买光耦隔离的不要买那种只有三极管驱动的第三12V电源适配器一定要选电流足够的我推荐12V 6A第四OLED买I2C接口的SPI接口的接线更多但速度更快看个人选择。半导体制冷片TEC1-12706有很多种有的标称6A但实际只有4A买的时候看评价。散热片要选面积足够大的至少40x40mm配合12V风扇。6.3 从仿真到实物的移植注意事项Proteus仿真里用的元件模型和实物可能有差异。比如仿真里的DHT11响应是即时的实物需要等待仿真里的继电器是理想开关实物有吸合时间和弹跳。移植时要把这些因素考虑进去在代码里加足够的延时和容错。另外仿真里的电源是理想的实物电源有纹波和压降。建议在实物调试时先用示波器看一遍所有电源轨确认纹波在可接受范围内再上电运行。6.4 后续可扩展的方向这个项目目前只做了基础的除湿控制后面还可以加不少东西。比如加一个ESP8266模块把温湿度数据上传到手机实现远程监控加一个RTC时钟模块记录每天的除湿时长加一个SD卡模块把历史数据存下来做趋势分析。如果要做OTA升级STM32F103C8T6的Flash只有64KB跑OTA会比较紧张建议换F103RCT6或者F407。不过对于这个项目来说OTA不是刚需用ST-Link烧录就足够了。我在实际使用中最大的体会是硬件项目里电源和时序永远是最容易出问题的地方代码逻辑反而很少出错。把电源做好、把时序调准项目就成功了一大半。另外不要迷信仿真实物调试才是检验真理的唯一标准。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

GSD Core v1.40.0 文档审计解读:Skill 面整合、namespace 两阶段路由与上下文窗口守卫 2026/9/25 2:29:54

GSD Core v1.40.0 文档审计解读:Skill 面整合、namespace 两阶段路由与上下文窗口守卫

【免费下载链接】gsd-core Git. Ship. Done - Core 项目地址: https://gitcode.com/gh_mirrors/ge/gsd-core 点击查看 免费下载 本文聚焦 GSD Core 仓库中 v1.40.0 文档审计 changeset 所记载的核心技术变更:86→59 的 skill 表面整合、六个 namespace …

阅读更多 →
jwt4cj RSA非对称签名教程:RS256/RS384/RS512公私钥JWT签发与验证详解 2026/9/25 2:29:54

jwt4cj RSA非对称签名教程:RS256/RS384/RS512公私钥JWT签发与验证详解

jwt4cj RSA非对称签名教程:RS256/RS384/RS512公私钥JWT签发与验证详解 【免费下载链接】jwt4cj 一个用于生成和验证JSON Web Token的库 项目地址: https://gitcode.com/Cangjie-TPC/jwt4cj jwt4cj 是一款基于 RFC 7519 标准的仓颉语言 JWT 库,支持…

阅读更多 →
Simple Live:一个 App 看 4 家直播,跨端弹幕与数据同步 2026/9/25 2:29:53

Simple Live:一个 App 看 4 家直播,跨端弹幕与数据同步

Simple Live:一个 App 看 4 家直播,跨端弹幕与数据同步 【免费下载链接】dart_simple_live 简简单单的看直播 项目地址: https://gitcode.com/GitHub_Trending/da/dart_simple_live Simple Live 是一个用 Flutter 写的跨平台直播聚合应用。哔哩哔…

阅读更多 →
html-anything 电子指南模板 digital-eguide 全解析:用双页跨页 HTML 生成创作者品牌的 Lead Magnet 2026/9/25 2:29:47

html-anything 电子指南模板 digital-eguide 全解析:用双页跨页 HTML 生成创作者品牌的 Lead Magnet

AI 应用人工智能AI AgentAI 写作媒体生成 【免费下载链接】html-anything ✨ The agentic HTML editor — your local AI agent writes the HTML, you ship it. 🚀 75 Skills 9 Surfaces (magazine deck poster XHS / tweet prototype data report Hyperfram…

阅读更多 →
计算 Stack Overflow 已接受答案率(Accepted Answer Rate):基于 BigQuery 公共数据集与 Knowledge Catalog 的社区健康指标实战指南 2026/9/25 2:29:47

计算 Stack Overflow 已接受答案率(Accepted Answer Rate):基于 BigQuery 公共数据集与 Knowledge Catalog 的社区健康指标实战指南

数据目录AI Agent人工智能知识管理示例工程 【免费下载链接】knowledge-catalog Google Cloud Knowledge Catalog Tools and Samples 项目地址: https://gitcode.com/gh_mirrors/kn/knowledge-catalog 点击查看 免费下载 已接受答案率(Accepted Answer …

阅读更多 →
fs-extra readJsonSync() 完全指南:同步读取 JSON 文件并解析为对象 2026/9/25 2:29:47

fs-extra readJsonSync() 完全指南:同步读取 JSON 文件并解析为对象

开发工具 【免费下载链接】node-fs-extra Node.js: extra methods for the fs object like copy(), remove(), mkdirs() 项目地址: https://gitcode.com/gh_mirrors/no/node-fs-extra 点击查看 免费下载 导读 readJsonSync() 是 fs-extra 提供的一个"读文件 …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉