IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 温湿度压力传感器——BME280,硬件开发与程序设计 -> 正文阅读

[嵌入式]温湿度压力传感器——BME280,硬件开发与程序设计

温湿度压力传感器——BME280,硬件开发与程序设计

前言

??这是第三个传感器,来自博世的温湿度、压力传感器——BME280.

硬件部分介绍

BME280介绍

??BME280是一款集成温度、湿度、气压,三位一体的环境传感器.
??温度检测范围:-40℃~+85℃,分辨率0.1℃,误差±0.5℃
??湿度检测范围:0~100%RH,分辨率0.1%RH,误差±2%RH
??压力检测范围:300~1100hPa
??实际测试下来,精度确实不错,传感器噪音以较小、精度高,可以看出短时间内室内温度、湿度的变化微小变化,多次测量气压计基本在1hpa左右的差距。

电路部分

参考官方的的电路,电路部分很简单。在这里插入图片描述

程序设计

移植部分

??BME280的寄存器还是比较少的,所以需要移植的部分也不多,每个传感器有两个可以配置的参数。

Sensor_BME280 BME280_1;
int BME280_Init(void)
{
    /****结构体初始化****/
    //设备参数
    BME280_1.IIC_Aisle = hi2c1;
    BME280_1.IIC_ADDR = 0x77;
    BME280_1.BME280_Mode = BME280_Mode_Normal;
    BME280_1.BME280_IIR_Time = BME280_Filter_16;
    BME280_1.BME280_Tstandby = BME280_Tstandby_0_5;
    //温度参数
    BME280_1.TEMP.TEMP_EN = BME280_Sensor_ON;
    BME280_1.TEMP.TEMP_Ove = BME280_Over_16;
    //湿度参数
    BME280_1.HUM.HUM_EN = BME280_Sensor_ON;
    BME280_1.HUM.HUM_Ove = BME280_Over_16;
    //压力参数
    BME280_1.PRESS.PRESS_EN = BME280_Sensor_ON;
    BME280_1.PRESS.PRESS_Ove = BME280_Over_16;

??设备参数:设备参数主要是选择通讯方面的参数和设备的传感器总参数。通讯可以选择SPI和IIC。修改下面的参数就可以修改,本例程是使用IIC通讯。

#define BME280_COM_Mode BME280_IIC //BME280的通讯方式

??传感器参数:一个是是否测量,另一个是过采样次数。都比较好理解。但需要注意的是,经过测试,如果不测量温度,直接测量湿度、压力,则结果就是错误的,不是说与实际温度、压力有偏差,而是结果与实际差距非常多。所以强烈建议在测量温度、压力之前,先测量温度参数,具体原因下文会慢慢解释。
??以下代码也是在初始化函数中的,但可以修改,以下只是作为例程演示用

    float DATA1[3] = 0;
    while (1)
    {
        BME280_UP(&BME280_1);
        //读取温度、湿度、压力
        if (BME280_Get_OLL(&BME280_1, &DATA1[0], &DATA1[1], &DATA1[2]) != BME280_OK)
        {
            return BME280_Error;
        }
        printf("Temp=");
        printf("%0.3f,", DATA1[0]);
        printf("Hum=");
        printf("%0.3f,", DATA1[1]);
        printf("Press=");
        printf("%0.3f\r\n", DATA1[2]);
        BME280_Sleep(&BME280_1);
        HAL_Delay(50);
    }

??移植部分只有这么多,如果你也是用IIC通讯,可以全部照搬过去,核对以下IIC的接口和设备地址就可以直接用了。

API介绍

??首先就是小白式测量函数,直接测量全部的三个数据。在初始化完成后,可以直接调用(设备模式是正常模式情况下<与例程相同>)。

/**
  * @brief 获取当前温度、湿度、压力
  * @param BME280:目标设备
  * @param Temp:温度
  * @param Hum:湿度
  * @param Press:压力
  * @retval 操作反馈
  */
int BME280_Get_OLL(Sensor_BME280 *BME280, float *Temp, float *Hum, float *Press)

接下里是三个参数的分开测量,这个传感器的设计有一个难点,就是数据的补偿,补偿公式十分复杂,晦涩难懂,但好在官方给出了程序式的写法,但也有好多种写法,经过测试,我搬了适合32位单片机的程序。会额外列出,供想自己写程序或需要的小伙伴。如果直接移植本程序,可以忽略不看。
??测量温度参数

/**
  * @brief 获取当前温度
  * @param BME280:目标设备
  * @param DATA:获得的数据
  * @retval 操作反馈
  */
int BME280_Get_Temp(Sensor_BME280 *BME280, float *DATA)

??温度补偿公式

    //补偿公式参考官方文档
    double var1, var2, T = 0;
    var1 = (((double)DAC_T) / 16384.0 - ((double)Dig_T1) / 1024.0) * ((double)Dig_T2);
    var2 = ((((double)DAC_T) / 131072.0 - ((double)Dig_T1) / 8192.0) * 
    (((double)DAC_T) / 131072.0 - ((double)Dig_T1) / 8192.0)) * ((double)Dig_T3);
    BME280->t_fine = (double)(var1 + var2);
    T = (var1 + var2) / 5120.0;
    *DATA = T;

其中DAC_T是采样得到的数值,Dig_Tx是设备寄存器中的补偿值(每颗芯片都有特有的补偿值,在初始化中已经读取)
??测量湿度参数

/**
  * @brief 获取当前湿度
  * @param BME280:目标设备
  * @param DATA:获得的数据
  * @retval 操作反馈
  */
int BME280_Get_HUM(Sensor_BME280 *BME280, float *DATA)

??湿度补偿公式

    //补偿公式参考官方文档
    double Var_H;
    Var_H = (((double)BME280->t_fine) - 76800.0);
    Var_H = (DAC_H - (((double)Dig_H4) * 64.0 + ((double)Dig_H5) / 16384.0 * Var_H)) 
    		* (((double)Dig_H2) / 65536.0 * (1.0 + ((double)Dig_H6) / 67108864.0 * Var_H * 
    		* (1.0 + ((double)Dig_H3) / 67108864.0 * Var_H)));
    Var_H = Var_H * (1.0 - ((double)Dig_H1) * Var_H / 524288.0);

    if (Var_H > 100.0)
    {
        Var_H = 100.0;
    }
    else if (Var_H < 0.0)
    {
        Var_H = 0.0;
    }
    *DATA = Var_H;

??测量压力参数

/**
  * @brief 获取当前压力
  * @param BME280:目标设备
  * @param DATA:获得的数据
  * @retval 操作反馈
  */
int BME280_Get_Press(Sensor_BME280 *BME280, float *DATA)

??压力补偿公式

    double var1 = {0};
    double var2 = {0};
    double p = {0};
    //补偿公式参考官方文档
    var1 = ((double)BME280->t_fine / 2.0) - 64000.0;
    var2 = var1 * var1 * ((double)Dig_P6) / 32768.0;
    var2 = var2 + var1 * ((double)Dig_P5) * 2.0;
    var2 = (var2 / 4.0) + (((double)Dig_P4) * 65536.0);
    var1 = (((double)Dig_P3) * var1 * var1 / 524288.0 + ((double)Dig_P2) * var1) / 524288.0;
    var1 = (1.0 + var1 / 32768.0) * ((double)Dig_P1);
    if (var1 == 0.0)
    {
        return BME280_Error;
    }
    p = 1048576.0 - (double)DAC_P;
    p = (p - (var2 / 4096.0)) * 6250.0 / var1;
    var1 = ((double)Dig_P9) * p * p / 2147483648.0;
    var2 = p * ((double)Dig_P8) / 32768.0;
    p = (p + (var1 + var2 + ((double)Dig_P7)) / 16.0) / 100.0;
    *DATA = p;

??设备复位函数

/**
  * @brief 复位设备
  * @param BME280:目标设备
  * @retval 操作反馈
  */
int BME280_Reset(Sensor_BME280 *BME280)

??设备开机、休眠函数

/**
  * @brief 使设备睡眠
  * @param BME280:目标设备
  * @retval 操作反馈
  */
int BME280_Sleep(Sensor_BME280 *BME280)

/**
  * @brief 使设备开机(正常模式)
  * @param BME280:目标设备
  * @retval 操作反馈
  */
int BME280_UP(Sensor_BME280 *BME280)

??读取ID函数

/**
  * @brief 读取设备ID
  * @param BME280:目标设备
  * @param ID:读取的ID
  * @retval 操作反馈
  */
int BME280_ID(Sensor_BME280 *BME280, uint8_t *ID)

开源地址

??和OPT3001、BMX160是一个库,最后一个传感器由于硬件有些问题,正在打板,也差不多写好了,过几天便会更新。
可以去白嫖了~下载的时候求求点一下星星,抱拳了!
github :https://github.com/lijinlong21549/Sensor-collection
关于硬件有什么问题欢迎私信。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-09-11 18:59:12  更:2021-09-11 19:01:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/30 1:12:36-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码