SHT21是一款基于IIC的温湿度传感器,它的引脚及定义如下:
标准的IIC器件,没有其他多余的引脚,应用框图如下:
温度的测量范围是-40到125℃,湿度测量范围0-100%RH,具体参数及采样精度见下图:
芯片采用IIC通信,有关IIC通信原理可参考:
IIC通信原理-CSDN博客文章浏览阅读298次,点赞5次,收藏8次。这样看起来,区分起止信号与数据电平是不是就更加容易些了,但是嘛由于只有一根数据线了,缺点就是无法同时收发了,因此它是半双工通信的。一般的IIC器件,比如EEPROM,此时会发送要写入或读取的地址,如往0x0000地址写入数字1,那么会先发送0x0000,等到回码后再发送0x01,之后在收到应答后结束通信。前面在讲UART时提到过通信传输所需要的几个必要条件,首先得知道什么时候通信开始,什么时候通信结束,然后就是如何去解析数据了,根据这几点,我们来谈谈IIC是如何实现通信的。从图上可以看到,IIC规定的。https://blog.csdn.net/u011436603/article/details/136007075 温湿度的获取也很简单,启动IIC,读取相应寄存器的值,再根据手册提供的公式转换一下即可。温度和湿度使用不同的指令分别进行测量,具体的指令码如下:
采集温度时:
- 启动IIC
- 发送设备地址+写指令
- 发送测量温度指令
- 发送设备地址+读指令
- 读数据
- 结束IIC
- 换算温度值
采集湿度时:
- 启动IIC
- 发送设备地址+写指令
- 发送测量湿度指令
- 发送设备地址+读指令
- 读数据
- 结束IIC
- 换算湿度值
关于数值的获取及转换公式手册写的也很清楚
温度转换
湿度转换
具体的代码如下:
float SHT2x_MeasureTempHM(void)
{
float TEMP;
u8 tmp1, tmp2;
u16 ST;
SHT2x_SCL_OUTPUT();
SHT2x_SDA_OUTPUT();
SHT2x_I2cStartCondition();
SHT2x_I2cWriteByte(I2C_ADR_W);
SHT2x_I2cWriteByte(TRIG_TEMP_MEASUREMENT_HM);//测温度
SHT2x_I2cStartCondition();
SHT2x_I2cWriteByte(I2C_ADR_R);
SHT2x_SCL_HIGH();
SHT2x_SCL_INPUT();
while(Bit_RESET == SHT2x_SCL_STATE())
{
delay_us(20);
}
tmp1 = SHT2x_I2cReadByte();
SHT2x_I2cAcknowledge();
tmp2 = SHT2x_I2cReadByte();
SHT2x_I2cNoAcknowledge();
SHT2x_I2cStopCondition();
ST = (tmp1 << 8) | (tmp2 << 0);
ST &= ~0x0003;
TEMP = ((float)ST * 0.00268127) - 46.85;
SHT2x_SCL_OUTPUT();
return (TEMP);
}
float SHT2x_MeasureHumiHM(void)
{
float HUMI;
u8 tmp1, tmp2;
u16 SRH;
SHT2x_SCL_OUTPUT();
SHT2x_I2cStartCondition();
SHT2x_I2cWriteByte(I2C_ADR_W);
SHT2x_I2cWriteByte(TRIG_HUMI_MEASUREMENT_HM);//测湿度
SHT2x_I2cStartCondition();
SHT2x_I2cWriteByte(I2C_ADR_R);
SHT2x_SCL_HIGH();
SHT2x_SCL_INPUT();
while( Bit_RESET==SHT2x_SCL_STATE())
{
delay_us(2);
}
tmp1 = SHT2x_I2cReadByte();
SHT2x_I2cAcknowledge();
tmp2 = SHT2x_I2cReadByte();
SHT2x_I2cNoAcknowledge();
SHT2x_I2cStopCondition();
SRH = (tmp1 << 8) | (tmp2 << 0);
SRH &= ~0x0003;
HUMI = ((float)SRH * 0.00190735) - 6;
SHT2x_SCL_OUTPUT();
return (HUMI);
}