0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

零知开源——STM32F407VET6驱动SHT41温湿度传感器完整教程

零知实验室 来源:PCB56242069 作者:PCB56242069 2025-07-09 18:53 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

​✔零知开源是一个真正属于国人自己的开源软硬件平台,在开发效率上超越了Arduino平台并且更加容易上手,大大降低了开发难度。零知开源在软件方面提供了完整的学习教程和丰富示例代码,让不懂程序的工程师也能非常轻而易举的搭建电路来创作产品,测试产品。快来动手试试吧!

✔访问零知开源平台,获取更多实战项目和教程资源吧!

项目概述

本项目基于STM32F407VET6零知增强板,实现SHT41高精度湿度传感器的驱动和数据采集。SHT41是Sensirion推出的新一代数字温湿度传感器,具有±0.2°C的温度精度和±1.8%RH的湿度精度,采用I2C接口通信。本教程将展示如何通过STM32F407的硬件I2C接口驱动SHT41,并实现实时温湿度数据的采集与显示。

一、硬件连接

1.1 硬件清单

>主控芯片:STM32F407VET6零知增强板

>传感器SHT41温湿度传感器(I2C地址:0x44)

>杜邦线若干

1.2 接线硬件表

SHT41引脚 零知增强板引脚 功能说明
VCC 3.3V 电源正极
GND GND 电源地
SCL 21/SCL I2C时钟线
SDA 20/SDA I2C数据线

注意:I2C总线需要4.7kΩ上拉电阻(开发板通常已内置)

1.3 接线实物图

wKgZO2huSbeAB7VbAAb2le_lNfA966.png

二、软件环境配置

2.1 安装开发工具

零知IDE 3.8.0

选择开发板零知增强板

2.2 依赖库

Adafruit SHT4x Library

Adafruit_I2CDevice

Adafruit BusIO

三、核心代码实现

3.1 零知IDE代码驱动

#include "Adafruit_SHT4x.h"
Adafruit_SHT4x sht4 = Adafruit_SHT4x();

void setup() {
  Serial.begin(115200);
  while (!Serial) delay(10);  // 等待串口初始化

  // 初始化传感器
  if (!sht4.begin()) {
    Serial.println("Sensor not found!");
    while (1) delay(1);
  }
  
  // 设置高精度模式
  sht4.setPrecision(SHT4X_HIGH_PRECISION);
  // 关闭加热器(节能模式)
  sht4.setHeater(SHT4X_NO_HEATER);
}

void loop() {
  sensors_event_t humidity, temp;
  sht4.getEvent(&humidity, &temp);  // 读取数据

  Serial.print("Temperature: "); 
  Serial.print(temp.temperature); 
  Serial.println(" ℃");
  
  Serial.print("Humidity: "); 
  Serial.print(humidity.relative_humidity); 
  Serial.println("% rH");
  delay(1000);  // 每秒读取一次
}

3.2核心库函数解析

3.2.1Adafruit_SHT4x库

bool Adafruit_SHT4x::begin(TwoWire *theWire) {
  i2c_dev = new Adafruit_I2CDevice(SHT4x_DEFAULT_ADDR, theWire);
  if (!i2c_dev->begin()) return false;
  return reset(); // 发送复位命令
}

功能:初始化I2C通信并复位传感器

参数:I2C接口指针(默认使用Wire)

返回值:初始化成功返回true,失败返回false

bool Adafruit_SHT4x::getEvent(sensors_event_t *humidity, 
                              sensors_event_t *temp) {
  // 根据精度和加热器设置选择命令
  uint8_t cmd = SHT4x_NOHEAT_HIGHPRECISION; 
  uint16_t duration = 10;
  
  // 发送测量命令
  if (!i2c_dev->write(&cmd, 1)) return false;
  
  delay(duration); // 等待测量完成
  
  // 读取6字节数据(温度+CRC, 湿度+CRC)
  uint8_t readbuffer[6];
  if (!i2c_dev->read(readbuffer, 6)) return false;
  
  // CRC校验
  if (readbuffer[2] != crc8(readbuffer, 2) ||
      readbuffer[5] != crc8(readbuffer + 3, 2)) 
    return false;
  
  // 原始数据转换
  uint16_t temp_raw = (readbuffer[0] < < 8) | readbuffer[1];
  uint16_t hum_raw = (readbuffer[3] < < 8) | readbuffer[4];
  
  // 转换为实际值
  _temperature = -45 + 175 * temp_raw / 65535.0;
  _humidity = -6 + 125 * hum_raw / 65535.0;
  
  // 填充传感器事件
  if (temp) fillTempEvent(temp, millis());
  if (humidity) fillHumidityEvent(humidity, millis());
  return true;
}

