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
在这里插入图片描述

更多推荐