在做一个项目时用到了一个温湿度传感器SHT20,这颗芯片有着非常高的精度0.3%,业界普遍认同它。
因为之前单片机开发用到过SHT11,所以一想原理差不多,都是基于I2C通讯,如果使用软件I2C移植就相对简单,不如利用PSOC的特性,直接使用它的I2C组件来完成。
之前没有使用过I2C的组件,所以找到了PCreator 中的SCB_I2CCommMaster的里程,其中两个收发函数:
WriteCommandPacket();
ReadStatusPacket();
我们可以再发送函数中找到:
(void) I2CM_I2CMasterWriteBuf(0x40, 0xE5, 1, \ I2CM_I2C_MODE_COMPLETE_XFER);
其中我们把第一个从设备地址修改为SHT20手册上标注的0x40,第二个参数是发送的数据,后面跟着长度,和设置模式(默认即可)
我们通过手册可以看到我们要向读取数据需要发送两个字节的数据,第一个是7位的从设备地址和1位的读写命令。当然当你调用 I2CM_I2CMasterWriteBuf这个函数时就默认先发送
第一个字节的数据,所以我们只要发送后面的11100101即0XE5。函数调用之后我们就可以准备调用接收函数进行读取数据啦
(void) I2CM_I2CMasterReadBuf(0x40, buffer, 3, \I2CM_I2C_MODE_COMPLETE_XFER);
同样的我们可以成功读取到三个字节的数据,我们只需要按照手册拿到画红线的数据即可,这个就是湿度的原始数据。然后我们带入给的公式:
对应解析的代码是:
float SHT2x_CalcRH(uint16 u16sRH)
//==============================================================================
{
uint16 humidityRH; // variable for result
u16sRH &= ~0x0003; // clear bits [1..0] (status bits)
//-- calculate relative humidity [%RH] --
humidityRH = -6.0 + 125.0/65536 * (uint16)u16sRH; // RH= -6 + 125 * SRH/2^16
return humidityRH;
}
这样我们运行程序可以从调试模式中看到数据:
转化为10进制就是32,那么相对湿度就是32%。
测温度的话只需要把发送的命令改为测试温度的即可0xE3,然后用如下程序进行解析:
float SHT2x_CalcTemperatureC(uint16 u16sT)
//==============================================================================
{
float temperatureC; // variable for result
u16sT &= ~0x0003; // clear bits [1..0] (status bits)
//-- calculate temperature [°C] --
temperatureC= -46.85 + 175.72/65536 *(float)u16sT; //T= -46.85 + 175.72 * ST/2^16
return temperatureC;
}
可以看到数据是27.5714531,那么温度可以表示为27.57度。
最后附上指令表:
|