AHT20.h

#ifndef  __AHT20_H__
#define  __AHT20_H__

#include "stm32f1xx_hal.h"

#define AHT20_ADDRESS	0x70
#define AHT20_TIMEOUT	100




void AHT20_Init(I2C_HandleTypeDef *hi2c);
void AHT20_Read(float *Humidity,I2C_HandleTypeDef *hi2c);


#endif

AHT20.c

#include "AHT20.h"


void AHT20_Init(I2C_HandleTypeDef *hi2c)
{
    uint8_t Readbuf;

    HAL_Delay(40);
    HAL_I2C_Master_Receive(hi2c, AHT20_ADDRESS, &Readbuf, 1, AHT20_TIMEOUT);
	
	
	if((Readbuf & 0x08) != 0x08)
	{
		//临时变量用于发送
		uint8_t SendBuf[3] = {0xBE, 0x08, 0x00};

		//根据手册,发送初始化指令
		HAL_I2C_Master_Transmit(hi2c, AHT20_ADDRESS, SendBuf, 3, AHT20_TIMEOUT);
		HAL_Delay(10);
	}
}
void AHT20_Read(float *Humidity , I2C_HandleTypeDef *hi2c )
{
	//触发测量指令
	uint8_t SendBuf[3] = {0xAC, 0x33, 0x00};
	//临时变量用于读取
	uint8_t ReadBuf[6];

	//发送测量指令
	HAL_I2C_Master_Transmit(hi2c, AHT20_ADDRESS, SendBuf, 3, AHT20_TIMEOUT);

	//根据手册,等待80ms
	HAL_Delay(80);

	//接收测量数据
	HAL_I2C_Master_Receive(hi2c, AHT20_ADDRESS, ReadBuf, 6, AHT20_TIMEOUT);

	//根据手册,检测忙状态Bit[7]为0后可以读取数据
	if((ReadBuf[0] & 0x80) == 0x00)
	{
		//临时变量,存放数据
		uint32_t Data = 0;

		//湿度数据计算
		Data = ((uint32_t)ReadBuf[3] >> 4) + ((uint32_t)ReadBuf[2] << 4) + ((uint32_t)ReadBuf[1] << 12);
		*Humidity = Data * 100.0f / (1<<20);
	}
}

BMP280.c

#ifndef  __BMP280_H__
#define  __BMP280_H__

#include "stm32f1xx_hal.h"
#include "i2c.h"

#define BMP280_I2C	hi2c2			//BMP280使用的I2C


#define BMP280_idADDRESS  0xD0
#define BMP280_ADDRESS	  0xEE
#define BMP280_TIMEOUT	  100
#define BMP280_CONFIG		  0xF5  //采样间隔、数字滤波。
#define BMP280_CTRL_MEAS	0xF4  //设置温度过采样、压力过采样、传感器工作模式。


//温度读取要用到的寄存器
#define BMP280_TEMP_XLSB	0xFC
#define BMP280_TEMP_LSB		0xFB
#define BMP280_TEMP_MSB		0xFA

//气压读取要用到的寄存器
#define BMP280_PRESS_XLSB	0xF9
#define BMP280_PRESS_LSB	0xF8
#define BMP280_PRESS_MSB	0xF7

//BMP280校准寄存器
#define BMP280_DIG_T1_LSB_REG   0x88
#define BMP280_DIG_T1_MSB_REG   0x89
#define BMP280_DIG_T2_LSB_REG   0x8A
#define BMP280_DIG_T2_MSB_REG   0x8B
#define BMP280_DIG_T3_LSB_REG   0x8C
#define BMP280_DIG_T3_MSB_REG   0x8D
#define BMP280_DIG_P1_LSB_REG   0x8E
#define BMP280_DIG_P1_MSB_REG   0x8F
#define BMP280_DIG_P2_LSB_REG   0x90
#define BMP280_DIG_P2_MSB_REG   0x91
#define BMP280_DIG_P3_LSB_REG   0x92
#define BMP280_DIG_P3_MSB_REG   0x93
#define BMP280_DIG_P4_LSB_REG   0x94
#define BMP280_DIG_P4_MSB_REG   0x95
#define BMP280_DIG_P5_LSB_REG   0x96
#define BMP280_DIG_P5_MSB_REG   0x97
#define BMP280_DIG_P6_LSB_REG   0x98
#define BMP280_DIG_P6_MSB_REG   0x99
#define BMP280_DIG_P7_LSB_REG   0x9A
#define BMP280_DIG_P7_MSB_REG   0x9B
#define BMP280_DIG_P8_LSB_REG   0x9C
#define BMP280_DIG_P8_MSB_REG   0x9D
#define BMP280_DIG_P9_LSB_REG   0x9E
#define BMP280_DIG_P9_MSB_REG   0x9F

//过采样设置,即分辨率设置,过采样率越高,分辨率越高
#define Temp_OverSampl_0	0x00
#define Temp_OverSampl_1	0x20
#define Temp_OverSampl_2	0x40
#define Temp_OverSampl_4	0x60
#define Temp_OverSampl_8	0x80
#define Temp_OverSampl_16	0xE0
#define Press_OverSampl_0	0x00
#define Press_OverSampl_1	0x04
#define Press_OverSampl_2	0x08
#define Press_OverSampl_4	0x0C
#define Press_OverSampl_8	0x10
#define Press_OverSampl_16	0x1C

//模式设置
#define Sleep_Mode	0x00
#define Forced_Mode 0x01
#define Normal_Mode 0x03

//待机时间设置
#define t_0_5ms		0x00
#define t_62_5ms	0x20
#define t_125ms		0x40
#define t_250ms 	0x60
#define t_500ms 	0x80
#define t_1000ms 	0xA0
#define t_2000ms 	0xC0
#define t_4000ms 	0xE0

