STM32获取SHT3X温湿度芯片数据
目录
一、概述
SHT3X是Sensirion公司推出的一款高精度、完全校准的温湿度传感器,基于CMOSens技术。它提供了线性化、温度补偿的数字输出,具有宽电源电压范围、高速I2C接口以及可选的地址设置等特点。
- 高精度:SHT3X提供了高精度的温湿度测量,湿度误差在±3%(SHT30)或±2%(SHT31)以内,温度误差在±0.3℃(SHT30)或±0.2℃(SHT31)以内。
- 宽电源电压范围:SHT3X的供电电压范围宽达2.4V至5.5V,确保了与各种组装情况的兼容性。
- 高速I2C接口:SHT3X配备了高速I2C接口,通信速度可达1MHz,并支持两个用户可选地址,方便多个传感器在同一总线上工作。
- 快速启动和测量时间: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_trawValueTemp_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_trawValueTemp_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_trawValueTemp; // 从传感器获取的温度原始值
uint16_trawValueHumi; // 从传感器获取的湿度原始值
// 读取测量值
error = SHT3X_WriteCommand(CMD_FETCH_DATA);
if(error == NO_ERROR) error = SHT3X_StartReadAccess();
uint32_trawValueTemp_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
原文地址:https://blog.csdn.net/qq_26043945/article/details/143687178
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!