历史上的今天
返回首页

历史上的今天

今天是:2025年08月14日(星期四)

正在发生

2019年08月14日 | STM32与SHT1X温湿度传感器通讯

2019-08-14 来源:eefocus

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


1、硬件介绍

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

image.png?imageView2/2/w/550

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?imageView2/2/w/550

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


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;

}


推荐阅读

史海拾趣

EMI Filter Company公司的发展小趣事

Kemet公司在EMI滤波器领域也有着一席之地。他们致力于研发符合环保标准的EMI滤波器。随着全球对环保问题的日益重视,Kemet看到了绿色环保EMI滤波器的巨大潜力。他们采用环保材料和无铅工艺,生产出了符合RoHS标准的EMI滤波器。这些产品不仅性能稳定,而且对环境友好,赢得了众多环保意识强烈的客户的青睐。

Daewoo公司的发展小趣事

除了汽车产业外,Daewoo公司在家电领域也取得了不俗的成绩。随着消费者对家电品质要求的不断提高,Daewoo公司不断推出高品质、高性能的家电产品,赢得了消费者的信赖和好评。同时,公司还积极拓展国际市场,将产品出口到世界各地,进一步提升了品牌知名度和影响力。

这些故事共同展现了Daewoo公司在电子行业中的发展历程和取得的成就。虽然公司经历了许多挑战和困难,但凭借其坚定的信念和不懈的努力,最终实现了多元化发展,成为了韩国乃至全球电子行业的佼佼者。

Amaze Electronics Pte Ltd公司的发展小趣事

在电子行业的快速发展中,Amaze Electronics Pte Ltd以其前瞻性的技术创新赢得了市场的认可。公司投入大量研发资源,成功开发出了一款高效能、低能耗的智能手机芯片。这款芯片不仅大幅提升了手机的运行速度,还显著降低了能耗,为用户带来了更流畅的使用体验。凭借这一技术创新,Amaze Electronics迅速在市场上脱颖而出,赢得了众多手机制造商的合作意向。

Cystech公司的发展小趣事

C-TECH Co., Ltd非常重视产品质量管理。公司自成立之初就引入了ISO 9001质量管理体系,并严格按照体系要求进行生产和管理。此外,公司还不断投入资源提升产品质量检测水平,确保每一款产品都能满足客户的需求和期望。正是凭借对品质的严格把控和持续改进,C-TECH Co., Ltd赢得了客户的广泛信任和好评。

Brainboxes公司的发展小趣事

Brainboxes公司成立于1984年,总部位于英国利物浦市。创立之初,公司专注于数据和I/O连接产品的设计和制造。凭借对串行通信技术的深刻理解,Brainboxes迅速在行业内崭露头角。其早期产品,如串口服务器和适配器,因高度可配置和可靠的特性而受到市场的欢迎。随着业务的发展,公司逐渐扩大产品线,涵盖IO模块等多个领域。

岑科(CENKER)公司的发展小趣事

随着生产规模的扩大,岑科在2010年将制造板块迁移至广西,以进一步优化企业资源配置。这一举措不仅降低了生产成本,还提高了生产效率。同时,岑科加速了自主创新和技术进步的步伐,不断推出更具竞争力的电子产品。在这一阶段,岑科的产品质量和性能得到了市场的广泛认可,客户满意度也持续提升。

问答坊 | AI 解惑

第4/15原创:独立按键

事无巨细,独立键盘 经过多天的等待,元器件终于补齐了,虽然焊接的过程中出现了非常悲剧的事情,但最终我的板子得以“残”貌示人,就傻傻的高兴一下好了。 言归正传,今天写写独立按键的原理及编程方法。 按键是什么东西,我想这个就不必由我向 ...…

查看全部问答>

CDB文件丢失或损坏

请教: 在打开DSP/BIOS菜单下的工具时,弹出这样的错误,说是CDB文件丢失或损坏。请问如何解决? PS:重新载入不行。…

查看全部问答>

FPGA 的IO脚分配问题

我知道要FPGA工作要有一个flash ,可是如何连接FPGA和flash啊,还有怎么向flash里下载我写的那个模块啊? 我选的一个FPGA说有484个引脚可是为什么又说315个可用引脚啊? 我现在面临的问题主要是,FPGA里面的程序模块我已经写完了,可是现在要把它 ...…

查看全部问答>

“通用射频测量和EMC诊断测试解决方案”

海洋仪器诚邀您参加技术交流会 活动时间:2010年6月25日(星期五) 活动地点:北京湖北大厦贵宾楼二层楚宫 主办:德国罗德与施瓦茨公司(R&S公司)       北京海洋兴业科技有限公司 随着各种电子产品研发生 ...…

查看全部问答>

寻求帮助简易超声波测距

学了一点超声波知识,现在想做个来看看效果,可资料有缺乏,哪位高手能给小弟指导一下吗?谢了 要求51单片机主控,用四位数码管显示被测距离,能测5-10米的距离,有效显示4位数。大家能提供点图图和C程序吗?本人将不胜感激。先谢谢了 。。…

查看全部问答>

大家好,wince 电池问题。GetSystemPowerStatusEx2是获取都是0,电源属性里面 电池显示为充电,是怎么回事呢?

wince 电池问题。GetSystemPowerStatusEx2是获取都是0,电源属性里面 电池显示为充电,是怎么回事呢?…

查看全部问答>

求:RAPI自定义功能函数的使用方法???

如何在wince中实现自定义功能函数,能通过Rapi被PC程序调用? 我参考的Windows CE那本书上提供的例子代码尝试进行实现,可是PC就是调用不成功; 1、wince下dll实现后,拷贝在/windows目录下; 2、PC程序通过ceRapiInvoke函数调用; 3、PC程序进行 ...…

查看全部问答>

急!求助STM32时钟设置

开发环境IAR + JLINK原来程序中设置HCLK为SYSCLK的4分频,SYSCLK为72MHz,程序正常运行!后来将HCLK设置为SYSCLK的16分频,SYSCLK为72MHz,程序正常运行!再后来将HCLK设置为SYSCLK的64分频,SYSCLK为72MHz,程序不能下载到芯片中! ...…

查看全部问答>

STM32F103VE引脚使用咨询

                                 STM32F103VE的那些I/O引脚可以承受5V电平?谢谢!…

查看全部问答>

版主----请教STM32中软中断的问题

ARM7中有软中断,STM32中是否SVCall就是cortex-M3中的软中断?用法是否跟ARM7中的软中断类似? 版主请指示一下,谢谢!…

查看全部问答>