资讯详情

毕业设计3-BME280温湿度大气压传感器调试记录(STM32F103C8T6 + STM32CubeMX + BME280)

文章目录

  • 一、准备驱动文件
  • 二、STM32CubeMX配置
  • 三、Keil代码介绍
  • 总结:
我的毕业设计需要显示测量的温度、湿度和大气压数据,所以选择BME基于280传感器传感器。I2C通信,我们通过移植官方驱动库。本文主要介绍整个移植过程,没有理论介绍。 这是我们见过的通用传感器。姿态传感器太麻烦了。

我把整个工程文件放在下面的链接里,大家自己拿。

一、准备驱动文件

在这里插入图片描述 其中“bme280_defs.h主要是定义bme280寄存器的一些地址,bme280.h定义了一些初始化函数和功能实现函数bme280.c这三个文件需要添加到工程中才能实现这些函数。 本文件的目的是在初始化时确定BME280能否正常工作,如果通过自检,可以开始读取数据并处理。当然,在这个项目中,我没有使用这个函数。如果你想让传感器自检,你可以使用它。

二、STM32CubeMX配置

1.在“SYS我们将模块设置为SW”; 2. 在“RCC我们可以选择最后一个;

请参考三种差异:https://www.cnblogs.com/niu-li/p/11172052.html

3.因为BME依靠280传感器I2C要实现,我们需要一路开车I2C,其余默认; 4. 我们需要在串口调试助手中打印读取的数据; 5.让我们配置时钟树。我们必须检查我们的外部晶振是多少,需要与我们的硬件一致; 6. 我们可以将整个文件保存在相应的文件夹中; 7.我们需要选择我们想要生成的工程文件,然后点击右上角的工程文件。

三、Keil代码介绍

1.我们首先需要重定向和串口,main.c在文件中添加以下代码:

#include "stdio.h" 
#ifdef __GNUC__ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endif PUTCHAR_PROTOTYPE { 
           //具体哪个串口可以更改huart1为其它串口 HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1 , 0xffff); return ch; } 

2.我们需要将那3个文件拷贝到工程中: 3.因想用硬件I2C来实现,所以需要修改一下“i2c.c”文件:

void user_delay_ms(uint32_t period)
{ 
        
	HAL_Delay(period);
}
int8_t user_i2c_read(uint8_t dev_id, uint8_t reg_addr, uint8_t *reg_data, uint16_t len)
{ 
        
  int8_t rslt = 0; /* Return 0 for Success, non-zero for failure */
	HAL_StatusTypeDef status = HAL_OK; 
	status = HAL_I2C_Mem_Read(&hi2c2, dev_id<<1, reg_addr, I2C_MEMADD_SIZE_8BIT, reg_data, len, 0xffff);
	if (status == HAL_OK)
	{ 
        
        rslt = 0;
	}
    else
	{ 
        
        rslt = -1;
	}
    return rslt;
}


int8_t user_i2c_write(uint8_t dev_id, uint8_t reg_addr, uint8_t *reg_data, uint16_t len)
{ 
        
  int8_t rslt = 0; /* Return 0 for Success, non-zero for failure */
	HAL_StatusTypeDef status = HAL_OK;
  status = HAL_I2C_Mem_Write(&hi2c2, dev_id<<1, reg_addr, I2C_MEMADD_SIZE_8BIT, reg_data, len, 0xffff);
	if (status == HAL_OK)
	{ 
        
      rslt = 0;
	}
    else
	{ 
        
      rslt = -1;
	}
    return rslt;
}

我们也需要在"i2c.h"文件中添加

void user_delay_ms(uint32_t period);
int8_t user_i2c_read(uint8_t dev_id, uint8_t reg_addr, uint8_t *reg_data, uint16_t len);
int8_t user_i2c_write(uint8_t dev_id, uint8_t reg_addr, uint8_t *reg_data, uint16_t len);

4.回到“main.c”文件中: (1)定义两个结构体,一个为bme280,一个用来存储数据

struct bme280_dev dev;
struct bme280_data comp_data;

(2)初始化bme280:

int8_t rslt = BME280_OK;
dev.dev_id = BME280_I2C_ADDR_PRIM;
dev.intf = BME280_I2C_INTF;
dev.read = user_i2c_read;    //利用硬件I2C模式来读取数据
dev.write = user_i2c_write;
dev.delay_ms = user_delay_ms;
rslt = bme280_init(&dev);

(3)读取函数:

int8_t stream_sensor_data_forced_mode(struct bme280_dev *dev)
{ 
        
    uint8_t settings_sel;

    /* Recommended mode of operation: Indoor navigation */
    dev->settings.osr_h = BME280_OVERSAMPLING_1X;
    dev->settings.osr_p = BME280_OVERSAMPLING_16X;
    dev->settings.osr_t = BME280_OVERSAMPLING_2X;
    dev->settings.filter = BME280_FILTER_COEFF_16;
    settings_sel = BME280_OSR_PRESS_SEL | BME280_OSR_TEMP_SEL | BME280_OSR_HUM_SEL | BME280_FILTER_SEL;
	bme280_set_sensor_settings(settings_sel, dev);
    bme280_set_sensor_mode(BME280_FORCED_MODE, dev);
	bme280_get_sensor_data(BME280_ALL, &comp_data, dev);
	HAL_Delay(40);
	printf("temperature:%0.2f*C pressure:%0.2fhPa humidity:%0.2f%%\r\n",comp_data.temperature,   comp_data.pressure/100, comp_data.humidity);
}

(4)在while循环中进行实时读取:


总结:

通过本次实验自己学会了1个I2C传感器设备的调试,从移植官方的驱动到数据读取!!!

标签: t6n温度传感器伟力通t6c内置传感器电池bme280湿度传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台