4. 传感器原理图设计(上):温湿度传感器(SHT30)电路设计、I2C接口详解

各位同学,欢迎来到第四讲。今天咱们要啃一块硬骨头——温湿度传感器SHT30的电路设计,顺带把I2C接口彻底讲透。

说实话,传感器选型这块,我踩过不少坑。早年做项目图便宜,用过一些国产的温湿度传感器,结果在户外高温高湿环境下,数据飘得跟过山车似的。后来换成SHT30,嗯,稳了。所以这次课程,我直接带大家用这颗业界公认的“小钢炮”。

4.1 SHT30芯片选型与封装

SHT30是Sensirion公司的数字温湿度传感器。精度高、功耗低、体积小。我习惯把它用在农业气象站上,因为它的长期稳定性确实好。

关键参数,我列个表,大家心里有个数:

参数 典型值 备注
温度精度 ±0.3°C 0~65°C范围内
湿度精度 ±2%RH 20~80%RH范围内
工作电压 2.4V ~ 5.5V 推荐3.3V
接口 I2C 标准模式100kHz / 快速模式400kHz
封装 DFN-8 2.5mm x 2.5mm

封装是DFN-8,说白了就是八个脚的贴片封装,很小。焊接的时候要小心,我刚开始手工焊这种封装,总是连锡,后来用热风枪吹,配合助焊剂,才顺手。

4.2 典型电路设计

SHT30的外围电路其实很简单。但简单归简单,细节决定成败。我给大家拆解一下。

4.2.1 电源去耦

芯片的VDD和VSS之间,必须加一个100nF的陶瓷电容。位置要尽量靠近芯片引脚。为什么?因为传感器内部有ADC,瞬间电流变化很快。不加这个电容,你测出来的数据可能会有跳变。

我曾经在一个项目中,为了省一个电容,结果数据每隔几秒就跳一下。排查了两天,最后加上电容,问题解决。嗯,这个坑我替你们踩过了。

推荐电路连接:

  • VDD → 3.3V
  • VSS → GND
  • VDD与VSS之间并联100nF电容(尽量靠近芯片)
  • 可选:再加一个10μF电解电容做低频滤波

4.2.2 I2C上拉电阻

SHT30的SCL和SDA是开漏输出,必须外接上拉电阻。阻值怎么选?我一般用4.7kΩ。如果总线长度超过20cm,或者挂载多个设备,我会降到2.2kΩ。

你想想看,上拉电阻太小,功耗大;太大,信号上升沿变缓,容易出错。农业气象站里,传感器离主控板可能有点距离,所以我建议用2.2kΩ,稳妥。

我的经验: 如果I2C总线上只挂SHT30一个设备,4.7kΩ完全够用。如果还要挂其他传感器(比如风速、光照),建议统一用2.2kΩ。

4.2.3 ADDR引脚配置

SHT30的I2C地址由ADDR引脚决定。接GND时,地址是0x44;接VDD时,地址是0x45。我习惯接GND,因为0x44好记。

注意:如果你在一条I2C总线上挂两个SHT30,一个接GND,一个接VDD,就能区分开了。这个技巧我在做双点温湿度监测时用过。

4.3 I2C接口详解

I2C接口,说白了就是两根线:SCL(时钟)和SDA(数据)。SHT30作为从机,主控器(比如STM32)作为主机。

通信流程,我给大家捋一遍:

  1. 起始条件: SCL高电平时,SDA从高变低。
  2. 发送地址: 7位地址(0x44左移1位=0x88)加读写位(0为写,1为读)。
  3. 等待应答: 从机拉低SDA表示应答。
  4. 发送命令: 比如0x2C(高重复性测量)加0x06。
  5. 等待测量: 约15ms。
  6. 读取数据: 6个字节(温度高8位、温度低8位、CRC、湿度高8位、湿度低8位、CRC)。
  7. 停止条件: SCL高电平时,SDA从低变高。

注意: SHT30的CRC校验是强制性的。我曾经偷懒没做CRC校验,结果在强电磁干扰环境下,读出来的湿度值直接变成负数。从那以后,我再也不敢跳过CRC了。

4.4 代码示例:读取温湿度数据

下面是一段基于STM32 HAL库的读取代码。我简化了,只保留核心逻辑。

// SHT30 I2C地址(ADDR接GND)
#define SHT30_ADDR 0x44

// 发送测量命令(高重复性,时钟拉伸使能)
uint8_t cmd[2] = {0x2C, 0x06};
HAL_I2C_Master_Transmit(&hi2c1, SHT30_ADDR << 1, cmd, 2, 100);

// 等待15ms
HAL_Delay(15);

// 读取6字节数据
uint8_t buf[6];
HAL_I2C_Master_Receive(&hi2c1, SHT30_ADDR << 1, buf, 6, 100);

// 计算温度(单位:°C)
uint16_t temp_raw = (buf[0] << 8) | buf[1];
float temperature = -45.0 + 175.0 * temp_raw / 65535.0;

// 计算湿度(单位:%RH)
uint16_t hum_raw = (buf[3] << 8) | buf[4];
float humidity = 100.0 * hum_raw / 65535.0;

这段代码,说白了就是三步:发命令、等一会儿、读数据。但要注意,CRC校验我没写进去,实际产品中一定要加。我后面会专门讲CRC的实现。

4.5 避坑指南

最后,我把自己在SHT30设计上踩过的坑,总结成几条:

  • 电源纹波: 我曾经用LDO给SHT30供电,但LDO输出纹波偏大,导致湿度读数波动。后来换成低纹波的LDO,问题解决。
  • PCB布局: SHT30的封装底部有散热焊盘,必须接地。我见过有人没接地,结果温度读数偏高2°C。
  • 防潮处理: 农业气象站户外使用,建议在传感器表面涂一层三防漆。但注意,不要堵住传感器开孔。
  • I2C总线电容: 如果传感器离主控板超过30cm,I2C线缆电容会增大。我建议用屏蔽双绞线,并降低上拉电阻到1.5kΩ。

好了,这一讲的内容就到这儿。SHT30的电路设计,说白了就是电源、上拉、地址三个要点。I2C接口,记住起始、地址、数据、停止四个步骤。下一讲,咱们继续搞传感器原理图设计,聊聊光照传感器和风速传感器。

记住,做硬件设计,细节是魔鬼。每一个电容、每一根走线,都可能影响最终的数据质量。别怕麻烦,多测试,多验证。