资讯动态

基于STM32与ESP8266的仓库环境监测系统设计

发布时间:2026/10/8 6:27:57 来源:尧图企业网站定制
1. 项目缘起与整体设计思路仓库环境管理这件事说大不大说小也真不小。我最早接触这类需求是帮一个做食品原料存储的朋友处理他仓库里反复出现的受潮问题——堆在角落的几袋原料因为通风不及时表面结了一层水汽直接报废。他当时问我能不能做个东西实时盯着温湿度湿度一超标就自动开风机顺便把数据传到手机上人在外面也能看。这个需求听起来简单但真动手做涉及的东西一点不少传感器选型、执行机构驱动、通信联网、数据上云每一环都有坑。这个项目就是围绕这个真实场景展开的基于STM32做主控采集仓库内的温湿度和粉尘浓度根据阈值自动控制通风和除湿设备再通过ESP8266把数据上传到云平台。它解决的核心问题是——把原本靠人定时巡检、凭感觉开关风机的粗放管理变成一套自动判断、自动执行、远程可见的闭环系统。适合谁参考电子、自动化、物联网方向的在校学生做课程设计或毕业设计也适合想给自家小仓库、菇房、档案室做一套低成本环境监控的动手派。整套方案的成本可以压到百元级别门槛不高但该有的工业思路一样不少。我先把整体架构讲清楚不然后面细节容易乱。系统分四层感知层温湿度传感器、粉尘传感器、控制层STM32主控、执行层继电器驱动的风机、除湿机、通信与展示层ESP8266联网 云平台 手机端。数据流向是传感器采集 → STM32处理判断 → 超阈值驱动执行机构 → 同时把数据打包发给ESP8266 → 上云 → 手机查看。这个分层不是摆样子它决定了你调试时的排查顺序数据不对先查感知层执行不动先查控制层到执行层的链路上不了云就盯通信层一层层往下捋效率比瞎试高得多。为什么主控选STM32而不是Arduino或者ESP32直接搞定这是很多人纠结的点。ESP32确实自带WiFi一颗芯片就能采集加联网看起来更省事。但我实测下来STM32在这类项目里有几个实打实的优势外设资源丰富多路ADC、多个定时器、多串口后面想加个显示屏、加个按键、加个蜂鸣器报警引脚和资源都够用实时性和稳定性更好主循环跑控制逻辑不容易被网络任务拖累生态成熟标准库和HAL库资料铺天盖地出问题好查。而ESP8266在这里只干一件事——当个网卡负责把STM32通过串口喂给它的数据转发到云端。职责单一反而稳定。这种主控通信模块分离的设计是我踩过坑之后更推荐的方案网络模块死机了主控照样能本地自动控制不至于整个系统瘫痪。至于云平台的选择我倾向于用支持MQTT协议的物联网平台。MQTT是个轻量级的发布订阅协议特别适合这种小数据量、低频次上报的场景比HTTP轮询省流量也更实时。设备把数据发布到一个主题Topic手机端订阅这个主题就能收到推送。整个链路的延迟通常在秒级对仓库监控来说完全够用。2. 核心硬件选型与关键参数拆解硬件选型这块我不想堆一堆型号让你自己挑而是把每个器件的选择逻辑讲透你照着场景对号入座就行。2.1 主控与最小系统STM32我一般推荐从STM32F103C8T6这颗国民芯片起步。它是Cortex-M3内核72MHz主频64KB Flash、20KB RAM对于这个项目绰绰有余。价格便宜最小系统板俗称蓝板或核心板十几块钱就能买到资料多到烂大街。如果你手头有F407或者别的型号也完全能用逻辑是通用的改改引脚定义和时钟配置即可。最小系统要确认几样东西供电3.3V板载一般有AMS1117稳压、8MHz晶振HSE用于倍频到72MHz、复位电路、BOOT跳线下载程序时BOOT0拉高进ISP模式或者用ST-Link直接SWD下载就不用管。我强烈建议用SWD方式下载调试只需要SWDIO、SWCLK、GND、3.3V四根线比串口ISP稳定得多还能在线单步调试。ST-Link克隆版二三十块是这笔投入里最值的。2.2 温湿度与粉尘传感器温湿度我用得最多的是DHT22AM2302单总线数字输出测温范围-40到80摄氏度精度±0.5摄氏度湿度精度±2%到±5%。它比DHT11精度高一个档次价格也就贵几块钱仓库场景值得。注意DHT22对时序敏感读取间隔不能短于2秒否则容易读失败。如果你追求更稳的工业级方案可以上SHT30I2C接口精度更高、响应更快但价格也上去了。新手先用DHT22练手逻辑跑通再换。粉尘监测是这类项目的重点也是难点。市面上常见的是GP2Y1010AU0F这款夏普粉尘传感器光学原理输出模拟电压需要配合一个红外LED驱动脉冲来采样。它的特点是便宜二三十块但输出是相对值不是精确的PM2.5浓度需要自己标定。另一个选择是PMS5003/PMS7003激光粉尘传感器串口输出直接给你PM1.0、PM2.5、PM10的浓度值精度高很多价格在五六十到一百多。我的建议是如果只是做趋势监测和阈值报警GP2Y1010够用如果要报具体数值直接上PMS5003省去标定的麻烦。仓库里粉尘主要来自货物搬运和通风带入监测趋势比绝对精度更重要。2.3 执行机构与驱动执行层就是风机和除湿机。这里的关键是STM32的IO口驱动能力很弱一般单个引脚只能输出20mA左右绝对不能直接驱动电机或继电器线圈。正确做法是用继电器模块或者MOS管驱动电路做隔离和放大。继电器模块选光耦隔离的5V继电器输入端接STM32的IO输出端接220V的风机或除湿机。光耦隔离能防止强电侧干扰串回单片机这个钱不能省。接线时注意继电器模块的VCC和GND要单独供电或者做好滤波因为继电器吸合瞬间电流突变会拉低电压可能导致单片机复位。我踩过这个坑——风机一启动单片机就重启查了半天才发现是电源被拉垮了。解决办法是给单片机供电和继电器供电分开走或者在大电容上并联一个1000uF的电解电容做储能缓冲。如果控制的是直流小风机比如12V的散热风扇用**MOS管如IRF540**做低边开关更合适没有机械触点寿命长、无噪音。栅极串一个100欧姆电阻栅源之间加一个10K下拉电阻防止误导通这是标准做法。2.4 通信模块ESP8266ESP8266我推荐用ESP-01S或者NodeMCU开发板。ESP-01S体积小、便宜十块左右但只有8个引脚烧录需要额外的USB转TTL且供电要求高峰值电流能到300mA。NodeMCU自带USB接口和稳压调试方便适合新手。两者本质一样都是ESP8266EX芯片。这里有个高频坑ESP8266供电必须稳。很多人用STM32板子上的3.3V给ESP8266供电结果一联网就重启或者连不上。原因是ESP8266发射瞬间电流大板载稳压带不动。一定要给ESP8266单独供电或者用能提供500mA以上的3.3V稳压源并在电源脚附近并一个100uF以上的电容。这个细节决定了你后面联网调试是顺利还是崩溃。STM32和ESP8266之间用**串口UART**通信波特率一般用115200。STM32发AT指令给ESP8266ESP8266执行后返回结果。AT指令是ESP8266的母语比如ATCWMODE1设置Station模式ATCWJAPSSID,PASSWORD连WiFiATCIPSTART建立TCP连接。用AT指令的好处是不用管ESP8266内部固件逻辑把它当黑盒用缺点是AT指令的响应处理比较繁琐要解析返回字符串。后面我会讲怎么把这部分封装好。3. 软件架构与核心逻辑实现软件这块我按分层写、模块化的思路来别把所有代码堆在main里不然改一处崩一片。3.1 主程序框架与任务调度主程序我用前后台架构裸机跑不上RTOS这个项目没必要。前台是中断处理串口接收、定时器计时后台是主循环轮询各个任务。主循环里我按固定节奏跑每2秒读一次温湿度每1秒读一次粉尘每500ms检查一次阈值并控制执行机构每5秒上报一次数据到云端。这些节奏用定时器计数来控制而不是用delay死等——delay会阻塞整个循环导致其他任务响应不及时这是新手最常见的错误。具体做法配置一个1ms的SysTick中断在中断里对一个全局变量tick自增。主循环里判断if(tick - lastReadTemp 2000)这样的条件来触发任务。这样每个任务各跑各的互不阻塞。这个模式叫时间片轮询简单可靠是裸机项目的标配。3.2 传感器数据采集DHT22的驱动核心是单总线时序。它用一根数据线完成双向通信主机先拉低至少1ms发起起始信号然后释放DHT22响应后连续输出40位数据16位湿度16位温度8位校验。每一位数据用高电平持续时间区分26到28微秒表示070微秒表示1。这个时序对延时精度要求高我一般用微秒级延时函数配合关中断来保证时序不被其他中断打断。读回来的数据要做校验和验证前4个字节相加的低8位应该等于第5个字节不等就丢弃重读。粉尘传感器GP2Y1010的驱动要点是脉冲采样。它的红外LED需要周期性点亮典型周期是10ms其中LED点亮时间0.32ms。在这0.32ms内读取模拟输出才能得到有效值。所以要用一个定时器输出PWM去驱动LED控制脚然后在LED点亮的窗口内用ADC采样。这个时序配合是GP2Y1010最容易出错的地方很多人直接读ADC发现数值乱跳就是没做脉冲同步。3.3 阈值判断与自动控制逻辑控制逻辑我加了回差迟滞判断这是工业控制的常用技巧能防止执行机构在阈值附近反复开关。举个例子如果湿度阈值设60%湿度一到60%就开风机降到59.9%就关那风机会疯狂启停既费电又伤设备。正确做法是设两个阈值启动阈值60%停止阈值55%。湿度升到60%才开一直开到降到55%才关。中间这5%就是回差带。同理粉尘浓度、温度都可以这么设。控制逻辑用状态机写更清晰。以通风为例定义两个状态FAN_OFF和FAN_ON。在FAN_OFF状态下如果湿度大于启动阈值或粉尘大于启动阈值切到FAN_ON并开继电器在FAN_ON状态下如果湿度和粉尘都低于各自的停止阈值切回FAN_OFF并关继电器。状态机的好处是逻辑一目了然不会出现条件嵌套混乱。3.4 ESP8266联网与数据上云这部分是整个项目里最容易卡住的地方我详细讲。ESP8266用AT指令联网的流程是固定的几步AT—— 测试模块是否响应返回OK说明通信正常。ATCWMODE1—— 设为Station模式作为客户端连路由器。ATCWJAP你的WiFi名,密码—— 连接WiFi成功返回WIFI CONNECTED和WIFI GOT IP。ATCIPMUX0—— 设为单连接模式。ATCIPSTARTTCP,服务器地址,端口—— 建立TCP连接。ATCIPSEND长度—— 声明要发送的数据长度收到提示后发送数据。每一步都要等模块返回预期结果才能进行下一步所以代码里要写带超时的等待函数。比如发完ATCWJAP后循环等待串口收到OK或FAIL最多等10秒超时就重试。这个发指令-等响应-判断-重试的框架封装好了后面所有AT操作都能复用。数据上云我推荐用MQTT协议。相比直接发TCP裸数据MQTT有主题Topic机制手机端订阅对应主题就能收到不用自己解析原始字节流。ESP8266可以用ATMQTT指令部分固件支持或者让STM32自己组MQTT报文通过TCP发出去。后者更灵活我一般用后者STM32按MQTT协议格式拼好CONNECT、PUBLISH报文通过ATCIPSEND发给ESP8266转发。MQTT报文格式是固定的CONNECT报文包含协议名、协议级别、连接标志、保活时间、客户端ID等字段PUBLISH报文包含主题名和负载。拼报文时注意剩余长度字段的编码规则可变长度编码每字节低7位是数据最高位是延续标志这是最容易算错的地方。4. 实操过程与关键环节记录理论讲完上实操。我按从零到跑通的顺序把关键步骤和现场记录摆出来。4.1 开发环境搭建我用Keil MDK或者STM32CubeIDE。Keil在国内资料多但要注意安装对应的器件支持包Device Family Pack否则新建工程时找不到芯片型号。CubeIDE免费且自带CubeMX配置工具图形化配置引脚和时钟生成初始化代码对新手友好。我现在的习惯是用CubeMX配好时钟树、引脚、外设生成代码框架再在生成的代码里填业务逻辑。这样省去手写初始化寄存器的麻烦也不容易配错时钟。时钟配置是重点HSE选8MHz晶振PLL倍频到72MHz作为系统时钟APB1分频到36MHz因为APB1最高36MHzAPB2保持72MHz。配错了会导致串口波特率不对、定时器计时不准。CubeMX里直接填目标频率它会自动算分频系数很省心。4.2 分模块调试顺序我的调试顺序是先通串口再通传感器最后通网络。串口是调试的眼睛先把printf重定向到串口后面所有调试信息都靠它输出。重定向方法是重写fputc函数把字符通过HAL_UART_Transmit发出去。有了串口打印传感器读没读到、读到多少一目了然。传感器调试时我习惯先打印原始数据再打印转换后的物理量。比如DHT22先打印那40位原始数据确认校验通过再打印温湿度值。这样如果数值不对能快速定位是时序问题还是转换公式问题。粉尘传感器先打印ADC原始值再打印换算后的浓度方便标定。网络调试是最磨人的。我的经验是用串口助手先手动发AT指令确认模块本身能连WiFi、能建TCP连接再写代码自动化。手动都连不上代码肯定也连不上先排除硬件和模块问题。手动通了再把指令序列搬到代码里一条条加每加一条验证一次。4.3 数据上报格式设计上报到云端的数据我用JSON格式因为可读性好、手机端解析方便。格式大概是这样{temp:25.6,humi:58.3,dust:42,fan:1}temp是温度humi是湿度dust是粉尘浓度fan是风机状态1开0关。STM32用sprintf把数据拼成这个字符串再通过MQTT发布。注意sprintf浮点数在部分Keil配置下会出问题默认不支持浮点格式化需要在工程设置里勾选Use MicroLIB或者手动处理浮点转字符串。我一般用整数放大法温度25.6存成256上报时再除以10避免浮点格式化的坑。4.4 云平台与手机端配置云平台我用支持MQTT的物联网平台注册设备后拿到三个关键信息设备ID、用户名、密码或者叫密钥以及服务器地址和端口。在平台上定义一个数据主题比如/warehouse/data设备往这个主题发布手机端订阅这个主题。手机端可以用平台自带的App也可以用通用的MQTT客户端App填入相同的连接信息和主题就能看到实时数据。这里有个细节MQTT的客户端ID要唯一。如果两个设备用同一个客户端ID连接后连的会把先连的踢下线导致设备反复掉线。所以客户端ID里最好带上设备唯一标识比如MAC地址或芯片ID。5. 常见问题与排查技巧实录这部分是我踩坑最多的地方整理成速查表你遇到问题直接对号入座。5.1 传感器类问题现象可能原因排查方法DHT22读数一直失败读取间隔太短、时序被打断间隔加到2秒以上读取时关中断DHT22数值明显偏差传感器受潮或老化换新传感器对比检查是否靠近热源粉尘ADC值乱跳没做脉冲同步采样确认LED驱动PWM和ADC采样时序对齐粉尘数值恒定不变传感器进灰或LED损坏清理光学腔检查LED是否点亮DHT22有个隐蔽的坑上电后第一次读取往往失败需要等1到2秒让传感器稳定。我在初始化后先延时2秒再读第一次成功率明显提高。另外DHT22的数据线要接4.7K到10K的上拉电阻到3.3V不接上拉经常读不到数据这个电阻很多模块板载了但裸传感器必须自己加。5.2 通信类问题ESP8266连不上WiFi先确认三件事WiFi是2.4GHz的ESP8266不支持5GHz、密码正确、供电充足。我遇到过路由器开了双频合一ESP8266连不上把2.4G和5G分开就好了。还有一次是供电问题用电脑USB供电时能连换成板载稳压就连不上一测电压只有3.0V换了个稳压模块立刻正常。AT指令返回ERROR或者乱码检查波特率。ESP8266出厂固件波特率常见是115200但有些模块是9600或74880。用ATUART_DEF可以改波特率。如果返回一堆乱码多半是波特率不匹配挨个试常见值。TCP连接建立后很快断开检查保活机制。MQTT有保活时间Keep Alive如果设备在保活时间内没发心跳PINGREQ服务器会断开连接。我一般设保活时间60秒每30秒发一次心跳留足余量。5.3 执行机构类问题风机一启动单片机就复位前面提过是电源被拉垮。解决办法单片机供电和继电器供电分开或者加大滤波电容。我实测在继电器电源脚并一个1000uF电解电容加一个0.1uF陶瓷电容复位问题基本消失。继电器吸合但设备不工作检查继电器输出侧接线。继电器有常开NO和常闭NC触点控制设备一般用常开触点设备电源火线接继电器公共端COM设备另一端接常开触点NO继电器吸合时COM和NO导通设备得电。接错到常闭触点逻辑就反了。5.4 上云类问题数据发出去但云端收不到按这个顺序查ESP8266是否连上WiFiATCWJAP?查询、TCP是否连上ATCIPSTATUS查询、MQTT是否连接成功看CONNECT报文有没有收到CONNACK响应、主题名是否匹配发布和订阅的主题必须完全一致大小写敏感。我遇到过一次主题名多了一个斜杠排查了半天才发现。MQTT报文拼错导致连接失败重点检查剩余长度字段。这个字段用可变长度编码小于128的值占1字节128到16383占2字节。我第一次写的时候按固定1字节处理数据一长就错。正确算法是值对128取余得到当前字节值除以128继续直到值为0每个字节最高位表示是否还有后续字节。6. 系统优化与扩展方向基础功能跑通后有几个方向可以让这套系统更实用。6.1 增加本地显示与报警加一块OLED屏SSD1306I2C接口或者LCD屏ILI9341SPI接口本地实时显示温湿度和粉尘值不用掏手机就能看。ILI9341用SPI驱动刷屏速度快但占引脚多OLED用I2C两根线搞定适合引脚紧张的场景。再加一个蜂鸣器做超限报警用三极管驱动STM32的IO控制三极管基极即可。报警逻辑和风机控制类似超阈值就响回差带内不响。6.2 数据存储与历史曲线云平台一般自带数据存储和曲线展示但如果你想本地留一份可以加SD卡模块或者Flash芯片如W25Q64定时把数据写进去。SD卡用SPI接口配合FatFS文件系统能存成CSV文件方便导出分析。Flash芯片容量小但更可靠适合存关键数据。6.3 多仓库组网如果管理多个仓库可以每个仓库一套采集终端通过WiFi上报到同一个云平台用不同的设备ID区分。手机端按设备ID筛选查看。再进一步可以用LoRa做远距离低功耗组网适合仓库分散、WiFi覆盖不到的场景但成本和复杂度会上升按需选择。6.4 控制策略升级现在的阈值控制是固定值可以升级成分时段策略比如白天货物进出频繁粉尘阈值放宽夜间无人湿度控制更严格。再高级一点用PID或者模糊控制调节风机转速需要风机支持调速让环境更平稳。不过对大多数仓库场景固定阈值加回差已经够用别过度设计。我个人在实际操作中的体会是这类项目七分靠硬件稳定三分靠软件逻辑。传感器供电、通信模块供电、继电器隔离这三样做好了软件调试会顺很多这三样偷懒后面会被各种玄学问题折磨到怀疑人生。另外调试信息一定要打足串口打印不花钱但能帮你省下大量猜测时间。最后分享一个小技巧把关键参数阈值、上报间隔、WiFi信息做成宏定义或者存在Flash里改参数不用重新烧程序现场调试会方便很多。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