3、数据采集硬件平台:ESP32/STM32简介、GPIO引脚功能、I2C/SPI/UART通信协议基础、开发板选型建议
好,咱们进入硬件部分。说实话,做物联网数据采集,选对硬件平台,项目就成功了一半。我见过太多人一上来就纠结“用ESP32还是STM32”,结果项目拖了两个月还没动工。今天我就把这两个平台掰开揉碎了讲清楚,再聊聊那些绕不开的通信协议。
3.1 ESP32与STM32:两位老将的对比
先说说ESP32。这玩意儿现在几乎是物联网开发的标配了。为什么?因为它自带Wi-Fi和蓝牙,你想想看,一个芯片就把无线通信搞定了,省了多少事。我最早用ESP8266的时候,那叫一个痛苦——资源少、开发环境简陋。到了ESP32时代,双核处理器、520KB SRAM、16MB Flash,跑个FreeRTOS轻轻松松。
再说STM32。这是ST公司的王牌产品线,从低端的F0系列到高端的H7系列,覆盖了你能想到的所有场景。它的优势在于:稳定、外设丰富、生态成熟。我在做工业数据采集项目时,首选就是STM32。为什么?因为工业现场对稳定性要求极高,ESP32偶尔的Wi-Fi断连问题在工业场景下是不能接受的。
核心区别一句话总结:
- ESP32:适合需要无线通信、快速原型验证、成本敏感的项目
- STM32:适合对稳定性、实时性、外设数量要求高的工业级项目
我个人习惯是:做消费级产品原型用ESP32,做工业级产品用STM32。当然,现在也有ESP32-S3这种带丰富外设的型号,边界在模糊,但选型逻辑不变。
3.2 GPIO引脚功能:不只是高低电平
GPIO,全称是General Purpose Input Output,通用输入输出。听起来简单,但这里面的坑不少。
每个GPIO引脚,除了能输出高低电平、读取外部电平之外,还可能有复用功能。比如ESP32的GPIO2,它既是普通IO口,又是UART1的TX引脚,还连接着板载LED。你想想看,如果你把GPIO2用作普通输出,同时又想用UART1通信,那不就冲突了吗?
避坑指南:
我曾经在一个项目中,用ESP32驱动一个OLED屏幕,怎么调都不显示。折腾了两天,最后发现是GPIO21和GPIO22被I2C占用了,而我恰好把OLED的SDA和SCL接到了这两个引脚上。嗯,从那以后,我每次画板子前都会先查一遍引脚复用表。
这里我列一下常用的GPIO功能分类:
| 功能类型 | 说明 | 典型应用 |
|---|---|---|
| 数字输出 | 输出高/低电平 | 控制LED、继电器 |
| 数字输入 | 读取外部电平 | 按键检测、传感器状态 |
| 模拟输入(ADC) | 读取模拟电压值 | 光敏电阻、电位器 |
| PWM输出 | 输出可调占空比的方波 | 电机调速、LED调光 |
| 中断输入 | 检测电平变化触发中断 | 按键消抖、脉冲计数 |
选型时要注意:不是所有GPIO都支持所有功能。比如ESP32的ADC2引脚,在Wi-Fi开启时就不能用。这种细节,数据手册里写得清清楚楚,但很多人就是不看。
3.3 I2C/SPI/UART:三大通信协议基础
做数据采集,传感器和主控之间怎么通信?说白了就是这三种协议。我一个个讲。
3.3.1 I2C:两线制,多设备
I2C只需要两根线:SDA(数据线)和SCL(时钟线)。所有设备都挂在这两根线上,通过地址来区分。好处是节省引脚,坏处是速度相对慢(标准模式100kHz,快速模式400kHz)。
我在项目中用过I2C接多个传感器:温湿度、气压、光照,全部挂在一组I2C总线上。只要地址不冲突,就能正常工作。但要注意,I2C总线上有上拉电阻,一般4.7kΩ左右。如果距离长了,或者设备多了,上拉电阻要适当调整。
小技巧:
调试I2C时,用示波器看SDA和SCL的波形,比用逻辑分析仪更直观。我习惯先看SCL有没有时钟信号,再看SDA的数据是否完整。如果波形变形严重,八成是上拉电阻的问题。
3.3.2 SPI:四线制,高速率
SPI比I2C快得多,典型速度在10MHz以上。它需要四根线:MOSI(主出从入)、MISO(主入从出)、SCLK(时钟)、CS(片选)。每个从设备需要一个独立的CS引脚。
说白了,SPI就是全双工、高速、但占引脚多。适合接显示屏、SD卡、高速ADC这类设备。我记得有一次做音频采集,用I2C读ADC数据,速度跟不上,换成SPI后问题立刻解决。
SPI的四种模式(CPOL和CPHA的组合)经常让人头疼。我的经验是:先看传感器数据手册里写的模式,然后配置主控的SPI模式与之匹配。如果通信乱码,先检查模式对不对。
3.3.3 UART:异步串行,最经典
UART就是串口,只需要TX和RX两根线。它不需要时钟线,靠双方约定好的波特率来同步。常见的波特率有9600、115200等。
UART最大的优点是简单,几乎所有的MCU都支持。但缺点也很明显:只能点对点通信,不能像I2C那样挂多个设备。而且没有时钟同步,波特率误差超过3%就容易丢数据。
三种协议对比:
| 协议 | 线数 | 速度 | 通信方式 | 典型应用 |
|---|---|---|---|---|
| I2C | 2 | 100kHz-3.4MHz | 半双工 | 传感器、EEPROM |
| SPI | 4+N | 10MHz-80MHz | 全双工 | 显示屏、SD卡、ADC |
| UART | 2 | 9600-921600bps | 全双工 | GPS模块、蓝牙模块 |
3.4 开发板选型建议
选开发板,说白了就是选“够用”的,不是选“最贵”的。我见过有人用STM32H743做温度采集,那简直是杀鸡用牛刀。
这里我按场景给几个建议:
- 入门学习:ESP32-DevKitC 或 STM32F103C8T6(蓝色 pill 板)。便宜、资料多、社区活跃。
- Wi-Fi数据采集:ESP32-WROOM-32 模组。自带Wi-Fi和蓝牙,做MQTT上报最方便。
- 工业级采集:STM32F407VET6 或 STM32F103RCT6。外设丰富,稳定性好,支持CAN总线。
- 低功耗场景:ESP32-S3 或 STM32L4系列。休眠功耗可以做到微安级别。
避坑指南:
我曾经贪便宜买了一批山寨的STM32F103C8T6,结果发现Flash容量只有标称的一半,而且ADC精度差得离谱。从那以后,我买芯片只走正规渠道,或者选国产替代如GD32、AT32,至少质量有保障。
最后说一句:选型没有标准答案。你手里的项目需求、团队技术栈、成本预算,才是决定因素。别盲目跟风,也别过度设计。够用就好,留有余量。
下一章,咱们就正式开始搭建开发环境,写第一行代码了。