STM32与SHT1X温湿度传感器通讯

在这次项目开发中应用到了SHT1X温湿度传感器,该系列有SHT10、SHT11和SHT15,属于Sersirion温湿度传感器家族中的贴片封装系列。包括一个电容性聚合体测湿敏感元件、一个用能隙材料制成的测温元件,传感器内部有一个精度高达14为位的A/D转换器。更详细资料请参考说明书。

1、硬件介绍

现在对本次使用的SHT15作简要介绍。其引脚定义如下:

引脚

名称

描述

1

GND

2

DATA

串行数据, 双向

3

SCK

串行时钟, 输入口

4

VDD

电源

NC

NC

必须为空

SHT1X温湿度传感器使用的2线通讯,类是于I2C总线,但并不相同,使用普通的GPIO就可实现通讯。此次采用STM32F103VET6来操作SHT15,具体的连接方式如下:

SCK 用于微处理器与SHT1x 之间的通讯同步。由于接口包含了完全静态逻辑,因而不存在最小SCK 频率。

DATA 引脚为三态结构,用于读取传感器数据 . 当向传感器发送命令时, DATA 在 SCK 上升沿有效且在 SCK 高电平时必须保持稳定。 DATA 在 SCK 下降沿之后改变。为避免信号冲突,微处理器应驱动DATA 在低电平。需要一个外部的上拉电阻(例如: 10kΩ)将信号提拉至高电平。上拉电阻通常已包含在微处理器的I/O 电路中。

2、通讯实现

现在说明一下传感器通讯的实现。首先看一看其操作命令。传感器的命令包含三个地址位(目前只支持000,这就是只能挂接在空闲的IIC总线上的原因)和五个命令位。SHT1x 会以下述方式表示已正确地接收到指令:在第8个SCK 时钟的下降沿之后,将DATA 下拉为低电平(ACK 位)。在第9个SCK 时钟的下降沿之后,释放DATA(恢复高电平)。命令集如下:

命令

代码

预留

0000x

温度测量

00011

湿度测量

00101

读状态寄存器

00111

写状态寄存器

00110

预留

0101x-1110x

软复位, 接口复位, 状态寄存器复位即恢复为默认状态.在要发送下一个命令前,至少等待 11ms.

11110

接下来具体说说各种该命令操作的实现:

2.1、启动时序

用一组“启动传输”时序来完成数据传输的初始化。它包括:当SCK时钟高电平时DATA翻转为低电平,紧接着SCK变成低电平,随后是在SCK时钟高电平,随后是在SCK时钟高电平DATA翻转位高电平。时序如下:

具体的编码实现如下:

/*SHT1X启动时序操作*/
void StartSHT1XOperation(BusPinOperation *SetBusPin)
{/*将data线设置为输出模式*/SetDataPineDirection(Out);SetBusPin[DataPin](Set);SetBusPin[SckPin](Reset);Delayus(10);SetBusPin[SckPin](Set);Delayus(5);SetBusPin[DataPin](Reset);Delayus(5);SetBusPin[SckPin](Reset);Delayus(10);SetBusPin[SckPin](Set);Delayus(5);SetBusPin[DataPin](Set);Delayus(10);SetBusPin[SckPin](Reset);
}

2.2、通讯复位

如果与SHT1x 通讯中断,可通过下列信号时序复位:当DATA 保持高电平时,触发SCK 时钟9 次或更多。时序图如下:

具体的编码实现如下:

/*SHT1X通讯复位*/
void ResetSHT1XCommunication(BusPinOperation *SetBusPin)
{/*将data线设置为输出模式*/SetDataPineDirection(Out);Delayms(1);SetBusPin[DataPin](Set);SetBusPin[SckPin](Reset);for(int i=0;i<9;i++){SetBusPin[SckPin](Set);Delayus(10);SetBusPin[SckPin](Reset);Delayus(10);}StartSHT1XOperation(SetBusPin);
}

同时也可以实现软件复位,状态寄存器复位为默认状态。在要发送下一个命令前,至少等待 11ms。具体实现如下:

