1. 课程导论与硬件准备:ESP32 I2C外设概览、常用I2C传感器选型与硬件连接

各位同学好,我是你们的老朋友。咱们这门课叫《ESP32 多传感器I2C驱动调试与采集效率调试与故障定位实战》,名字挺长,但说白了就一件事——怎么让ESP32跟多个I2C传感器好好说话,不出错、不丢数据、跑得稳。

我做了十几年嵌入式,踩过的坑比你们吃过的盐还多(笑)。记得刚入行那会儿,调一个I2C温湿度传感器,死活读不到数据,折腾了两天,最后发现是上拉电阻焊错了。嗯,这种低级错误,我希望你们通过这门课,一次都不要犯。

1.1 ESP32 I2C外设概览

ESP32的I2C外设,其实挺强的。它有两个独立的I2C控制器,可以配置成主机模式或从机模式。我们这门课主要用主机模式,也就是ESP32主动去读传感器数据。

几个关键参数,我列个表,你们记一下:

参数 ESP32 I2C能力 我的建议
时钟频率 标准模式 100kHz / 快速模式 400kHz / 高速模式 1MHz+ 多传感器场景建议用100kHz,稳
引脚映射 任意GPIO均可配置为SDA/SCL 避开ADC2引脚,Wi-Fi开启时会有干扰
从机地址 7位地址,支持0x01~0x7F 注意地址冲突,后面会讲
FIFO深度 硬件32字节FIFO 批量读取时效率很高

我个人习惯,在ESP32上做I2C项目,默认用GPIO21做SDA、GPIO22做SCL。为什么?因为这是官方开发板的标准引脚,资料最多,遇到问题也好查。当然,如果你板子布线有特殊要求,可以改,但记得在代码里显式配置,别用默认值。

小技巧: ESP32的I2C驱动在ESP-IDF里叫i2c_master,Arduino环境用Wire库。我个人更推荐ESP-IDF,因为底层控制力更强,调试信息也更丰富。但如果你刚入门,用Arduino也行,咱们课程两种都会讲。

1.2 常用I2C传感器选型

咱们课程选了三个经典传感器,覆盖了温度湿度、姿态角度、光照强度三个常见场景。我为什么选它们?

  • SHT30:温湿度传感器,精度高、功耗低、价格便宜。我在一个农业大棚项目里用过它,连续跑了两年没出过问题。
  • MPU6050:六轴姿态传感器(三轴加速度+三轴陀螺仪)。这玩意儿是航模、平衡车项目的常客。我当年做自平衡小车,就是靠它稳住重心的。
  • BH1750:数字光照强度传感器,直接输出lux值,不用自己算。我帮朋友做智能窗帘项目时用过,效果很稳定。

这三个传感器的I2C地址和供电要求,我整理了一下:

传感器 I2C地址(7位) 工作电压 典型功耗
SHT30 0x44(默认)/ 0x45 2.4V ~ 5.5V 2μA(休眠)
MPU6050 0x68(默认)/ 0x69 2.375V ~ 3.46V 3.5mA(工作)
BH1750 0x23(默认)/ 0x5C 2.4V ~ 3.6V 0.12mA(工作)
注意: MPU6050的供电电压最高只有3.46V!我曾经见过有人直接接5V,结果芯片冒烟了。如果你用3.3V的ESP32开发板,那没问题。但如果你用5V的Arduino,记得加电平转换。

1.3 硬件连接与原理图解读

硬件连接其实不复杂,但有几个关键点,我重点说一下。

首先,I2C总线是开漏结构,所以SDA和SCL线必须接上拉电阻。ESP32内部有弱上拉,但不够用。我建议外部接4.7kΩ上拉电阻到3.3V。如果你接多个传感器,总线电容会增大,上拉电阻可以适当减小到2.2kΩ。

其次,多个传感器是并联在总线上的。SDA连一起,SCL连一起,每个传感器有自己的VCC和GND。地址不能冲突,如果冲突了,需要改地址引脚(比如SHT30的ADDR引脚接VCC或GND来切换地址)。

下面这张图,是我画的一个典型连接方案:

ESP32 多传感器 I2C 总线连接图 ESP32 主控 GPIO21(SDA) / GPIO22(SCL) 4.7kΩ 4.7kΩ 3.3V SHT30 温湿度传感器 地址: 0x44 MPU6050 六轴姿态传感器 地址: 0x68 BH1750 光照强度传感器 地址: 0x23 图例说明 SDA 数据线(实线) SCL 时钟线(虚线) 上拉电阻 4.7kΩ 电源 3.3V

这张图里,三个传感器共用SDA和SCL线,各自独立供电。上拉电阻接在总线靠近ESP32的一端。嗯,这里要注意:上拉电阻的电源必须和传感器逻辑电平一致。我们这里统一用3.3V,所以没问题。

1.4 逻辑分析仪与示波器准备

做I2C调试,光靠串口打印是远远不够的。你想想看,如果I2C通信失败了,你只知道「读不到数据」,但到底是地址错了、时钟没拉起来、还是从机没应答?这时候就需要看波形了。

我个人强烈建议,每个做嵌入式的人手边都要有一台逻辑分析仪。不一定要贵,几十块钱的USB逻辑分析仪就够用。它能帮你看到:

  • 起始条件是否正常(SDA在SCL高电平时下降)
  • 地址字节是否发送正确
  • 从机是否返回ACK
  • 数据字节的时序是否满足要求
  • 停止条件是否完整(SDA在SCL高电平时上升)

示波器呢?如果你有,当然更好。示波器能看到模拟波形,比如信号幅度是否足够、上升沿是否太缓。但示波器贵,而且操作复杂。对于I2C调试,逻辑分析仪是性价比最高的选择。

我的调试工具清单:
  • 逻辑分析仪(24MHz采样率以上,8通道)—— 必备
  • 数字示波器(100MHz带宽以上)—— 推荐,但不是必须
  • 杜邦线若干、面包板一块
  • 万用表(测电压、通断)

我曾经在一个项目里,MPU6050偶尔读不到数据,用逻辑分析仪一抓,发现是SCL线上有毛刺,导致从机误判了时钟周期。后来在SCL上加了一个100pF的小电容滤波,问题就解决了。这种问题,没有逻辑分析仪,你根本想不到。

准备建议: 如果你还没有逻辑分析仪,去某宝搜「USB逻辑分析仪 24MHz」,几十块钱就能买到。配套的软件用Saleae Logic或者PulseView,都挺好用。咱们后面几章会专门讲怎么用逻辑分析仪抓I2C波形。