STM32+ESP8266+LabVIEW物联网温度采集系统实战指南
发布时间:2026/9/9 22:38:50 作者:尧图编辑部 阅读量:1,286

简介这是一个面向物联网与嵌入式学习者的综合实训项目整合ESP8266 Wi-Fi模块、STM32F103ZET6主控与LabVIEW上位机解决温度数据采集、无线传输与实时显示问题。资源适合正在开展STM32课程设计、希望了解物联网通信链路或入门LabVIEW图形化编程的读者。压缩包共288个文件大小约2.03MB以h/c源码、o目标文件、su临时文件及工程配置文件为主另含html与pdf说明文档、LabVIEW的vi程序等完整覆盖从固件编写到上位机界面的开发内容。当前已有2492人学习浏览。其中整理了硬件连接方式、STM32读取温度传感器流程、ESP8266的AT指令配置、LabVIEW界面设计及系统联调排错等关键环节实操参考价值明确对于希望快速搭建无线温控原型或复习HAL库开发、串口通信、TCP/IP透传等知识点的同学尤为适用。1. 项目整体拆解一套典型的物联网温度采集闭环先把这个项目翻译成大白话STM32ZET6负责把温度传感器的数据读出来ESP8266负责把数据用WiFi发出去LabVIEW在电脑上负责把数据收下来、显示成曲线或者存进表格。三个器件各干各的活串起来就是一个完整的物联网数据采集闭环。这套组合在嵌入式圈子里非常经典几乎可以说是教科书级别的练手项目。核心原因有三个方面第一STM32F103ZET6是Cortex-M3内核主频72MHz片上资源丰富Flash有512KBRAM有64KB跑个轻量级RTOS都绰绰有余用来做数据采集属于大马拉小车非常适合新手熟悉整个开发流程第二ESP8266模块本身自带TCP/IP协议栈你不需要在STM32上移植什么lwIP直接通过串口发AT指令就能联网把最麻烦的网络部分外包出去开发成本极低第三LabVIEW是图形化编程画个框图就能写出上位机界面不用去抠C#或者Python的界面代码。我最早玩这个组合是在几年前做实验室环境监测的毕设当时一共采集八个点的温度用DS18B20挂在一条单总线上STM32轮询读取后通过ESP8266发给上位机。那个项目跑了大半年稳定性一直不错后来还加了继电器控制加热器做成了简单的恒温控制。这个项目适合什么人正在学STM32但觉得裸机点灯没意思的、需要给实验室或者家里做个远程温湿度监测的、想入门物联网但不想一上来就碰Linux和路由器开发的。它的技术跨度刚好覆盖了嵌入式开发中最常用的几个环节传感器驱动、串口通信、AT指令、网络协议、上位机开发一课全通。2. 硬件端设计思路为什么核心板选了ZET6而不是C8T6很多朋友上来就问温度采集而已STM32F103C8T6不就够用了吗为什么非要ZET6这话没毛病如果只是纯粹读个DS18B20然后转发串口C8T6确实绰绰有余。但项目的价值不应该只看当前需求更要看未来的扩展性和学习收益。ZET6相比C8T6有几个实打实的优势引脚数量多ZET6是LQFP144封装共112个GPIO而C8T6是LQFP48封装只有37个GPIO。这意味着你可以同时挂多路传感器、接OLED显示屏、预留按键和LED指示灯后期想加功能不用重新画板子。其次是资源容量512KB Flash对初学者非常友好跑正点原子的例程时各种库函数全开也不用担心空间不够。第三个原因是这个芯片的资料极其丰富遇到问题搜解决方案非常容易学习成本低。至于ESP8266我用的是ESP-12F模块板载PCB天线通信距离在空旷环境下实测可以到50米左右室内穿一堵墙问题不大。模块通过4针串口和STM32连接TX接STM32的USART2_RXPA3RX接USART2_TXPA2VCC接3.3VGND共地。这里有个坑ESP8266的IO口是3.3V电平绝对不能直接接5V否则模块很可能直接烧掉。在传感器选择上如果你追求简单DS18B20是首选单总线协议一根线就能传数据而且每个芯片有唯一的64位ROM序列号可以一条总线挂多个传感器。缺点就是时序要求严格必须关中断才能保证时序准确这在后面会细说。如果你想要更高精度可以考虑SHT30或者DHT22这类数字温湿度传感器走I2C或者单总线读出来直接就是温度和湿度省去换算的麻烦。系统整体数据流是这样一个链路DS18B20采集温度STM32通过GPIO读取原始数据并转换为实际温度值将温度数据打包成JSON格式字符串通过USART2发送给ESP8266ESP8266通过TCP协议将数据传给PC端的LabVIEW上位机LabVIEW解析并实时显示温度曲线。实际项目中如果用WiFi通信这个链路就是完整的如果临时调试也可以把ESP8266这一环拿掉直接用USB转TTL把STM32和PC连起来走串口通信。两种方式在LabVIEW里的处理逻辑不同后面我会仔细讲。3. STM32端核心代码实现单总线时序与JSON数据打包3.1 DS18B20驱动单总线时序必须关中断DS18B20用的单总线协议只有一根数据线所有通信都是主机发起从机响应。时序上最关键的是三个动作复位脉冲、写时序、读时序。每个时序都有严格的时间窗口用GPIO模拟时稍有偏差就会导致读出来全是85摄氏度0x0550这是最常见的故障现象。我习惯直接用正点原子例程里的24C02那个延时函数做微秒级延时。DS18B20初始化时序主机拉低总线480us到960us然后释放总线等待从机拉低总线60us到240us表示存在脉冲。如果收不到存在脉冲基本就是硬件连接问题检查上拉电阻4.7K到10K都可以我一般用4.7K、检查VCC和GND有没有接反。写时序则需要注意写0是拉低总线60us到120us写1是拉低总线1us到15us后释放总线60us。读时序是拉低总线1us到15us后释放然后在15us内采样。这些时序参数看起来简单但实际调试时如果不开中断屏蔽串口中断一来就会打断时序导致读取失败。所以我的代码里在读写DS18B20前都加上__disable_irq()读完再__enable_irq()恢复实测这样处理后读取成功率接近百分之百。下面是读取温度的核心代码我用的是标准外设库如果你习惯HAL库逻辑也是一样的:short DS18B20_Get_Temp(void) { unsigned char tl, th; short temp; __disable_irq(); // 关闭中断保证时序准确 DS18B20_Reset(); // 复位总线 DS18B20_Write_Byte(0xCC); // 跳过ROM检测 DS18B20_Write_Byte(0x44); // 启动温度转换 while(!DS18B20_Read_Bit()); // 等待转换完成读到1表示转换结束 DS18B20_Reset(); // 再次复位总线 DS18B20_Write_Byte(0xCC); DS18B20_Write_Byte(0xBE); // 读取暂存器内容 tl DS18B20_Read_Byte(); // 温度低字节 th DS18B20_Read_Byte(); // 温度高字节 __enable_irq(); temp (th 8) | tl; // 合并为16位 return temp; }得到的temp是带符号的16位值实际温度为temp * 0.0625摄氏度。12位精度下每个LSB代表0.0625度这个换算关系是DS18B20出厂设定的所有资料里都一样。3.2 JSON打包与串口转发别用sprintf裸拼字符串STM32读取到温度后需要组一个数据包发给ESP8266。最简单的方案是用sprintf拼字符串但实际使用中我踩过坑温度值是浮点数直接拼字符串时可能因为库的差异导致格式不对而且在嵌入式环境里float打印本身也容易出问题。我的处理方式是把温度先放大100倍转成整数也就是保留两位小数上位机收到后再除以100。比如25.12度就发送2512。这样做的最大好处是完全避开浮点数的串口传输和解析问题而且传输过程中不会损失精度。实际代码逻辑如下float temp_celsius (float)DS18B20_Get_Temp() * 0.0625; int temp_scaled (int)(temp_celsius * 100); // 放大100倍保留两位小数 char json_buf[32]; sprintf(json_buf, {\t\:%d}\r\n, temp_scaled); // 通过USART2发送给ESP8266 USART2_SendString(json_buf);我选JSON格式而不是简单发个数字是因为这个方案以后扩展性更好。比如后期要加湿度就改成{t:2512,h:6320}上位机解析逻辑改动很小。数据末尾加\r\n作为帧结束符方便上位机做数据帧切分。如果你追求更高效率可以把JSON字符串换成4字节浮点数的原始字节发送这样每个数据点只要4字节比字符串省很多。但这种方式调试的时候很不直观串口助手没法直接看到温度值。我建议初学者先用字符串方式把整个链路调通再考虑优化传输格式。3.3 ESP8266联网配置透传模式的正确打开方式ESP8266这块我用的是AT固件出厂默认就有。第一次使用建议用USB转TTL单独把模块连到电脑上调试用串口助手发AT指令确认模块工作正常。常见测试指令是发AT如果返回OK就说明模块没问题。要让模块连上WiFi并进入透传模式需要依次发送这几条指令ATCWMODE1 # 设置Station模式连接外部路由器 ATCWJAP你的WiFi名,WiFi密码 # 连接WiFi路由器 ATCIPSTARTTCP,192.168.1.100,8080 # 建立TCP连接到电脑192.168.1.100是电脑的局域网IP ATCIPMODE1 # 开启透传模式 ATCIPSEND # 开始透传发送之后发送的数据都会直接转发到TCP服务器透传模式下ESP8266不做任何解析收到的字节流原样发到TCP连接的另一端。退出透传模式需要单独发注意这三个加号前后不能有其他数据否则不生效。这个模式下最大的问题是调试不方便。一旦进入透传你在串口助手里发出的内容会被直接发送到远端服务器而不是当作AT指令解析。所以我的经验是先用非透传模式测试TCP通信确认两端能收到数据后再切透传模式。另外一个常见问题是ESP8266有个休眠机制如果一段时间没数据收发模块会自动进入省电模式导致连接断开。解决方法是定时发送心跳包我一般每30秒发一个空数据或者实际温度数据这样连接保持很稳定。4. LabVIEW上位机开发TCP服务器模式的完整实现4.1 两种通信架构怎么选串口直连还是TCP网络上位机这块你需要先确定用哪种方式接收数据。如果调试阶段用的是USB转TTL直连STM32那LabVIEW这边用VISA串口控件就够了。如果走的是ESP8266无线方案那LabVIEW需要创建一个TCP服务器等待ESP8266来连接。我强烈建议使用TCP服务器模式因为这样才体现了物联网的核心价值——数据采集端和显示端不在同一个物理位置采集端设备可以放在数据现场而人在办公室就能远程监控。串口直连只适合调试验证不适合做成品。LabVIEW里TCP通信的核心节点就四个TCP Listen监听端口TCP Open建立连接TCP Read读取数据TCP Write发送数据。服务端流程一般是启动时调用TCP Listen指定端口号我常用8080或8081避开常见端口等待ESP8266发起连接。连接建立后放到一个While循环里用TCP Read按字节数读取数据。4.2 数据解析粘包处理与JSON解析串口和TCP通信都会遇到一个经典问题粘包。就是说STM32发的两帧数据可能在接收端被合并成了一包或者一帧被拆成了多个包。在LabVIEW里不用自己写太复杂的解析逻辑可以利用我前面加上的\r\n作为帧结束标志。具体做法是用TCP Read节点读取原始字节转换成一个字符串然后在循环里用Match Pattern或者Search/Split String来查找\r\n每匹配到一次就算一个完整的数据帧帧与帧之间不会混淆。如果读到的是半包也就是还没看到\r\n就把这部分缓存下来跟下一包拼接直到凑成完整一帧。这个逻辑不复杂但非常重要不做粘包处理的话后期数据多了会经常出现解析错误。解析JSON时LabVIEW本身对JSON支持不算好老版本连官方库都没有。我习惯用最简单的方式用Search/Split String提取t:后面的数字部分然后Decimal String To Number转换成数值。比如收到的字符串是{t:2512}\r\n提取出2512再除以100就得到25.12度。如果你愿意装第三方库JKI JSON是LabVIEW社区最常用的JSON解析包处理更加规范但对这个项目来说没必要大动干戈。4.3 前面板设计实时曲线和历史数据同时展示一个实用的温度采集上位机界面应该包含三个核心部分实时温度显示数值框、实时温度曲线波形图、历史数据表格或文件记录。温度数值直接用Numeric Indicator把解析出来的温度值连过去然后设置小数点位数。实时曲线用Waveform Chart这个控件自带历史数据缓冲直接把每次解析到的温度值传入即可自动绘制曲线。波形图的Y轴范围建议设置成0到100度X轴显示时间这样视觉效果最直观。数据记录我习惯用Write To Spreadsheet File节点每次读到有效温度后追加写入第一列存时间戳第二列存温度值。还可以加一个红色LED指示灯表示通信状态如果超过5秒没收到新数据就认为通信中断指示灯点亮。实现方式是记录上次收到数据的时间和当前时间做差。上面的框图逻辑用文字描述大致是这样主程序进入While循环循环内调用TCP Read读取数据把收到的数据拼到缓存字符串后面用Match Pattern找帧尾\r\n找到就截取完整帧并解析出温度值更新数值显示和波形图然后循环继续。循环外放一个TCP Listen等待连接连接断开后自动重新监听。整个逻辑用几个框图和连线就能完成工作量不大。5. 联调实战从串口助手到LabVIEW的完整调试记录5.1 分模块验证不要一上来就摸黑联调我调试这类项目有一个铁律永远分模块验证。也就是说先确保每个独立模块能正常工作再把它们组合起来联调。如果直接全部接好上电出了问题根本不知道是哪一环的锅。第一步单独测DS18B20读取功能。编译下载一个最简单的程序把读到的温度通过串口1打印出来电脑串口助手看输出。如果读出来是85度优先查硬件连接和上拉电阻然后查代码里关中断有没有正确执行。第二步单独测ESP8266模块。USB转TTL接上串口助手发送AT指令确认模块能连上WiFi并正常建立TCP连接。这时候可以用网络调试助手在电脑上建一个TCP服务器看看模块能不能连上来。第三步STM32和ESP8266联调。STM32把温度JSON数据包发过去ESP8266透传出去网络调试助手能看到数据。如果网络调试助手能看到就说明硬件链路的每一环都是通的问题只可能出在LabVIEW这边。5.2 LabVIEW接收不到数据的最常见原因联调过程中LabVIEW收不到数据是最让人抓狂的问题。我总结下来90%的情况逃不出下面几个原因TCP端口被占用或者防火墙拦截。LabVIEW运行时如果提示无法监听端口很可能是其他程序占用了这个端口。换个端口试试比如8081。另外Windows防火墙默认会拦截外部设备的TCP连接需要到控制面板防火墙设置里找到对应程序允许入站连接。IP地址写错。这个看似低级但特别容易犯。ESP8266里ATCIPSTART指令中填的IP地址必须是电脑当前的局域网IP而且电脑和ESP8266必须连接同一个路由器。很多人电脑同时连着有线网络和WiFiIP地址有多个要确认用的是哪个。在Windows命令行里输ipconfig看IPv4地址那个才是瓶颈。透传模式没有真正开启。有时候你还停留在AT指令模式然后开始在LabVIEW里傻等数据那必然什么都等不到。确认一下ESP8266的串口调试窗口看是否已经收到ATCIPSEND的返回OK然后模块才真正进入透传状态。5.3 数据乱码或温度值异常偏大怎么排查如果你在LabVIEW上看到的数字明显不对比如上千上万那就不是通信问题而是解析问题。检查这几点字符串转数值时有没有正确处理放大倍数。STM32端发的2512LabVIEW解析后应该除以100如果忘了除就是25.12显示成2512。是否被粘包问题干扰。如果解析时帧切分不对读取到的中间数据可能被截断了出现毫无规律的大数。温度传感器数据线接触不良。DS18B20数据线如果接触不好读出来的值可能跳变很大这时候用手捏一下传感器观察数据是否变化基本能定位。温度值异常偏大还有一种情况就是DS18B20的12位精度下符号位没处理好。DS18B20在零下温度时返回的是补码如果你直接按无符号数处理零下温度就会出现一个非常大的值。所以代码里temp一定要声明为short有符号类型而不是unsigned short。我的代码里用的是short这个问题再麻瓜也不会踩到。6. 常见问题排查速查表最后整理一份排查速查表把实际项目中踩过的大部分坑都汇总进去方便你后面调试时对照检查。这个表涵盖了从硬件连接到软件解析的绝大多数问题基本能覆盖你调试过程中可能遇到的各种奇奇怪怪的现象。现象可能原因排查方法解决方案DS18B20读出来一直是85度上拉电阻缺失、VCC/GND接反、时序被中断干扰万用表测量供电电压示波器观察总线波形加4.7K上拉电阻确保3.3V供电读写前后关闭全局中断串口输出的JSON串乱码接线不共地检查所有模块是否共用同一个GND模块和主板必须共地ESP8266联不上WiFiWiFi密码错误、路由器5G频段不支持串口助手单独测试AT指令确认2.4G频段核对密码ESP8266连接TCP失败一次就断TCP服务器没启动或IP/端口错误网络调试助手手动测试确认电脑IP用ipconfig获取端口未被占用LabVIEW收不到心跳数据防火墙阻止入站连接、透传未开启关防火墙临时测试在防火墙允许程序入站确认发送过ATCIPSEND温度闪现超大值符号位未处理、粘包解析错误检查代码里温度变量类型用有符号short存储原始数据处理半包缓存7. 一些额外的想法这套架构还能怎么玩在你把整个链路跑通之后你会发现这套架构凭空长出了很多可玩性。换一个传感器把DS18B20换成SHT30就能做成温湿度采集加一路继电器配合LabVIEW端的逻辑判断就能实现简单的上位机远程控制把LabVIEW里的数据接入数据库就能做成历史数据分析系统。ESP8266和STM32的配合远不止于温度采集这就像给了你一套积木后面怎么搭就是你自己的事了。在这个方向上加功能时我建议优先级这么排先把数据记录和导出做扎实解决数据能看不能存的痛点然后做报警提醒设置上下限阈值超限时弹窗或者声音提醒有精力再去做远程控制功能。每一步都在现有的框架上加一点点东西不会伤筋动骨。关于LabVIEW编程如果你跟我一样是个嵌入式背景出身的人刚开始可能会觉得图形化编程很别扭。但用多了你会发现对于数据采集和显示这类应用场景LabVIEW确实比C快太多了。画框图连线这套思路特别适合数据从哪来到哪去这种数据流模型天然适合做测量和监控。我在实际使用中的最大体会是别拿着一本教科书从头啃到尾而是拿着你的项目反推去学碰到哪个功能不会就去查那个功能的帮助和例程效率高得多。最后再分享一个小技巧整个系统调试通过之后运行步调很快的While循环会让CPU占用率很高。你可以在循环里加一个Wait(ms)节点延迟100毫秒左右。温度采集本身并不需要太高的刷新率每秒钟显示个几次对眼睛来说就够了。延迟加进去之后CPU占用率会从接近满载降到一个很低的水平电脑风扇也安静了。这个细节不会影响功能但能让你的程序显得更专业别人看了会说这人调过东西。本文还有配套的精品资源点击获取