一,SHT30温湿度传感器核心电路模块解析
模块围绕SHT30数字温湿度传感器搭建,全引脚功能完整引出,适配各类嵌入式主控快速对接。
主控核心单元
完整引出SHT30的VDD供电、GND接地引脚,保障基础供电通路。
引出SDA、SCL标准I2C通信引脚,搭配RST复位引脚、INT中断引脚,覆盖全功能操作需求。
预留ADDR地址配置引脚,支持通过硬件跳线切换传感器I2C地址。
电源滤波单元
配置C1、C2、C3三颗100nF陶瓷滤波电容,就近布置在传感器电源引脚附近。
可有效滤除电源线上的高频杂波干扰,保障传感器供电稳定,避免温湿度采集数据跳变。
I2C总线匹配单元
在SDA、SCL通信线路上分别串联100Ω限流电阻R2、R3,抑制信号过冲。
搭配4.7kΩ上拉电阻R4、R5,完全适配I2C通信协议电气要求。
提升长距离布线下的信号完整性,避免通信丢包、时序异常问题。
地址配置与状态指示单元
预留ADDR跳线帽J1,可快速切换传感器I2C地址(0x44/0x45)。
支持单I2C总线挂载多颗SHT30传感器,拓展多节点采集场景。
增设电源状态指示灯电路,搭配610Ω限流电阻点亮LED1,上电即可直观判断模块供电状态。
对外接口单元
左侧预留6Pin标准排针接口,将VDD、SDA、SCL、GND、INT、RST全功能引脚统一引出。
可直接与STM32、Arduino等各类主控设备快速对接,无需额外飞线改造。
二,代码
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// ===== OLED I2C(用自定义TwoWire,避开Mbed引脚问题)=====
#define OLED_SDA 4
#define OLED_SCL 5
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_I2C_ADDR 0x3C
TwoWire myWire(OLED_SDA, OLED_SCL);
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &myWire, -1);
// ===== SHT30(用默认Wire,A4=SDA, A5=SCL)=====
#define SHT30_ADDR 0x44
float sht30_temp = 0;
float sht30_hum = 0;
// 从SHT30读取一次温湿度(高重复度测量命令 0x2C06)
bool SHT30_Read(float *temp, float *hum) {
Wire.beginTransmission(SHT30_ADDR);
Wire.write(0x2C); // 测量命令高字节
Wire.write(0x06); // 测量命令低字节
if (Wire.endTransmission() != 0) return false;
delay(20); // 等待测量完成
// 请求读取6字节:温度高、温度低、CRC、湿度高、湿度低、CRC
if (Wire.requestFrom(SHT30_ADDR, (uint8_t)6) != 6) return false;
uint8_t data[6];
for (int i = 0; i < 6; i++) data[i] = Wire.read();
// 转换温度
uint16_t t_raw = (data[0] << 8) | data[1];
*temp = ((float)t_raw * 175.0f / 65535.0f) - 45.0f;
// 转换湿度
uint16_t h_raw = (data[3] << 8) | data[4];
*hum = (float)h_raw * 100.0f / 65535.0f;
return true;
}
void setup() {
Serial.begin(115200);
// 初始化SHT30用的I2C(默认Wire,A4/A5)
Wire.begin();
// 初始化OLED用的I2C(自定义引脚)
myWire.begin();
if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_I2C_ADDR)) {
Serial.println("OLED init failed");
while (true);
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("OLED OK");
display.display();
delay(1000);
}
void loop() {
bool ok = SHT30_Read(&sht30_temp, &sht30_hum);
// 串口输出
if (ok) {
Serial.print("Temp: "); Serial.print(sht30_temp, 1);
Serial.print(" C Hum: "); Serial.print(sht30_hum, 0);
Serial.println(" %");
} else {
Serial.println("SHT30 read failed");
}
// OLED显示
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0, 0);
display.println("SHT30 + OLED");
display.setTextSize(2);
display.setCursor(0, 20);
display.print("T:");
display.print(sht30_temp, 1);
display.print("C");
display.setCursor(0, 45);
display.print("H:");
display.print(sht30_hum, 0);
display.print("%");
display.display();
delay(2000);
}三,代码解析
双I2C总线架构设计方案
通过物理隔离两条独立I2C总线,规避单总线设备冲突风险,大幅提升温湿度采集与显示系统的运行稳定性。
默认系统总线(Wire)
专属挂载设备:SHT30数字温湿度传感器
引脚配置说明:AVR/Arduino Uno系列默认复用A4(SDA)、A5(SCL)引脚,ESP32等其他平台需根据硬件原理图确认对应引脚定义
初始化方式:直接调用标准库接口Wire.begin()完成总线启动
自定义独立总线(myWire)
专属挂载设备:OLED显示屏
引脚自定义配置:通过TwoWire myWire(OLED_SDA, OLED_SCL)实例化新I2C对象,指定GPIO 4为SDA、GPIO 5为SCL
初始化方式:调用自定义对象接口myWire.begin()完成总线启动
架构设计核心优势
突破开发板默认I2C引脚的硬件资源限制,灵活适配不同布局的外设接线
将温湿度传感器这类低速率敏感采集设备,与OLED这类高速刷新外设物理隔离,避免总线抢占导致的通信丢包
支持后续在单条总线上扩展多颗同类型外设,无需调整另一条总线的硬件配置
系统初始化流程
全流程按优先级完成硬件资源初始化,配套错误拦截机制避免未就绪硬件引发系统崩溃。
调试链路初始化:启动串口并配置波特率为115200,用于后续运行状态、故障信息的打印输出
双总线依次启动:按顺序完成默认Wire总线、自定义myWire总线的初始化操作,确保两条I2C链路就绪
OLED硬件初始化:调用display.begin(SSD1306_SWITCHCAPVCC, OLED_I2C_ADDR)完成显示屏驱动配置
故障拦截处理:若OLED初始化失败,立即打印错误信息并进入while(true)死循环,阻断后续未就绪的硬件操作
上电自检确认:屏幕成功点亮后打印"OLED OK"字符,直观验证显示功能正常可用
主循环运行逻辑
以2秒为固定采集刷新周期,完成传感器读取、数据输出、屏幕更新全流程操作。
传感器数据采集:调用SHT30_Read函数完成温湿度数据的读取操作
串口状态反馈:读取成功时打印当前温度、湿度实测值;读取失败时输出"SHT30 read failed",快速定位接线或传感器硬件故障
OLED屏幕刷新:
先执行display.clearDisplay()清空显存缓冲区,避免上一帧画面残留
绘制固定标题"SHT30 + OLED",调用setTextSize(2)设置大字号,清晰展示温度(T)、湿度(H)实测数据
最后执行display.display()将缓冲区数据推送至物理屏幕完成画面更新
结合你之前做的SHT30硬件模块设计,这套双总线方案可以直接复用你之前预留的全引脚接口,无需额外修改硬件就能快速完成代码移植。
四,实现效果

我要赚赏金
