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

目录

  • 温湿度压力传感器——BME280,硬件开发与程序设计
  • 前言
  • 硬件部分介绍
    • BME280介绍
    • 电路部分
  • 程序设计
    • 移植部分
    • API介绍
    • 开源地址

前言

  这是第三个传感器,来自博世的温湿度、压力传感器——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
关于硬件有什么问题欢迎私信。

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

  1. 物联网浪潮之下如何从 0 到 1开启智能化硬件开发?

    在物联网浪潮之下,智能硬件的火爆程度不断升温.未来十年,全球接入互联网的硬件设备将达到1万亿台.如今的智能硬件产品正成为下一个"台风口",同时这对于终端市场也是一个机遇.然而从创新 ...

  2. 智能手机之硬件开发知识篇一

    硬件开发知识: 手机软件层次: 手机软件技术也可按技术含量高低分为三层:技术含量低的是人机界面软件,稍高一些的是接口软件和模块软件,最高的是基础通信软件. 第一次层次是OperatingSystem( ...

  3. 《近匠》专访机智云 CTO 刘琰—从 0到1 开启智能化硬件开发

    在物联网浪潮之下,智能硬件的火爆程度不断升温.未来十年,全球接入互联网的硬件设备将达到1万亿台.如今的智能硬件产品正成为下一个"台风口",同时这对于终端市场也是一个机遇.然而从创新 ...

  4. 温湿度传感器SHTC3驱动开发(一)小白也能轻松理解

    一 .首先了解设备硬件原理图 首先在公司干活,要你开发一个设备驱动,那你的老大必须得给你的东西如下: 开发板主板硬件原理图 驱动设备的硬件原理图 驱动的设备的数据手册(datasheet) 一个硬件正 ...

  5. 单片机进阶---HLK-W801硬件开发之焊接电路

    前文介绍 <单片机进阶-HLK-W801硬件开发之制作PCB> <单片机进阶-HLK-W801硬件开发之优化PCB> 第一次接触到手焊贴片,也算是刚入门,侥幸成功之下,给大家传 ...

  6. 软硬整合技术、智能硬件开发与顶层设计应用_课程

    来自台湾的高焕堂老师,和来自美国硅谷的柯博文老师,共同指导... 课程名称:软硬整合技术.智能硬件开发与顶层设计应用 指导老师:高焕堂.柯博文 课程说明: 在智能&大数据时代,系统开发不仅仅攸 ...

  7. 计算机编程书籍-Python硬件开发树莓派从入门到实践无人驾驶 AndroidTV 自动循迹

    内容简介 <Python硬件开发树莓派从入门到实践>全书可大致分为4个部分,其中第13章介绍了树莓派的基本使用:第4章介绍了如何在树莓派上使用Python的OpenCV包:第58章介绍了树 ...

  8. 学妹靠这个学会硬件开发入职华为,今天搞到100个免费名额!

    有不少同学跟我一样,天生对硬件感兴趣,也有同学是看中5G带来的行业红利,想入职大疆.华为等从事硬件开发. 很多人跟我说想搞硬件,但网上资料太少,而且没做过真的硬件项目,想拿高薪很难. 前两天看到一个学 ...

  9. 想做硬件开发的人员必看

    转眼间,已经毕业一年了,在这一年中经历了很多,工作已经换了两个了,住的地方好像已经换了两三个了,这中间不包括跨地区生活.  我刚大四的时候,应聘一家网络公司做硬件开发,03年的时刚过完年,我就千里 ...

  10. EtherCAT伺服驱动器-如何选择硬件开发方案

     EtherCAT伺服驱动器-如何选择硬件开发方案

最新文章

  1. Silverlight Tools Beta 2 For Vs2008 中文版装不上的原因
  2. Android Studio 新建项目的R文件丢失的解决方法
  3. php 数组到字符串的转换,php – 数组到字符串到数组的转换
  4. C++语言之父 Bjarne Stroustrup 简介
  5. 文件锁操作《精通Unix下C语言编程与项目实践》之三
  6. C#调用word打印
  7. n个台阶,一个人每次最多走m步,算法实现
  8. UE4异步编程专题 - 线程池FQueuedThreadPool
  9. 两阶段3D目标检测网络 SIENet: Spatial Information Enhancement Network for 3D Object Detection from Point Cloud
  10. 文本分析软件_读书笔记:伍多库卡茨质性文本分析:方法、实践与软件使用指南...
  11. 【转载】用java压缩文件夹/文件
  12. [有限元]证明常应变三角形单元形函数面积分线积分公式
  13. archlinux 更新错误 Unrecognized archive format
  14. webpack和webpack-dev-server安装配置(遇到各种问题的解决方法)
  15. Tcpping 替代ping测试网路延迟
  16. Mpass – PHP做Socket服务的解决方案
  17. 2018HN省队集训
  18. 使用java代码画一棵圣诞树
  19. 用JAVA制作ICQ
  20. 树莓派3B+(无显示器)实现串口登录

热门文章

  1. Poker2的Programmer Dvorak解决方案
  2. 用CSS美化表格【前端知识】
  3. linux中不用命令安装flash,Linux下安装flash player的方法
  4. 4k hidpi 黑苹果_黑苹果开启缩放分辨率HiDPi以及字体模糊的调整方法总结
  5. 偏最小二乘回归(PLSR)算法原理
  6. chrome插件开发(Demo案例)
  7. HSpice中的测量语句(I)
  8. 冲压工艺中常见的问题,值得收藏
  9. laydate定位修改
  10. 2020数学建模国赛A题 炉温曲线 心得