龙空技术网

【STM32F103ZET6开发板】第3-5讲:SHT20温湿度传感器

电子友人章 126

前言:

现在看官们对“stm32温度计”大约比较讲究,朋友们都需要了解一些“stm32温度计”的相关资讯。那么小编同时在网上收集了一些对于“stm32温度计””的相关文章,希望大家能喜欢,看官们一起来学习一下吧!

SHT20温湿度传感器实验

实验目的了解SHT20数字温湿度传感器的基本原理。掌握STM32与SHT20传感器IIC总线通信的程序设计。实验内容编写程序检测SHT20温湿度值通过串口1在串口调试助手上显示。编写程序检测SHT20温湿度值通过串口1在艾克姆实验助手上显示。硬件设计湿度测量简介

前面有介绍使用湿敏元件对湿度进行测量的方法,这是近几十年来得以迅速发展的电子式湿度测量,其实,早在18世纪人类就发明了干湿球湿度计用以测量湿度,称之为干湿球测湿法。

干湿球测湿法采用间接测量方法,通过测量干球、湿球的温度,再经过计算得到湿度值,因此对使用温度没有严格限制,在高温环境下测湿也不会对传感器造成损坏。干湿球湿度计的准确度还取决于干球、湿球两支温度计本身的精度;湿度计必须处于通风状态:只有纱布水套、水质、风速都满足一定要求时,才能达到规定的准确度。

与电子式湿度测量对比:干湿球湿度计的准确度不够高,只有5% ~ 7%RH。干湿球湿度计体积比较大,不易集成到产品中去。但其维护相当简单,在实际使用中,只需定期给湿球加水及更换湿球纱布即可。另外,与电子式湿度传感器相比,干湿球测湿法不会产生老化、精度下降等问题。干湿球湿度计更适合于在高温及恶劣环境的场合使用,抗污染性也比较好。

图1:干湿球湿度计实物图

电子式湿度传感器是近几十年,特别是近20年才迅速发展起来的。湿度传感器生产厂在产品出厂前都要采用标准湿度发生器来逐个标定,电子式湿度传感器的准确度可以达到2% ~ 3%RH。而来自瑞士的Sensirion(盛思锐)是湿度、气体和液体流量测量和控制领域高质量传感器和传感器解决方案的领先制造商。

Sensirion公司成立于1998年,是从苏黎世的瑞士联邦技术学院(ETH)拆分创建,总部位于瑞士苏黎世。员工分布在美国、韩国、日本、中国、中国台湾和德国等国家和地区。瑞士的总部负责研究、开发和生产。下面介绍的SHT20和SHT30均是Sensirion公司推出的高灵敏度、高精度的温湿度传感器。

注: Sensirion公司早期推出的SHT1x系列和SHT7x系列(已停产),因性价比远低于SHT2x系列和SHT3x系列而很少再被采用了。SHT2X系列数字温湿度传感器

适用于各种应用,并已成为行业标准数字湿度传感器SHT2x系列可用于各种大批量的应用,并且事实上已成为今天的行业标准。SHT2x系列包括低成本版本SHT20(精度误差是±3.0%RH)、标准版本SHT21(精度误差是±2.0%RH)和高端版本SHT25(精度误差是±1.8%RH)。SHT2x湿度传感器系列将电容式湿度传感器、带隙温度传感器和专用模拟和数字集成电路都集成在一个CMOSens® 芯片上,使得传感器具有良好的精度,长期稳定性和超低功耗。

下面给出SHT20数字温湿度传感器和带PCB板的SHT20模块的实物图。

图2:SHT20传感器和SHT20模块实物图

注: SHT20模块是艾克姆科技设计的,该模块已在IIC总线上加有上拉电阻。SHT20数字温湿度传感器的规格参数

下面介绍下SHT20数字温湿度传感器的规格参数,SHT20模块的规格参数在此不做介绍。

表1:SHT20数字温湿度传感器规格参数

参数

规格

工作电压

2.1V~3.6V

芯片尺寸

3mm ×3mm×1.1mm

测量范围

温度:-40~+125℃ 湿度:0~100%RH

精度

温度:±0.3℃ 湿度:±3%RH (25℃)

分 辨 率

温度:0.01℃ 湿度:0.04%RH

衰 减 值

温度:<0.04℃/年 湿度:<0.5%RH/年

输出信号

IIC接口

反应时间(湿度)

8 sec(tau63%)

能耗

3.2uW(8位,1次测量/秒条件下)

引脚数

6个

SHT20数字温湿度传感器的引脚定义

下面介绍SHT20数字温湿度传感器的引脚定义,首先将SHT20数字温湿度传感器的引脚号标注下。

图3:SHT20数字温湿度传感器引脚号

