
衣柜里的味道总是来得莫名其妙。我住的城市一到梅雨季衣柜背板能直接摸出水珠真丝衬衫放一周再拿出来领口就长了一圈黑斑。试过各种吸湿袋换得勤不说吸满水之后反而成了细菌培养皿。后来查资料才知道衣柜内部湿度超过60%RH霉菌就开始活跃超过70%RH基本上就是给真菌开了无限畅饮通道。吸湿袋那种被动方式在小空间里确实能降一点湿度但效果不可控湿度反弹也快。所以干脆自己做了一套STM32智能除湿衣柜控制系统现在把代码、原理图、仿真文件都开源出来。整套系统的思路很简单用DHT11采集衣柜内的实时温湿度单片机判断湿度是否超标超标就启动半导体制冷片除湿模块同时OLED屏显示当前状态按键可以自己设定目标湿度。这篇文章把完整的硬件选型、原理图设计、软件架构、仿真验证以及实物调试的坑都记录下来适合想在STM32上做真实小项目的朋友也适合家里衣柜、鞋柜、书柜一样饱受潮湿困扰的人。我尽量把每个选择背后的原因写清楚不是只给一份“照着抄”的作业而是让你做完之后真的明白这套系统为什么这么搭。1. 衣柜霉味的根源湿度阈值和传统吸湿方案的边界1.1 衣柜内的湿度到底有多夸张南方回南天的时候衣柜内部湿度冲到85%RH以上是常事。你可以自己做个实验衣柜门关着里面挂一个湿度计外面客厅放一个湿度计关窗开抽湿机一小时外面的湿度可能降到50%衣柜里可能还在75%徘徊。因为衣柜的通风条件差水汽一旦进去就很容易郁积在衣物纤维里。衣物本身的纤维结构非常容易吸水棉织物回潮率在8%左右羊毛能到15%化纤好一些但也有3%上下。衣柜里的水汽来源不只空气衣服从外面晾晒收进来时残留的潮气、人体皮屑和油脂里的水分、以及墙体渗透的潮气都会在密闭空间里不断累积。更麻烦的是衣柜内外的温差会造成局部结露尤其在柜子靠外墙那一侧水珠直接沿着木板往下流。这种情况下霉菌和尘螨的繁殖条件非常充分。霉菌对湿度的适应范围很广但有一个公认的临界点环境相对湿度持续超过60%RH霉菌孢子的萌发速度会指数上升。尘螨也是在55%RH以上才活跃超过75%RH简直是大爆发。衣柜里那些“白毛”和“黑点”本质上就是霉菌菌落在纤维表面的代谢产物。1.2 除湿袋、除湿机为何不够用市面上最常见的氯化钙除湿袋一包大概能吸300~500毫升水。猛一听好像挺能吸但你算一下就明白了一个0.8立方米的衣柜在75%RH环境下空气中的水蒸气质量大概有45克。衣服从外面带进去的潮气、墙体渗透进来的水分远远超过空气中的这部分。所以一包除湿袋看着沉甸甸的其实也就撑一两周而且它吸湿的过程完全不受控——衣柜里湿度已经降到50%了它还在继续吸不节能也不聪明。除湿机倒是效果猛但体型摆在那里塞进衣柜既不现实也不安全。衣柜里空间本来就紧凑压缩机式除湿机需要散热空间而且水箱要定期倒运转噪音也大。很多人舍不得在衣柜里长期放一台除湿机于是衣柜长期处于“无人看管”状态。还有一种方案是衣物烘干后马上入柜但这不是做系统只是把问题往后推。真正的问题在于衣柜除湿需要的是持续的、自动的、按需工作的微量除湿而不是一次性放一袋吸湿剂或者整台大机器。把“湿度高了才启动湿度到了就停止”这个逻辑交给MCU来做才叫控制。这就是我做这套系统的核心动机——用低成本嵌入式方案把衣柜内部的湿度管起来。1.3 为什么是STM32控制的“主动除湿衣柜”选STM32做控制器理由很现实资料多、可复现性强、外设丰富。F103C8T6这颗芯片定时器、ADC、I2C、USART全都齐了跑除湿控制这种轻量任务绰绰有余。更重要的是我开源出来之后别人拿到代码和原理图能直接在Keil里编译下载不用改引脚就能复现这种“可复现性”对开源项目来说比性能更关键。在控制架构上主动除湿和被动吸湿是本质区别。被动方案靠干燥剂和空气的自然流动效果取决于材料和摆放位置。主动方案则是一个传感器加一个执行器的闭环DHT11实时检测湿度STM32通过中断或定时采集计算出当前湿度是否超过启动阈值再通过继电器控制制冷片和风扇。湿度降到目标区间之后系统自动停机进入低功耗待机。整个过程不用人管也不会出现“衣柜已经够干了还在拼命除湿”的情况。这套系统的外围也没有堆什么复杂器件一颗LED、一个蜂鸣器、两个按键、一块OLED屏成本很低逻辑却很完整。从学习嵌入式控制系统的角度看它涵盖了传感器驱动、执行机构选型、迟滞控制、人机交互、仿真验证和电磁兼容处理几乎把一个小型IoT设备该遇到的基本问题都碰了一遍。2. 硬件与原理图从BOM表到一张可靠图纸2.1 器件选型低成本但可复现的BOM清单做开源项目最忌讳的是选一堆冷门芯片别人想抄作业都买不到货。我全部选了淘宝几块钱就能买到的常规件主控、传感器、电源模块、执行机构拆开算整套物料成本不超过50元。下表是实际用到的器件清单模块型号/规格数量单价参考作用主控STM32F103C8T6最小系统板1约8元核心逻辑与湿度判断温湿度传感器DHT111约3元采集温湿度显示0.96寸OLED SSD1306 I2C接口1约9元显示湿度/温度/工作状态除湿执行器TEC1-12706半导体制冷片1约13元冷凝除湿核心散热风扇5V/12V 4010风扇2约2元/个冷端对流、热端散热继电器驱动1路低电平触发继电器模块1约3元控制制冷片12V通断电源AMS1117-3.3稳压模块1约2元给MCU/传感器/OLED供电人机交互轻触按键、蜂鸣器31约3元设置目标湿度、报警提示F103C8T6的Flash是64KBRAM是20KBDHT11和OLED的驱动加起来占用不超过4KB资源运行内存占用不到2KB所以完全不用担心空间不够。有人说用STM32控制一个衣柜除湿是“杀鸡用牛刀”但你换个角度看正因为芯片资源富余才能在代码里加入完整的调试信息、状态机、迟滞算法和防误动逻辑即使以后加一个ESP8266做手机App联动F103也还扛得住。2.2 DHT11传感器的电路接法和精度边界DHT11的电路非常简单本质是一颗单总线温湿度传感器数据引脚需要外接一颗4.7kΩ上拉电阻到3.3V。这个电阻不能省略因为DHT11空闲时数据线是高电平当它拉低数据线表示应答信号的时候需要上拉电阻保证电平转换速度快且稳定。接法上DHT11的VCC接3.3V有些版本支持5V但建议统一用3.3V避免逻辑电平和MCU不匹配GND接GNDDATA接STM32的任意GPIO。我用的是PA1因为PA1附近有充足的3.3V和GND引脚布线短信号不容易被干扰。数据线的PCB走线要尽量避开继电器模块和制冷片的驱动线这两部分有较强电磁干扰DHT11的时序信号对上升沿和下降沿比较敏感。DHT11的精度是±2℃和±5%RH分辨率只有1%RH。这个精度在很多项目里被嫌弃但在衣柜除湿场景下完全够用。你需要的不是把湿度精确控制到±1%RH而是判断“湿度是不是超过了60%”以及“有没有回到安全区间”。5%RH的误差对一个阈值区间有迟滞的控制系统影响不大。如果以后要升级可以直接把DHT11换成DHT21AM2301或SHT30虽然价格贵一些但精度更高而且代码里只要改一个头文件里的数据解析函数就能兼容。2.3 执行机构选择半导体制冷片 vs PTC加热衣柜除湿主要有两条技术路线半导体制冷片冷凝除湿和PTC加热加排风。我做之前对比了很久两个方案各有各的适用场景。半导体制冷片TEC1-12706利用的是珀尔帖效应——给它通直流电一片会变冷另一片会变热。冷端温度可以比环境低十几到二十摄氏度空气中的水蒸气经过冷端时凝结成水珠顺着导冷片滴落到集水槽热端需要加散热片和风扇把热量排出去。这个方案的优点是工作的时候衣柜内温度基本不变不会把夏天衣柜变成烤炉适合放贵重衣物。缺点是制冷片的能效比不算高TEC1-12706额定12V、最大电流6A实际工作电流我控制在4A左右功耗约48W制热端的散热风扇需要一直转。PTC加热加排风的方案则是把衣柜内空气加热让衣物里的水分加速蒸发再用风扇把湿气吹出衣柜外。这个方案简单粗暴、除湿速度快但问题也很明显衣柜内温度会升高冬天还好夏天关上柜门半个小时就能到40℃对羊毛羊绒非常不友好而且这个方案只能在衣柜有通风口或者门缝较大的情况下有效不然湿气排不出去只是把衣服“烘”一遍。我最终选了半导体制冷片方案。对于衣柜这种容积不大、相对密闭的场合冷凝除湿更温和也更适合长期运行。下表是两个方案的对比项目半导体制冷片冷凝除湿PTC加热排风衣柜内温升几乎无温升明显升温除湿速度中等但持续较快对贵重衣物友好度高低功耗约50W约100W以上结构复杂度需要集水、散热简单适合季节全年至少要有通风条件2.4 原理图设计要点最小系统、电源树和继电器隔离原理图我用嘉立创EDA画的画的时候有几个地方花了不少心思。首先是STM32最小系统。F103C8T6的VDD和VSS引脚全部都要接3.3V和GND每个VDD引脚旁边放一颗100nF去耦电容这颗电容要尽量靠近芯片脚离远了去耦效果会大打折扣。8MHz晶振配上两颗20pF负载电容电容另一端接到GND。NRST复位脚接10kΩ上拉电阻和一颗100nF电容到GND。BOOT0我加了一个10kΩ下拉电阻让它默认从Flash启动方便直接用串口下载BOOT1引脚不影响串口下载可以悬空也可以加下拉。其次是电源树规划。整个系统有三路电源USB的5V输入通过AMS1117转成3.3V给MCU、OLED、DHT11供电12V开关电源单独给半导体制冷片供电12V再经过一个LM7805或者直接用5V电源适配器给风扇供电。需要特别提醒的是12V电源的GND一定要和5V电源的GND连在一起否则MCU输出高电平控制继电器时继电器模块和MCU之间的电平参考地不一致会出现开关不动作甚至损坏管脚的怪问题。如果你买的是成品继电器模块模块上通常自带三极管驱动、光耦隔离和续流二极管直接用PA0输出低电平触发是最稳的。最后是隔离处理。继电器虽然带了光耦隔离但半导体制冷片本身是一个大功率感性/阻性复合负载关断瞬间会产生反向电动势。原理图里我在制冷片的电源两端并联了一个SS34肖特基二极管做续流保护方向是二极管的阴极接电源正极、阳极接电源负极这样反向尖峰会被二极管吸收掉不会打到继电器触点和MCU的电源轨。这一步如果省掉调试时大概率会遇到“单片机偶尔重启”的怪问题。3. 代码实现一套不靠“玄学”的软件架构3.1 软件总体框架主循环与定时任务很多初学者拿到这类项目第一反应就是把所有代码都塞进while(1)里读一下DHT11判断一下湿度控制一下继电器刷新一下OLED然后再循环。这样做逻辑上确实能跑但实际用起来会发现一个很烦人的问题DHT11的单总线读取是阻塞式的一次完整读取过程大概要10ms到20ms如果OLED刷新再慢一点整个循环周期可能超过100ms按键按下去要等好几拍才有反应。我的代码结构把任务按优先级拆开主循环负责按键扫描和显示刷新SysTick中断里做1ms时基独立于主循环之外。DHT11的采集放在一个定时器触发的任务里30秒采一次采完把结果放到一个全局结构体里主循环只读取这个结构体不做任何阻塞操作。继电器控制同样由主循环根据结构体里的湿度值计算计算完成立即动作不让采集过程拖累控制响应。硬件抽象层面我建了三个模块dht11.c负责单总线时序和数据校验device.c负责继电器、蜂鸣器和LED操作display.c负责OLED绘制。main函数里只做初始化然后进入一个带状态机的循环代码可读性比“一把梭”强得多后续想加WiFi模块或者加一个自动学习算法也只要在状态机里加状态就行。3.2 DHT11驱动代码单总线时序和校验DHT11的单总线通信比较别扭它不像SPI和I2C有标准库函数完全靠GPIO翻转位来模拟时序。基本流程分四步MCU拉低数据线至少18ms作为起始信号释放总线等待DHT11响应DHT11拉低80μs再拉高80μs表示应答然后连续输出40位数据前16位是湿度中间16位是温度最后8位是校验和。每一个bit的0和1靠高电平持续时间区分高电平26μs到28μs左右是0高电平70μs左右是1。驱动里最需要注意的是微秒级延时。在STM32F103上简单一点可以用SysTick做微秒延时但注意DHT11时序要求比较高最好临时关掉其他中断避免中断处理函数打断了50μs级别的时序窗口。我实际用的是空循环校准将SystemCoreClock设为72MHz一个简单的for循环延时约1μs。虽然看起来不优雅但只要经过实测校准就能稳定工作。驱动骨架如下uint8_t dht11_read_raw(uint8_t* data) { uint8_t bits[40] {0}; // 起始信号 dht11_gpio_set_output_low(); delay_ms(20); dht11_gpio_set_input(); delay_us(30); // 等待应答 if (dht11_wait_low(100) 0) return 1; // 等DHT11拉低 dht11_wait_high(100); // 等拉高 // 读取40bit for (int i 0; i 40; i) { dht11_wait_low(100); uint32_t t dht11_wait_high(100); // 统计高电平时间 bits[i] (t 50) ? 1 : 0; } // 组字节 for (int i 0; i 5; i) data[i] (bits[i*8]7) | (bits[i*81]6) | ... ; if (data[4] ! (data[0]data[1]data[2]data[3]) 0xFF) return 2; return 0; }读取完之后必须做两件事一是校验和验证如果校验失败直接丢弃这次数据用上一次读到的值继续控制不要让显示和控制“跳变”二是对多次采样做滤波程序里连续采集5次去掉最大最小取中间三次的平均值。DHT11原本的重复测量最小间隔是1s我实际用30s采样一次足够衣柜这种惯性很大的控制对象用。3.3 除湿控制策略迟滞控制避免继电器抖如果代码只写一句“湿度超过60就开低于60就关”系统工作起来会非常难受。原因很简单DHT11读数本身有±5%RH的误差再加上衣柜内空气流动不均湿度值会在一两个百分点之间跳动。如果阈值就卡在60%RH继电器会像抽风一样反复吸合释放制冷片频繁启停用不了多久触点就烧黑、寿命大减。处理这个问题最经典的办法是引入迟滞区间。我把“目标湿度”设计为50%RH可调控制逻辑是当前湿度大于等于55%RH时启动除湿只有在湿度降到小于等于45%RH时才停止。这样启动和停止之间隔了10个百分点即使传感器读数一直在抖继电器也只会在一段较长的时间里切换一次不会来回跳动。稍加一点时间上的防误动逻辑比如“湿度超过55%RH且持续2分钟”才触发启动效果会更好避免单次瞬时波动造成误启动。控制代码非常直白核心就一个函数void device_control_update(float humidity, float target) { float start_val target 5.0f; // 启动阈值 float stop_val target - 5.0f; // 停止阈值 if (!relay_on humidity start_val) { relay_on 1; relay_ctrl(1); buzzer_beep(1); lcd_show_status(DEHUMIDIFYING); } else if (relay_on humidity stop_val) { relay_on 0; relay_ctrl(0); lcd_show_status(STANDBY); } }这套逻辑同样适用于完全不同的行业场景比如温室大棚、配电柜、仓库环境监控。你换一个更大的执行器把传感器换成FS300等控制策略不需要改。这也是我想在开源文件里强调的一点核心思路比具体代码值钱。3.4 显示与按键交互逻辑和体验OLED屏我用的是0.96寸128x64I2C接口接PB6SCL和PB7SDA。这套驱动代码是目前嵌入式圈子里最成熟的u8g2库精简版画两个大数字显示湿度、一个小字显示温度、一个状态图标显示“运行/待机”信息层级很清楚。很多人在OLED上恨不得把所有信息都堆上去结果字又小又挤晚上看一眼都觉得累。其实衣柜除湿系统的日常可读信息只有三个当前湿度、目标湿度、是否在除湿。其他信息放到调试串口里就可以了。按键部分用了两个按键一个模式键一个加减键。短按模式键可以在“标准除湿50%RH/ 干燥除湿40%RH/ 节能除湿60%RH”三档之间循环切换长按模式键进入高级设置这时候加减键可以以1%步进调整目标湿度从30%到70%可调。长按时间超过800ms会掉入设置状态屏幕角落会有个“SET”小字提示设置完5秒没有按键操作自动保存退出。按键扫描放在主循环里每轮循环扫描一次用按键状态机做消抖同时支持短按和长按。这段逻辑不复杂不过有限状态机一旦写好以后加一个“童锁键”也就是多画两个状态的事情。4. 仿真验证不焊板也能把逻辑跑通4.1 Proteus仿真流程与DHT11的模拟问题硬件焊接前最好先做一轮仿真验证尤其是控制逻辑部分。Proteus里可以搭建STM32F103的最小电路然后加载Keil编译出来的HEX文件。如果你没有下载器这是最廉价的验证方式。我的仿真却是这么处理的由于Proteus自带的DHT11模型时序细节和真实传感器有一定差异直接连上去很容易在延时环节出问题读回来的数据全是0。刚开始我也卡在这里后来换成用Proteus的“虚拟终端”配合定时器去模拟DHT11的输出。简单说就是用虚拟终端周期性发一串符合DHT11格式的能量造数据把这串数据接到单片机的PA1引脚上让真实的DHT11驱动代码去接收并解析。这样虽然绕了一点但能够真实检验代码里的时序逻辑而不是被模型带偏。除了DHT11OLED在Proteus里也是重灾区仿真速度经常慢得像幻灯片。我的建议是仿真阶段先干掉OLED驱动或者把它注释成“只更新一个全局变量”然后把关键状态通过串口发到虚拟终端。看完串口日志判断控制逻辑正确了再把OLED还原到实物上去调。仿真的目的不是复刻全部用户体验而是先把“异常逻辑”排掉。4.2 更贴近实际代码的Wokwi在线仿真Proteus还有一个比较麻烦的门槛需要自己找元件库而且Proteus里对STM32这种功能丰富的芯片支持并不算好。后来我换了一条路线用Wokwi在线仿真平台。Wokwi原本以Arduino仿真出名现在也支持STM32F103C8T6界面非常干净直接在网页上添加一个DHT11和LED/OLED就能跑。Wokwi的优势在于它不像Proteus那样需要另外搭建虚拟终端来模拟传感器它原生支持DHT11模型、OLED屏幕模型可以直接连STM32的引脚。代码也是真实编译运行的底层寄存器操作和中断都能跑。我在Wokwi里搭了一套除湿逻辑的仿真STM32连接DHT11、OLED、一个LED代表继电器然后把湿度阈值设为50%启动阈值55%人为让DHT11模型输出从45%缓慢增加到65%观察LED是不是在55%边界点亮、在45%边界熄灭。这样把迟滞逻辑的真实效果看得非常直观。Wokwi没法模拟半导体制冷片的制冷过程但它帮我确认了控制策略和传感器驱动逻辑的正确性这就足够了。调完逻辑之后回到物理焊接剩下的主要是电源和负载的实战问题。这里还想提一个仿真的边界仿真环境里没有电源纹波、没有继电器开关带来的电磁干扰、也没有传感器因为位置不同带来的数值差异。所以仿真通过只是第一关硬件联调是更关键的一关。我见过不少人在仿真里跑得很顺实物一上电就崩溃因为仿真不会告诉你“继电器关断瞬间MCU复位了”这种事。仿真能减少的是那些纯逻辑错误和接线错误带来的无效返工。4.3 仿真的通过标准到底调到什么样算能打板仿真调到什么程度才算合格我自己有一份验收标准每次做开源项目都要过一遍第一控制状态翻转正确。无论传感器读到任何合法范围内湿度值继电器的开和关状态始终符合迟滞控制表不会出现启动阈值和停止阈值重叠时导致快速切换的情况。第二校验失败能平稳降级。人为让DHT11校验失败确认程序不会死机会沿用上一次的合法数值并给出警告。第三按键响应符合预期。短按切换档位、长按进入设置、加减调节、超时自动保存这四类操作都不能有误触。第四整套逻辑连续运行1000次循环无复位。在Proteus或者Wokwi里用脚本模拟长时间运行如果在仿真阶段都能出现意外复位那实物只会更糟这种问题必须提前排掉。这四条都过了我才会确信硬件调试时遇到的主要问题会集中在电源和电磁干扰上而不是代码逻辑。省下来的调试时间远比仿真花的时间多这也是我一直推荐先仿真再打板的原因。5. 实物调试与结果三个问题一次讲透5.1 继电器关断导致STM32复位的处理实物上电调试的第一个大坑就是继电器关断的时候单片机复位。现象非常典型系统运行正常湿度一到启动阈值继电器吸合制冷片开始工作一切正常但湿度降到停止阈值继电器释放的那一瞬间OLED闪了一下蜂鸣器响了一下然后系统重新启动。用逻辑分析仪看继电器释放瞬间VCC上有超过600mV的尖峰持续时间很短但足够让STM32的电源监测电路误判为掉电。问题根源还是关闭瞬间反电动势。虽然成品继电器模块上有续流二极管但半导体制冷片本身在断电时电感储能释放更猛烈加上12V和3.3V电源之间没有做好去耦尖峰直接传导到了MCU侧。解决做了两件事一是在制冷片电源两端并联SS34续流二极管并尽量靠近制冷片引脚二是在MCU的3.3V电源入口增加100μF电解电容和100nF陶瓷电容组合吸收高频尖峰。电容不是越大越好电解电容负责低频储能陶瓷电容负责高频旁路两个配合起来效果才正。改装之后连续开关继电器上百次单片机一次都没再复位过。5.2 DHT11位置带来的数据失真与修正第二个问题更隐蔽传感器位置不对导致数据失真。起初我把DHT11放在衣柜顶部靠近制冷片的位置想着这里空气循环快能最快反映湿度变化。结果发现系统经常提前停机——制冷片冷端吹出的风非常干燥局部湿度可能只有35%但衣柜下层还是湿的。DHT11采样到的是局部干燥空气控制逻辑以为“除湿完成”实际衣柜里远没达到目标。这个问题的本质是采样点没有代表衣柜中部的主体湿度。解决方式是把传感器放到衣柜中部层板后方避开冷端出风口同时数据线用一个插座延长出来方便测试。改完之后读数稳定了不少。另外DHT11外界环境差异容易造成采样偏差我还在程序里增加了连续5次采集中位数滤波进一步降低传感器位置的偶发误差。如果你以后把系统放到更大的空间比如2平方米的储物间可能需要放两个传感器取平均值一个传感器只会照顾到它所在的那一小片区域。5.3 实测除湿数据从75%RH到52%RH花了多久改完这些问题我把系统放进一个0.8立方米的成品衣柜做实测。衣柜内放置一堆棉质衣物、一条牛仔裤和一床被套模拟真实负载。测试当天环境温度26℃衣柜初始湿度75%RH目标湿度设置50%面板显示“标准除湿”档。每小时记录一次数据时间衣柜内湿度系统状态0h75%RH制冷片启动0.5h68%RH持续除湿1h61%RH持续除湿1.5h56%RH持续除湿2h53%RH仍运行2.5h51%RH仍运行3h48%RH自动停机三小时把湿度从75%RH降到48%RH效果出乎意料。之后系统进入待机状态两天内湿度一直稳定在45%到52%之间制冷片基本不会频繁启动。运行功耗方面制冷片4A电流乘12V实际约48W加上风扇总功耗约55W。因为每天实际运行时间很短平均到一天的电费可以忽略不计。噪音方面12V风扇全速运行在30分贝左右放在衣柜里关门后基本听不见。5.4 开源仓库里应该放哪些文件怎么快速用起来开源内容不只是堆一堆代码还要让别人能顺着你的思路复现。我在仓库里放了四类文件工程源码Keil5工程标准外设库编译零错误零警告一键生成HEX原理图和PCB图嘉立创EDA源文件加PDF导出版本不装软件也能看仿真工程Proteus和Wokwi两套配置分别针对逻辑验证和原型展示上位机调试文档详细的接线说明、烧录步骤、常见问题排查表。拿到这份开源资料的人最快上手路线是先在Keil里打开工程编译用STM32 ST-LINK Utility或者STM32CubeProgrammer把HEX烧进最小系统板然后按原理图接好外设先不接12V负载只接传感器和OLED确认显示正常最后接继电器和制冷片注意续流二极管一定要上不然等着看复位吧。文件里的README写了每个外设的接线表对照着接基本不会错。整个调试建议分三步走每走完一步都确认无误再进下一步不要一口气全接完——这种带220V/12V混合电源的项目分步上电是保安全的底线。我做这个项目最大的体会是真正把一套开源方案从代码完整复现到硬件实机中间隔着的不是知识而是那些文档里从来不写的边界条件。芯片供电纹波会不会让单片机复位、传感器放在哪个位置才有代表性、继电器吸合释放会不会产生电磁干扰这些问题在没有接上真实负载之前你永远不会意识到。这也是我一直坚持“原理图仿真代码”三件套全部开源的原因——希望看到文章的每个人都能在我已经排除坑的基础上去踩自己的坑。