SHT20温湿度传感器数据读取(STM32硬件IIC驱动,RTOS)

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

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值