表2:SHT20数字温湿度传感器引脚定义

SHT20引脚号

管脚名

功能描述

1

SDA

串行数据,双向

2

GND

供电地

3

NC

空脚

4

NC

空脚

5

VCC

供电正

6

SCL

串行时钟,双向

SHT20温湿度模块与开发板连接

IK-ZET6开发板上没有SHT20温湿度模块专用的接口,需杜邦线连接SHT20温湿度模块到IK-ZET6开发板上。如下图所示。

图4:SHT20模块与开发板接线图

表3:SHT20传感器与开发板连接

SHT20模块

开发板J3

说明

VCC

3V3

GND

GND

SDA

PB7

非独立GPIO

SCL

PB6

非独立GPIO

注:独立GPIO表示开发板没有其他的电路使用这个GPIO,非独立GPIO说明开发板有其他电路用到了该GPIO。软件设计SHT20数字温湿度传感器转换公式

SHT20数字温湿度传感器采用的是标准的IIC总线通信。但MCU通过IIC总线读取的信息需要按照一定的计算关系转换成与之对应的温度值和相对湿度值。下面分别给出SHT20的温度转换的计算公式和相对湿度的转换公式。

SHT20的温度转换的计算公式:

图5:温度转换的计算公式

SHT20的相对湿度转换的计算公式:

图6:相对湿度转换的计算公式

SHT20温湿度串口调试助手显示实验(串口1)注:本节的实验源码是在“实验3-3-1:DHT11温湿度传感器 - 串口调试助手显示(串口1)”的基础上修改。本节对应的实验源码是:“实验3-19-1:SHT20温湿度传感器 - 串口调试助手显示(模拟IIC)”。工程需要用到的库文件

本例需要用到的c文件如下表所示,工程需要添加下表中的c文件。

表4:实验需要用到的C文件

序号

文件名

后缀

功能描述

1

stm32f10x_rcc

.c

复位与时钟控制器。

2

stm32f10x_gpio

.c

通用输入输出。

3

stm32f10x_usart

.c

通用同步/异步收发器。

4

misc

.c

中断向量控制器。

按下图所示将需要的c文件添加到工程。

图7:在新建工程中添加所需库函数c文件

头文件引用和路径设置需要引用的头文件

因为在“main.c”文件中使用了标准库和我们自己建的软件延时函数,所以需要引用下面的头文件。

#include "stm32f10x.h" //delay这里报错的原因是:delay函数用汇编实现的,导致了MDK误报。 #include "delay.h" 需要包含的头文件路径

本例需要包含的头文件路径如下表:

表5: 头文件包含路径

序号

路径

描述

1

..\Lib\F10x_FWLIB\inc

标准库头文件路径。

2

..\User

stm32f10x_conf.h头文件在该路径,所以要包含。

3

..\User\bsp

自建的板卡相关的驱动文件路径。

MDK中点击魔术棒,打开工程配置窗口,按照下图所示添加头文件包含路径。

图8:添加头文件包含路径

MCU与SHT20通信所需函数汇集

在“实验3-19-1:SHT20温湿度传感器 - 串口调试助手显示(模拟IIC)”工程中有sht20.c文件,该文件包括了MCU通过I2C总线与SHT20通信所用到的函数。这些函数是艾克姆科技根据SHT20手册设计的函数,仅供用户参考。下表列举了这些函数。

表6:MCU与SHT20通信相关函数汇集

序号

函数名

功能描述

1

SHT2X_IIC_WriteByte

向SHT20写入一字节数据。

2

SHT2X_IIC_ReadByte

从SHT20读出一串数据。

3

SHT2x_CheckCrc

SHT20校验函数。

4

SHT2x_ReadUserRegister

SHT20读用户寄存器。

5

SHT2x_WriteUserRegister

SHT20写用户寄存器。

6

SHT2x_Calc_T

SHT20温度计算。

7

SHT2x_Calc_RH

SHT20湿度计算。

8

SHT2x_SoftReset

SHT20软件复位。

9

SHT2x_GetSerialNumber

SHT20序列号获取。

10

SHT2X_Init

SHT20初始化。

11

SHT2X_TEST

SHT20温湿度串口发送

编写代码

首先介绍下SHT20初始化函数,代码如下。

代码清单:初始化SHT20