功能:获取温湿度数据并填充到事件结构体

参数:指向温湿度事件结构体的指针

返回值:成功返回true,失败返回false

static uint8_t crc8(const uint8_t *data, int len) {
  const uint8_t POLYNOMIAL(0x31);
  uint8_t crc(0xFF);
  
  for (int j = len; j; --j) {
    crc ^= *data++;
    for (int i = 8; i; --i) {
      crc = (crc & 0x80) ? (crc < < 1) ^ POLYNOMIAL : (crc < < 1);
    }
  }
  return crc;
}

功能:计算CRC8校验码

参数:数据指针和长度

返回值:CRC8校验值

3.2.2Adafruit_Sensor库

void Adafruit_SHT4x::fillTempEvent(sensors_event_t *temp, uint32_t timestamp) {
  memset(temp, 0, sizeof(sensors_event_t));
  temp->version = sizeof(sensors_event_t);
  temp->sensor_id = _sensorid_temp;
  temp->type = SENSOR_TYPE_AMBIENT_TEMPERATURE;
  temp->timestamp = timestamp;
  temp->temperature = _temperature;
}

功能:填充温度事件结构体

参数:

temp:目标结构体指针
timestamp:时间戳

void Adafruit_SHT4x::fillHumidityEvent(sensors_event_t *humidity, 
                                      uint32_t timestamp) {
  memset(humidity, 0, sizeof(sensors_event_t));
  humidity->version = sizeof(sensors_event_t);
  humidity->sensor_id = _sensorid_humidity;
  humidity->type = SENSOR_TYPE_RELATIVE_HUMIDITY;
  humidity->timestamp = timestamp;
  humidity->relative_humidity = _humidity;
}

功能:填充湿度事件结构体

参数:

humidity:目标结构体指针
timestamp:时间戳

3.2.3Adafruit_I2CDevice库

bool Adafruit_I2CDevice::write_then_read(const uint8_t *write_buffer,
                                        size_t write_len, 
                                        uint8_t *read_buffer,
                                        size_t read_len, 
                                        bool stop) {
  if (!write(write_buffer, write_len, stop)) {
    return false;
  }
  return read(read_buffer, read_len);
}

功能:先写后读的I2C操作(常用模式)
参数:

write_buffer:写入数据缓冲区

write_len:写入数据长度

read_buffer:读取数据缓冲区

read_len:读取数据长度

stop:是否在写操作后发送停止条件

bool Adafruit_I2CDevice::read(uint8_t *buffer, size_t len, bool stop) {
  size_t pos = 0;
  while (pos < len) {
    size_t read_len = min(len - pos, _maxBufferSize);
    bool read_stop = (pos + read_len >= len) ? stop : false;
    
    if (!_read(buffer + pos, read_len, read_stop))
      return false;
    
    pos += read_len;
  }
  return true;
}

功能:从I2C设备读取数据
参数:

buffer:数据缓冲区

len:读取长度

stop:是否发送停止条件

四、常见问题解答

Q1:编译时报错"Adafruit_SHT4x.h: No such file or directory"

A:解决方法

检查是否安装了依赖库(Adafruit BusIO)

Q2:传感器检测失败("Couldn't find SHT4x")

A:排查步骤

检查硬件连接(VCC、GND、SCL、SDA)

确认I2C地址正确(SHT41默认为0x44)

使用I2C扫描工具确认设备地址

检查上拉电阻(4.7kΩ)

Q3:数据读取不稳定或CRC校验失败

A:解决方案

降低I2C时钟速度

缩短I2C总线长度

尝试不同的精度模式

Q4:如何提高测量精度?

A:优化方法

使用高精度模式:sht4.setPrecision(SHT4X_HIGH_PRECISION)

启用加热器:sht4.setHeater(SHT4X_MED_HEATER_100MS)

避免传感器暴露在气流中

五、结果显示

成功运行后,串口监视器将输出以下格式的数据:

wKgZO2huSWSAMVpHAAMcxHCKsEo199.png

资源链接

SHT41数据手册

STM32F407VET6参考手册

Adafruit SHT4x库GitHub

通过本教程,开发者可以快速构建稳定可靠的环境监测系统,点击了解更多零知开发教程:

