一、项目任务与模块介绍
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源码,定位到了未初始化变量的低级错误并予以修复。这让我不再盲目迷信第三方库,提升了底层代码的排错自信。
建议
对于后续参与类似传感器采集板项目的同学,我有以下建议:
- 强烈建议保留热隔离槽设计。对于任何接触式或高精度的环境传感器(如温度、气体传感器),PCB上的覆铜和热传导是最大的误差源。
- 初始化顺序要严谨。在Arduino开发中,
Wire.begin()必须放在涉及I2C总线的中断配置(如attachInterrupt())之前,否则极易引发I2C总线死锁。 - 预留硬件地址跳线(如本板的JP1),这在一个总线上需要挂载多个相同传感器的应用场景下非常实用,极大提高了模块的通用性。
总体而言,这次项目让我完整体验了一个传感器模块从原理图、热力学PCBLayout到深层软件除错的全过程。最后再次感谢Digikey和硬禾科技联合举办的2026 Make Blocks 第二季活动,祝硬禾的活动越办越好!