/*************************************************************************** * 描 述 : SHT20初始化 * 入 参 : 无 * 返回值 : 无 **************************************************************************/ void SHT2X_Init(void) { SHT2x_GetSerialNumber(sndata1,sndata2); if((sndata1[0]+sndata1[1]+sndata1[3]+sndata1[4]+sndata1[5]+sndata1[6]+sndata1[7])>0) { if( SHT2x_CheckCrc(sndata1,0,1,sndata1[1])&& SHT2x_CheckCrc(sndata1,2,1,sndata1[3])&& SHT2x_CheckCrc(sndata1,4,1,sndata1[5])&& SHT2x_CheckCrc(sndata1,6,1,sndata1[7])&& SHT2x_CheckCrc(sndata2,0,2,sndata2[2])&& SHT2x_CheckCrc(sndata2,3,2,sndata2[5]) ) { printf("SHT2X CRC ok\r\n"); SN1=((sndata2[3]<<24)+(sndata2[4]<<16)+(sndata1[0]<<8)+sndata1[2]); SN2=((sndata1[4]<<24)+(sndata1[6]<<16)+(sndata2[0]<<8)+sndata2[1]); printf("SHT2X SN:0x%x%x\r\n",SN1,SN2); } else printf("SHT2X CRC error\r\n"); } else { SHT2x_GetSerialNumber(sndata1,sndata2); printf("SHT2X通信错误\r\n"); }

if(SHT2x_WriteUserRegister(0x3a)) printf("设置成功\r\n"); else printf("设置错误\r\n"); }

然后,MCU读取到的SHT20温湿度信息会经过计算公式转换成温度是摄氏度和湿度为相对湿度的结果。有关函数清单如下。

代码清单:SHT20温度计算

/************************************************************************** * 描 述 : 计算温度 * 入 参 : 无 * 返回值 : 1---成功计算出温度值, 0---失败 ***************************************************************************/ FunctionalState SHT2x_Calc_T(void) { uint8_t length=0; uint8_t Tdata[3]={0}; if(!IIC_Start())return DISABLE; IIC_Send_Byte(I2C_ADR_W); if(!IIC_Wait_Ack()) { IIC_Stop(); return DISABLE;} IIC_Send_Byte(TRIG_T_MEASUREMENT_POLL); IIC_Wait_Ack(); sw_delay_us(20); IIC_Stop(); do { IIC_Start(); IIC_Send_Byte(I2C_ADR_R); } while(!IIC_Wait_Ack()); for(length=0;length<=3;length++) { Tdata[length]=IIC_Read_Byte(0x00); IIC_Ack(); }; IIC_NAck(); IIC_Stop(); if(((Tdata[0]+Tdata[1]+Tdata[2])>0)&&SHT2x_CheckCrc(Tdata,0,2,Tdata[2])) temperatureC= (-46.85 + (175.72/65536 )*((float)((((uint16_t)Tdata[0]<<8)+(uint16_t)Tdata[1])&0xfffc))); else return DISABLE; return ENABLE; }

代码清单:SHT20湿度计算

/************************************************************************* * 描 述 : 计算湿度 * 入 参 : 无 * 返回值 : 1---成功计算出湿度值, 0---失败 ***************************************************************************/ FunctionalState SHT2x_Calc_RH(void) { uint8_t length=0; uint8_t RHdata[3]={0}; if(!IIC_Start())return DISABLE; IIC_Send_Byte(I2C_ADR_W); if(!IIC_Wait_Ack()) {IIC_Stop(); return DISABLE;} IIC_Send_Byte(TRIG_RH_MEASUREMENT_POLL); IIC_Wait_Ack(); sw_delay_us(20); IIC_Stop(); do { IIC_Start(); IIC_Send_Byte(I2C_ADR_R); } while(!IIC_Wait_Ack()); for(length=0;length<=3;length++) { RHdata[length]=IIC_Read_Byte(0x00); IIC_Ack(); }; IIC_NAck(); IIC_Stop(); if(((RHdata[0]+RHdata[1]+RHdata[2])>0)&&SHT2x_CheckCrc(RHdata,0,2,RHdata[2])) humidityRH = -6.0 + 125.0/65536 * ((float)((((uint16_t)RHdata[0]<<8)+(uint16_t)RHdata[1])&0xfff0)); else return DISABLE; return ENABLE; }

代码清单:串口实时显示SHT20温湿度

