基于STM32与SHT30的温湿度传感器模块设计

一、核心结论

基于STM32与SHT30的温湿度传感器模块是低成本、高精度、易集成的环境监测解决方案,适用于智能家居、工业控制、农业大棚等场景。SHT30作为新一代数字温湿度传感器,采用I2C接口(支持标准/快速模式),具备±0.2℃温度精度±2%RH湿度精度,配合STM32的低功耗特性(如STM32L0系列)和丰富外设(I2C、ADC、定时器),可实现实时温湿度监测、数据记录、超限报警等功能。

关键优势

  • 高精度:温度±0.2℃(0-60℃),湿度±2%RH(20-80%RH);

  • 低功耗:SHT30待机电流0.2μA,STM32休眠模式电流<1μA;

  • 易扩展:I2C接口支持多设备并联(最多112个从机),可集成其他I2C传感器(如光照、气压)。

二、硬件设计

1. SHT30传感器模块介绍

  • 核心参数

    • 测量范围:温度-40125℃,湿度0100%RH;

    • 接口:I2C(地址0x44/0x45,默认0x44,ADDR引脚接VCC时0x45);

    • 供电:2.4~5.5V DC(推荐3.3V);

    • 封装:DFN-8(2.5×2.5×0.9mm),适合紧凑设计。

  • 工作原理:采用CMOSens®技术,集成电容式湿度传感器和带隙温度传感器,通过I2C输出数字信号(含CRC校验)。

2. 电路连接(STM32与SHT30)

(1)硬件清单

  • STM32微控制器(如STM32F103C8T6、STM32L051C8T6);

  • SHT30模块(如Adafruit SHT31-D Breakout);

  • 电源:3.3V DC(STM32与SHT30共电源);

  • 上拉电阻:I2C总线需4.7kΩ上拉电阻(SDA、SCL引脚);

  • 杜邦线、面包板(原型验证)或PCB(量产)。

(2)接线示意图

SHT30引脚 功能 STM32引脚 说明
VCC 电源正极 3.3V 供电范围2.4~5.5V
GND 电源负极 GND 共地
SDA I2C数据线 PB7(I2C1_SDA) 需4.7kΩ上拉电阻
SCL I2C时钟线 PB6(I2C1_SCL) 需4.7kΩ上拉电阻
ADDR 地址选择 悬空(默认0x44) 接VCC时地址0x45

(3)电路原理图

+3.3V ────┬───── VCC (SHT30)  
         │  
         ├─ 4.7kΩ ─── SDA (SHT30) ─── PB7 (STM32)  
         │  
         ├─ 4.7kΩ ─── SCL (SHT30) ─── PB6 (STM32)  
         │  
GND ─────┴───── GND (SHT30)

三、软件实现(基于STM32 HAL库)

1. 开发环境

  • IDE:STM32CubeIDE(免费,集成HAL库);

  • 固件库:STM32CubeMX(配置外设)、HAL库(I2C、GPIO驱动);

  • 调试工具:ST-Link V2(程序下载与调试)。

2. 核心代码实现

(1)I2C初始化(STM32CubeMX配置)

  • 打开STM32CubeMX,选择目标芯片(如STM32F103C8T6);

  • 配置I2C1:模式为“I2C”,速度“标准模式(100kHz)”;

  • 配置GPIO:PB6(SCL)、PB7(SDA)为“Alternate Function Open Drain”,上拉使能;

  • 生成代码(MDK-ARM或STM32CubeIDE工程)。

(2)SHT30驱动代码(HAL库)

#include "stm32f1xx_hal.h"

// SHT30 I2C地址(默认0x44,ADDR接GND)
#define SHT30_ADDR 0x44 << 1  // I2C地址需左移1位(7位地址+1位读写位)

// SHT30命令码(单次测量,高精度模式,时钟拉伸关闭)
#define SHT30_MEAS_CMD 0x2C06  

I2C_HandleTypeDef hi2c1;  // I2C句柄(由CubeMX生成)

// SHT30初始化
void SHT30_Init(I2C_HandleTypeDef *hi2c) {
  // 检查设备是否存在(发送空读)
  uint8_t dummy;
  HAL_I2C_Master_Transmit(hi2c, SHT30_ADDR, &dummy, 0, 100);
  if (HAL_I2C_GetError(hi2c) != HAL_I2C_ERROR_NONE) {
    Error_Handler();  // 设备未响应,进入错误处理
  }
}

// 读取温湿度数据(返回0成功,-1失败)
int SHT30_ReadData(I2C_HandleTypeDef *hi2c, float *temp, float *humi) {
  uint8_t cmd[2] = {0x2C, 0x06};  // 单次测量命令(高重复率,时钟拉伸关闭)
  uint8_t data[6];  // 接收数据:温度(2)+CRC(1) + 湿度(2)+CRC(1)
  uint16_t raw_temp, raw_humi;
  uint8_t crc_temp, crc_humi;

  // 发送测量命令
  if (HAL_I2C_Master_Transmit(hi2c, SHT30_ADDR, cmd, 2, 100) != HAL_OK) {
    return -1;  // 发送失败
  }

  // 等待测量完成(高精度模式约15ms)
  HAL_Delay(15);

  // 读取6字节数据
  if (HAL_I2C_Master_Receive(hi2c, SHT30_ADDR, data, 6, 100) != HAL_OK) {
    return -1;  // 接收失败
  }

  // 解析数据(大端模式)
  raw_temp = (data[0] << 8) | data[1];
  crc_temp = data[2];
  raw_humi = (data[3] << 8) | data[4];
  crc_humi = data[5];

  // CRC校验(多项式0x31,初始值0xFF)
  if (CRC8_Check(raw_temp, crc_temp) != 0 || CRC8_Check(raw_humi, crc_humi) != 0) {
    return -1;  // CRC校验失败
  }

  // 转换为实际值(公式见SHT30 datasheet)
  *temp = -45 + 175 * (raw_temp / 65535.0f);  // 温度:-45~130℃
  *humi = 100 * (raw_humi / 65535.0f);         // 湿度:0~100%RH

  return 0;
}

