H文件
#ifndef _TMPHUM_H_
#define _TMPHUM_H_
typedef enum {false, true} bool;
///传感器共用的数据结构体
typedef struct
{
float temperature;
float humidity;
} SensorStruct;
extern SensorStruct SensorData;
extern void vTaskTmpHumSensor(void *pvParameters);
#endif /* _USERGPIO_H_ */
C文件
///温度湿度传感器使用型号: SHT20
#define SHT20_IIC_PORT hi2c1 ///SHT20对应使用的IIC端口
#define SHT20_ADDRESS_READ 0x81 ///读
#define SHT20_ADDRESS_WRITE 0x80 ///写
#define SHT20_READ_TEMPERATURE_CMD 0xF3 ///no hold master
#define SHT20_READ_HUMIDITY_CMD 0xF5 ///no hold master
#define SHT20_SOFTRESET_CMD 0xFE
SensorStruct SensorData;
bool Is_Sht20_Readdata_Ok(unsigned char * d)
{
unsigned char crc;
crc = Calc_Crc_854(d);
if(crc == *(d+2))
{
return true;
}
return false;
}
bool Sht20_Write(uint8_t addr,uint8_t cmd)
{
HAL_StatusTypeDef ret;
ret = HAL_I2C_Master_Transmit( &SHT20_IIC_PORT, addr, &cmd, 1, HAL_MAX_DELAY );
if ( ret != HAL_OK )
{
DBG_PRINTF( "Error Tx SHT20\r\n" );
return false;
}
return true;
}
bool Sht20_Read(uint8_t * d)
{
HAL_StatusTypeDef ret; // return status of i2c
ret = HAL_I2C_Master_Receive( &SHT20_IIC_PORT, SHT20_ADDRESS_READ, d, 3, HAL_MAX_DELAY );
if ( ret != HAL_OK )
{
DBG_PRINTF( "Error Rx SHT20\r\n" );
return false;
}
return true;
}
float Calc_Temperature_Sth20(uint16_t rawdata)
{
float temperature;
rawdata &= 0xFFFC;
temperature = rawdata*175.72/65536;///参考手册数值意义
temperature -= 46.85;
return temperature;
}
float Calc_Humidity_Sth20(uint16_t rawdata)
{
float humidity;
rawdata &= 0xFFFC;
humidity = rawdata*125/65536; ///参考手册数值意义
humidity -= 6;
return humidity;
}
void vTaskTmpHumSensor(void *pvParameters)
{
uint16_t rawdata;
uint8_t sht20_buffer[4];
uint8_t string_temp[30];
vTaskDelay(500);
Sht20_Write(SHT20_ADDRESS_WRITE, SHT20_SOFTRESET_CMD);
while(1)
{
vTaskDelay(500);
if(Sht20_Write(SHT20_ADDRESS_WRITE, SHT20_READ_TEMPERATURE_CMD))
{
vTaskDelay(100);
Sht20_Read(sht20_buffer);
rawdata = sht20_buffer[0]*256+sht20_buffer[1];
rawdata &= 0xFFFC;
SensorData.temperature = Calc_Temperature_Sth20(rawdata);
}
vTaskDelay(500);
if(Sht20_Write(SHT20_ADDRESS_WRITE, SHT20_READ_HUMIDITY_CMD))
{
vTaskDelay(100);
Sht20_Read(sht20_buffer);
rawdata = sht20_buffer[0]*256+sht20_buffer[1];
rawdata &= 0xFFFC;
SensorData.humidity = Calc_Humidity_Sth20(rawdata);
}
sprintf ( (char*)string_temp, "temper:%.1f C,humidity:%.1f %\r\n",
SensorData.temperature,SensorData.humidity); //
DBG_PRINTF( string_temp );
}
}
本程序是基于RTOS,新建vTaskTmpHumSensor(void *pvParameters)任务进行SHT20数据读取。
最终结构体SensorData.temperature, SensorData.humidity 中放置就是得到的SHT20温度及湿度数据
温度精度到0.1℃ 湿度精度到0.1%RH