STM32获取SHT3X温湿度芯片数据

news2024/11/23 1:24:06

目录

一、概述

二、单次数据采集模式的测量

1、配置说明

2、代码实现方式

三、周期性数据采集模式的测量

1、配置说明

2、代码实现方式

四、完整代码下载链接


一、概述

        SHT3X是Sensirion公司推出的一款高精度、完全校准的温湿度传感器,基于CMOSens技术。它提供了线性化、温度补偿的数字输出,具有宽电源电压范围、高速I2C接口以及可选的地址设置等特点。

  1. 高精度:SHT3X提供了高精度的温湿度测量,湿度误差在±3%(SHT30)或±2%(SHT31)以内,温度误差在±0.3℃(SHT30)或±0.2℃(SHT31)以内。
  2. 宽电源电压范围:SHT3X的供电电压范围宽达2.4V至5.5V,确保了与各种组装情况的兼容性。
  3. 高速I2C接口:SHT3X配备了高速I2C接口,通信速度可达1MHz,并支持两个用户可选地址,方便多个传感器在同一总线上工作。
  4. 快速启动和测量时间:SHT3X具有非常快的启动和测量时间,能够快速响应环境变化。

        SHT3X的引脚包括供电引脚(VDD/VSS)、复位引脚(nRESET)、地址引脚(ADDR)、以及I2C通信引脚(SCL/SDA)。其中,ADDR引脚用于设置传感器的地址,SCL和SDA引脚分别用于I2C通信的时钟和数据线。

        通过ADDR引脚的适当接线,可以选择I2C地址(见下表)。ADDR引脚可以连接到逻辑高电平或逻辑低电平。通过切换ADDR引脚上的电平,可以在运行期间动态改变传感器的地址。

SHT3x-DIScomes采用8引脚DFN封装,请参见下表所示。 

        SHT3X内部包含湿度传感器和温度传感器,通过ADC模块将模拟信号转换为数字信号。校准模块结合ADC模块输出的数值进行处理和线性化,然后通过I2C接口与外部通信。在传输过程中,每个数据值后面都会跟着CRC校验和,以确保数据的准确性。

二、单次数据采集模式的测量

1、配置说明

        在这种模式下,一个发出的测量命令触发一个数据对的采集。每个数据对包括一个16位温度值和一个16位湿度值(按此顺序)。在传输过程中,每个数据值后面总是跟着一个CRC校验和(参见下图所示)。在单次模式下,可以选择不同的测量命令。16位命令(参见下图所示)。它们在可重复性(低、中、高)和时钟延伸(使能或禁用)方面有所不同。重复性设置会影响测量持续时间,从而影响传感器的总能耗。

2、代码实现方式

在main主函数中调用初始化后,通过调用下面的函数实现两种方式的单次测量。

	// 演示带时钟拉伸的单次测量
	error = SHT3X_GetTempAndHumi(&temperature, &humidity, REPEATAB_HIGH, MODE_CLKSTRETCH, 50);
	if(error != NO_ERROR){} // 在这里处理错误 
	HAL_Delay(50);
		
	// 演示带轮询的单次测量,超时50毫秒
	error = SHT3X_GetTempAndHumi(&temperature, &humidity, REPEATAB_HIGH, MODE_POLLING, 50);
	if(error != NO_ERROR){} // 在这里处理错误 
	HAL_Delay(50);
//----------------------------------------------------------------------------
// 获取温度和湿度
etError SHT3X_GetTempAndHumi(float* temperature, float* humidity,
                             etRepeatability repeatability, etMode mode,
                             uint8_t timeout)
{
  etError error; // 错误代码
                               
  switch(mode)
  {    
    case MODE_CLKSTRETCH: // 以时钟拉伸模式获取温度和湿度
      error = SHT3X_GetTempAndHumiClkStretch(temperature, humidity,
                                             repeatability, timeout);
      break;
    case MODE_POLLING:    // 以轮询模式获取温度和湿度
      error = SHT3X_GetTempAndHumiPolling(temperature, humidity,
                                          repeatability, timeout);
		
      break;
    default:              
      error = PARM_ERROR; // 参数错误
      break;
  }
  
  return error; // 返回错误代码
}


