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

  • Post author:
  • Post category:其他


最近公司里的一个小的项目:基于冰库的温度检测,采用无线通讯的方式,将采集到的温度信息传送给基站,基站通过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));	   



版权声明:本文为duanfeiteng0814原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。