STM32获取SHT3X温湿度芯片数据

目录

一、概述

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

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 Hzerror = SHT3X_WriteCommand(CMD_MEAS_PERI_05_L);break;          case FREQUENCY_1HZ:  // 低可靠性, 1.0 Hzerror = SHT3X_WriteCommand(CMD_MEAS_PERI_1_L);break;          case FREQUENCY_2HZ:  // 低可靠性, 2.0 Hzerror = SHT3X_WriteCommand(CMD_MEAS_PERI_2_L);break;          case FREQUENCY_4HZ:  // 低可靠性, 4.0 Hzerror = SHT3X_WriteCommand(CMD_MEAS_PERI_4_L);break;          case FREQUENCY_10HZ: // 低可靠性, 10.0 Hzerror = SHT3X_WriteCommand(CMD_MEAS_PERI_10_L);break;          default:error = PARM_ERROR; // 参数错误break;}break;case REPEATAB_MEDIUM: // 中等可靠性switch(frequency){case FREQUENCY_HZ5:  // 中等可靠性, 0.5 Hzerror = SHT3X_WriteCommand(CMD_MEAS_PERI_05_M);break;case FREQUENCY_1HZ:  // 中等可靠性, 1.0 Hzerror = SHT3X_WriteCommand(CMD_MEAS_PERI_1_M);break;        case FREQUENCY_2HZ:  // 中等可靠性, 2.0 Hzerror = SHT3X_WriteCommand(CMD_MEAS_PERI_2_M);break;        case FREQUENCY_4HZ:  // 中等可靠性, 4.0 Hzerror = SHT3X_WriteCommand(CMD_MEAS_PERI_4_M);break;      case FREQUENCY_10HZ: // 中等可靠性, 10.0 Hzerror = SHT3X_WriteCommand(CMD_MEAS_PERI_10_M);break;default:error = PARM_ERROR; // 参数错误break;}break;case REPEATAB_HIGH: // 高可靠性switch(frequency){case FREQUENCY_HZ5:  // 高可靠性, 0.5 Hzerror = SHT3X_WriteCommand(CMD_MEAS_PERI_05_H);break;case FREQUENCY_1HZ:  // 高可靠性, 1.0 Hzerror = SHT3X_WriteCommand(CMD_MEAS_PERI_1_H);break;case FREQUENCY_2HZ:  // 高可靠性, 2.0 Hzerror = SHT3X_WriteCommand(CMD_MEAS_PERI_2_H);break;case FREQUENCY_4HZ:  // 高可靠性, 4.0 Hzerror = SHT3X_WriteCommand(CMD_MEAS_PERI_4_H);break;case FREQUENCY_10HZ: // 高可靠性, 10.0 Hzerror = 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.xdnf.cn/news/12116.html

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

相关文章

[原创]手把手教学之前端0基础到就业——day11( Javascript )

文章目录 day11(Javascript)01Javascript①Javascript是什么②JavaScript组成③ Javascript的书写位置1. 行内式 (不推荐)2 . 内部位置使用 ( 内嵌式 )3. 外部位置使用 ( 外链式 ) 02变量1. 什么是变量2. 定义变量及赋值3. 注意事项4. 命名规范 03输入和输出1) 输出形式12) 输出…

[JAVAEE] 面试题(五) - HashMap, Hashtable, ConcurrentHashMap

目录 一. Hashtable1.1 Hashtable效率低下的原因: 二. ConcurrentHashMap2.1 ConcurrentHashMap更高效的原因: 三. HashMap, Hashtable, ConcurrentHashMap 之间的区别 HashMap是线程不安全的. 在多线程环境下, 使用: HashtableConcurrentHashMap 来确保线程安全. 一. Hashta…

Vue 2 —Vue Router 页面导航和参数传递

当从A页面跳转到B页面的时候把数据也一起传递过去,可用Vue Router 功能: 一、. this.$router.push 方法 Vue Router 是 Vue.js 的官方路由管理器,允许你在应用中进行页面导航(即跳转到不同的 URL 路径)。 this.$rout…

Local Transfer 致力于更加便捷地共享传输文件

软件主页:https://illusionna.github.io/LocalTransfer

[AcWing算法基础课]动态规划之01背包

题目链接:01背包 有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。第 i 件物品的体积是 vi,价值是 wi。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。 首先,我们…

标准、高效的管理测试用例和活动

送您一份新人礼,自动化测试平台限时免费体验~ 本文主要介绍测试用例管理的基础知识和基本使用方法,帮助您快速管理测试用例及活动。 操作流程 用例管理的主要使用流程如下: 1.新建测试用例 2.评审测试用例 3.创建测试计划 4.执行测试计划 5…

如何在jupyter notebook切换python环境

