温湿度传感器SHT20的驱动与使用

时间:2021-04-06 19:29:20

    最近公司里的一个小的项目:基于冰库的温度检测,采用无线通讯的方式,将采集到的温度信息传送给基站,基站通过UDP传输给上位机。

    实验平台

     编译软件: IAR Embedded Workbench for ARM version 6.40

                        KEIL Keil uVision4

      硬件平台:(1) 测温度标签: Nrf24LE1与SHT20  (2) 基站: STM32F107与NRF24LE1

     SHT20的驱动代码可以点击这里

     在原来网上找到的源码,发现IIC写寄存器的时候,有些偏差。因此自己参考了之前驱动ADXL345加速度传感器的模拟IIC程序,对写寄存器部分进行了优化。

以下是读取的函数,将该函数放在while(1)的循环里,即可实现对温度的读取。

float ReadSht20(char whatdo)
{
float temp;
uchar MSB,LSB;
float Humidity;
float Temperature;

SET_Resolution();
I2CStart();
if(I2C_Write_Byte(SHT20ADDR&0xfe)==ACK)
{
if(I2C_Write_Byte(whatdo)==ACK)
{
do
{
Delay(6);
I2CStart();
}while(I2C_Write_Byte(SHT20ADDR|0x01)==NACK);

MSB = I2C_Read_Byte(ACK);
LSB = I2C_Read_Byte(ACK);
I2C_Read_Byte(NACK);
I2CStop();
LSB &= 0xfc;
temp = MSB*256 + LSB;

if (whatdo==((char)0xF5))
{

Humidity = (temp*125)/65536-6;
return Humidity;
}
else
{

Temperature = (temp*175.72)/65536-46.85;
return Temperature;
}
}
}
return 0;
}

读取的函数读出的函数是float类型。可以使用union进行转化,

typedef union 
{
float x;
INT8U y[4];
}Temperature;

typedef union
{
float x;
INT8U y[4];
}Humidity;

 

Temperature TagTemperature;
Humidity TagHumidity;


通过以下两个语句可以使用float类型的数据

TagHumidity.x=ReadSht20((char)0xF5);
TagTemperature.x=ReadSht20((char)0xF3);

 

而使用以下的两个语句可以实现串口吐出4个byte的温度值

  Temperature_BUFF[0]=TagTemperature.y[0];
Temperature_BUFF[1]=TagTemperature.y[1];
Temperature_BUFF[2]=TagTemperature.y[2];
Temperature_BUFF[3]=TagTemperature.y[3];
UART0_SendBuff(Temperature_BUFF,sizeof(Temperature_BUFF));