/*对SHT1X实现软件复位*/
uint8_t Sht1xSoftwareReset(BusPinOperation *SetBusPin)
{uint8_t err = 0;ResetSHT1XCommunication(SetBusPin);err=err+WriteByteT0Sht1x(SOFTWARE_RESET,SetBusPin);return err;
}

2.3、操作状态寄存器

SHT1x 的某些高级功能可以通过给状态寄存器发送指令来实现,如选择测量分辨率,电量不足提醒,使用 OTP 加载或启动加热功能等。

/*读状态寄存器*/
uint8_t ReadStatusRegister(uint8_t *pValue,uint8_t *pCheckSum,BusPinOperation *SetBusPin)
{uint8_t err=0;StartSHT1XOperation(SetBusPin);err=WriteByteT0Sht1x(READ_STATUS_REGISTER,SetBusPin);*pValue=ReadByteFromSht1x( Ack,SetBusPin);*pCheckSum=ReadByteFromSht1x( noAck,SetBusPin);return err;
}/*写状态寄存器*/
uint8_t WriteStatusRegister(uint8_t *pValue,BusPinOperation *SetBusPin)
{uint8_t err=0;StartSHT1XOperation(SetBusPin);err +=WriteByteT0Sht1x(WRITE_STATUS_REGISTER,SetBusPin);err +=WriteByteT0Sht1x(*pValue,SetBusPin);return err;
}

2.4、温湿度的读取和计算

发布一组测量命令(‘00000101’表示相对湿度RH,‘00000011’表示温度T)后,控制器要等待测量结束。这个过程需要大约20/80/320ms,分别对应8/12/14bit 测量。根据本人测试8位时,15ms可以;12位时,70ms可以;14位时240ms可以。 SHT1x 通过下拉DATA 至低电平并进入空闲模式,表示测量的结束。控制器在再次触发SCK 时钟前,必须等待这个“数据备妥”信号来读出数据。检测数据可以先被存储,这样控制器可以继续执行其它任务在需要时再读出数据。

/*获取SHT1X的温度值*/
float GetSht1xTemperatureValue(float vdd,BusPinOperation *SetBusPin)
{float tempValue=0.0;uint16_t sot=0;uint8_t err=0;uint8_t highByte=0;uint8_t lowByte=0;uint8_t checkSum=0;StartSHT1XOperation(SetBusPin);WriteByteT0Sht1x(TEMP_MEAS_COMMAND,SetBusPin);SetDataPineDirection(In);Delayms(240);if(ReadDataPinBit() == 1){err += 1;}highByte=ReadByteFromSht1x(Ack,SetBusPin);lowByte=ReadByteFromSht1x(Ack,SetBusPin);checkSum=ReadByteFromSht1x(noAck,SetBusPin);sot=(uint16_t)highByte;sot=(sot*256)+(uint16_t)lowByte;if(err != 0){ResetSHT1XCommunication(SetBusPin);}else{tempValue=ConvertTemperatureData(sot,vdd);}return tempValue;
}/*获取SHT1X的湿度值*/
float GetSht1xHumidityValue(float temp,BusPinOperation *SetBusPin)
{float humiValue=0.0;uint16_t sorh=0;uint8_t err=0;uint8_t highByte=0;uint8_t lowByte=0;uint8_t checkSum=0;StartSHT1XOperation(SetBusPin);WriteByteT0Sht1x(HUMI_MEAS_COMMAND,SetBusPin);SetDataPineDirection(In);Delayms(70);if(ReadDataPinBit() == 1){err += 1;}highByte=ReadByteFromSht1x(Ack,SetBusPin);lowByte=ReadByteFromSht1x(Ack,SetBusPin);checkSum=ReadByteFromSht1x(noAck,SetBusPin);sorh=(highByte<<8)|lowByte;if(err != 0){ResetSHT1XCommunication(SetBusPin);}else{humiValue=ConvertHumidityData(sorh,temp);}return humiValue;
}

对于其他的计算部分直接按公式便写即可。

欢迎关注:

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

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

相关文章

STM32与MS5837压力传感器的I2C通讯