//----------------------------------------------------------------------------
// 使用时钟拉伸获取温度和湿度
etError SHT3X_GetTempAndHumiClkStretch(float* temperature, float* humidity,
                                       etRepeatability repeatability,
                                       uint8_t timeout)
{
  etError 		error;        // 错误代码
  uint16_t    rawValueTemp; // 从传感器获取的温度原始值
  uint16_t    rawValueHumi; // 从传感器获取的湿度原始值
  

	// 以时钟拉伸模式开始测量
	// 根据所需的可靠性使用相应的命令
	switch(repeatability)
	{
		case REPEATAB_LOW:
			error = SHT3X_WriteCommand(CMD_MEAS_CLOCKSTR_L);
			break;
		case REPEATAB_MEDIUM:
			error = SHT3X_WriteCommand(CMD_MEAS_CLOCKSTR_M);
			break;
		case REPEATAB_HIGH:
			error = SHT3X_WriteCommand(CMD_MEAS_CLOCKSTR_H);
			break;
		default:
			error = PARM_ERROR; // 参数错误
			break;
	}
  

  // 如果没有错误,开始读取访问
  if(error == NO_ERROR) error = SHT3X_StartReadAccess();

	// 如果没有错误,读取温度原始值,读取湿度原始值
	uint32_t		rawValueTemp_rawValueHumi;
	if(error == NO_ERROR) error = SHT3X_Read4BytesAndCrc(&rawValueTemp_rawValueHumi, timeout);
	
	rawValueTemp = rawValueTemp_rawValueHumi>>16;
	rawValueHumi = rawValueTemp_rawValueHumi&0xffff;
  
  // 如果没有错误,计算温度(℃)和湿度(%RH)
  if(error == NO_ERROR)
  {
    *temperature = SHT3X_CalcTemperature(rawValueTemp);
    *humidity = SHT3X_CalcHumidity(rawValueHumi);
  }
  
  return error; // 返回错误代码
}



//----------------------------------------------------------------------------
// 使用轮询获取温度和湿度
etError SHT3X_GetTempAndHumiPolling(float* temperature, float* humidity,
                                    etRepeatability repeatability,
                                    uint8_t timeout)
{
  etError 		error;           // 错误代码
  uint16_t    rawValueTemp;    // 从传感器获取的温度原始值
  uint16_t    rawValueHumi;    // 从传感器获取的湿度原始值

	// 以轮询模式开始测量
	// 根据所需的可靠性使用相应的命令
	switch(repeatability)
	{
		case REPEATAB_LOW:
			error = SHT3X_WriteCommand(CMD_MEAS_POLLING_L);
			break;
		case REPEATAB_MEDIUM:
			error = SHT3X_WriteCommand(CMD_MEAS_POLLING_M);
			break;
		case REPEATAB_HIGH:
			error = SHT3X_WriteCommand(CMD_MEAS_POLLING_H);
			break;
		default:
			error = PARM_ERROR; // 参数错误
			break;
	}
  
	
  
  // 如果没有错误,等待直到测量完成
  if(error == NO_ERROR)
  {
    // 每1毫秒轮询一次,直到测量完成或超时
    while(timeout--)
    {
      // 检查测量是否完成
      error = SHT3X_StartReadAccess();
  
      // 如果测量已完成 -> 退出循环
      if(error == NO_ERROR) break;
  
      HAL_Delay(1);
    }
    
    // 检查超时错误
    if(timeout == 0) error = TIMEOUT_ERROR; // 发生超时错误
  }
	
  
  // 如果没有错误,读取温度和湿度原始值
  if(error == NO_ERROR)
  {
		uint32_t		rawValueTemp_rawValueHumi;
    if(error == NO_ERROR) error = SHT3X_Read4BytesAndCrc(&rawValueTemp_rawValueHumi, 0);
	
		rawValueTemp = rawValueTemp_rawValueHumi>>16;
		rawValueHumi = rawValueTemp_rawValueHumi&0xffff;
  }
	
  
  // 如果没有错误,计算温度(℃)和湿度(%RH)
  if(error == NO_ERROR)
  {
    *temperature = SHT3X_CalcTemperature(rawValueTemp);
    *humidity = SHT3X_CalcHumidity(rawValueHumi);
  }
	
	
  
  return error; // 返回错误代码
}

三、周期性数据采集模式的测量

1、配置说明

        在这种模式下,一个发出的测量命令产生一个数据对流。每个数据对包括一个16位温度值和一个16位湿度值(按此顺序)。在周期模式下,可以选择不同的测量命令。相应的16位命令(参见下图所示)。它们在可重复性(低、中和高)和数据采集频率(每秒0.5、1、2、4、10次测量)方面有所不同。在此模式下不能选择时钟拉伸。数据采集频率和重复性设置会影响传感器的测量持续时间和电流消耗。

        测量数据的传输可以通过相应的16位命令(参见下图所示),启动读取数据。如果没有测量数据,I2C读取头会响应一个NACK时,通信停止。


