简介
什么是SHT31? 一主机多从机--通过寻址的方式--每个从机都有唯一的地址(器件地址0x44+引脚地址)<<1 + 读写位(读1写0)
SHT31新一代 Sensirion 湿度和温度传感器在尺寸与智能方面建立了新的标准:它嵌入了适于回流焊的双列扁平无引脚 DFN 封装, 底面 3 x 3mm ,高度 1.1mm。传感器输出经过标定的数字信号,标准 I2C 格式。
1、原理图
配置为通用开漏输出。
PB6--SCL
PB7--SDA
器件地址 引脚地址--ADDR引脚的高低电平
0x44+ 0
1
2、时序说明
数据传输
SDA 引脚用于传感器的数据输入和输出。当向传感器发送命令时, SDA 在串行时钟(SCL)的上升沿
有效, 且当 SCL 为高电平时, SDA 必须保持稳定。在 SCL 下降沿之后, SDA 值可被改变。为确保通讯
安全, SDA 的有效时间在 SCL 上升沿之前和下降沿之后应该分别延长至 TSU and THO -参考图 9。当从传感器读取数据时, SDA 在 SCL 变低以后有效(TV),且维持到下一个 SCL 的下降沿 。
为避免信号冲突,微处理器(MCU)必须只能驱动SDA 和 SCL 在低电平。需要一个外部的上拉电阻(例如: 10kΩ)将信号提拉至高电平。上拉电阻通常可能已包含在微处理器的 I/O 电路中。
起始信号
结束信号
3、SHT31读写数据
SHT31指令集
了解一下如下SHT31命令集:
读数据
工作顺序为:先发送IIC通信开始标志Start后,写入左移一位的地址,并将空出来的位写0表示写数据。当收到传感器应答后,即可发送命令的高八位,再次等待应答,再发送余下的低八位。然后等待ACK应答即可。
(读 R:‘1’,写 W:‘0’)。在第 8 个 SCL时钟下降沿之后,通过拉低 SDA 引脚(ACK 位),指示传感器数据接收正常。
校验:发送一次读取指令,收到6字节数据;期中1、2字节数温度的,第三字节是温度的校验字节;4、5字节是湿度的,第6字节是湿度的校验字节。校验方式采用。
温湿度转换
4、温湿度转换应用
sht3x初始化
读取温湿度
/********************************************************************************************************* * 函 数 名 : Sht3x_Read_TemperatureHumidity * 功能说明 : 读取SHT3x温湿度数据 * 形 参 : HT:存储温湿度的结构体指针 * 返 回 值 : 无 *********************************************************************************************************/ int Sht3x_Read_TemperatureHumidity(Sht3x_TypeDef *temp) { unsigned char buff[6] = {0}; unsigned char i = 0; IIC_Start(); //起止信号 IIC_WriteByte(SHT3X_ADDR<<1 | IIC_WRITE); //器件地址+写 if(IIC_Wait_ACK() == ACK){ //对方应答了,继续执行 IIC_WriteByte(SHT3X_READ_TEMP_HUM>>8); //命令的高位 if(IIC_Wait_ACK() == ACK){ //对方应答了,继续执行 IIC_WriteByte(SHT3X_READ_TEMP_HUM&0xff); //命令的低位 if(IIC_Wait_ACK() == ACK){ //对方应答了,继续执行 do{ if(++i > 20){ return 4; } IIC_Stop(); Delay_Ms(2); //等待对方采集好数据 IIC_Start(); IIC_WriteByte(SHT3X_ADDR<<1 | IIC_READ);//询问是否采集好了数据 }while(IIC_Wait_ACK() != ACK); //如果条件成立,表示传感器采集数据未完成 for(i=0; i<5; i++){ buff[i] = IIC_ReadByte(ACK); } buff[5] = IIC_ReadByte(NACK); IIC_Stop(); } //转换温湿度 if(crc8(buff, 2) == buff[2] && crc8(&buff[3], 2) == buff[5]) { temp->temperature = (buff[0]<<8|buff[1])/65535.0*175-45; temp->humidity = (buff[3]<<8|buff[4])/65535.0*100; }