MS5837压力传感器是一种可用于电路板上&#xff0c;适用于检测10-1200mbar压力范围的传感器&#xff0c;灵敏度非常高&#xff0c;理论上能够检测到0.01mbar的压力变化&#xff0c;实际使用过程中测试并无明显的变化。 MS5837采用I2C总线通讯&#xff0c;与STM32的MCU可以实现…

STM32F0使用LL库实现MS5536C通讯

在本次项目中&#xff0c;限于空间要求我们选用了STM32F030F4作为控制芯片。这款MCU不但封装紧凑&#xff0c;而且自带的Flash空间也非常有限&#xff0c;所以我们选择了LL库实现。在本文中我们说明一下&#xff0c;使用LL库实现MS5536C的SPI通讯。 1、MS5536C简述 MS5536C是…

STM32F0使用LL库实现DMA方式AD采集

在本次项目中&#xff0c;限于空间要求我们选用了STM32F030F4作为控制芯片。这款MCU不但封装紧凑&#xff0c;而且自带的Flash空间也非常有限&#xff0c;所以我们选择了LL库实现。在本文中我们将介绍基于LL库的ADC的DMA采集方式。 1、概述 这次我们使用DMA方式实现对AD的采集…

STM32与宇电设备实现AI-BUS通讯

宇电的设备使用基于RS-485的自定义协议&#xff0c;协议本身比较简单&#xff0c;只有2条指令&#xff1a; 读&#xff1a;地址代号52H&#xff08;82&#xff09; 要读的参数代号00校验码 写&#xff1a;地址代号43H&#xff08;67&#xff09;要写的参数代号写入数低字节写…

FreeRTOS如何结束和重新启动调度程序

大多数主机或桌面系统&#xff08;比如Linux&#xff0c;Mac或Windows&#xff09;都有一个正常的用例&#xff0c;你可以在早上启动操作系统&#xff0c;然后在晚上关闭它&#xff0c;然后你就离开机器。嵌入式系统是不同的&#xff1a;他们没有参加&#xff0c;他们应该“永远…

先进过程控制之一:浅说APC

先进过程控制&#xff08;APC&#xff09;技术作为在生产装置级的信息化应用&#xff0c;在优化装置的控制水平和提高生产过程的管理水平的同时&#xff0c;还为企业创造了可观的经济效益。 1、什么是APC 先进过程控制&#xff0c;简称APC&#xff0c;并不是什么新概念。它仅…

STM32与多台MS5803压力传感器I2C通讯

MS5803压力传感器支持SPI和I2C总线通讯&#xff0c;拥有24位AD转换。能够同时获得压力值和温度值&#xff0c;其中压力测量范围为10-1100mbar&#xff0c;温度的测量范围是-40-85摄氏度。各引脚功能及参数如下&#xff1a; 传感器内部结构图如下&#xff1a; 通讯协议的选择通过…

STM32F0使用LL库实现SHT70通讯

在本次项目中&#xff0c;限于空间要求我们选用了STM32F030F4作为控制芯片。这款MCU不但封装紧凑&#xff0c;而且自带的Flash空间也非常有限&#xff0c;所以我们选择了LL库实现。本篇我们将基于LL库采用模拟I2C接口的方式实现温湿度采集。 1、SHT70简述 SHT70是一款集温湿度…

STM32F0使用LL库实现PWM输出

在本次项目中&#xff0c;限于空间要求我们选用了STM32F030F4作为控制芯片。这款MCU不但封装紧凑&#xff0c;而且自带的Flash空间也非常有限&#xff0c;所以我们选择了LL库实现。本文我们将说明如何通过LL库实现PWM信号的输出。 1、概述 我们知道STM32的TIM计时器可以输出P…

STM32F0使用LL库实现Modbus通讯

在本次项目中&#xff0c;限于空间要求我们选用了STM32F030F4作为控制芯片。这款MCU不但封装紧凑&#xff0c;而且自带的Flash空间也非常有限&#xff0c;所以我们选择了LL库实现。本篇将说明基于LL实现USART通讯。 1、概述 我们想要实现基于RS485的Modbus通讯实际就是基于US…

