酒窖这东西懂行的人都知道最怕的不是酒不够好而是环境悄悄变了味。温度忽高忽低、湿度撑不住、光线漏进来都可能让一瓶好酒在不知不觉中走下坡路。我去年帮朋友改造一个地下酒窖时就琢磨过怎么把一套能长期稳定跑的监测系统落到实际环境里。当时第一个想到的方案就是用STM32做主控自己搭一套环境监测系统而不是直接买成品传感器。成品设备贵不说还不一定适配酒窖那种常年高湿、温度变化慢的特殊工况。这套系统的核心思路很简单用STM32持续采集温度、湿度、光照强度这些关键环境参数再把数据集中显示和存储必要的时候联动通风、加湿设备做自动调节。这篇文章就把我整套设计思路、选型逻辑、关键代码片段以及调试过程中踩过的坑完整放出来给正在做类似项目或者想自己动手搞一套的朋友做个参考。1. 整体方案设计与需求拆解1.1 酒窖环境监测到底要测什么不少人一提起环境监测第一反应就是放个温湿度传感器就完事了。实际做过就会知道酒窖环境远不是测个温湿度那么简单。葡萄酒长期存储对环境的敏感度非常高温度波动超过两度就可能让酒的陈化过程失衡湿度低于50%软木塞容易干缩漏气高于80%又可能滋生霉菌。光照更是需要严格控制的变量紫外线会加速酒体氧化这也是为什么葡萄酒瓶大多用深色玻璃。所以这套系统在传感层面需要覆盖的物理量其实有三个维度环境温湿度、液态环境温度、以及光照强度。温湿度传感器负责监测空气环境这个好理解液态温度检测则是通过不锈钢探头深入酒液内部直接测酒体本身的温度这个数据往往比空气温度更有参考价值光照传感器则布置在酒窖入口或照明灯具附近用于监测是否有人长时间开灯或者漏光。还有一个常常被忽视的维度是通风状态。酒窖如果长期密闭二氧化碳浓度可能悄悄升高人进去会感到头晕葡萄酒也会因为缺乏微氧循环而影响熟成。考虑到成本和系统复杂度我没有单独上二氧化碳传感器而是在联动控制上做文章通过监测温湿度变化趋势自动控制通风风机的启停节奏。1.2 为什么选STM32做主控这个项目完全可以拿ESP32或者树莓派来做选STM32是有明确理由的。酒窖环境常年高湿、温度偏低对控制器的稳定性要求远高于功能丰富度。ESP32虽然Wi-Fi方便但无线模块在这种屏蔽环境下信号衰减严重本身发热也偏大长时间在密闭空间里跑容易热漂移。STM32主打的就是一个稳。我当时选的是STM32F103RCT6这颗芯片在工业控制和环境监测领域用得非常多资源够用、外设齐全、价格也实惠。选这颗还有一层考虑它带3路USART、2路I2C、3路ADC刚好能用一套芯片把传感器数据采集、显示驱动、联动控制全部做掉不需要额外的通信芯片。更重要的是STM32的生态实在太成熟了。标准外设库也好、HAL库也好代码资源极其丰富遇到问题搜一下就有答案。对于这种长期运行、需要稳定可靠的环境监测系统选STM32等于选了整个行业十几年积累的经验包。1.3 系统架构的一次成型思路整套系统的信号流是这样走的传感器采集的数据先经过STM32内部的滤波和处理逻辑随后一路分给本地OLED显示屏做实时显示另一路通过RS485总线上传给上位机或者触摸屏。同时STM32根据预设的控制逻辑直接驱动继电器模块实现加湿器、通风风机、照明灯的自动启停控制。为了让这套系统即使无人值守也能稳定运行我还加了一个看门狗定时器防止程序在极端情况下跑飞。电源部分也做了专门处理用宽压DC-DC模块把输入电压降到3.3V前端加了防反接和TVS保护避免酒窖里可能出现的电压波动伤到主控板。这里要说明的是这套架构属于典型的传感器-控制器-执行器三层结构并没有引入物联网关或者云端平台。原因很简单酒窖环境监测的场景里数据不出本地就能闭环控制没必要把数据送云端绕一圈。后期如果需要远程查看数据预留的RS485接口可以直接接一个DTU或者网关模块扩展成本极低。2. 核心元件选型与技术参数解析2.1 温湿度传感器选型干货酒窖环境监测最核心的传感器就是温湿度这块选型我纠结了很久。市面上常见的温湿度传感器主要有三种DHT22、SHT30和SHT40。DHT22胜在便宜又普及实验室玩票足够但长期稳定性一般在持续高湿环境下漂移会逐渐变明显。SHT30是盛思锐的中端主力精度高、稳定性好I2C接口价格也在合理范围内量产的工业设备里用得非常普遍。SHT40则是SHT30的升级款精度更高、功耗更低不过单价也贵了一截。这套系统最终选了SHT30。理由很直接酒窖环境需要长期监测传感器稳定性比初始精度更关键。SHT30在20到60摄氏度范围内精度可以做到正负0.2摄氏度湿度精度正负2%RH足够覆盖酒窖的实际工况。更重要的是它的长期漂移小连续运行两年以上数据依然可信这是DHT22这种低成本传感器做不到的。液态温度检测用的是DS18B20防水探头这个几乎是此类应用的标准选择。单总线协议一根线就能挂多个探头而且探头直接做成不锈钢封装能泡在酒液里不腐蚀。DS18B20的精度虽然不算顶配但胜在接口简单、稳定性好实际使用中一个人测酒体温度误差完全够用。注意买的时候要选原装正品市面上有些国产替代品在高温段误差能到两三度别贪这个便宜。光照传感器用的是BH1750数字光强度传感器。这颗芯片通过I2C接口输出16位的照度值量程从0到65535勒克斯分辨率能到1勒克斯测酒窖里微弱的环境光变化也够用。关键是它内置了光电二极管和ADC出厂时做了标定不需要自己搭光敏电阻配合ADC去校准省了很多事。2.2 RS485通信方案为什么值得坚持这套系统里上位机或者触摸屏需要实时读取传感器数据。通信方式我当时列了几种选择直接用I2C或SPI从机模式对接触摸屏、用RS232串口通信、还有RS485差分通信。前两种都存在明显短板I2C和SPI走线距离有限抗干扰能力也一般酒窖里各种电源线、继电器线束很容易把信号弄脏RS232则是电平信号抗共模干扰能力差布线超过两三米就可能出问题。RS485用的是差分信号传输两根线互为参考外部干扰对两根线的影响被互相抵消传输距离理论上能到1200米。对于酒窖这种分布式安装场景主控板和显示屏可能隔着几面墙RS485几乎是性价比最高的选择。实际工程中我用的是隔离型RS485模块在MCU侧加数字隔离器防止地电位差把主控板烧掉——这个问题在工业现场太常见了强烈建议做隔离。2.3 显示与交互模块的取舍系统的人机交互部分用了0.96寸OLED屏SSD1306驱动芯片四针I2C接口。选OLED而不是LCD的原因是视角广、亮度高、耗电低而且不需要背光长时间显示也不会发热。酒窖里光线暗OLED的显示效果远比断码屏或者字符屏舒服。按键设计就简简单单三个菜单键、加键、减键。通过这三个键可以切换显示页面、修改温湿度报警阈值、调整控制回差。这块逻辑看似简单但实现起来有个细节需要注意按键消抖和长按短按的区分处理后面软件章节我会专门讲。至于要不要上触摸屏我的观点是看预算。工业上用的串口触摸屏比如淘晶驰或者大彩基本都支持RS485或者串口通信直接对接STM32的USART即可。如果只是为了本地显示和简单操作OLED加按键的组合完全够用还能省下好几百块的成本。3. 软件架构与核心代码实现3.1 状态机架构让逻辑更清晰这套系统的软件部分一开始我就决定用状态机来组织逻辑而不是简单地写在主循环里一坨代码。原因很实际监测系统有多个并行任务读取传感器、处理显示、响应按键、执行控制如果用顺序执行的思路写一旦按键扫描阻塞I2C读取整个系统就会卡住。状态机的核心思想是把系统拆成若干明确的状态每个状态下只做该做的动作状态之间通过事件触发切换。我把这套系统划分成四个状态初始化状态、正常监测状态、参数设置状态、报警状态。初始化状态只做一件事就是等待各传感器上电稳定并完成初次读取如果某个传感器无响应会记录错误标志而不是直接死机。正常监测状态是系统的主运行态周期性轮询传感器数据并刷新显示。按键按下时系统从正常监测状态切到参数设置状态此时传感读取暂停、显示切换为参数编辑界面。只要检测到温度或湿度越界系统就切到报警状态联动继电器动作。这种写法最大的好处是每个状态内部的逻辑不会互相干扰排查问题的时候思路清晰。就算以后要加新功能比如联网上报只需要新增一个状态不用改动已有的状态逻辑。3.2 传感器读取与数据处理的核心代码传感器驱动我直接用STM32标准外设库配合I2C和单总线协议实现。SHT30的读取流程是这样先发送0x2C06命令让传感器进入周期测量模式10Hz采样率然后等待约15毫秒再读取6字节数据其中温度和高度的原始数据各占2字节剩余2字节是CRC校验。这里有一个特别关键的细节SHT30的CRC校验。很多人初次用这颗传感器时容易忽略这个校验直接取数据用结果发现偶尔读到跳变的异常值。实际在长时间运行时I2C线路上的一点干扰就可能让某个字节出错。我在读取代码里加了CRC8校验校验失败的数据直接丢弃、不参与平均计算这个动作把系统的数据稳定性提升了一大截。另一个重要的数据处理逻辑是滑动平均滤波。传感器原始读数在短时间内会有正常波动比如开门的一瞬间空气流动可能让湿度读数值突然跳动。如果直接用这个值去做控制判断就会导致继电器频繁启停。我做了5次采样取中位数的策略连续采5个值去掉最大值和最小值剩下的3个取平均。这个做法比单纯算术平均更能抵御脉冲干扰实测效果非常稳。温度数据的处理还要考虑湿度的温度补偿。SHT30内部虽然已经做了温度补偿但在极限工况下如果想进一步精准测量露点可以用Magnus公式算出露点温度。这套系统里我用露点温度作为是否开启除湿风机的判断依据效果比直接看湿度值更好。3.3 看门狗与掉线自动恢复逻辑嵌入式系统最怕的就是程序跑飞然后彻底失联。酒窖环境监测这种系统的麻烦之处在于一旦系统卡死没有人及时发现可能整个酒窖的环境数据就处于失控状态。所以我加了两层保护。一层是硬件看门狗IWDG每500毫秒需要喂狗一次如果主循环没有在预定时间内喂狗单片机就自动复位。另一层是软件层面的传感器掉线检测每次I2C或单总线读取失败时错误计数加一当连续失败次数超过10次时系统记录故障状态并在OLED上显示对应传感器的错误提示。这样即使传感器接线松脱或者损坏维护人员也能一眼看出问题出在哪个环节。3.4 按键扫描与菜单逻辑的优化按键这块虽然看着不起眼实际上特别容易写成一堆Bug集合。最典型的坑就是机械抖动触点闭合和断开的瞬间电平会在极短时间内反复跳变如果直接在电平变化沿触发动作按一下键可能触发好几遍。我用的是经典的10毫秒消抖方案检测到电平变化后延时10毫秒再确认电平状态确认稳定后才算一次有效按键。长按和短按的区分逻辑也一并说清楚。这里用了一个比较巧妙的方法在定时器中断里实时记录按键持续的时间戳主循环只做状态判断。如果按键从按下到释放的总时长小于800毫秒判定为短按只做步进调整如果超过1.5秒判定为长按执行连续快速调整。用这个方案设置温湿度阈值时短按一次调0.1长按则持续快速加或减操作效率高得多。4. 联动控制策略与调试实录4.1 温湿度控制回差怎么设酒窖环境监测不只是把数据测出来更关键的是把环境稳住。这里的稳住和普通恒温恒湿箱不一样酒窖讲究的是缓慢渐变而不是快速响应。所以我在联动控制里做了回差控制算法。以加湿器为例设定湿度目标值为70%RH如果直接做成湿度低于70%就开启、高于70%就关闭会导致加湿器在边界值附近频繁启停。这样不仅浪费电还会因为加湿器频繁通断造成湿度波动反而变大。我在这里引入了回差控制湿度低于68%时启动加湿高于72%时停止加湿。这个正负2%的回差区间避免了临界点的反复振荡实测下来加湿器每天的启动次数从十几次降到了两三次。4.2 通风与温度联动的层次设计通风控制在逻辑上要比单纯的阈值控制复杂一些。酒窖通风的目标是在不引起温度大幅波动的前提下实现空气交换。我的做法是把它分成两个层级。第一层是定时通风每天设定两个时段早上六点和晚上八点各通风15分钟用于驱散酒窖内的积攒气体和异味即使温湿度都正常也执行。第二层是条件通风当检测到露点温度与空气温度的差值过大说明空气相对湿度接近饱和这时候无论湿度显示多少都开启通风机促进空气流动。这两层逻辑结合起来相当于既保证了基础的空气新鲜度又能在湿度异常时自动介入。实际运行中我发现二层逻辑触发频率远高于一层尤其是在南方梅雨季节这套联动逻辑对防止霉菌滋生非常明显。4.3 继电器驱动电路的工程细节控制加湿器、风机和照明灯的是三路继电器模块。这里有一个新手容易踩的坑单片机引脚直接驱动继电器模块时如果直接用推挽输出给高电平部分继电器模块的输入阻抗会导致驱动能力不足表现为继电器吸合不稳定。我当时用的是PNP三极管做低电平驱动MCU引脚输出低电平时三极管导通、继电器吸合。这样的设计还有一个隐藏的好处即使单片机程序跑飞导致引脚输出高电平继电器也会自然断开系统处于安全状态。这个特性在酒窖里很重要——一旦控制逻辑异常宁可设备不动作也不能让加湿器或者风机一直工作不停。另外继电器的线圈两端我都加了续流二极管防止断电瞬间的反向电动势把三极管击穿。这个元器件虽然小但没装的情况下继电器寿命会急剧缩短属于必须加的保护。4.4 实测数据与系统表现整套系统装好后我在朋友的地下酒窖里连续跑了将近两个月。酒窖面积大约20平米深约3米入口有保温门。传感器部署方案是SHT30挂在酒窖中部距地面1.5米的墙面上DS18B20探头直接插入一个装有红酒的玻璃瓶牺牲瓶BH1750安装在灯具附近。实测的温度曲线显示在没有开启空调、仅靠这套系统控制通风和加湿的情况下酒窖内温度稳定在15到18摄氏度之间昼夜波动不超过1.5度湿度稳定在65%到72%之间。这个数据完全满足葡萄酒的中长期存储要求。其中最有参考价值的是在梅雨季连续降雨的那两周系统通过二楼联动逻辑自动增加了通风频次酒窖内的湿度峰值始终没有越过75%这条警戒线。之前这套环境监测系统如果在相同工况下需要人隔三差五下去看一眼湿度经常在梅雨季爬到80%以上。这就是自动联动控制和单纯的数据监测之间最本质的区别。5. 常见问题与排查技巧实录5.1 传感器读数异常怎么办SHT30偶尔读到间隔性的错误值大概率是I2C总线上拉电阻的问题。STM32的I2C引脚内部虽然有弱上拉但在传感器离主控比较远的时候外部上拉电阻还是必须加的。我的做法是在SHT30电源和SDA、SCL引脚之间各接一个4.7千欧的上拉电阻到3.3V这样即使总线连线长度超过半米也能保证信号质量。DS18B20读数全是85摄氏度这个几乎成了单总线传感器的标志性故障。出现这个读数代表传感器和主机之间的通信失败可能的原因是接线顺序错了、供电电压不足、或者总线上的上拉电阻阻值太大。重点检查一下数据线是否再接上4.7千欧的上拉电阻到VCC保证空闲状态下总线电平被拉高。另外DS18B20的电源线、地线、数据线三根线的顺序也很容易接反特别是防水探头那根线里三条线的颜色在不同厂家里并不完全统一一定要用万用表先测一下再接线。5.2 继电器频繁通断如何根治这个问题的根源通常不是程序逻辑而是传感器数据本身在边界值附近来回抖动。即使软件上做了滑动平均如果滤波窗口太小数据波动依然会穿透控制阈值。这时候优先加大滤波窗口长度把采样次数从5次提升到15次。如果还是不行就要检查传感器安装位置附近是否有局部的微气候干扰比如加湿器出风口直吹传感器的位置那测出来的湿度必然大幅波动。把传感器移到空气流动均匀、不受设备近距离影响的位置问题就会迎刃而解。5.3 系统运行一段时间后卡死程序跑一段时间后卡死先查电源。酒窖这种环境用电条件普遍一般电压波动和浪涌都可能导致MCU进入异常状态。我的排查顺序是这样的第一测量MCU供电电压是否稳定在3.3V正负5%范围内第二确认各路外设的功耗总量没有超过稳压芯片的额定输出第三检查硬件看门狗是否正常使能如果没有开启看门狗程序跑飞就无法自恢复。在实际项目里有几次卡死排查到最后是因为几个继电器同时吸合的瞬间电流冲击导致电压跌落MCU直接复位了。解决方法是给继电器模块单独供电或者加大前端电源的余量。5.4 RS485通信偶尔丢帧RS485通信偶尔丢帧多半是总线阻抗不匹配的问题。正常情况下RS485总线的首尾两端需要各接一个120欧的终端电阻来匹配阻抗防止信号反射。如果只接了主控板和触摸屏没有接终端电阻或者只在其中一端接了一个信号传输过程中就会产生反射、出现偶发性的数据错误。检查这个最简单的方式是把信号速率降低到9600波特率如果丢帧消失那基本就坐实了终端电阻的问题。另外RS485的A、B两根线的接线顺序也不能反。虽然很多设备具备自动收发转换功能但老一点的设备A、B接反则完全无法通信。排查时先用万用表测一下A、B之间的电压空闲状态下应该在0.2V以上如果接近0说明总线被短路或者主从设备的极性接反了。6. 系统扩展与升级方向这套酒窖环境监测系统目前的形态已经能解决核心问题但如果往后想进一步提升有几个方向值得试一试。加一个ESP8266或者ESP32模块通过串口对接STM32就能把数据上报到家中的局域网配合Home Assistant或者巴法云之类的IoT平台做远程监控。很多资料只讲了Wi-Fi模块怎么初始化往往忽略了一点STM32和Wi-Fi模块之间的串口波特率、数据格式需要严格匹配而且最好做一个简单的帧协议来区分传感器数据和网络状态数据不然物联网平台收到的数据会有解析错位。另一个值得升级的方向是把显示从OLED换成更大的串口屏把实时趋势曲线直接画出来。STM32F103的Flash空间跑一个曲线绘制算法足够但需要把历史数据组织成环形缓冲区防止内存越界。数据存储方面可以在I2C总线上挂一个AT24C256 EEPROM每10分钟存一次温湿度数据EEPROM的10万次擦写寿命足够支持连续记录一年以上。有了历史数据就能在后期做趋势分析比如判断酒窖环境是否在某个季节有规律性波动从而提前调整控制策略。云端这条线如果想走得更远还可以考虑在STM32上跑一个轻量级的MQTT客户端通过串口透传模块把数据推到云服务器。但这里必须提醒一句酒窖环境的控制闭环应该留在本地远程只做监测和告警千万不要把关键的控制逻辑放到云端去执行——一旦网络断开设备就会失去判断能力这在环境监测领域是大忌。我自己的实际体会是STM32这套方案的魅力恰恰在于它足够克制。不去拼命堆功能而是围绕核心痛点把每个环节都做扎实。传感器选型宁可多花一点钱买稳定可靠的代码逻辑宁可多花几天做状态机和滤波算法硬件保护宁可多加几步也不心存侥幸。环境监测系统本质上是在和缓慢的变化打交道前期的这些细致功夫会在基金积月累的运行中换来实实在在的省心和放心。如果你也在折腾类似的项目别急着上高大上的物联网方案先把这间屋子里该守住的指标守住就已经赢了一半。