成为订阅者(免费)

加入29,000名其他订阅者以获得用户销售折扣和 其他免费资源。
:
:
大学教师'担心 - 您的邮件地址完全是 安全的。我保证使用它 只要 to send you MicroZine.

如何使用 BMP280气压芯片

BMP280是一个疯狂的小型SMD装置(2.0mm x 2.5mm)所以你'll need to 抓住突破板以在替补席上使用它。这足够小 它可以在手机内使用。这似乎有点不寻常 可能会想到这个设备只在气象站环境中使用,直到 您意识到压力可用于测量高度。

事实上,Bosch Sensortech建议的应用程序 (制造BMP280)是:

  • 增强GPS导航(例如,先定期改进, 死亡,斜坡检测)。
  • 室内导航(地板检测,电梯检测)。
  • 户外导航,休闲和运动应用。
  • 天气预报。
  • 医疗保健应用(例如肺活量测定法)。
  • 垂直速度指示(例如上升/下沉速度)。

它也非常适合和用作高度准确的Arduino 气压传感器采用SPI接口,因为它采用SPI接口。

[资源: //www.bosch-sensortec.com/bst/products/all_products/bmp280]

BMP280压力传感器框图

资源: datasheet Figure 1

最初似乎使用BMP280芯片测量高度是a 由于GPS系统更准确,并且还为您提供了很少的冗余 高度信息也是如此。现在,我对谷歌做了一点研究 最后的陈述可能不是如此准确!

我们都倾向于假设我们所拥有的任何系统都是绝对准确的 认为GPS在那个类别(基于我的Satnav告诉我的事实 正是我在哪里 - 但那是多么准确?)。事实证明是关于 ±10m!

尽管GPS卫星在船上有原子钟,甚至 由于行驶速度和距离而调整相对论变化之后 在地球上方 - 有其他影响GPS精度的因素包括 大气,卫星位置不准确等因素也是如此 这些可以加起来非常大的错误。

Garmin GPS接收器通常准确到10M [水平 measurement]
[来源:garmin.com/aboutgps].

你知道军队是否不相信爱因斯坦's theory of 相对性将应用并内置于软件开关到卫星内部 代码停止调整该科学(他们必须在它们时打开它 found Enistein'S的相对论定理确实适用于卫星!)。

为什么GPS 高度测量不是那么准确

另一个网站(见下面的链接|)更完全讨论问题。在 发明内容,它是GPS对气压测量测量的比较。在那里面 它讨论了挂起滑翔机和滑翔伞必须如何飞行 具体定义的体积空间,使它们不会从中删除 竞赛。要做到这一点,他们可以准确地测量高度 使用自己的乐器,你会认为GPS系统是 适合那个;也许不会!

关于GPS的事情是GPS接收器知道卫星在哪里 因此,它相对于4个或更多卫星以极高的准确性了解其位置 (更多卫星给出了越来越多的位置准确性)。问题是 卫星的轨道并不意味着卫星或GPS接收器知道 地面位于哪里!

""您的GPS单元在其内存中有多个模型(基准)。"