STM32基于SPI和AD7192的数据采集

在开发臭氧发生器的时&#xff0c;我们需要一个高分辨率的AD采集&#xff0c;于是选择了AD7192&#xff0c;选择这款ADC的原因比较简单。首先它是24位的符合我们的精度要求&#xff1b;其次它自带时钟&#xff0c;便于节省空间&#xff1b;第三它有4路单端或2路差分输入&#x…

Modbus协议栈实现Modbus RTU多主站支持

前面我们已经详细讲解过Modbus协议栈的开发过程&#xff0c;并且利用协议栈封装了Modbus RTU主站和从站&#xff0c;Modbus TCP服务器与客户端&#xff0c;Modbus ASCII主站与从站应用。但在使用过程中&#xff0c;我们发现一些使用不便和受限的地方&#xff0c;所以我们就想要…

STM32基于AD5663的UV灯电压控制

在开发臭氧发生器的时&#xff0c;我们使用UV灯来实现臭氧的产生。而UV灯的强度决定了臭氧产生的浓度&#xff0c;UV灯的光强则与其控制电压密切相关。所以我们要控制产生的臭氧的浓度就需要调节其控制电压。我们选择了AD5663这一模拟量输出模块来实现这一点。 1、AD5663简介 …

实现Modbus ASCII多主站应用

前面我们已经分析了Modbus RTU的更新设计和具体实现&#xff08;如果不清楚可查看前一篇文章&#xff09;。其实Modbus ASCII与Modbus RTU都是基于串行链路实现的&#xff0c;所以有很多的共同点&#xff0c;基于此&#xff0c;这篇文章我们只讨论与Modbus RTU所不同的部分。 …

STM32一种基于NTC的控温电路及软件实现

NTC&#xff08;Negative Temperature Coefficient&#xff09;是一种随温度上升时&#xff0c;电阻值呈指数关系减小的热敏电阻。应用广泛&#xff0c;最近我们就采用了NTC来控制加热并测温&#xff0c;并达到了预期的效果。 1、硬件设计 我们使用三极管作为加热元件&#x…

STM32利用光敏二极管实现光度测量

最近我们在开发臭氧发生器时&#xff0c;需要监测生成的臭氧的浓度&#xff0c;于是想到使用光度计来测量。因为不同浓度的臭氧对管的吸收作用是不相同的&#xff0c;于是检测光照强度的变化就可以得到相应的浓度数据。 1、硬件设计 此次光照度检测我们选用了S1336-5BQ光电点二…

STM32的ADC通道间干扰的问题

最近我们在开发一个项目时&#xff0c;用到了MCU自带的ADC&#xff0c;在调试过程中发现通道之间村在相互干扰的问题。以前其实也用过好几次&#xff0c;但要求都不高所以没有太关注&#xff0c;此次因为物理量的量程较大&#xff0c;所以看到了变化。 首先来说明一下此次的软…

实现Modbus TCP多网段客户端应用

对于Modbus TCP来说与Modbus RTU和Modbus ASCII有比较大的区别&#xff0c;因为它是运行于以太网链路之上&#xff0c;是运行于TCP/IP协议之上的一种应用层协议。在协议栈的前两个版本中&#xff0c;Modbus TCP作为客户端时也存在一些局限性。我们将对这些不足作一定更新。 1、…

改进初学者的PID-介绍

最近看到了Brett Beauregard发表的有关PID的系列文章&#xff0c;感觉对于理解PID算法很有帮助&#xff0c;于是将系列文章翻译过来&#xff01;在自我提高的过程中&#xff0c;也希望对同道中人有所帮助。作者Brett Beauregard的原文网址&#xff1a;http&#xff1a;//brettb…

改进初学者的PID-采样时间

最近看到了Brett Beauregard发表的有关PID的系列文章&#xff0c;感觉对于理解PID算法很有帮助&#xff0c;于是将系列文章翻译过来&#xff01;在自我提高的过程中&#xff0c;也希望对同道中人有所帮助。作者Brett Beauregard的原文网址&#xff1a;http&#xff1a;//brettb…