https://www.lingzhilab.com/freesources.html

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • I2C
    I2C
    +关注

    关注

    28

    文章

    1547

    浏览量

    130446
  • 温湿度传感器

    关注

    6

    文章

    627

    浏览量

    37351
  • STM32F4
    +关注

    关注

    3

    文章

    204

    浏览量

    29815
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    SHT3x系列温湿度传感器驱动设计与实现

    在我们的产品中经常会遇到温湿度检测的需求。可以用于检测温湿度传感器元件也有很多。我们经常使用的SHT各系列数字温湿度
    发表于 12-12 15:14 4379次阅读
    <b class='flag-5'>SHT</b>3x系列<b class='flag-5'>温湿度</b><b class='flag-5'>传感器</b>的<b class='flag-5'>驱动</b>设计与实现

    SHT1x系列温湿度传感器驱动设计与实现

    在我们的产品中,经常需要检测温湿度数据。有很多检测温湿度的方法和模块,其中SHT1x系列温湿度传感器就是一种成本较低使用方便的
    发表于 12-14 14:11 2355次阅读
    <b class='flag-5'>SHT</b>1x系列<b class='flag-5'>温湿度</b><b class='flag-5'>传感器</b>的<b class='flag-5'>驱动</b>设计与实现

    STM32F407VET6STM32F407IET6有什么区别?

    STM32F407VET6STM32F407IET6,除了引脚上数量不同之外,还有什么区别吗? 我的CAN驱动,在STM32F407VET6可正常运行。在
    发表于 07-03 07:06

    开源——STM32F407VET6驱动SHT41温湿度传感器完整教程

    目基于STM32F407VET6增强板,实现SHT41高精度温湿度传感器
    发表于 07-10 12:01

    sht10温湿度传感器驱动

    本帖最后由 jafybestwish 于 2014-10-6 10:00 编辑 sht10温湿度传感器驱动,提供
    发表于 10-06 09:57

    开源分享-温湿度模块DHT11的使用

    、核心代码// DHT11温湿度传感器demo演示 #include "dht11.h" //使用DHT11DHT sensor; void setup
    发表于 05-13 17:32

    基于SHT11温湿度传感器和单片机技术的智能温湿度测量系统

    研究了基于SHT11温湿度传感器和单片机技术的智能温湿度测量系统。系统使用SHT11温湿度
    发表于 04-27 06:34

    SHT10温湿度传感器是如何进行通信的

    怎样去调试STM32F103ZET6及外围传感器呢?SHT10温湿度传感器是如何进行通信的?
    发表于 11-11 06:42

    温湿度传感器如何驱动SHT85单片机STM32 HAL库?

    温湿度传感器如何驱动SHT85单片机STM32 HAL库?
    发表于 02-07 07:46

    STM32F407VET6数据手册

    STM32F407VET6数据手册。
    发表于 04-13 14:10 642次下载

    DHT22+数字温湿度传感器+AM2302+温湿度模块+取代SHT11+SHT15

    DHT22+数字温湿度传感器+AM2302+温湿度模块+取代SHT11+SHT15
    发表于 11-22 19:22 56次下载

    基于STM32F407VET6的CS1237驱动程序

    基于STM32F407VET6的CS1237驱动程序,亲测可用,欢迎大家一起交流
    发表于 08-28 11:22 202次下载

    STM32F407VET6

    STM32F407VET6规格书
    发表于 02-07 15:59 103次下载

    stm32f407vet6原理介绍

    STM32F407VET6是一款基于ARM Cortex-M4内核的高性能微控制,由STMicroelectronics公司生产。它具有丰富的外设和功能,广泛应用于各种嵌入式系统开发。本文将介绍
    的头像 发表于 01-03 16:49 1.5w次阅读
    <b class='flag-5'>stm32f407vet6</b>原理介绍

    开源——基于STM32F407VET6增强板的四路独立计时

    本教程介绍基于STM32F407VET6增强板的四路独立计时实现方案。项目采用TFT显示屏、蜂鸣器和按钮构建交互系统,支持各计时独立
    的头像 发表于 07-01 10:13 862次阅读
    <b class='flag-5'>零</b><b class='flag-5'>知</b><b class='flag-5'>开源</b>——基于<b class='flag-5'>STM32F407VET6</b><b class='flag-5'>零</b><b class='flag-5'>知</b>增强板的四路独立计时<b class='flag-5'>器</b>