// CRC8校验函数(多项式0x31,初始值0xFF)
uint8_t CRC8_Check(uint16_t data, uint8_t crc_expected) {
  uint8_t crc = 0xFF;
  uint8_t data_arr[2] = {(uint8_t)(data >> 8), (uint8_t)data};

  for (int i = 0; i < 2; i++) {
    crc ^= data_arr[i];
    for (int j = 0; j < 8; j++) {
      if (crc & 0x80) crc = (crc << 1) ^ 0x31;
      else crc <<= 1;
    }
  }
  return (crc == crc_expected) ? 0 : 1;
}

(3)主函数(数据读取与显示)

int main(void) {
  HAL_Init();
  SystemClock_Config();  // 系统时钟配置(由CubeMX生成)
  MX_I2C1_Init();        // I2C1初始化(由CubeMX生成)

  SHT30_Init(&hi2c1);    // 初始化SHT30
  float temp, humi;

  while (1) {
    if (SHT30_ReadData(&hi2c1, &temp, &humi) == 0) {
      // 打印数据(通过串口或LCD)
      printf("Temp: %.2f℃, Humi: %.2f%%RH\r\n", temp, humi);
      
      // 超限报警(示例:温度>30℃或湿度>70%RH)
      if (temp > 30 || humi > 70) {
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);  // 点亮报警LED
      } else {
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
      }
    } else {
      printf("SHT30 Read Failed!\r\n");
    }
    HAL_Delay(1000);  // 1秒读取一次
  }
}

参考代码 基于STM32&SHT30 温湿度传感器模块(原理图+PCB源文件+程序源码) www.youwenfan.com/contentcns/160774.html

四、数据处理与优化

1. 数据转换公式

SHT30返回的16位原始数据需转换为实际温湿度:

  • 温度(℃)\(T=−45+175×\frac{S_T}{2^{16}−1}\)

  • 湿度(%RH)\(RH=100×\frac{S_RH}{2^{16}−1}\)

    \(S_T\)\(S_RH\)为原始数据,范围0~65535)

2. CRC校验

SHT30的每个数据包(温度/湿度)后附带1字节CRC校验码,多项式为0x31(x⁸+x⁵+x⁴+1),初始值0xFF。代码中需实现CRC8校验函数(如上例),确保数据正确性。

3. 低功耗优化

  • STM32休眠模式:读取间隔设为10秒(而非1秒),其余时间进入Stop模式(电流<1μA);

  • SHT30周期测量:发送周期测量命令(如0x2236,每秒测量1次),STM32仅在测量完成后唤醒读取数据;

  • 关闭未用外设:禁用ADC、定时器等未用模块,降低功耗。

五、应用案例

1. 智能家居环境监测

  • 场景:客厅温湿度监测,联动空调/加湿器;

  • 实现:STM32读取SHT30数据,通过Wi-Fi模块(如ESP8266)上传至云平台(如阿里云),手机APP实时显示并设置阈值(如温度26℃自动开空调)。

2. 农业大棚精准调控

  • 场景:大棚温湿度监测,控制风机/喷淋系统;

  • 实现:STM32读取数据后,通过LoRa模块(如SX1278)发送至网关,网关根据阈值(如湿度<60%启动喷淋)控制执行器。

3. 工业设备状态监控

  • 场景:机房温湿度监测,防止设备过热/受潮;

  • 实现:STM32将数据存入EEPROM(掉电保存),异常时通过短信模块(如SIM800L)发送报警短信至管理员。

六、常见问题与解决

  1. I2C通信失败

    • 检查接线(SDA/SCL是否接反)、上拉电阻(是否焊接);

    • 确认SHT30地址(ADDR引脚电平是否正确);

    • 降低I2C速率(尝试100kHz或10kHz)。

  2. 数据跳变

    • 远离热源/冷源(如阳光直射、空调出风口);

    • 增加软件滤波(如滑动平均滤波:filtered_temp = 0.8*prev_temp + 0.2*curr_temp)。

  3. CRC校验错误

    • 检查CRC函数实现(多项式、初始值是否正确);

    • 缩短I2C线长(<50cm),减少电磁干扰。

七、总结

基于STM32与SHT30的温湿度传感器模块通过I2C接口实现高精度环境监测,硬件设计简单(仅需4根线),软件实现基于HAL库(易上手),适用于多种场景。通过优化功耗(休眠模式、周期测量)和数据校验(CRC),可进一步提升系统稳定性和续航能力。

posted @ 2026-03-29 15:28  小前端攻城狮  阅读(45)  评论(0)    收藏  举报