目录 1、切换到目标python环境,假设我的是叫“tf” C:\Users\hello>activate tf(tf) C:\Users\hello>2、安装notebook内核包 (tf) C:\Users\hello>pip install ipykernel3、将环境加入到notebook中 python -m ipykernel install --user --name pytorch --…

windows工具 -- 使用SpaceSniffer查看哪些文件夹占用那么大空间, 再也不用右键属性了

目的 C盘不知道哪些文件夹占用了那么多空间, 右键属性扫描太慢了 效果 运行效果 静态截图 下载使用 下载 SpaceSniffer https://github.com/redtrillix/SpaceSniffer/releases 解压到文件夹后, 双击运行

[DEBUG] 服务器 CORS 已经允许所有源,仍然有 304 的跨域问题

背景 今天有一台服务器到期了,准备把后端迁移到另一台服务器上,结果前端在测试的时候,出现了 304 的跨域问题。 调试过程中出现的问题,包括但不限于: set the request’s mode to ‘no-cors’Redirect is not allow…

智慧园区解决方案:科技赋能,打造未来管理新典范

智慧园区作为城市发展的重要组成部分,正以前所未有的速度蓬勃发展。随着5G、云计算、大数据、物联网(IoT)、BIM(建筑信息模型)、人工智能(AI)及区块链等前沿技术的日益成熟与融合应用&#xff0…

CTF记录

1. [SWPUCTF 2022 新生赛]android 用jadx打开,然后搜索NSS关键字 NSSCTF{a_simple_Android} 2. [SWPU 2024 新生引导]ez_SSTI 模板注入题目,直接焚靖可以秒了 填入数据 ls / 然后 cat /flag即可 获取成功 NSSCTF{2111e7ad-97c5-40d5-9a3b-a2f657bd45e8…

Vue使用富文本编辑器vue-quill-editor

Vue使用富文本编辑器 1. 安装 npm install vue-quill-editor -S2. 引入到项目中 有两种挂载方式: 全局挂载 和 在组件中挂载,根据自己的项目需求选择,一般用到富文本编辑都是在某一个项目中,我们这里为了方便大家选择&#xff…

AUTOSAR_EXP_ARAComAPI的7章笔记(2)

☞返回总目录 相关总结:服务发现实现策略总结 7.2 服务发现的实现策略 如前面章节所述,ara::com 期望产品供应商实现服务发现的功能。服务发现功能基本上是在 API 级别通过 FindService、OfferService 和 StopOfferService 方法定义的,协议…

windows yolo11 自定义训练

一、在yolo11源码文件夹创建一个train.py 内容如下: from ultralytics import YOLOif __name__ __main__:model YOLO(rultralytics/cfg/models/11/yolo11.yaml)model.train(datarD:/yolo11/WiderPerson_yolo/WiderPerson_yolo/WiderPerson_yolo.yaml,imgsz(640,3…

简述 synchronized 和 java.util.concurrent.locks.Lock 的异同?

大家好,我是锋哥。今天分享关于【简述 synchronized 和 java.util.concurrent.locks.Lock 的异同?】面试题。希望对大家有帮助; 简述 synchronized 和 java.util.concurrent.locks.Lock 的异同? 在Java编程中,synchro…

C语言中,“extern”关键字的含义与用法

在C语言中,extern 关键字用于声明一个已经在其他地方定义的变量或函数。它的主要作用是告诉编译器,某个变量或函数是在当前文件之外定义的,编译器应该在链接阶段找到这个变量或函数的实际定义。以下是 extern 的一些常见用途和用法&#xff1…

TCP最后一次握⼿连接阶段,如果ACK包丢失会怎样?

2024年10月NJSD技术盛典暨第十届NJSD软件开发者大会、第八届IAS互联网架构大会在南京召开。百度文心快码总经理臧志分享了《AI原生研发新范式的实践与思考》,探讨了大模型赋能下的研发变革及如何在公司和行业中落地,AI原生研发新范式的内涵和推动经验。 …

【大数据学习 | HBASE】hbase的读数据流程与hbase读取数据

1. hbase的读数据流程 在解析读取流程之前我们还需要知道两个功能性的组件和HFIle的格式信息 HFILE 存储在hdfs中的hbase文件,这个文件中会存在hbase中的数据以kv类型显示,同时还会存在hbase的元数据信息,包括整个hfile文件的索引大小&…

AI基础知识

目录 1.激活函数:one: 激活函数的作用:two: sigmoid函数:three: tanh函数:four: ReLu:five: Leaky ReLU 2.Softmax函数3.优化器:one: 优化器的作用:two: BGD(批梯度下降):three: SGD(随机梯度下降):four: MBGD(Mini Ba…

01背包问题(DP)

2. 01背包问题 - AcWing题库 DP做题思路分析 实现代码&#xff1a; #include <iostream> #include <algorithm>using namespace std;const int N 1010;int n , m; int v[N],w[N],dp[N][N];int main() {cin >> n >> m;for (int i 1;i < n;i) {ci…