2026 Make Blocks #2阶段2 - SHT30温度/环境传感器采集模块
该项目使用了SHT30温湿度传感器芯片,实现了温湿度传感器模块的设计,它的主要功能为:支持标准 I2C 通信接口,非常适合单片机感知环境温湿度。
标签
温湿度传感器
SHT30
Make Blocks
枫雪天
更新2026-06-01
54

一、项目任务与模块介绍

1.1 所选任务

本项目选择的任务是SHT30温度/环境传感器采集模块的设计与验证。目标是设计一块基于SHT30芯片的小型传感器采集板,通过标准I2C接口与主控MCU通信,为嵌入式系统提供高精度的温度和相对湿度数据。除了基本的温湿度读取功能外,项目还要求验证该传感器芯片的INT(Alert报警)引脚功能——通过设定温湿度阈值,当环境参数越限时由硬件自动触发中断信号,这也是本模块设计区别于市面上普通温湿度模块的特色之一。

1.2 硬件与功能简介

1.2.1 任务目标模块:SHT30温度/环境传感器采集模块

SHT30-DIS是Sensirion出品的一款数字温湿度传感器芯片,采用DFN-8封装,模块主要特性如下(参考原理图标注):

  • 工作电压:2.15V ~ 5.5V,完美兼容3.3V和5V控制系统
  • 工作电流:<1.5mA,适合低功耗应用
  • 测量精度:温度精度±0.2°C,湿度精度±2%RH(注:此处按原理图高配指标标注)
  • 测量范围:温度 -40 to 125°C,湿度 0-100%RH
  • 通信接口:标准I2C,Breakout 2.54mm-6Pin排针引出
  • INT引脚:即数据手册中的Alert报警引脚,可编程温湿度上下限阈值,支持硬件中断
  • 外形尺寸:19mm × 16mm,小巧紧凑,带2mm安装孔

本模块将I2C信号(SDA、SCL)、INT报警引脚、RST复位引脚以及电源通过6Pin排针引出,方便与Arduino等主控板通过杜邦线连接测试。

1.2.2 主控Arduino UNO开发板 + 接口扩展板

  • 主控ATmega328
  • 接口2.54mm排针


二、设计思路与选型

2.1 设计框图

整个系统的工作框架如下:

┌─────────────────┐         杜邦线      ┌──────────────────────┐
│ Arduino Uno │ SDA / SCL │ SHT30 Sensor Module │
│ 开发板 │◄───────────────────►│ │
│ │ INT(Alert) │ SHT30-DIS │
│ (Arduino IDE) │◄────────────────────│ + 镂空隔热PCB设计 │
│ │ RST / VCC / GND │ + I2C与地址配置电阻 │
└─────────────────┘ └──────────────────────┘

│ USB串口

PC 串口调试助手(查看测试结果)

2.2 选型说明

主控芯片选用Arduino Uno开发板,原因是其硬件I2C接口成熟稳定、Arduino框架便于快速开发,且D2引脚支持外部中断,正好用于接收INT(Alert)信号。

传感器芯片选用Sensirion SHT30-DIS。选型过程中曾对比了多款传感器,最终选择SHT30的原因如下:

型号

精度(温/湿)

接口

Alert/INT功能

封装尺寸

单价参考

DHT11

±2°C / ±5%RH

单总线

✗ 无

插件封装

AHT20

±0.3°C / ±2%RH

I2C

✗ 无

4×5mm

SHT30-DIS

±0.2°C / ±2%RH

I2C

✓ 有

2.5×2.5mm

SHT40

±0.2°C / ±1.8%RH

I2C

✗ 无

1.5×1.5mm

DHT11精度较低且无I2C,AHT20和SHT40缺少硬件报警引脚。综合考虑精度、功能完整性,SHT30-DIS是满足本项目所有需求的最佳选择

这里有一个重要的调试经验:SHT30的INT(Alert)功能仅在周期测量模式下工作,单次触发模式下传感器不会进行阈值比较。我在最初调试时使用单次读取函数,INT引脚毫无反应。查阅数据手册后才发现这一限制,切换为周期测量模式后,中断功能立即正常工作。

