这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 分享SHT30温度传感器功能实现

共1条 1/1 1 跳转至

分享SHT30温度传感器功能实现

高工
2026-08-14 11:14:27     打赏

一,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硬件模块设计,这套双总线方案可以直接复用你之前预留的全引脚接口,无需额外修改硬件就能快速完成代码移植。


四,实现效果

image.png







共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]