datasheet

STM32与SHT1X温湿度传感器通讯

2019-08-14来源: eefocus关键字:STM32  SHT1X  温湿度传感器

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


1、硬件介绍

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

image.png

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(恢复高电平)。命令集如下:

image.png

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


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;

}


关键字:STM32  SHT1X  温湿度传感器

编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic471060.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:【STM32+W5500】22,W5500连接外部服务器失败,如ONENET
下一篇:关于stm32的spi发送命令时的注意事项

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

基于stm32f103的矩阵键盘

我现在的任务是做一个8*8的矩阵键盘,制PCB版之前,我用电路板搭了一个3*3的矩阵键盘来模拟一下,设置PA0、PA1、PA2为PP输出,设置P3、P4、P5下拉输入。大多数的芯片内部上拉或下拉电阻都是弱上拉或弱下拉,stm32f103的内部也一样,内部上拉或下拉的电阻阻值约为40K,这样可以方便外部调整,但是,在作为一些通讯引脚时,可能会出现上电时数据不稳定的问题,如I2C通讯,解决的办法是在外部在加上一个较强的上拉或下拉即可。具体程序如下:#include <stm32f10x.h>#include "usart.h"void KeyBoard_Init(void)//按键初始化
发表于 2019-08-16

基于 STM32F407 使用 4*4 矩阵键盘

写在前面:这是我第一次开始写博客,可能写的不是很好,也请大家谅解。本人现在大三,以前在学习过程中遇到过各种各样的问题,关于51单片机,STM32单片机,最近在学习ARM11的Tiny6410以后还会更新一些C/C++/Qt等等方面的东西关于写博客这件事,其实 一直想写博客记录下来,但是因为某些原因(懒),so , 没有写。现在开始,以后遇到单片机上或者编程上遇到的问题,并且自己很好地解决了,我就会在这里记录下来。希望通过博客记录我的学习历程并希望我所解决问题的过程能够帮到需要的人,一起加油吧!!!我是在STM32F407开发板上使用的4*4 矩阵键盘下面是我所使用的开发板1、首先介绍一下4*4矩阵键盘扫描原理 
发表于 2019-08-16
基于 STM32F407 使用 4*4 矩阵键盘

基于STM32F407最小系统板三种矩阵键盘实现方法

0xe0:return 0xe7; case 0xd0:return 0xd7; case 0xb0:return 0xb7; case 0x70:return 0x77; } } if(mode) key =1; if((GPIO_ReadInputData(GPIOA)&0xF0)==0xF0) key =1; return 0;}比较:三种方案其实,第二种方案比较通用,第一种比较简单易懂,前两种都比较好,因为按键按下不松开,并不会影响CPU一直停留在while()循环里啥都不干。最后的实验效果:之前用的板子是STM32F107,数据手册中的GPIO口一些输出输入方式的配置与STM32
发表于 2019-08-16
基于STM32F407最小系统板三种矩阵键盘实现方法

STM32笔记(二)(寄存器)——矩阵键盘

      矩阵键盘是我第一个需要动手焊接东西的实验,是3*3的键盘,焊了一个下午。因为是第一次焊东西,有多处不足,但最后也勉强能用。键盘的电路是组长设计的,希望下一次我能自己独立设计电路。键盘外观正面背面  外观略显粗糙。。。。主要代码       矩阵键盘最主要的一部分代码就是按键扫描部分,通过一个扫描函数对高低电平进行判断,从而确定按键的位置。用过串口输出案件编号1~9。key.c代码void KEY_Init1(void){ RCC->APB2ENR|=1<<3;      JTAG_S
发表于 2019-08-16
STM32笔记(二)(寄存器)——矩阵键盘

STM32 学习笔记 一.矩阵键盘

刚刚接触STM32,感觉和arduino完全是两个难度,如果说arduino是乐高积木,那我感觉STM32就跟盖楼一样,哈哈,是真的难,真的极具挑战性,可能是我刚开始学觉得难,到后面熟练了应该会好一些,言归正传,就讲一讲我们学长给我们下的任务矩阵键盘。学长学姐们做的是九键的矩阵键盘,我们做的是四键的,难度其实相差不大,换汤不换药的类型,原理就是一二号线通高电平,三四号线低电平,然后交换,让一二号低电平,三四号高电平这样就可以确定是哪个按键被按下。OK上代码key.c函数#include "key.h"#include "delay.h"#include "usart.h"
发表于 2019-08-16
STM32 学习笔记 一.矩阵键盘

STM32 矩阵键盘通过串口输出

STM32F103C8T6 4*4矩阵键盘 通过串口输出,可以用来写密码锁程序的思路如下:1、首先需要配置的是矩阵键盘:配置两个函数:  KEY44_Init(矩阵键盘初始化)和key44_Scan(扫描并获取值)   。2、其次,设置串口(本文设置为STM32F103C8T6的串口三): 我们需要对USART进行初始化设置,详细请见下文。3、然后就开始写我们的主函数:主函数比较简单。因为程序已经分装了。4、最后我们要实现按下一个键,串口打出一个字符(按下1键,打出1)——————————————————————————————————————————————————-下边为程序:所用芯片
发表于 2019-08-16

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved