SHTC3温湿度传感器的使用
1、SHTC3简单说明
SHTC3是一个检测温度、湿度的传感器,可以检测-40℃~125℃的温度范围和0%~100%的湿度范围。
SHTC3的工作电压范围为:1.62V~3.6V。
SHTC3使用的通讯方式是I2C,通讯速率可以达到400KHz。
SHTC3的管脚图如下:
从图中可以看到,SHTC3只有4个引脚,电源和地、2个I2C通讯引脚。
关于SHTC3更多说明,可以查看它的规格资料。
2、SHTC3的设备地址和命令
在SHTC3的规格资料内,SHTC3的I2C设备地址为0x70,如下:
在实际的使用过程中,SHTC3的设备地址需要与读写数据/命令方向位组成一个字节同时发送,字节的最低位为读写数据/命令方向位,高7位是SHTC3的设备地址。
如果要通过I2C写数据或命令给SHTC3,在I2C起始信号之后,需要发送“1110 0000”,即0xE0给SHTC3,除了通过高7位“1110 000”的设备地址寻址还通过最低位“0”通知SHTC3接下来是写数据或命令操作。
如果要通过I2C读取SHTC3中的数据,在I2C起始信号之后,需要发送“1110 0001”,即0xE1给SHTC3,除了通过高7位“1110 000”的设备地址寻址还通过最低位“0”通知SHTC3接下来是读取数据的操作。
SHTC3的命令由2个字节组成,在发送命令时,主机需要通过I2C发送2个字节命令给SHTC3。SHTC3有如下命令:
- //SHTC3地址
- #define SHTC3_ADDRESS 0x70
- //SHTC3 命令
- #define SHTC3_WIRTE_CMD ((SHTC3_ADDRESS<<1)&0xFE)
- #define SHTC3_READ_CMD ((SHTC3_ADDRESS<<1)|0x01)
- #define SHTC3_SOFT_RESET_CMD 0x805D//软件复位命令
- #define SHTC3_READ_ID_CMD 0xEFC8//读取SHTC3 ID命令
- #define SHTC3_WAKE_UP_CMD 0x3517//将芯片从睡眠模式唤醒命令
- #define SHTC3_SLEEP_CMD 0xB098//使芯片进入休眠命令
- //Normal Mode Clock Stretching Enable Measurement Command
- #define SHTC3_NOR_READ_TEMP_FIR_EN_CMD 0x7CA2//
- #define SHTC3_NOR_READ_HUM_FIR_EN_CMD 0x5C24//
- //Normal Mode Clock Stretching Disable Measurement Command
- #define SHTC3_NOR_READ_TEMP_FIR_DIS_CMD 0x7866//
- #define SHTC3_NOR_READ_HUM_FIR_DIS_CMD 0x58E0//
- //Low Power Mode Clock Stretching Enable Measurement Command
- #define SHTC3_LOW_READ_TEMP_FIR_EN_CMD 0x6458//
- #define SHTC3_LOW_READ_HUM_FIR_EN_CMD 0x44DE//
- //Low Power Mode Clock Stretching Disable Measurement Command
- #define SHTC3_LOW_READ_TEMP_FIR_DIS_CMD 0x609C//
- #define SHTC3_LOW_READ_HUM_FIR_DIS_CMD 0x401A//
主机发送2个字节命令给SHTC3的代码如下:
- void SHTC3_WRITE_CMD(uint16_t cmd)
- {
- I2C_START();
- SHTC3_ERR = I2C_WRITE_BYTE(SHTC3_WIRTE_CMD);
- if(SHTC3_ERR != )
- {
- SHTC3_ERR = I2C_WRITE_BYTE((cmd>>) & 0xFF);
- if(SHTC3_ERR != )
- {
- SHTC3_ERR = I2C_WRITE_BYTE(cmd & 0xFF);
- if(SHTC3_ERR != )
- {
- I2C_STOP();
- }
- }
- }
- }
SHTC3_ERR变量的作用主要是检测是否能收到SHTC3的应答信号,如果没有收到应答信号就不再进行后面的操作。
SHTC3_SOFT_RESET_CMD是SHTC3的软件复位命令,主机通过发送该命令来复位SHTC3。一般在上电初始化时,主机通过发送该命令来复位一下SHTC3。通过调用SHTC3_WRITE_CMD(SHTC3_SOFT_RESET_CMD)函数来软件复位SHTC3。
SHTC3有一个16bit的ID寄存器,主机可以通过读取该寄存器的值来判断与SHTC3的通讯是否正常。该ID寄存器内保存的值如下:
上图中的"x"表示无效值,将ID寄存器的值读取回来之后,只需要去比较bit11位和bit5~bit0位的值就好,将其它位屏蔽掉之后的值为0x0807。主机读取SHTC3 ID寄存器的值的代码如下:
- void SHTC3_READ_ID(uint16_t cmd)
- {
- SHTC3_ID = ;
- SHTC3_WRITE_CMD(SHTC3_READ_ID_CMD);
- if(SHTC3_ERR != )
- {
- I2C_START();
- SHTC3_ERR = I2C_WRITE_BYTE(SHTC3_READ_CMD);
- if(SHTC3_ERR != )
- {
- SHTC3_ID = I2C_READ_BYTE();
- SHTC3_ID <<= ;
- SHTC3_ID |= I2C_READ_BYTE();
- I2C_STOP();
- SHTC3_ID &= 0x083F;
- }
- }
- }
从SHTC3的ID寄存器读取回来的数据再与上0x083F,去除掉不需要用到的部分bit。
SHTC3_WAKE_UP_CMD和SHTC3_SLEEP_CMD是SHTC3的休眠唤醒和进入休眠命令,在使用的过程中,为了减少功耗,在不需要测量数据的时候,一般让SHTC3处于休眠状态。在需要测量温湿度的时候,再通过发送SHTC3_WAKE_UP_CMD命令来唤醒SHTC3,但是需要注意的是,SHTC3在唤醒之后需要一段稳定的时候,只有在SHC3稳定之后主机才能发送测量命令给SHTC3。SHTC3的休眠唤醒和进入休眠的代码如下:
- void SHTC3_WAKE_UP(void)
- {
- SHTC3_WRITE_CMD(SHTC3_WAKE_UP_CMD);
- if(SHTC3_ERR != )//没有收到响应信号,直接退出
- {
- I2C_STOP();
- //正常休眠唤醒之后需要等待一段稳定的时间发送命令,SHTC3才能响应主机
- I2C_DELAY();//大约1ms
- }
- }
- void SHTC3_INTO_SLEEP(void)
- {
- SHTC3_WRITE_CMD(SHTC3_SLEEP_CMD);
- I2C_STOP();
- }
上面的SHTC3_WAKE_UP函数在发送完SHTC3_WAKE_UP_CMD命令之后,如果收到SHTC3的应答信号,说明命令发送成功了,在发送完结束信号之后,会通过一个软件延时等待SHTC3稳定。
在使用SHTC3时,需要注意的是,如果SHTC3处于休眠的状态,那么SHTC3只能响应唤醒命令,如果主机在SHTC3休眠的状态下发送其它命令,那么SHTC3是不会反馈应答信号给主机的。
SHTC3上电初始化代码如下:
- void SHTC3_Init(void)
- {
- I2C_Init();
- SHTC3_WAKE_UP();//为了防止仿真的时候SHTC3再SLEEP状态下复位运行时造成SHTC3无法响应主机发送的命令,由于在仿真的时候SHTC3芯片没有断电,还是处于休眠状态,SHTC3在休眠是无法响应除了唤醒命令的其它操作的
- SHTC3_WRITE_CMD(SHTC3_SOFT_RESET_CMD);//发送软件复位命令
- HAL_Delay();//延时等待复位稳定
- SHTC3_READ_ID(SHTC3_READ_ID_CMD);
- printf("SHTC3的ID值为:0x%04x\r\n",SHTC3_ID);
- }
首先调用I2C_Init()函数配置I2C的引脚。然后通过调用SHTC3_WAKE_UP()函数唤醒SHTC3,这一步不是必须的,这只是为了防止在仿真的时候复位运行时,HTC3处于休眠的状态从而导致无法响应主机发送的复位命令。
发送完唤醒命令之后,主机接着发送复位命令给SHTC3,让SHTC3软复位,SHTC3复位后需要一段稳定的时间,所以使用延时等待一下。最后读取SHTC3的ID值并通过USART打印出来,用来检验读取到的ID值是否正确。
3、SHTC3测量温度湿度命令和步骤
SHTC3有多个测量温度湿度的命令,如下:
在这里使用的是Normal Mode中的命令来测量数据,Low Power Mode不知道有什么区别。
从上面的命令表中可以看到,测量命令除了读取回来的数据先后顺序有区别,还有一个Clock Stretching Enabled和Clock Stretching Disabled的区别。
Clock Stretching是时钟拉伸的意思。如果使用Clock Stretching Enable命令的话,那么发送完测量命令之后,在SHTC3测量温度湿度数据的过程中,SHTC3会拉低I2C的时钟线SCL,通过这样来禁止主机发送命令给SHTC3,只有当SHTC3完成温度湿度数据测量时,SHTC3才会释放时钟线SCL。
如果使用Clock Stretching Disable命令的话,在SHTC3测量数据的过程中,SHTC3并不会拉低I2C的时钟线SCL,只是如果主机在SHTC3测量数据的过程中发送命令或数据的时候,SHTC3是不会响应主机的,主机可以通过SHTC3是否有响应信号来判断SHTC3是否完成数据的测量。
在SHTC3数据手册中有说道,每一个测量周期包含4个命令部分,如下:
1、发送唤醒命令。
2、发送测量命令
3、读取测量完成之后的数据。
4、发送休眠命令。
SHTC3测量示例如下图所示:
主机首先发送休眠唤醒命令使SHTC3从休眠的状态唤醒,发送完休眠唤醒命令之后,需要等待SHTC3唤醒并且稳定。
接着发送测量命令,SHTC3在接收到测量命令之后就开始测量数据了。
上面的图中出现了Clock Stretching enabled和Clock Stretching disabled两个分支,这是根据发送的测量命令的不同而导致的。
如果使用的是Clock Stretching enabled测量命令,那么在SHTC3在测量数据的过程中,当主机发送设备地址和读位给SHTC3后,SHTC3在应答一个信号之后就会将SCL时钟线拉低,主机在这个时候就无法与SHTC3通讯,只有在SHTC3测量完数据释放SCL后,主机才读取到SHTC3测量完的数据。
如果使用的是Clock Stretching disabled测量命令,么在SHTC3在测量数据的过程中,当主机发送设备地址和读位给SHTC3,SHTC3不会产生应答信号(NACK)给主机,主机可以通过不断发送命令然后查询是否收到ACK信号来判断SHTC3是否完成测量。
当SHTC3完成数据的测量,主机就可以读取SHTC3中的温度和湿度的数据了,温度数据包含2个字节的数据和1个字节的CRC校验数据,通用湿度的数据也包含2个字节的数据和1个字节的CRC校验数据。
在完成数据的读取操作之后,主机发送休眠命令给SHTC3,使SHTC3在不工作的时候休眠从而降低功耗。
读取到的温度和湿度数据是带有CRC校验的,可以通过CRC校验检验数据是否正确。SHTC3的CRC校验如下:
SHTC3的CRC校验代码如下:
- uint8_t SHTC3_CRC_CHECK(uint16_t DAT,uint8_t CRC_DAT)
- {
- uint8_t i,t,temp;
- uint8_t CRC_BYTE;
- CRC_BYTE = 0xFF;
- temp = (DAT>>) & 0xFF;
- for(t = ;t < ;t ++)
- {
- CRC_BYTE ^= temp;
- for(i = ;i < ;i ++)
- {
- if(CRC_BYTE & 0x80)
- {
- CRC_BYTE <<= ;
- CRC_BYTE ^= 0x31;
- }
- else
- {
- CRC_BYTE <<= ;
- }
- }
- if(t == )
- {
- temp = DAT & 0xFF;
- }
- }
- if(CRC_BYTE == CRC_DAT)
- {
- temp = ;
- }
- else
- {
- temp = ;
- }
- return temp;
- }
在SHTC3资料中已经给出了计算温度和湿度的公式,如下:
SRH和ST是从SHTC3采集回来的数据。
SHTC3完成一次测量的代码如下:
- void SHTC3_MEASUREMENT_TEMP_HUM(void)
- {
- uint8_t Cnt;
- uint8_t Temp_Check_Num;
- uint8_t Hum_Check_Num;
- uint16_t TEMP_MEASUREMENT;
- uint16_t HUM_MEASUREMENT;
- uint32_t result;
- SHTC3_WAKE_UP();
- if(SHTC3_ERR != )
- {
- SHTC3_WRITE_CMD(SHTC3_NOR_READ_TEMP_FIR_DIS_CMD);//SHTC3大约11ms~20ms检测一次温度
- if(SHTC3_ERR != )
- {
- Cnt = ;
- do//等待SHTC3检测完成,
- {
- I2C_DELAY();//大约1ms
- I2C_START();
- SHTC3_ERR = I2C_WRITE_BYTE(SHTC3_READ_CMD);
- Cnt++;
- if(Cnt == )//防止读不到响应时,程序卡死
- {
- break;
- }
- }while(SHTC3_ERR == );//正常读取到响应才退出
- if(SHTC3_ERR != )
- {
- //SHTC3检测完成,开始读取数据,连CRC总共6个byte
- TEMP_MEASUREMENT = I2C_READ_BYTE();//温度数值高8位
- TEMP_MEASUREMENT <<= ;
- TEMP_MEASUREMENT |= I2C_READ_BYTE();//温度数值低8位
- Temp_Check_Num = I2C_READ_BYTE();//温度CRC校验
- HUM_MEASUREMENT = I2C_READ_BYTE();
- HUM_MEASUREMENT <<= ;
- HUM_MEASUREMENT |= I2C_READ_BYTE();
- Hum_Check_Num = I2C_READ_BYTE();
- I2C_STOP();
- Cnt = SHTC3_CRC_CHECK(TEMP_MEASUREMENT,Temp_Check_Num);
- if(Cnt == )
- {
- result = TEMP_MEASUREMENT**;//保留一位小数点
- TEMP_DATA = (uint16_t)(result >> );
- if(TEMP_DATA >= )
- {
- //正温度
- TEMP_DATA -= ;
- Cnt = TEMP_DATA%;
- TEMP_DATA = TEMP_DATA/;
- printf("采集到的温度度值是:%d.%d\r\n",TEMP_DATA,Cnt);
- }
- else
- {
- //负温度
- TEMP_DATA = - TEMP_DATA;
- Cnt = TEMP_DATA%;
- TEMP_DATA = TEMP_DATA/;
- printf("采集到的温度度值是:-%d.%d\r\n",TEMP_DATA,Cnt);
- }
- }
- Cnt = SHTC3_CRC_CHECK(HUM_MEASUREMENT,Hum_Check_Num);
- if(Cnt == )
- {
- result = HUM_MEASUREMENT*;
- HUM_DATA = (uint8_t)(result >> );
- printf("采集到的湿度值是:%d%%\r\n",HUM_DATA);
- }
- printf("\r\n");
- }
- }
- SHTC3_INTO_SLEEP();
- }
- }
完整的工程代码可以在:https://github.com/h1019384803/STM32F103ZET6_I2C查看。
SHTC3温湿度传感器的使用的更多相关文章
- 数字温湿度传感器DHT11--操作源代码
//IO定义 #define P_DataIN_DHT11 PB0_IN #define P_DataOUT_DHT11 PB0_OUT //宏定义 #define BSET_DHT11 P_Data ...
- DH11数字温湿度传感器
DH11数字温湿度传感器是一种集温度.湿度一体的复合传感器,它能把温度和湿度物理量通过温.湿度敏感元件和相应电路转化成方便计算机.PLC.智能仪表等数据采集设备直接读取的数字量.DHT11由电阻式感湿 ...
- STM32读取温湿度传感器DHT11和DHT21(AM2301)系列问题
1.DHT11和DHT21传感器 这两种传感器都是奥松公司的产品,具体的传感器说明书在其官网上有(www.aosong.com). DHT11 数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合 ...
- STM32应用实例五:与SHT1X温湿度传感器通讯
在这次项目开发中应用到了SHT1X温湿度传感器,该系列有SHT10.SHT11和SHT15,属于Sersirion温湿度传感器家族中的贴片封装系列.包括一个电容性聚合体测湿敏感元件.一个用能隙材料制成 ...
- Arduino和C51开发DHT11温湿度传感器
技术:51单片机.Arduino.DHT11.温湿度传感器.传感器 概述 学习单片机离不开对传感器的学习,本文主要介绍DHT11温湿度传感器的使用方法,同学也可以了解更多的传感器,这对你以后开发产 ...
- 进阶之路(中级篇) - 016 温湿度传感器DHT11
如果想使用 Arduino 开发板驱动 DHT11 来获取温湿度的时候建议使用第三方的库,这样可以加快程序的开发速度,而且不容易出错,下面的代码我已经安转了第三方的库了.详细的安装方法请参考极客先锋的 ...
- 树莓派使用DHT11温湿度传感器
一.相关介绍 DHT11介绍: DHT11是一款比较便宜的温湿度传感器模块.读取数据只需要占用一个IO口.能够同时测量温度和相对湿度. DHT11的数据手册可以看这里:http://wenku.bai ...
- 玩转X-CTR100 l STM32F4 l DHT11温湿度传感器
我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] DHT11数字温湿度传感器是一款含有已校准数字信号输 ...
- 使用Arduino Wire Library读取温湿度传感器AM2321
AM2321是采用I2C总线或单总线通讯的国产温湿度传感器.在AM2321手册中,当采用I2C通讯时,手册指定了多处需要主机等待的时间间隔,包括: (1)唤醒传感器时,从机不回复ACK,但主机主要等待 ...
随机推荐
- ES6的原始类型数据——Symbol
javascript中原始值,即基本数据类型,像Number,String,Boolean,undefined,Null都是基本类型值,保存在栈中,但是有个疑问: Symbol打印出来明明是个函数,具 ...
- Redis系列六 - 浅谈如何设计秒杀系统
前言 设计一个系统之前,我们肯定要先确认系统业务场景是怎样的,下面就以某电商平台上的秒杀活动为场景,一起来探讨一个秒杀系统改如何去设计. 场景 我们现在要卖100件纸尿布,按照系统的用户量及以往经验来 ...
- java面试题汇总四
第三部分 Java SE基础 3.1 java多线程 3.1.1 线程的实现方式,怎么启动线程怎么区分线程? 1.线程的实现方式: 有 4 种方式可以用来创建线程: 2.继承 Thread 类 2 ...
- python学习基础知识
学习python前最好知道的知识点: python之父:Guido van Rossum python是一种面向对象语言 目前python最新的版本是3.8,python2已经逐渐淘汰 python的 ...
- Python1-变量
一.变量和简单数据类型 1.变量 命名规则: 变量名组成——字母.下划线.数字(不可做首字符): 用下划线分隔单词,不可包含空格: 关键字和函数名不可做变量名: 小写字母做变量名,不建议使用大小写的字 ...
- 菜鸟对java和Go的理解
1.go对比java go通过结构体嵌套+接口实现类似面向对象中的继承和多态.个人认为尤其是go的接口抓住了多态的本质.而Go提倡的面向接口的思想也可能使得架构上更加解耦. 2.关于Go不要通过共享内 ...
- 测试必知必会系列- Linux常用命令 - tar
21篇测试必备的Linux常用命令,每天敲一篇,每次敲三遍,每月一循环,全都可记住!! https://www.cnblogs.com/poloyy/category/1672457.html 压缩一 ...
- javaScript 基础知识汇总 (十一)
1.柯里化和偏函数 偏函数 假如一个函数有两个参数,然后第一个参数我们调用的时候是确定的,那么我门就可以创建一个偏函数来简化参数传递的问题 示例 function mul(a,b){ return a ...
- 五分钟学Java:如何学习Java面试必考的网络编程
原创声明 本文作者:黄小斜 转载请务必在文章开头注明出处和作者. 本文思维导图 简介 Java作为一门后端语言,对于网络编程的支持是必不可少的,但是,作为一个经常CRUD的Java工程师,很多时候都不 ...
- 数据结构和算法:Python实现二分查找(Binary_search)
在一个列表当中我们可以进行线性查找也可以进行二分查找,即通过不同的方法找到我们想要的数字,线性查找即按照数字从列表里一个一个从左向右查找,找到之后程序停下.而二分查找的效率往往会比线性查找更高. 一. ...