2、代码实现方式

 在main主函数中调用初始化后,通过调用下面的函数实现两种方式的连续测量。

error = SHT3X_StartPeriodicMeasurment(REPEATAB_HIGH, FREQUENCY_1HZ);			

// 读取测量缓冲区
error = SHT3X_ReadMeasurementBuffer(&temperature, &humidity);
			
if(error == NO_ERROR)
{
    // 点亮蓝色LED以提示新温度和湿度值
    //LedBlueOn();
    //DelayMicroSeconds(10000); // 延时10毫秒
    //LedBlueOff(); // 关闭蓝色LED
}
else if (error == ACK_ERROR)
{
    // 如果缓冲区没有新值,则忽略此错误
    //error = NO_ERROR;
}
//----------------------------------------------------------------------------
// 启动周期性测量
etError SHT3X_StartPeriodicMeasurment(etRepeatability repeatability,
                                      etFrequency frequency)
{
  etError error;        // 错误代码

	// 根据所需的可靠性和频率使用相应的命令
	switch(repeatability)
	{
		case REPEATAB_LOW: // 低可靠性
			switch(frequency)
			{
				case FREQUENCY_HZ5:  // 低可靠性, 0.5 Hz
					error = SHT3X_WriteCommand(CMD_MEAS_PERI_05_L);
					break;          
				case FREQUENCY_1HZ:  // 低可靠性, 1.0 Hz
					error = SHT3X_WriteCommand(CMD_MEAS_PERI_1_L);
					break;          
				case FREQUENCY_2HZ:  // 低可靠性, 2.0 Hz
					error = SHT3X_WriteCommand(CMD_MEAS_PERI_2_L);
					break;          
				case FREQUENCY_4HZ:  // 低可靠性, 4.0 Hz
					error = SHT3X_WriteCommand(CMD_MEAS_PERI_4_L);
					break;          
				case FREQUENCY_10HZ: // 低可靠性, 10.0 Hz
					error = SHT3X_WriteCommand(CMD_MEAS_PERI_10_L);
					break;          
				default:
					error = PARM_ERROR; // 参数错误
					break;
			}
			break;
			
		case REPEATAB_MEDIUM: // 中等可靠性
			switch(frequency)
			{
				case FREQUENCY_HZ5:  // 中等可靠性, 0.5 Hz
					error = SHT3X_WriteCommand(CMD_MEAS_PERI_05_M);
					break;
				case FREQUENCY_1HZ:  // 中等可靠性, 1.0 Hz
					error = SHT3X_WriteCommand(CMD_MEAS_PERI_1_M);
					break;        
				case FREQUENCY_2HZ:  // 中等可靠性, 2.0 Hz
					error = SHT3X_WriteCommand(CMD_MEAS_PERI_2_M);
					break;        
				case FREQUENCY_4HZ:  // 中等可靠性, 4.0 Hz
					error = SHT3X_WriteCommand(CMD_MEAS_PERI_4_M);
					break;      
				case FREQUENCY_10HZ: // 中等可靠性, 10.0 Hz
					error = SHT3X_WriteCommand(CMD_MEAS_PERI_10_M);
					break;
				default:
					error = PARM_ERROR; // 参数错误
					break;
			}
			break;
			
		case REPEATAB_HIGH: // 高可靠性
			switch(frequency)
			{
				case FREQUENCY_HZ5:  // 高可靠性, 0.5 Hz
					error = SHT3X_WriteCommand(CMD_MEAS_PERI_05_H);
					break;
				case FREQUENCY_1HZ:  // 高可靠性, 1.0 Hz
					error = SHT3X_WriteCommand(CMD_MEAS_PERI_1_H);
					break;
				case FREQUENCY_2HZ:  // 高可靠性, 2.0 Hz
					error = SHT3X_WriteCommand(CMD_MEAS_PERI_2_H);
					break;
				case FREQUENCY_4HZ:  // 高可靠性, 4.0 Hz
					error = SHT3X_WriteCommand(CMD_MEAS_PERI_4_H);
					break;
				case FREQUENCY_10HZ: // 高可靠性, 10.0 Hz
					error = SHT3X_WriteCommand(CMD_MEAS_PERI_10_H);
					break;
				default:
					error = PARM_ERROR; // 参数错误
					break;
			}
			break;
		default:
			error = PARM_ERROR; // 参数错误
			break;
	}

  return error; // 返回错误代码
}