被动元件方面,根据原理图设计,I2C总线的SCL和SDA线各串接一颗10kΩ上拉电阻(R1、R2)至VDD。地址线ADDR通过R3(1MΩ)弱上拉至VDD(默认地址0x45),并预留了JP1跳线以供短接至GND(地址0x44)。电源和复位引脚分别配置了C2、C1(均为100nF)滤波电容。


三、原理图与PCB设计

3.1 原理图

原理图设计规范严谨,核心为SHT30芯片(U1),通过6Pin排针座(H1)引出。电路要点如下:

  • 引脚分配:H1排针依次为VDD、GND、SCL、SDA、INT、RST
  • I2C与上拉:R1(10kΩ)、R2(10kΩ)保障了SCL/SDA的I2C总线稳定性
  • 硬件地址配置:巧妙利用R3(1MΩ)上拉和JP1短接点的配合。不焊JP1时地址为0x45,短接JP1时地址为0x44,灵活性极高
  • 退耦与滤波:VDD网络通过C2(100nF)退耦,RST硬件复位引脚通过C1(100nF)滤波防误触发

3.2 PCB设计

PCB设计图

3D效果

PCB采用双层板设计,尺寸为极凑的19mm×16mm。本设计的最大亮点在于优秀的热力学设计

  • U型镂空隔热槽:这是本板最专业的细节。PCB中央放置DFN8封装的SHT30芯片,四周切割了贯穿板厚的镂空槽。这能最大程度切断排针(外部热源)和PCB覆铜传导过来的热量,保证传感器测量的是纯粹的空气环境温度,极大提高了响应速度和准确性。
  • 清晰的丝印标注:正面印有"SHT30 Digital Temperature Humidity V2.0",排针处清晰标注了GND、SCL、SDA、INT、RST,且GND丝印做了高亮反白处理,防呆设计出色。
  • 布局合理:阻容元件(C1/C2, R1/R2/R3)均匀分布在镂空槽外侧,不干扰中心传感器的气流交换。右侧预留了标准的2mm安装孔(间距15mm),方便结构固定。


四、调试软件与关键代码

4.1 开发环境

软件开发使用Arduino IDE 2.3.5,选择Arduino Uno作为目标板,通过USB串口进行程序烧录和调试输出。主要使用了以下库:

  • Wire.h:硬件I2C驱动
  • ClosedCube_SHT31D.h:支持SHT3x系列的第三方库,封装了周期测量、Alert阈值读写等功能。

在使用该库时,我发现其源码存在一个Bug:readTemperatureAndHumidity()内部的error变量未初始化即参与判断,导致AVR平台上频发16358错误码。通过修改库文件ClosedCube_SHT31D.cpp,将SHT31D_ErrorCode error;修正为SHT31D_ErrorCode error = SHT3XD_NO_ERROR;后,通信恢复绝对稳定。

4.2 关键代码片段

测试程序采用模块化设计,在setup()中必须严格遵循先初始化I2C、再配置中断的顺序,否则会导致总线死锁:

void setup() {
Serial.begin(115200);
while (!Serial);

// 0. RST硬件复位引脚处理 (设为高电平使其正常工作)
pinMode(PIN_RST, OUTPUT);
digitalWrite(PIN_RST, HIGH);

// 1. 先初始化I2C
Wire.begin();
sht30.begin(0x45); // 对应原理图R3上拉的默认地址
delay(50);

// 2. 软复位 + 清除状态
sht30.softReset();
delay(100);
sht30.clearAll();

// 3. 配置INT(Alert)引脚中断
pinMode(PIN_INT, INPUT); // 推挽输出,无需外部上拉
attachInterrupt(digitalPinToInterrupt(PIN_INT), onAlertISR, RISING);

// 4. 写入报警阈值
sht30.writeAlertHigh(31.0, 29.0, 80.0, 78.0);
sht30.writeAlertLow(22.0, 20.0, 22.0, 20.0);

// 5. 启动周期测量模式(INT引脚仅在此模式下生效)
sht30.periodicStart(SHT3XD_REPEATABILITY_HIGH, SHT3XD_FREQUENCY_1HZ);
}

INT硬件中断处理是本项目的核心。当环境参数越过阈值时,SHT30硬件将INT引脚拉高,触发MCU的RISING中断:

volatile bool alertTriggered = false;