/************************************************************************** * 描 述 : SHT20温湿度串口发送函数 * 入 参 : 无 * 返回值 : 无 **************************************************************************/ void SHT2X_TEST(void) { //温度测试OK,通过串口1上传 if(SHT2x_Calc_T()) { printf("温度:%f\r\n",temperatureC); } //湿度测试OK,通过串口1上传 if(SHT2x_Calc_RH()) { printf("湿度:%f%%\r\n",humidityRH); } }

最后,在主函数中配置下I2C通信用引脚,初始化串口1及SHT20,调用SHT20_TEST函数实时读取温湿度信息。

代码清单:主函数

int main(void) { //初始化USART1并配置USART1中断优先级 USART1_Init(); //初始化IIC所用到的IO口 IIC_GPIO_Init(); //初始化SHT20 SHT2X_Init(); //主循环 while(1) { //温湿度测试OK,通过串口1上传 SHT2X_TEST(); //软件延时100ms sw_delay_ms(100); } } 实验步骤解压“…\第3部分:标准库教程和实验源码\ 2 – 传感器实验程序\”目录下的压缩文件“实验3-19-1:SHT20温湿度传感器 - 串口调试助手显示(模拟IIC)”,将解压后得到的文件夹拷贝到合适的目录,如“D\STM32F103ZET6”。启动MDK5.23。在MDK5中执行“Project→Open Project”打开“…\SHT20\projec”目录下的工程“SHT20.uvproj”。点击编译按钮编译工程。注意查看编译输出栏,观察编译的结果,如果有错误,修改程序,直到编译成功为止。编译后生成的HEX文件“SHT20.hex”位于工程目录下的“Objects”文件夹中。点击下载按钮下载程序 。如果需要对程序进行仿真,点击Debug按钮,即可将程序下载到STM32F103ZET6中进行仿真。程序运行后,打开串口调试助手选择正确的串口号,波特率设置为19200,数据位为8、停止位为1,可以观察到串口调试助手100ms显示一次读取到的温湿度信息。SHT20温湿度艾克姆实验助手显示实验(串口1)注:本节的实验源码是在“实验3-19-1:SHT20温湿度传感器 - 串口调试助手显示(模拟IIC)”的基础上修改。本节对应的实验源码是:“实验3-19-2:SHT20温湿度传感器 - 艾克姆实验助手显示(模拟IIC)”。工程需要用到的库文件

在使用库函数建“实验3-19-2:SHT20温湿度传感器 - 艾克姆实验助手显示(模拟IIC)”工程时,需要用到的c文件以及添加头文件包含路径的方法与介绍“实验3-19-1:SHT20温湿度传感器 - 串口调试助手显示(模拟IIC)”完全一样,在此不再赘述。

编写代码

首先sht20.c相关的函数及配置可完全参考“实验3-19-1:SHT20温湿度传感器 - 串口调试助手显示(模拟IIC)”的代码描述,因为是与艾克姆实验助手通信,需要有固定的通信格式,即本实验的SHT2X_TEST函数有所不同,代码清单如下。

程序清单:艾克姆实验助手实时显示SHT20温湿度信息

/************************************************************************** * 描 述 : SHT20测试函数 * 入 参 : 无 * 返回值 : 无 **************************************************************************/ void SHT2X_TEST(void) { uint8_t temp[5];

memset(temp, 0, 5); //将temp数组初始化 //温湿度测试OK,通过串口1上传 if(SHT2x_Calc_T()&&SHT2x_Calc_RH()) { temp[0] = 'H'; //由与艾克姆实验助手通信格式决定 temp[1] = (uint16_t)temperatureC/10+ 0x30; temp[2] = (uint16_t)temperatureC%10+ 0x30; temp[3] = (uint16_t)humidityRH/10+ 0x30; temp[4] = (uint16_t)humidityRH%10+ 0x30; USART1_SendStr(temp); //实时显示温湿度 } }

然后,在主函数中配置下I2C通信用引脚,初始化串口1及SHT20,调用SHT20_TEST函数实时读取温湿度信息。

程序清单:主函数

int main(void) {

//初始化USART1并配置USART1中断优先级 USART1_Init(); //初始化IIC所用到的IO口 IIC_GPIO_Init(); //初始化SHT20 SHT2X_Init();

//主循环 while(1) { //温湿度测试OK,通过串口1上传 SHT2X_TEST(); //软件延时100ms sw_delay_ms(100); } }

实验步骤解压“…\第3部分:标准库教程和实验源码\ 2 – 传感器实验程序\”目录下的压缩文件“实验3-19-2:SHT20温湿度传感器 - 艾克姆实验助手显示(模拟IIC)”,将解压后得到的文件夹拷贝到合适的目录,如“D\STM32F103ZET6”。启动MDK5.23。在MDK5中执行“Project→Open Project”打开“…\SHT20\projec”目录下的工程“SHT20.uvproj”。点击编译按钮编译工程。注意查看编译输出栏,观察编译的结果,如果有错误,修改程序,直到编译成功为止。编译后生成的HEX文件“SHT20.hex”位于工程目录下的“Objects”文件夹中。点击下载按钮下载程序 。如果需要对程序进行仿真,点击Debug按钮,即可将程序下载到STM32F103ZET6中进行仿真。程序运行后,打开艾克姆实验助手选择正确的串口号,波特率设置为38400,设置完成后,点击打开,可以观察到艾克姆实验助手信息栏会100ms刷新一次温湿度信息,并且有实时温湿度曲线。

标签: #stm32温度计