//----------------------------------------------------------------------------
// 读取测量缓冲区
etError SHT3X_ReadMeasurementBuffer(float* temperature, float* humidity)
{
  etError  		error;        // 错误代码
  uint16_t		rawValueTemp; // 从传感器获取的温度原始值
  uint16_t		rawValueHumi; // 从传感器获取的湿度原始值


  // 读取测量值
  error = SHT3X_WriteCommand(CMD_FETCH_DATA);
  if(error == NO_ERROR) error = SHT3X_StartReadAccess();  
	
	uint32_t		rawValueTemp_rawValueHumi;
	if(error == NO_ERROR) error = SHT3X_Read4BytesAndCrc(&rawValueTemp_rawValueHumi, 100);
	
	rawValueTemp = rawValueTemp_rawValueHumi>>16;
	rawValueHumi = rawValueTemp_rawValueHumi&0xffff;

  // 如果没有错误,计算温度(℃)和湿度(%RH)
  if(error == NO_ERROR)
  {
    *temperature = SHT3X_CalcTemperature(rawValueTemp);
    *humidity = SHT3X_CalcHumidity(rawValueHumi);
  }

  return error; // 返回错误代码
}

四、完整代码下载链接

完整代码下载链接:https://download.csdn.net/download/qq_26043945/89982127

数据手册:https://sensirion.com/media/documents/213E6A3B/63A5A569/Datasheet_SHT3x_DIS.pdf

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2238621.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机新手练级攻略——善用搜索引擎

计算机学生新手练级攻略——善用搜索引擎 在信息爆炸的时代,计算机专业的学生如何有效地自我提升?答案可能就藏在一个简单却强大的工具——搜索引擎中。搜索引擎不仅是获取知识的入口,更是解决问题的利器。下面,我将分享一些善用搜…

【MySQL】数据库表连接简明解释