void onAlertISR() {
alertTriggered = true; // 仅置标志位,不在ISR中执行耗时操作
}

void loop() {
SHT31D data = sht30.periodicFetchData(); // 获取1Hz周期数据

if (alertTriggered) {
alertTriggered = false;
Serial.println("!! HARDWARE INT TRIGGERED !!");

// 读取状态寄存器确认是温度还是湿度报警
SHT31D_RegisterStatus status = sht30.readStatusRegister();
Serial.print(" T_Alert : ");
Serial.println(status.T_TrackingAlert ? "YES" : "NO");
}
delay(1000);
}

这里需要注意,数据手册中明确指示Alert引脚在条件满足时拉高(switches high),因此必须配置为RISING边缘触发,且无需软件开启上拉电阻。


五、功能展示

5.1 实物与测试环境

实物PCB

模块与主控连接

测试硬件环境搭建如下:

  • Arduino Uno开发板:作为I2C主机,通过A4(SDA)、A5(SCL)、D2(INT)连接模块
  • 杜邦线:6根杜邦线连接模块,VDD接3.3V/5V,GND接GND,INT接D2
  • 热源模拟:使用手指触摸模块中心隔离区的传感器本体,模拟温度快速上升触发报警

5.2 串口测试输出

通过串口调试助手可以看到完整的测试过程验证:

  • 初始化阶段:读取芯片ID正常,阈值设置成功。高限Set=31.0°C,Clear=29.0°C。
  • 常规监测
    [ 10s] T=26.50C RH=55.20% | INT=LOW
    [ 11s] T=26.52C RH=55.25% | INT=LOW
  • 硬件报警触发:(用手捂住传感器后)
    [ 15s] T=31.10C RH=68.50% | INT=HIGH
    !! HARDWARE INT TRIGGERED !!
    T_Alert : YES
  • 报警解除:(松开手,温度降至Clear阈值29.0°C以下)
    INT引脚自动恢复为LOW电平,体现了硬件滞回特性的稳定消抖。


软件截图1:初始化日志

软件截图2:温度告警日志


六、心得体会

收获

本次项目虽然只是一个温湿度模块的设计,但在软硬件结合的完整闭环中,我收获了极其宝贵的实战经验。

第一,PCB热力学设计的重要性。 在画板阶段,为传感器四周添加U型镂空槽是极其明智的选择。空气本身是热的不良导体,镂空设计直接切断了排针焊接时和工作时主板带来的热传导,确保了SHT30反映的是真实的环境温度。这种在细节处见真章的硬件设计规范,比单纯连通线路更有价值。

第二,仔细研读Datasheet能少走很多弯路。 SHT30的INT(Alert)功能仅在"周期测量模式"下工作的限制,以及INT引脚"高电平触发"的极性,都是写在手册角落里的关键信息。我最初想当然地用单次读取+下降沿触发去调试,浪费了一些时间。

第三,培养了排查开源库Bug的能力。 遇到AVR平台上周期性报16358错误时,通过单步追溯ClosedCube_SHT31D源码,定位到了未初始化变量的低级错误并予以修复。这让我不再盲目迷信第三方库,提升了底层代码的排错自信。

建议

对于后续参与类似传感器采集板项目的同学,我有以下建议:

  1. 强烈建议保留热隔离槽设计。对于任何接触式或高精度的环境传感器(如温度、气体传感器),PCB上的覆铜和热传导是最大的误差源。
  2. 初始化顺序要严谨。在Arduino开发中,Wire.begin()必须放在涉及I2C总线的中断配置(如attachInterrupt())之前,否则极易引发I2C总线死锁。
  3. 预留硬件地址跳线(如本板的JP1),这在一个总线上需要挂载多个相同传感器的应用场景下非常实用,极大提高了模块的通用性。

总体而言,这次项目让我完整体验了一个传感器模块从原理图、热力学PCBLayout到深层软件除错的全过程。最后再次感谢Digikey和硬禾科技联合举办的2026 Make Blocks 第二季活动,祝硬禾的活动越办越好!

附件下载
SchematicP1.schdoc
原理图
PCB.pcbdoc
PCB设计图
SHT30_Alarm_I2C_UNO.ino
测试代码
团队介绍
个人
团队成员
枫雪天
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号