//滤波器设置
#define Filter_0 0x00
#define Filter_2 0x04
#define Filter_4 0x08
#define Filter_8 0x0C
#define Filter_16 0x1C

//BMP280校准结构体
typedef struct
{
	uint16_t T1;
	int16_t	T2;
	int16_t	T3;
	uint16_t P1;
	int16_t	P2;
	int16_t	P3;
	int16_t	P4;
	int16_t	P5;
	int16_t	P6;
	int16_t	P7;
	int16_t	P8;
	int16_t	P9;
	int32_t t_fine;
}BMP280_Calibration;


//BMP280初始化成功或失败
#define BMP280_OK		0
#define BMP280_ERROR	1	


uint8_t BMP280_Init(void);
uint8_t BMP280_ReadID(void);
double BMP280_PressureRead(void);
double BMP280_TempRead(void);
uint8_t BMP280_Read(double *temperature, double *pressure);



double BMP280_compensate_T(int adc_T);
double BMP280_compensate_P(int adc_P);

#endif

BMP280.h

#ifndef  __BMP280_H__
#define  __BMP280_H__

#include "stm32f1xx_hal.h"
#include "i2c.h"

#define BMP280_I2C	hi2c2			//BMP280使用的I2C


#define BMP280_idADDRESS  0xD0
#define BMP280_ADDRESS	  0xEE
#define BMP280_TIMEOUT	  100
#define BMP280_CONFIG		  0xF5  //采样间隔、数字滤波。
#define BMP280_CTRL_MEAS	0xF4  //设置温度过采样、压力过采样、传感器工作模式。


//温度读取要用到的寄存器
#define BMP280_TEMP_XLSB	0xFC
#define BMP280_TEMP_LSB		0xFB
#define BMP280_TEMP_MSB		0xFA

//气压读取要用到的寄存器
#define BMP280_PRESS_XLSB	0xF9
#define BMP280_PRESS_LSB	0xF8
#define BMP280_PRESS_MSB	0xF7

//BMP280校准寄存器
#define BMP280_DIG_T1_LSB_REG   0x88
#define BMP280_DIG_T1_MSB_REG   0x89
#define BMP280_DIG_T2_LSB_REG   0x8A
#define BMP280_DIG_T2_MSB_REG   0x8B
#define BMP280_DIG_T3_LSB_REG   0x8C
#define BMP280_DIG_T3_MSB_REG   0x8D
#define BMP280_DIG_P1_LSB_REG   0x8E
#define BMP280_DIG_P1_MSB_REG   0x8F
#define BMP280_DIG_P2_LSB_REG   0x90
#define BMP280_DIG_P2_MSB_REG   0x91
#define BMP280_DIG_P3_LSB_REG   0x92
#define BMP280_DIG_P3_MSB_REG   0x93
#define BMP280_DIG_P4_LSB_REG   0x94
#define BMP280_DIG_P4_MSB_REG   0x95
#define BMP280_DIG_P5_LSB_REG   0x96
#define BMP280_DIG_P5_MSB_REG   0x97
#define BMP280_DIG_P6_LSB_REG   0x98
#define BMP280_DIG_P6_MSB_REG   0x99
#define BMP280_DIG_P7_LSB_REG   0x9A
#define BMP280_DIG_P7_MSB_REG   0x9B
#define BMP280_DIG_P8_LSB_REG   0x9C
#define BMP280_DIG_P8_MSB_REG   0x9D
#define BMP280_DIG_P9_LSB_REG   0x9E
#define BMP280_DIG_P9_MSB_REG   0x9F

//过采样设置,即分辨率设置,过采样率越高,分辨率越高
#define Temp_OverSampl_0	0x00
#define Temp_OverSampl_1	0x20
#define Temp_OverSampl_2	0x40
#define Temp_OverSampl_4	0x60
#define Temp_OverSampl_8	0x80
#define Temp_OverSampl_16	0xE0
#define Press_OverSampl_0	0x00
#define Press_OverSampl_1	0x04
#define Press_OverSampl_2	0x08
#define Press_OverSampl_4	0x0C
#define Press_OverSampl_8	0x10
#define Press_OverSampl_16	0x1C

//模式设置
#define Sleep_Mode	0x00
#define Forced_Mode 0x01
#define Normal_Mode 0x03

//待机时间设置
#define t_0_5ms		0x00
#define t_62_5ms	0x20
#define t_125ms		0x40
#define t_250ms 	0x60
#define t_500ms 	0x80
#define t_1000ms 	0xA0
#define t_2000ms 	0xC0
#define t_4000ms 	0xE0

//滤波器设置
#define Filter_0 0x00
#define Filter_2 0x04
#define Filter_4 0x08
#define Filter_8 0x0C
#define Filter_16 0x1C

//BMP280校准结构体
typedef struct
{
	uint16_t T1;
	int16_t	T2;
	int16_t	T3;
	uint16_t P1;
	int16_t	P2;
	int16_t	P3;
	int16_t	P4;
	int16_t	P5;
	int16_t	P6;
	int16_t	P7;
	int16_t	P8;
	int16_t	P9;
	int32_t t_fine;
}BMP280_Calibration;


//BMP280初始化成功或失败
#define BMP280_OK		0
#define BMP280_ERROR	1	


uint8_t BMP280_Init(void);
uint8_t BMP280_ReadID(void);
double BMP280_PressureRead(void);
double BMP280_TempRead(void);
uint8_t BMP280_Read(double *temperature, double *pressure);



double BMP280_compensate_T(int adc_T);
double BMP280_compensate_P(int adc_P);

#endif

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