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