AHT20+BMP280传感器(HAL库类型)
·
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
更多推荐

所有评论(0)