ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

STM32智能除湿系统开源项目:从传感器到继电器的完整嵌入式实践

2026/8/21 2:18:29 拓冰建站 浏览量
STM32智能除湿系统开源项目:从传感器到继电器的完整嵌入式实践 这次我们来看一个基于 STM32 的智能除湿系统开源项目。对于电子爱好者、嵌入式开发者或需要解决特定环境湿度控制问题的工程师来说这是一个非常实用的参考设计。项目核心是使用 STM32 微控制器搭配温湿度传感器和继电器模块实现自动监测并控制除湿设备如除湿机、风扇的启停。最值得关注的是它已经将完整的源码和原理图文件开源这意味着你可以直接获取所有设计细节进行学习、修改或二次开发。这个项目的硬件门槛不高核心是常见的 STM32 微控制器如 STM32F103 系列配合 DHT11 或 DHT22 温湿度传感器以及一个继电器模块。软件上你需要一个 STM32 的开发环境比如 Keil MDK 或 STM32CubeIDE。本文会带你从零开始理解这个系统的设计思路获取并部署源码搭建硬件环境最终完成一个可以实际运行的智能除湿装置。无论你是想学习 STM32 的 ADC 采集、GPIO 控制、定时器应用还是想快速实现一个物联网湿度控制节点这个项目都提供了清晰的路径。1. 核心能力速览在深入细节之前我们先通过一个表格快速了解这个项目的核心规格和特点帮助你判断是否适合你的需求。能力项说明项目类型嵌入式系统 - 智能环境控制核心控制器STM32 系列微控制器常见为 STM32F103C8T6主要传感器DHT11 / DHT22 数字温湿度传感器执行机构继电器模块用于控制除湿机、风扇等220V设备核心功能实时监测环境湿度根据预设阈值自动控制继电器通断开发环境Keil MDK / STM32CubeIDE / PlatformIO通信接口预留 UART可用于连接 WiFi/蓝牙模块进行数据上报需二次开发开源内容完整 C 语言源码、原理图.SchDoc 或 .DSN 格式硬件成本较低主控传感器继电器模块通常在百元以内适合场景学习 STM32 外设编程、毕业设计、智能家居原型开发、仓库/地下室等场景的自动除湿2. 适用场景与使用边界这个开源项目主要面向几类用户嵌入式初学者希望通过一个完整的、有实际用途的项目来学习 STM32 的 GPIO、定时器、ADC如果使用模拟传感器和中断编程。电子爱好者/创客需要为家庭地下室、衣柜、摄影器材防潮箱或小型仓库制作一个成本低廉的自动除湿控制器。高校学生寻找毕业设计或课程设计的课题该项目结构清晰功能明确易于扩展如加入手机APP控制、数据记录。产品原型开发者作为智能除湿设备的前期功能验证原型。使用边界与注意事项非商用级产品该项目作为开源学习原型未经过严格的安规、EMC等测试。直接用于控制大功率电器如工业除湿机存在安全风险务必谨慎建议仅用于控制小功率设备或在完全理解电路安全的基础上进行强化设计。继电器负载能力注意继电器模块的触点容量如 10A 250V AC切勿超负荷使用控制大功率设备时建议增加交流接触器。传感器精度DHT11 精度相对一般湿度±5%RH温度±2℃对于要求高精度的场合如实验室可考虑更换为 SHT3x、AHT20 等更高精度的 I2C 传感器并相应修改代码。环境适应性设计时需考虑实际安装环境的防护如防尘、防潮开源原理图通常为开发板形式实际应用可能需要重新设计PCB并做封装处理。3. 环境准备与前置条件要复现或基于此项目进行开发你需要准备以下软硬件环境。硬件清单主控芯片STM32F103C8T6 核心板即“蓝色小板”或自制的 STM32 最小系统板。这是最常见的选择资源丰富且价格便宜。温湿度传感器DHT11 或 DHT22 模块。两者均为单总线数字接口DHT22 精度和量程更好。执行模块5V 或 3.3V 驱动的高电平触发继电器模块常开常闭接口。电源为整个系统供电。STM32核心板通常需要 5V 或 3.3V继电器模块可能需要 5V请根据模块规格统一供电。建议使用稳定的 5V/2A 电源适配器。负载设备用于测试的除湿设备如一个小风扇低压直流进行初步测试。连接220V交流设备务必注意安全下载调试器ST-Link V2 或 J-Link用于程序烧录和调试。杜邦线若干用于连接各模块。软件清单集成开发环境 (IDE)Keil MDK-ARM (uVision)传统且广泛使用的商业软件有代码大小限制。STM32CubeIDEST官方推出的免费IDE基于Eclipse集成STM32CubeMX图形化配置工具推荐新手使用。PlatformIO基于VS Code的跨平台物联网开发环境对开源库支持友好。STM32CubeMX如果你使用 STM32CubeIDE它已内置。如果使用 Keil可以单独安装此工具用于图形化配置引脚、时钟、外设并生成初始化代码。串口调试助手如 SecureCRT、Putty、MobaXterm 或 Arduino IDE 自带的串口监视器用于查看系统打印的温湿度数据和状态信息。原理图/PCB查看工具根据开源原理图格式可能需要Altium Designer、KiCad或立创EDA来查看和修改原理图。4. 安装部署与启动方式这里的“安装部署”指的是获取源码、配置工程、编译并烧录到硬件的过程。步骤一获取开源资料从开源平台如 GitHub、Gitee、论坛附件找到该项目下载压缩包。通常包含以下关键文件Project/Keil 或 STM32CubeIDE 工程目录。Src/和Inc/主要的C源文件和头文件。Hardware/或Schematic/原理图文件可能是 .pdf, .SchDoc, .DSN 等格式。README.md项目说明文档。步骤二使用 STM32CubeIDE 打开/创建工程推荐打开 STM32CubeIDE选择File - Import...。选择General - Existing Projects into Workspace点击Next。点击Browse...选择下载的源码包中的工程目录确保项目出现在列表中后点击Finish。如果项目是基于标准外设库StdPeriph Lib的旧工程CubeIDE 可能无法直接导入。此时更稳妥的方式是使用STM32CubeMX 重新生成打开 CubeMX选择与开源项目主控相同的型号如 STM32F103C8。根据开源原理图和源码main.c或gpio.c在 CubeMX 中图形化配置相同的引脚功能如 USART1 用于调试打印某个 GPIO 用于 DHT11 数据线另一个 GPIO 用于控制继电器。配置时钟树通常使用外部8MHz晶振PLL倍频到72MHz。在Project Manager标签页设置工程名称、路径选择 IDE 为STM32CubeIDE。点击GENERATE CODE生成新工程。将开源代码中核心的业务逻辑如DHT11_Read_Data()函数、主循环中的控制逻辑复制到新工程对应的main.c或用户文件中。步骤三编译与烧录在 IDE 中点击编译按钮通常是锤子图标确保0 Error(s), 0 Warning(s)。使用 ST-Link 连接开发板的SWDIO和SWCLK引脚并连接3.3V和GND。在 IDE 中配置调试器为ST-LINK (OpenOCD)点击调试或烧录按钮通常是虫子或闪电图标。程序烧录成功后复位或重新上电启动系统。5. 功能测试与效果验证系统上电后我们需要验证其核心功能是否正常工作。5.1 传感器数据读取测试测试目的确认 DHT11 传感器能正确读取环境温湿度。操作步骤将 DHT11 的数据引脚连接到 STM32 的某个 GPIO如 PA1并接好 VCC 和 GND。在代码中确保已正确初始化该 GPIO 为推挽输出/开漏输入并实现了单总线通信时序。在main函数的循环中调用读取函数并通过串口打印数据。// 示例代码片段 float temperature, humidity; if(DHT11_Read_TempHum(temperature, humidity) SUCCESS) { printf(Temp: %.1f C, Humi: %.1f%%\r\n, temperature, humidity); } else { printf(DHT11 Read Error!\r\n); } HAL_Delay(2000); // 每2秒读取一次DHT11需注意读取间隔预期结果打开串口调试助手设置正确的波特率如 115200能看到周期性的、合理的温湿度数据输出。判断成功数据稳定输出且用手握住传感器或对其哈气湿度值应有明显上升。常见失败原因接线错误、GPIO模式配置不对、单总线时序不精确需微调延时、传感器损坏、供电不足。5.2 继电器控制逻辑测试测试目的确认系统能根据湿度阈值自动控制继电器开关。操作步骤将继电器的控制引脚IN连接到 STM32 的另一个 GPIO如 PA2继电器模块的 VCC 和 GND 接系统电源。在代码中定义湿度阈值例如湿度高于 65%RH 开启除湿低于 55%RH 关闭。在主循环中添加控制逻辑。// 示例控制逻辑 #define HUMIDITY_HIGH_THRESHOLD 65.0 #define HUMIDITY_LOW_THRESHOLD 55.0 if (humidity HUMIDITY_HIGH_THRESHOLD) { HAL_GPIO_WritePin(RELAY_GPIO_Port, RELAY_Pin, GPIO_PIN_SET); // 置高电平触发继电器吸合 printf(Humidity HIGH, Relay ON.\r\n); } else if (humidity HUMIDITY_LOW_THRESHOLD) { HAL_GPIO_WritePin(RELAY_GPIO_Port, RELAY_Pin, GPIO_PIN_RESET); // 置低电平继电器断开 printf(Humidity LOW, Relay OFF.\r\n); } // 湿度在两者之间时保持原状态在继电器输出端接一个 LED 灯串联电阻进行安全测试代替真实的除湿设备。预期结果当串口打印的湿度值超过 65% 时继电器应吸合可听到“咔哒”声LED 点亮当湿度低于 55% 时继电器断开LED 熄灭。判断成功继电器动作与湿度变化逻辑一致且动作稳定无频繁抖动。常见失败原因继电器触发电平选择错误高/低电平触发、GPIO 驱动能力不足、阈值设置不合理导致震荡开关。5.3 系统稳定性与抗干扰测试测试目的验证系统在长时间运行和轻微干扰下的稳定性。操作步骤让系统连续运行数小时。观察串口数据是否持续稳定输出有无死机、数据跳变异常。轻微触碰或移动连接线观察系统是否会复位或数据异常。预期结果系统运行平稳数据输出连贯不受轻微物理干扰影响。判断成功长时间运行无故障逻辑控制稳定。常见失败原因电源纹波过大、程序中有死循环或阻塞、未正确处理看门狗、接线虚焊。6. 接口扩展与二次开发思路基础功能跑通后你可以考虑扩展更多功能使其更“智能”。6.1 添加通信模块WiFi/蓝牙目标实现手机 APP 或云端远程监控和控制。实现方式硬件添加 ESP-01SWiFi或 HC-05蓝牙模块连接到 STM32 的另一个串口USART2。软件编写串口通信协议用于接收指令和发送数据。对于 WiFi 模块通常需要 AT 指令集进行配置和网络通信。你可以让 STM32 发送 AT 指令使模块连接路由器并作为 TCP Client 连接到服务器或启用 UDP 通信。在手机端开发一个简单的 APP可使用 App Inventor 或 Flutter 等快速开发工具或使用网络调试助手进行测试。// 示例通过串口2发送温湿度数据到WiFi模块 void Send_Data_To_Server(float temp, float humi) { char buffer[64]; sprintf(buffer, ATCIPSEND%d\r\n, strlen(buffer)); // 假设已建立TCP连接 HAL_UART_Transmit(huart2, (uint8_t*)buffer, strlen(buffer), 1000); sprintf(buffer, {\temp\:%.1f,\humi\:%.1f}\r\n, temp, humi); HAL_UART_Transmit(huart2, (uint8_t*)buffer, strlen(buffer), 1000); }6.2 增加本地显示OLED/LCD目标本地实时显示温湿度和系统状态。实现方式硬件连接一个 I2C 或 SPI 接口的 OLED 屏幕如 0.96寸 SSD1306。软件集成 OLED 驱动库如ssd1306.h在读取传感器数据后调用显示函数刷新屏幕内容。6.3 实现数据存储与历史查询目标记录温湿度历史数据便于分析。实现方式硬件为 STM32F103C8T6 外接一个 SPI Flash如 W25Q64或 I2C EEPROM如 AT24Cxx。软件设计一个简单的存储结构体定时如每10分钟将时间戳和温湿度数据存入外部存储器。可以通过按键或串口命令触发历史数据读取和上传。7. 资源占用与性能观察对于 STM32F103C8T6 这类资源有限的单片机了解资源占用情况很重要。Flash 占用基础功能GPIO、串口、DHT11驱动、主逻辑编译后代码量通常在 20-40KB 之间远小于该芯片的 64KB Flash留有充足空间用于扩展功能。RAM 占用全局变量和栈空间占用很小主要取决于你分配的缓冲区大小如串口接收缓冲区、显示缓冲区。通常几KB足够。CPU 利用率主循环中主要的耗时操作是 DHT11 的读取需要毫秒级延时和串口打印。在合理的延时和打印频率下如每秒一次CPU 负载极低大部分时间处于空闲状态为后续添加复杂任务如网络协议解析留有余地。功耗系统功耗主要由外设决定。STM32 本身在运行模式约几十毫安。继电器在吸合时线圈会消耗电流约70mA待机时仅单片机和小电流传感器工作整体功耗较低适合电池供电场景需优化睡眠模式。性能优化建议若非必要减少串口打印频率或使用条件编译关闭调试信息。使用中断方式处理串口数据避免轮询等待。考虑使用低功耗模式在两次传感器读取间隔让 MCU 进入 Sleep 或 Stop 模式。8. 常见问题与排查方法在开发过程中你可能会遇到以下问题。这里提供一个排查指南。问题现象可能原因排查方式解决方案程序无法烧录1. ST-Link 连接错误或驱动未安装。2. 芯片型号选择错误。3. 芯片处于写保护状态。1. 检查 SWD 四根线是否接对GND, SWCLK, SWDIO, 3.3V。2. 在 IDE 中确认 Device 型号。3. 使用 ST-Link Utility 连接芯片。1. 重新接线安装 ST-Link 驱动。2. 更正为正确的芯片型号。3. 使用 ST-Link Utility 进行全片擦除Mass Erase解除保护。串口无数据输出1. 串口引脚配置错误TX/RX 接反。2. 波特率、停止位等参数不匹配。3. 代码中未初始化串口或重定向printf。1. 检查原理图确认 USART 的 TX 接调试器的 RX。2. 核对代码中huart1.Init的配置与调试助手设置。3. 检查是否包含了stdio.h并重写了_write或fputc函数。1. 交换 TX/RX 接线。2. 统一设置为常用波特率如 115200-8-N-1。3. 确保串口初始化成功并正确实现重定向。DHT11 读取失败1. 接线错误数据线、VCC、GND。2. 时序不准确特别是起始信号和等待响应。3. 传感器损坏。4. 供电不足VCC 跌落。1. 用万用表测量传感器 VCC 电压应为 3.3V或5V。2. 用逻辑分析仪或示波器抓取单总线波形对比 DHT11 时序图。3. 更换传感器测试。4. 检查电源带载能力可在传感器 VCC 对 GND 加一个 0.1uF 电容。1. 确保接线正确牢固。2. 根据 MCU 主频精确调整延时函数使用HAL_Delay或 SysTick。3. 更换传感器。4. 加强电源滤波或使用独立电源为传感器供电。继电器不动作或误动作1. 控制引脚电平与继电器触发方式不匹配。2. GPIO 配置为输入模式而非输出。3. 继电器模块供电不足。4. 负载过大或短路。1. 查阅继电器模块手册确认是高电平触发还是低电平触发。2. 检查代码中 GPIO 的初始化代码。3. 测量继电器模块 VCC 电压。4. 断开负载测试继电器空载时是否正常动作。1. 根据触发方式修改代码输出电平逻辑。2. 将 GPIO 初始化为推挽输出模式。3. 确保电源能提供足够电流100mA。4. 检查负载线路确保未短路负载功率在继电器额定范围内。系统运行一段时间后死机1. 看门狗未喂狗导致复位。2. 堆栈溢出。3. 中断服务程序处理时间过长或未清除标志。4. 电源不稳定。1. 检查是否使能了看门狗IWDG/WWDG。2. 在启动文件startup_stm32f103xe.s中适当增大堆栈大小。3. 检查中断优先级和中断服务函数。4. 用示波器观察电源电压纹波。1. 若未使用看门狗则禁用它。若使用则定期喂狗。2. 增加堆栈大小优化大数组和递归调用。3. 确保中断函数简洁及时清除中断标志。4. 使用 LDO 或增加电源滤波电容。9. 最佳实践与使用建议为了让你的项目更健壮、更安全这里有一些建议从低压负载开始测试绝对不要一开始就用继电器控制220V的除湿机先用一个5V或12V的小风扇、LED灯作为负载验证整个控制逻辑完全正确无误。电源隔离与保护控制强电部分继电器输出端和弱电部分STM32最好使用光耦或继电器进行电气隔离。在继电器线圈两端反向并联一个续流二极管如 1N4148以吸收关断时的感应电动势保护 MCU 的 GPIO。软件消抖与状态保持在读取传感器数据和判断阈值时可以加入简单的软件滤波如连续3次读数超过阈值才动作防止因数据抖动导致的继电器频繁开关延长继电器寿命。参数可配置化将湿度阈值、传感器读取间隔等参数定义为宏或存储在 EEPROM/Flash 中便于通过串口命令修改而无需重新编译程序。完善的调试信息在开发阶段利用串口打印丰富的状态信息如传感器原始数据、控制决策、错误码这是最有效的调试手段。项目成熟后可以通过宏定义关闭调试信息以减少代码大小和功耗。代码版本管理即使是个人项目也建议使用 Git 进行版本管理。每次实现一个稳定功能后就提交一次便于回溯和代码管理。安全第一制作外壳避免裸露的强电部分。在继电器控制的大功率设备回路中加入保险丝。如果对强电不熟悉请务必在有经验的人员指导下操作。10. 总结与下一步这个 STM32 智能除湿系统开源项目提供了一个从硬件到软件的完整闭环示例是学习嵌入式开发和控制逻辑的绝佳练手项目。它的价值不仅在于实现了除湿功能更在于清晰地展示了如何将传感器、控制器和执行器有机结合并提供了所有可审计的源码和原理图。最值得尝试的点在于其“即获即用”的特性。你不需要从零开始设计电路和编写驱动可以直接在现有框架上验证想法、学习代码、并快速进行功能扩展。最先应该验证的功能就是“传感器读数”和“继电器控制”这两个基本单元。只要这两个单元工作正常整个系统的骨架就搭建起来了。最容易踩的坑通常是“时序”和“电源”。DHT11 的单总线时序对延时非常敏感不同主频的 MCU 需要调整。而继电器动作瞬间的电流冲击可能导致电源电压跌落引起 MCU 复位务必确保电源有足够的余量和良好的滤波。后续扩展方向有很多你可以尝试将其升级为一个真正的物联网节点添加 ESP8266 实现微信小程序控制接入 BME280 传感器获取更精确的气压和温度数据增加 LCD 屏幕做本地显示甚至设计一个四层板 PCB集成所有元件打造一个更紧凑、专业的产品原型。建议将源码和原理图下载到本地结合本文的步骤亲手搭建并调试一遍。这个过程本身就是嵌入式开发能力提升最快的方式。