[资源 http://www.xcmag.com/2011/07/gps-versus-barometric-altitude-the-definitive-answer/]

实际上,每个GPS单元都有多种地球型号's surface e.g. WGS 84(世界大地体系 - 1984年创建)。其他基准可能更准确 对于特定国家,例如在英国OSGB36(条例调查数据)中。有 相当多的其他基准组,但WGS 84通常用于GPS系统。

WGS 84系统定义了近似于形状的扁圆形球体 地球,这是根据您的位置发生错误的地方 位于。在英国,您将在真正的身高70米以上,并在印度100米 以下! (参见上面的链接,用于全球高度变化的热图)。 根据您的GPS,可能会计算错误并补偿(Geoid correction).

此外,由于有以下其他水平错误源:

  • 电离层效应(±5m)
  • 卫星位置误差(±2.5)
  • 卫星时钟错误(±2米)
  • 多径干扰(±1M)
  • 对流效果(±0.5米)
  • 数学和舍入误差(±1米)

总水平误差:±15米。据估计 垂直的 错误 是3次:±45米。

另一个错误源是通过时间越来越平均信息而e .g。在...之上 几秒钟,所以输出读数会在攀爬或攀升时延迟 falling.

上面的部分是此链接的摘要:

http://www.xcmag.com/2011/07/gps-versus-barometric-altitude-the-definitive-answer/

使用 高度测量的气压

事实上,所有航空都使用转换的气压测量 显示高度测量,因为压力随高度而降低。因素 影响读数是温度,因此高度计是温度 补偿。另一个因素是地面压力测量(定义 零高度)随着天气而变化,所以高度计允许设置 地面压力读数(从航空的天气服务获得)到 消除局部压力变化。查找qnh和qne

博世280芯片压力范围为300至1100 HPA 装置高度可以从+ 9000米到-500m测量。它也有一个亲戚 精度为±0.12 HPA。这相当于±1m的相对精度。

注意:这可能是最大的不准确性 - 稍后请参阅实际 显示传感器的测量值(我使用的特定的)远远超过 对相对高度变化敏感。

即使这种不准确性在所有批次的批次中都是正确的 BMP280'然后它仍然代表比使用更准确的读数 高度测量的GPS。

绝对精度为±1HPA相当于11.9m [9500.0 /(1100-300)] - 这仍然比GPS垂直读数更好。得到更多 准确的高度读取本机必须校准I.e.设置 在地面上输出读数为零(或获得当前地面压力 从航空服务中读取区域并将其输入到 microcontroller).

BMP280(所有电子气压仪可能)可以很快反应 压力变化 - 没有等待。数据表表示您 可以读取设备的157次(对于BMP180是120Hz)。这表示 可以快速检测高度的变化。这有点太快了 测量 - 你赢了'需要很多数据点 - 尽管它们可以使用 当使用IIR过滤器时,即过采样然后过滤以获得一个 稳定的输出。快速测量率更适合 肺活量测量(呼吸测量)或用于快速高度变化测量 如在悬挂滑翔机比赛中..

BMP180之间的差异 and BMP280

下表显示了 BMP180较旧的差异 和替换部分BMP280。请注意BMP280如何更好 规格并具有多个接口,包括高速SPI,而 BMP180仅具有I2C(您可以用SPI订购单独的部分)。这 其他主要区别在于BMP280具有可选择的滤波器操作 具有5种不同的带宽,导致具有更高精度的测量。

BMP280和BMP180的比较

注意:温度准确性数据(埋藏在数据表中):

  • ±0.5°C(25°C)和
  • ±1.0°C(在全温度范围内0°C〜65°C)。

压力测量单位


单元 象征 不。帕斯卡
酒吧 酒吧 1 x 105 Pa (exactly)
毫巴 曼巴里 100 pa(究竟)
虎孔岛 HPA. 100 pa(究竟)
常规毫米或汞 mmhg. 133.322 ... PA.
互联网的汞 Inhg. 3386.39 ... PA.
每平方英寸的英镑力量 lbf / in.2 6894.76 ... PA.

[ 资源: http://www.npl.co.uk/reference/faqs/pressure-units ]

注意:HPA与MBAR(Millibar)数值相同。

测量高度

为了测量高度,您必须知道海平面的压力读数。这 常用的值是101325 PA或1013.25MB - 这是为了代表 海平面的平均大气压。不幸的是价值不是 代表许多不同国家的海平面的压力。

真的,精确高度测量的唯一方法是获得 从可靠的预测从海拔海平面的压力值。

笔记: 即使是地面价值也会改变出来 无论如何,一天,所以你真的需要一个传输当前压力的无线电链路 在地面到你的测量装置。这将成为高度 即使局部压力变化也可以测量尽可能准确。

原理图,示意图

如果您的突破不起,请使用级别的转换器部件't have them on-board (一些板有级别翻译组件)。如果它确实有它们那么 直接从(5V)UNO连接到突破板。或者使用A. 3V3 Arduino直接连接。

arduino. Uno BMP280 wiring

BMP280原理图

他们俩 电平转换电路 以上转换到5V和3V3的电压电平。你可以找到矿石 it 这里.

笔记: i2c连接是两个左上角的连接 如果USB连接器位于板的左侧,则Arduino Uno。他们不是 标记。左侧是SCL,右侧是SDA。他们是两个屏蔽 与6针连接器相对的销,下一个标签销是aref。

典型的压力 结果一天

这些读数取自Arduino的串行监视器输出 AdaFruti BMP280库和I2C库(I2C Library第1版)的串口。 身高未校准=错误(未指出除外)。

10.15 3/8/17 avg 3-4th aug 1007mbar sea level pressure forecast
Probe BMP280: Sensor found
 HeightPT1: 7.41 m; Height: 81.49 Pressure: 100350.00 Pa; T: 22.97 C
 HeightPT1: 14.10 m; Height: 80.99 Pressure: 100356.00 Pa; T: 23.03 C
 HeightPT1: 80.79 m; Height: 80.74 Pressure: 100359.00 Pa; T: 23.14 C

16:37 3/8/17
Probe BMP280: Sensor found
 HeightPT1: 6.81 m; Height: 74.95 Pressure: 100428.00 Pa; T: 23.43 C
 HeightPT1: 13.01 m; Height: 74.95 Pressure: 100428.00 Pa; T: 23.50 C
 HeightPT1: 18.62 m; Height: 74.78 Pressure: 100430.00 Pa; T: 23.55 C

17.06 3/8/17
 HeightPT1: 73.82 m; Height: 73.61 Pressure: 100444.00 Pa; T: 24.29 C
 HeightPT1: 73.82 m; Height: 73.86 Pressure: 100441.00 Pa; T: 24.29 C
 HeightPT1: 73.80 m; Height: 73.61 Pressure: 100444.00 Pa; T: 24.29 C

17:13 3/8/17
 HeightPT1: 72.57 m; Height: 72.77 Pressure: 100454.00 Pa; T: 24.50 C
 HeightPT1: 72.60 m; Height: 72.94 Pressure: 100452.00 Pa; T: 24.50 C
 HeightPT1: 72.63 m; Height: 72.85 Pressure: 100453.00 Pa; T: 24.50 C
 HeightPT1: 72.65 m; Height: 72.85 Pressure: 100453.00 Pa; T: 24.51 C

22:18 3/8/17
Probe BMP280: Sensor found
 HeightPT1:  5.31 m; Height: 58.44 Pressure: 100625.00 Pa; T: 27.80 C
 HeightPT1: 10.11 m; Height: 58.11 Pressure: 100629.00 Pa; T: 27.85 C
 HeightPT1: 14.51 m; Height: 58.53 Pressure: 100624.00 Pa; T: 27.89 C


MP280 test 17.06 3/8/17 Adafruit library output (when SDO pulled to 3V3)
Temperature = 24.61 *C
Pressure = 100444.17 Pa
Approx altitude = 73.60 m

3/8/17 Adafruit library output (when SDO pulled to 3V3)
Temperature = 24.99 *C
Pressure = 100462.96 Pa
Approx altitude = 72.02 m

3/8/17 Adafruit library output (when SDO pulled to 3V3)
Temperature = 25.03 *C
Pressure = 100458.71 Pa
Approx altitude = 72.38 m

07:09 4/8/17 forecast pressure 1009mbar avg sea level pressure
Probe BMP280: Sensor found
 HeightPT1: 5.08 m; Height: 55.85 Pressure: 100656.00 Pa; T: 21.30 C
 HeightPT1: 9.68 m; Height: 55.68 Pressure: 100658.00 Pa; T: 21.36 C
 HeightPT1: 13.87 m; Height: 55.85 Pressure: 100656.00 Pa; T: 21.42 C

09:04 4/8/17
 HeightPT1: 49.79 m; Height: 49.57 Pressure: 100731.00 Pa; T: 22.46 C
 HeightPT1: 49.79 m; Height: 49.74 Pressure: 100729.00 Pa; T: 22.46 C
 HeightPT1: 49.80 m; Height: 49.91 Pressure: 100727.00 Pa; T: 22.45 C
 HeightPT1: 49.80 m; Height: 49.82 Pressure: 100728.00 Pa; T: 22.44 C

不同的图书馆 give the same result

这里赋予了Adafruit图书馆实际预测海平面压力 得到高度。我不'认为它太准确,因为你必须拥有 您所在位置的实际地面压力值。我在哪里 23米以上海平面没有2M查看下面的读数!

I2C传感器库不会让您更改默认值 1013.25MB所以你需要去写一些代码以允许准确的高度 测量调整。

不同的图书馆 Adafruit and I2C library (same result)

07:41 13/8/17 forecast pressure 1020mbar avg sea level pressure
I2C Sensor LIB: Probe BMP280: Sensor found
 HeightPT1: 1.82 m; Height: 20.03 Pressure: 101758.00 Pa; T: 23.27 C
 HeightPT1: 3.50 m; Height: 20.28 Pressure: 101755.00 Pa; T: 23.34 C
 HeightPT1: 5.01 m; Height: 20.12 Pressure: 101757.00 Pa; T: 23.33 C

07:42 13/8/17 Adafruit library  forecast pressure 1020mbar
Temperature = 23.70 *C
Pressure = 101755.11 Pa
Approx altitude = 20.27 m

注意:I2C传感器库代码平均第1次读数(参见示例 2下面)所以左手值不稳定(直到收集10个值) 下一个测量是未享受的高度读数(20.03)。

有趣的是温度读数差异;也许之一 库代码实现不对。

警告: 使用预测获得校准的高度 预测压力读数不准确,因为它会略有不同 您的位置,所以最好设计代码来存储该值(当您当处时 地面级别 - 按下专用按钮,或收集电源的数据)。 然后使用此值作为测量相对高度的校准值 ground level.

为什么你的BMP280赢了't start

如果你'像我一样,你有一个没有级别移位器的突破板, 您可以创建一些组件(请参阅此页面上的原理图) I2C模式进行,然后将示例代码刻录到Arduino Uno R3中。你 then wonder why it'做了绝对没有!

作为一个典型的工程师,你可以给它,然后 - 它 - 它's time to read the 手动的! - 除非有爆发的危险,否则这一直是最后的手段 $ 800组件!在这种情况下首先阅读手册。

事实证明,BMP280的通信模式被设置为上电 各种控制输入的状态。

一"gotcha"是SPI模式下的输出变成I2C中的输入 mode!

SPI模式使用更多引脚来定义其接口,其中一个未使用 输出(SPI模式)用作I2C模式的输入!如果你有突破 然后,这些控制输入浮动,这意味着它只是不会进入 除非您在上电之前设置它们。

警告: 持有任何接口引脚,而VDD.IO. 由于电流通过保护而关闭将损坏芯片 二极管。如果您正在设计复杂的电源管理系统,可能会发生这种情况 当控制引脚连接到处理器和芯片的电源 单独控制。

相反,如果vDD. is off and VDD.IO. is supplied, 芯片上的控制引脚保持在高Z(非活动)。

IC2模式选择

要得到 I2C模式 going the 芯片选择引脚(CS)必须在V处保持DD.IO. level as the BMP280 powers up.

如果在电源上调SPI模式下,CS保持低电平,则处于活动状态。

I2C地址选择

除了使用SDO引脚(用作SPI模式的输出)除外 选择两个I2C地址之一的输入。该引脚必须保持低 获取较低的地址。

如果你 don'当SDO时,T希望从高到低电平 更改您使用的库只进入Adafruit库(或I2C传感器) 库)从0x77到0x76(adafruit库)更改BMP280_Address。 The file is at:

C:\用户\<user name>\文档\ arduino \ libraries \ adafruit_bmp280_library \ adafruit_bmp280.h

I2C上拉

SDI是一个双向开放式排水销,也必须安装上拉。

当输入时,无需在SCK上进行上拉;在I2C模式下设备 只有奴隶,不做时钟伸展。我用a测试了这个 使用1k连接到1k5然后将电阻下拉(5V至3V)下降到接地。和 连接到1K5顶部的SCK输入 - 它可以正常工作。

笔记: 如果您使用,您只能留出一个拉出电阻 自I2C自I2C的BMP280需要上拉,以便公共汽车可以是 为其他设备发布。

注意:SDI和SCK引脚不是真正的开放式漏斗,只有SDI和 SDO实施为双向。

表29在数据表(PIN描述)中显示正在发生的内容:

BMP280 PIN.

adafruit. Library just won't go

我发现Adafruit BMP280图书馆不起作用 - 原因 是SDO引脚(用作I2C模式的输入)默认为0x77 在软件中 - 这意味着SDO引脚需要将高(3V3高)拉高到工作 使用此库(或将库中的默认地址更改为0x76)。

I2C地址:用于BMP280

该设备可以设置为两个I2C地址中的一个,因此您可以有两个 一个I2C总线上的单独压力传感器。选择使用SDO进行 引脚作为输入,当低电平选择地址0x76时,以及高选择时 address 0x77.

BMP280数据表

点击这里下载 datasheet

软件库和版本

arduino. IDE版本

版本:1.6.4

BOSCH BMP280传感器库:

使用的图书馆是:

  • adafruit. BMP280 Library 1.0.2
  • I2C-Sensor-lib Ver 0.8.2

......都可以从Arduino IDE轻松安装。

如果你 do not see the library as an entry when you click the menus:

草图 - >Include Library

然后选择管理库:

草图 - >Include Library -->Manage Libraries...

搜索并安装<lib name> using the "Filter Your Search" form.

代码大小结果来自 libraries used:

对于使用的简单示例代码,代码使用具有很大的差异 shown below.

adafruit bmp280使用超过i2c传感器的1334字节 - 这是 如果您的代码空间耗尽,则要注意的事情。

Code use I2C-Sensor-Lib Lbrary:
Sketch uses 8,830 bytes (27%) of program storage space. Maximum is 32,256 bytes.
Global variables use 563 bytes (27%) of dynamic memory, leaving 1,485 bytes for local variables.

Code use Adafruit BMP280 Lbrary:
Sketch uses 10,164 bytes (31%) of program storage space. Maximum is 32,256 bytes.
Global variables use 563 bytes (27%) of dynamic memory, leaving 1,485 bytes for local variable

差异 libraries

adafruit. BMP280库配有成员函数(或方法) 允许进入海平面高度并根据此返回高度 值和当前的气压读数(参见下面的示例1)。这是一个 稀疏库,并没有给出任何其他控制寄存器的方法 设备中的设置。

另一方面,I2C Sensor Lib确实有设置内部的方法 设备的参数但没有海平面校正 功能。您真的需要校正器调整以获得更准确的高度。 下面的代码向您展示了如何udate图书馆允许进入大海 水平压力读数。

添加方法 I2C Sensor lib

这需要简单的补充 library file:

  • C:\用户\<username>\文档\ arduino \ libraries \ i2c-sensor-lib_ilib \ src \ i2c_bmp280.h

找到顶级方法     

"void高度(漂浮&仪表)"

...并添加在下面所示的一个:

"void高度(漂浮&仪表,漂浮Sealevelmbar.)"

/**<  gives the number of meters above sea level */
    空白 高度(漂浮& 仪表)
    {
        uint32_t iPascal;
        getPressure(iPascal);

        meter = 44330.0*(1-pow(漂浮(iPascal)/101325.0,1.0/5.255));

    };

    /**<  gives the number of meters above sea level. JFM parameterised sea level*/
    空白 高度(漂浮& 仪表,漂浮 Sealevelmbar.)
    {
        uint32_t iPascal;
        getPressure(iPascal);

        meter = 44330.0*(1-pow(漂浮(iPascal)/(seaLevelmbar*100),1.0/5.255));

    };

这只是增加了一种允许海平面压力的公共方法(预测) 要输入而不是默认的1013.25mbar值,这提供了更多 准确的高度阅读。

示例1ADAFRUIT库: BMP280

The 1英石 Arduino示例草图。这个例子使用了"Adafruit BMP280" Library.

单击下面的代码以将其复制到 clipboard.

/***************************************************************************
  This is a library for the BMP280 humidity, temperature & pressure sensor

  Designed specifically to work with the Adafruit BMEP280 Breakout
  ----> http://www.adafruit.com/products/2651

  These sensors use I2C or SPI to communicate, 2 or 4 pins are required
  to interface.

  Adafruit invests time and resources providing this open source code,
  please support Adafruit andopen-source hardware by purchasing products
  from Adafruit!

  Written by Limor Fried & Kevin Townsend for Adafruit Industries.
  BSD license, all text above must be included in any redistribution
 ***************************************************************************/

#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h>

#define BMP_SCK 13
#define BMP_MISO 12
#define BMP_MOSI 11
#define BMP_CS 10

adafruit._BMP280 bme; // I2C
//Adafruit_BMP280 bme(BMP_CS); // hardware SPI
//Adafruit_BMP280 bme(BMP_CS, BMP_MOSI, BMP_MISO,  BMP_SCK);

空白 setup() {
  Serial.begin(9600);
  Serial.println(F("BMP280 test"));

  if (!bme.begin()) {
    Serial.println("Could not find a valid BMP280 sensor, check wiring!");
    while (1);
  }
}

空白 loop() {
    Serial.print("Temperature = ");
    Serial.print(bme.readTemperature());
    Serial.println(" *C");

    Serial.print("Pressure = ");
    Serial.print(bme.readPressure());
    Serial.println(" Pa");

    Serial.print("Approx altitude = ");
    Serial.print(bme.readAltitude(1018.00)); // this should be adjusted to your local forcast
    Serial.println(" m");

    Serial.println();
    delay(2000);
}

示例2 - I2C LIB:BMP280

The 2n Arduino示例草图。这个考试用来使用 "I2C-Sensor-Lib" library.

注意:此示例需要上面显示的附加方法以准确 不包含在原始BMP280 Arduino库中的高度 (添加它的说明 这里):

空白高度(漂浮&仪表,漂浮Sealevelmbar.). 
#include <Wire.h>
#include "i2c.h"

#include "i2c_BMP280.h"
BMP280 bmp280;

空白 setup()
{
    Serial.begin(9600);

    Serial.print("I2C Sensor LIB: Probe BMP280: ");
    if (bmp280.initialize()) Serial.println("Sensor found");
    else
    {
        Serial.println("Sensor missing");
        while (1) {}
    }

    // onetime-measure:
    bmp280.setEnabled(0);
    bmp280.triggerMeasurement();
}

空白 loop()
{
    bmp280.awaitMeasurement();

    漂浮 temperature;
    bmp280.getTemperature(temperature);

    漂浮 pascal;
    bmp280.getPressure(pascal);

    英石atic 漂浮 meters, metersold;
//    bmp280.getAltitude(meters);
    bmp280.getAltitude(meters,1018.00); // Allow entry of forecast sea level pressure JFM
    metersold = (metersold * 10 + meters)/11;

    bmp280.triggerMeasurement();

    Serial.print(" HeightPT1: ");
    Serial.print(metersold);
    Serial.print(" m; Height: ");
    Serial.print(meters);
    Serial.print(" Pressure: ");
    Serial.print(pascal);
    Serial.print(" Pa; T: ");
    Serial.print(temperature);
    Serial.println(" C");

    delay(120);

}



使用高度的想法 Sensors

下面重复的数据表中的一个表给出了如何设置的指示 用于不同应用的设备,范围从室内导航(可以't 在这里使用GPS在室内没有信号 - 它也需要 加速度计,也许是陀螺芯片,用于抵抗运动 检测)。其他使用者是:DROP检测。电梯楼层变化 检测,天气监测(例如Arduino气压监测器: 最低电源设置),在手机中使用。

BMP280有趣的用例

资源: 数据表第7表7:建议基于使用的过滤器设置 cases.

注意:ODR是典型输出数据速率I.E。您可以阅读的最大值 给定设置的设备。

什么'S IIR过滤器?

BMP280芯片内置了 Infinite. IMPULSE. REsponse过滤器(这是一种类型 用于改善传感器的输出结果是有用的DSP滤波器(或 忽略短期更改)。例如,如果在室内使用传感器,则 传感器如此迅速和敏感,可以记录任何小的压力变化 例如砰的一扇门。

使用IIR是传感器响应时间和需要之间的折扣 忽略短期的压力变化 - 外部你不需要使用 自从赢过以来的IIR过滤器'T是砰地撞击的任何门,导致突然压力 更改(参见上面的表格中的天气监测/室内导航(IIR = 0))。 对于下降检测,情况与室内导航使用相反 - 您 想要检测即时高度变化检测的突然压力变化。

对于室内导航,您可以设置BMP280,以便进行小的更改 通过为IIR过滤器设置适当的值来忽略 - 这将是 最大值i.e.16 - 见上表(室内导航和手持持有 dynamic device).

更新率VS过采样

过采样是设备读取传感器和平均值的次数 结果,然后允许您读取它。你越过采血 设置阅读所需的时间越多。

下表(表14 - 从数据表再次来自数据表)显示了这种关系 在特定的待机时间(您可以控制:T_SB)之间与 过采样设置(OVSR_P和OVSR_T)。对于上面的设置表7显示 过采样设置是"Standard resolution"所以你可以将T_SB设置为 0.5并在83.33Hz中读取设备。该表如下表告诉您最大值 可实现的给定设置的输出速率。

BMP280采样率VS过采样设置

示例3高度更改代码

我有这个奇怪的想法,我想找出电梯的速度 本地体育中心,此设备是测量高度的理想工具 变化和高度变化率。要执行此操作,您需要为BMP280设置 电梯地板检测(见上表7) - 实际上滴滴检测提供 更多数据和125Hz的ODF - 您可以通过处理平均数据..

图书馆代码可以找到:

  • C:\用户\<username>\ documents \ arduino \ libraries \ adafruit_bmp280_library
  • C:\用户\<username>\ documents \ arduino \ libraries \ i2c-sensor-lib_ilib

目前在adafeuit库软件中的控制寄存器 该模式是修复的,没有提供重新编程它的规定(在方法中: 开始。它的值设置为3F)。因此,以下代码使用I2C 传感器库,因为这有几个功能,允许更改模式 BMP280(参见i2c_bmp280.h)。

对于电梯移动检测,您需要以下设置:

掉落检测
描述 范围 价值 I2C库方法
压力过采样 osrs_p. x2 特征来自verseure oversampleratio.
脾气过度采样 osrs_t. x1 沉淀物悬浮症秀地也是如此
IIR. IIR. 0 setfilterratio.
待机时间 T_SB. 0 = 0.5ms 英石estStandby.

我选择了一个待机时间'0' for a fast update 速率形成传感器。可能需要调整代码即i.增加 待机以降低功耗。

#include <Wire.h>
#include "i2c.h"

#include "i2c_BMP280.h"
BMP280 bmp280;

空白 setup()
{
    Serial.begin(115200);
    Serial.println("BMP280 elevator");
    Serial.print("Probe BMP280: ");
    if (bmp280.initialize()) Serial.println("Sensor found");
    else
    {
        Serial.println("Sensor missing");
        while (1) {}
    }

    // Setup for elevator floor change measurement.
    bmp280.特征来自verseure oversampleratio.(2);
    bmp280.沉淀物悬浮症秀地也是如此(1);
    bmp280.setFilterRatio(0);
    bmp280.setStandby(0);

    // onetime-measure:
    bmp280.setEnabled(0);
    bmp280.triggerMeasurement();
}

漂浮 get_altitude() {
   漂浮 meters;
   bmp280.getTemperature(meters);  // throw away - needed for alt.
   bmp280.getPressure(meters);     // throw away - needed for alt.
   bmp280.getAltitude(meters);
   return meters;
}

空白 loop()
{
    漂浮 distance,velocity;
    英石atic uint32_t time_now, time_was=millis(),dt;
    英石atic 漂浮 alt_was=get_altitude();
    英石atic uint32_t sample_time_was=millis();
    英石atic uint32_t readings=0;
    英石atic 漂浮 values=0,avg_alt=0;
    英石atic 漂浮 meters;

    if ( (millis()-sample_time_was) >2) { // read at a specific rate.

       if(!bmp280.awaitMeasurement()) Serial.println("MEASURE FAILED");

       meters = get_altitude();
       readings++;
       values += meters;

       bmp280.triggerMeasurement();

       sample_time_was = millis();
    }

//     // Serial plotter
//     Serial.print(meters);
//     Serial.print(" ");
//     Serial.println(metersoldn);

    time_now = millis();
    dt = time_now - time_was;
    if (dt>=1000) {

       avg_alt = values/readings;
       distance = avg_alt - alt_was;
       velocity = (distance/((漂浮)dt/1000.0));
       alt_was  = avg_alt;
       time_was = time_now;

//    Serial.print("AVG: ");
//    Serial.print(avg_alt);
//    Serial.print(" m/s ; dist: ");
//    Serial.print(distance);

    if (fabs(velocity)>0.2) {
       Serial.print("Velocity: ");
       Serial.print(velocity);
       Serial.print(" m/s ;");
    }
    Serial.print("debug: ");
    Serial.println(readings);


    values=0;
    readings=0;
    }

}



现在您可以使用BMP280以不仅仅是天气监测!

这是您在升降或降低传感器时获得的典型输出 (使用IDE中的串行监视器)。

注意:76个值尽可能快地旋转循环。理论上 自最大值开始以来,应设置为8的样品率为125Hz所以 采样率应为1/125 = 8ms。然后重复数据速率为1秒 125但代码只能在秒内达到76。这将是由于 使用浮点和串行输出 - 考虑使用传出点,它将走 快点。问题是你需要它去更快=设计决定( 图书馆也必须重新编写!)。

您可以看到高度的增加导致正值 高度降低导致负值,低于0.2米的任何东西是 忽略了。下面的输出只能从传感器移动到30cm 在桌子上,所以它非常敏感,非常适合高度变化检测 (建筑导航)。

BMP280 elevator
Probe BMP280: Sensor found
Velocity: -3812.96 m/s ;debug: 73
Velocity: -0.31 m/s ;debug: 76
debug: 76
debug: 76
debug: 76
debug: 76
Velocity: 0.32 m/s ;debug: 76
Velocity: 0.24 m/s ;debug: 76
debug: 76
debug: 76
debug: 76
debug: 76
Velocity: 0.54 m/s ;debug: 76
debug: 76
Velocity: -0.47 m/s ;debug: 76
debug: 76
debug: 76
Velocity: 0.35 m/s ;debug: 76
debug: 76
Velocity: -0.20 m/s ;debug: 76
Velocity: -0.28 m/s ;debug: 76
Velocity: 0.27 m/s ;debug: 76
debug: 76
debug: 76
Velocity: -0.45 m/s ;debug: 76
debug: 76
debug: 76
debug: 76

上面的代码只是首先获得速度。你应该改变 它可以使用每秒阅读每秒一次"indoor navigation" or "handheld device"BMP280模式和停止使用完整的数据集来平均i.e. 依靠BMP280的内部模式。然后基于高度显示速度 从一个样本更改为1秒间隔的一个样本。在手持设备中 您想要节省电力并进行其他任务!可能你需要一个 样品率大于1秒,以免错过缓慢的变化;

使用的其他想法 高度传感器:BMP280

BMP280可用于无人机,用于测量高度。建造 映射(或者只是弄清楚有多高 - 给出了设备 似乎相当准确(约30厘米)。所说的相对精度似乎有点 在±0.12hpa(±0.12mbar)的百分之一的分辨率和实践中悲观 似乎比这更好(虽然你需要索取准确性的地方 必须说明测量为±1m)。

串行监视器输出(上图)的结果显示了该设备 能够检测30厘米的高度变化(对于该特定设备)。


新的! Comments

让你说到你刚刚阅读的东西!留下下面的框中的评论。




隐私政策 | 接触 | 关于我

网站地图 | 使用条款


ezoic.报告此广告

访问我们的Facebook页面:

   点击这里



最近的文章

  1. 如何使用ADS1115

    使用ADS1115精度16位ADC进行教程进行低功耗。

    阅读更多

  2. arduino.模拟输出...易模拟输出生成

    arduino.模拟输出:如何创建最精确的PWM模拟输出以及如何创建模拟PWM正弦波。

    阅读更多

  3. 数号和等效的快速宏。加快代码!

    了解DigitalWrite()的工作原理......现在使用17倍宏宏!

    阅读更多

  4. TCS230颜色传感芯片:如何运作以及如何使用它。

    如何使用TCS230(/ TCS3200)彩色检测器芯片并轻松将其添加到您的任何项目中。

    阅读更多

  5. 如何使用ADXL345进行运动感测等。

    使用ADXL345 Acellerometer,您可以检测到16G!您还可以了解如何使用它来点击检测等。

    阅读更多

  6. HMC5883L 3轴数字MAGENTOMTER如何运作

    HMC5883L - 如何制作数字罗盘,了解HMC5883L和QMC5883L之间的差异以及它们是否兼容。

    阅读更多



读者 Comments

"I wanted to thank
你这么好
对于所有信息
你已经提供了
你的网站's

高超极好的."

- 逃亡Potthath.

"This site really is
最好的和我最喜欢的。
我发现这里有很多很有用
项目和提示。"

- 米兰

Bursach.<at>gmail.com<

"Awesome site,
非常,非常容易和好
导航!"


-
镭_tr.<at>
wolf359.cjb.net.


学习微控制器

"Interested in
微控制器?"

注册
免费7天指南:

自由 GUIDE : CLICK HERE


"I am a newbie to PIC
我想说
 how great your
网站一直在为我。"


- 戴夫

de_scott.<at>bellsouth.net

"Your site is a great
和完美的工作。
恭喜。"


- SURESH.

IntegratedInfosys.<at>
Yahoo.com.

"I couldn't find the correct
要定义的词语
你的网页。

非常有用,揭开,
诚实明确。

非常感谢
你的时间和作品。
问候。"


- Anon.

回到顶部