未经许可,不得转载。 文章目录 表连接表连接的类型内连接与外连接结合 WHERE 条件交叉连接(cross join)表连接 在关系型数据库中,建模是数据组织的核心难点。数据库建模需要将数据关系理清,构建出适合存储和查询的结构。 所谓“模型”包括实体(entity) 和关系(relati…

Unity 网格模型及优化

一个模型中可以包含很多网格,一个模型可以由多个网格组成。在Unity3D中一个网格可以由多个子网格(Sub-Mesh)组成。 在渲染引擎的时候,每个子网格都要匹配一个材质球来做渲染,实际上一个子网格本身就是一个个普通的模型&#xff0…

恒源云使用手册记录:从服务器下载数据到本地

文章目录 一、xftp下载二、通过Xftp客户端连接站点 一、xftp下载 先下载xftp:下载连接 二、通过Xftp客户端连接站点 右击文件,点击新建 名称可以任意 主机、端口号、用户名 点击这里的复制登录命令 比如我这里得到ssh -p 41604 rooti-2.gpushare.co…

ReactPress:功能全面的开源发布平台

ReactPress Github项目地址:https://github.com/fecommunity/reactpress 欢迎Star。 此项目是用于构建博客网站的,包含前台展示、管理后台和后端。 此项目是基于 React antd NestJS NextJS MySQL 的,项目已经开源,项目地址在 …

【LLM】3:从零开始训练大语言模型(预训练、微调、RLHF)

一、 大语言模型的训练过程 预训练阶段:PT(Pre training)。使用公开数据经过预训练得到预训练模型,预训练模型具备语言的初步理解;训练周期比较长;微调阶段1:SFT(指令微调/有监督微调…

Android CarrierConfig 参数项和正则匹配逻辑

背景 在编写CarrierConfig的时候经常出现配置不生效的情况,比如运营商支持大范围的imsi,或者是测试人员写卡位数的问题等等,因此就需要模式匹配(包含但不限于正则表达式)。 基本概念: 模式匹配涉及定义一个“模式”&a…

Golang | Leetcode Golang题解之第557题反转字符串中的单词III

题目&#xff1a; 题解&#xff1a; func reverseWords(s string) string {length : len(s)ret : []byte{}for i : 0; i < length; {start : ifor i < length && s[i] ! {i}for p : start; p < i; p {ret append(ret, s[start i - 1 - p])}for i < le…

运行WHTools批量启动游戏房间工具提示要安装.Net Framework3.5解决

确认电脑能正常上网 点击下载并安装此功能&#xff0c;开始安装.Net Framework 3.5 安装成功 成功启动WHTools

Xcode 16 使用 pod 命令报错解决方案

原文请点击这个跳转 一、问题现象&#xff1a; 有人会遇到 Xcode 升级到 16 后&#xff0c;新建应用然后使用 pod init 命令会报错如下&#xff1a; Stack Ruby : ruby 3.3.5 (2024-09-03 revision ef084cc8f4) [x86_64-darwin23]RubyGems : 3.5.22Host : macOS 15.0 (24A335…

STM32WB55RG开发(1)----开发板测试

STM32WB55RG开发----1.开发板测试 概述硬件准备视频教学样品申请源码下载产品特性参考程序生成STM32CUBEMX串口配置LED配置堆栈设置串口重定向主循环演示 概述 STM32WB55 & SENSOR是一款基于STM32WB55系列微控制器的评估套件。该套件采用先进的无线通信技术&#xff0c;支…

【广西】《广西壮族自治区本级政务信息化建设和运维项目预算支出标准》(桂财建〔2023〕102号)-省市费用标准解读系列09

《广西壮族自治区本级政务信息化建设和运维项目预算支出标准》&#xff08;桂财建〔2023〕102号&#xff09;是广西壮族自治区财政厅于2023年9月26日发布的费用标准&#xff08;了解更多可直接关注我们咨询&#xff09;。我司基于专业第三方信息化项目造价机构角度&#xff0c;…

前端学习笔记-Ajax篇

第1章:原生AJAX 1.1Ajax简介 AAX 全称为 Asynchronous JavaScript And XML&#xff0c;就是异步的 JS 和 XML。 通过 AAX 可以在浏览器中向服务器发送异步请求&#xff0c;最大的优势:无刷新获取数据。 AAX 不是新的编程语言&#xff0c;而是一种将现有的标准组合在一起使用…

HarmonyOS Next 实战卡片开发 02

HarmonyOS Next 实战卡片开发 02 卡片开发中&#xff0c;还有一个难点是显示图片。其中分为显示本地图片和显示网络图片 显示本地图片 卡片可以显示本地图片&#xff0c;如存放在应用临时目录下的图片。路径比如 /data/app/el2/100/base/你的项目boundleName/temp/123.png 以…

将文字转换为运动:使用AMD GPU生成视频指南

Transforming Words into Motion: A Guide to Video Generation with AMD GPU — ROCm Blogs 发布日期: 2024年4月24日 作者: Douglas Jia 本博客介绍了通过增强稳定扩散模型在文本到视频生成方面的进展&#xff0c;并展示了使用阿里巴巴的ModelScopeT2V模型在AMD GPU上生成视频…

快速入门Zookeeper

Zookeeper ZooKeeper作为一个强大的开源分布式协调服务&#xff0c;扮演着分布式系统中至关重要的角色。它提供了一个中心化的服务&#xff0c;用于维护配置信息、命名、提供分布式同步以及提供组服务等。通过其高性能和可靠的特性&#xff0c;ZooKeeper能够确保在复杂的分布式…

服务器上安装Orcale数据库以及PL SQL工具(中文)

一、前期准备 1、oracle数据库安装包–>Oracle下载地址&#xff0c;版本根据当时情况就下最新的就行&#xff0c;下载时间可能有点长&#xff0c;耐心点。 2、PL SQL工具下载地址–>PL SQL下载地址&#xff0c;百度网盘可以共享【限速&#xff0c;没办法&#xff01;&am…

协程6 --- HOOK

文章目录 HOOK 概述链接运行时动态链接 linux上的常见HOOK方式修改函数指针用户态动态库拦截getpidmalloc 第一版malloc 第二版malloc/free通过指针获取到空间大小malloc 第三版strncmp 内核态系统调用拦截堆栈式文件系统 协程的HOOK HOOK 概述 原理&#xff1a;修改符号指向 …

[0342].第12节:加载与存储指令及算数指令

我的后端学习大纲 JVM学习大纲 一、加载与存储指令&#xff1a; 加载&#xff1a;主要是指的将数据压入到操作数栈中&#xff0c;那么这个数据可能来源于常量池也可能来自于局部变量表 1.iload_0占1个字节。iload 0 占3个字节。 2.因为操作码数量有限&#xff0c;只有256个&…

spark的学习-06

SparkSQL读写数据的方式 1&#xff09;输入Source 方式一&#xff1a;给定读取数据源的类型和地址 spark.read.format("json").load(path) spark.read.format("csv").load(path) spark.read.format("parquet").load(path) 方式二&#xff1a…