风筝
发表于: 2019-8-16 06:55:41 | 显示全部楼层

在飞行机器人、气象站、改善路线性能、运动等众多项目中,测量压力和高度非常重要。在本篇文章中,您将学习如何使用BMP180传感器,这是最常用的压力测量传感器之一。


什么是气压?

气压或大气压力来自地球上空气的重量。该压力在海平面约为每平方厘米1千克。


有几个单位表示大气压力,可以很容易地相互转换。用于测量压力的单位是帕斯卡(Pa)。

单位
1hPa当量
帕斯卡(Pa)
100
大气压(atm)
0.000986923
Milibar(MBR)
1
毫米汞柱(mmHg)
0.750063755
英寸汞柱(inHg)
0.02953
Torr(托)
0.750061683
磅/平方英寸(psi)
0.014503774
牛顿每平方米(N /平方公尺)
100

气压与海平面的高度具有近似线性的反比,因此如果我们测量地点的气压,我们可以使用简单的数学运算从海平面计算海拔高度。

bmp-table.png


GY-68 BOSCH BMP180压力传感器特点

BOSCH BMP180是测量压力和海拔高度最常用的传感器之一。该模块最重要的功能如下:

●    压力测量范围为300至1100hPa

●    -0.1hPa绝对压力的测量精度

●    12hPa相对压力的测量精度

●    低功耗(标准模式下为5μA,每秒一次采样)

●    内部温度传感器,精度为0.5°C

●    支持I2C协议进行通信

●    完全校准

bmp-module-2.jpg


所需的材料

●    Arduino UNO R3开发板

●    BOSH BMP180模块

●    跳线

●    Arduino IDE

bmp-required-material.jpg


如何在Arduino中使用GY-68 BMP180压力传感器?

●    该传感器可作为模块使用,方便使用。 BMP180传感器模块的主要部件是:

●    BMP180传感器

●    3.3伏稳压器。此稳压器允许您将模块连接到5V。

●    需要上拉电阻才能正确通信I2C

bmp-pinout.compressed.jpg


电路链接

bmp_circuit.jpg

下载BMP180_Breakout_Arduino_Library以使用BMP180传感器模块:BMP180_Breakout_Arduino_Library


计算不同单位的绝对压力和基于海平面的海拔高度

  1. */

  2.   BMP180

  3.   modified on 23 Apr 2019
  4.   by Saeed Hosseini @ Electropeak
  5.   https://electropeak.com/learn

  6. */

  7. #include <SFE_BMP180.h>
  8. #include <Wire.h?

  9. SFE_BMP180 pressure;

  10. #define ALTITUDE 943.7 // Altitude of Electropeak Co. in meters

  11. void setup() {
  12.   Serial.begin(9600);
  13.   if (pressure.begin())
  14.     Serial.println("BMP180 init success");
  15.   else
  16.   {

  17.     Serial.println("BMP180 init fail\n\n");
  18.     Serial.println("Check connection");
  19.     while (1);
  20.   }

  21. }

  22. void loop() {

  23.   char status;
  24.   double T, P, p0, a;

  25.   status = pressure.startTemperature();
  26.   if (status != 0)
  27.   {
  28.     delay(status);
  29.     status = pressure.getTemperature(T);
  30.     if (status != 0)
  31.     {

  32.       Serial.print("temperature: ");
  33.       Serial.print(T, 2);
  34.       Serial.println(" deg C ");

  35.       status = pressure.startPressure(3);
  36.       if (status != 0)
  37.       {

  38.         delay(status);
  39.         status = pressure.getPressure(P, T);
  40.         if (status != 0)
  41.         {

  42.           Serial.print("absolute pressure: ");
  43.           Serial.print(P, 2);
  44.           Serial.print(" hpa = ");
  45.           Serial.print(P * 100, 2);
  46.           Serial.print(" pa = ");
  47.           Serial.print(P * 0.000986923, 2);
  48.           Serial.print(" atm = ");
  49.           Serial.print(P * 0.750063755, 2);
  50.           Serial.print(" mmHg = ");
  51.           Serial.print(P * 0.750061683, 2);
  52.           Serial.print(" torr = ");
  53.           Serial.print(P * 0.014503774, 2);
  54.           Serial.println(" psi");


  55.           p0 = pressure.sealevel(P, ALTITUDE); // we're at 943.7 meters
  56.           Serial.print("relative (sea-level) pressure: ");
  57.           Serial.print(p0, 2);
  58.           Serial.println(" hpa ");;


  59.           a = pressure.altitude(P, p0);
  60.           Serial.print("your altitude: ");
  61.           Serial.print(a, 0);
  62.           Serial.println(" meters ");
  63.         }
  64.         else Serial.println("error retrieving pressure measurement\n");
  65.       }
  66.       else Serial.println("error starting pressure measurement\n");
  67.     }
  68.     else Serial.println("error retrieving temperature measurement\n");
  69.   }
  70.   else Serial.println("error starting temperature measurement\n");
  71. Serial.println("==========================================================================");
  72.   delay(5000);
  73. }
复制代码

bmp-serial.jpg


让我们更准确地查看压力和高度计算的过程:

bmp-flow.jpg

根据上述算法,首先我们使用startTemperature()开始计算温度,然后使用getTemperature(T)将温度存储在变量T中。之后,我们用startPressure(3)计算压力。数字3是可以在0和3之间变化的最大分辨率。使用getPressure(P)我们将绝对压力存储在变量P中。此压力的量以hPa为单位,可以根据之前的表格转换为不同的单位。绝对压力随高度而变化。为了消除高度对计算压力的影响,我们应该根据存储在ALTITUDE变量中的高度使用sealevel(P,ALTITUDE)函数,并将测量值存储在任意变量中,例如p0。

使用altitude(P,p0)计算您的高度。此函数计算仪表的高度。


制作一个高度计!

与许多其他压力传感器一样,BMP180压力传感器测量绝对压力,绝对压力随高度的变化而变化。因此,您可以通过测量压力来计算相对高度。

  1. /*

  2.   BMP180 - altimeter

  3.   modified on 23 Apr 2019
  4.   by Saeed Hosseini @ Electropeak
  5.   https://electropeak.com/learn

  6. */

  7. #include <SFE_BMP180.h>
  8. #include <Wire.h>


  9. SFE_BMP180 pressure;

  10. double baseline;

  11. void setup()
  12. {
  13.   Serial.begin(9600);
  14.   Serial.println("REBOOT");

  15.   if (pressure.begin())
  16.     Serial.println("BMP180 init success");
  17.   else
  18.   {

  19.     Serial.println("BMP180 init fail (disconnected?)\n\n");
  20.     while (1);
  21.   }

  22.   baseline = readPressure();

  23.   Serial.print("baseline pressure: ");
  24.   Serial.print(baseline);
  25.   Serial.println(" hpa");
  26. }

  27. void loop()
  28. {
  29.   double a, P;


  30.   P = readPressure();

  31.   a = pressure.altitude(P, baseline);

  32.   Serial.print("relative altitude: ");
  33.   if (a >= 0.0) Serial.print(" ");
  34.   Serial.print(a, 1);
  35.   Serial.println(" meters, ");
  36.   delay(500);
  37. }


  38. double readPressure()
  39. {
  40.   char status;
  41.   double T, P, p0, a;
  42.   status = pressure.startTemperature();
  43.   if (status != 0)
  44.   {
  45.     delay(status);
  46.     status = pressure.getTemperature(T);
  47.     if (status != 0)
  48.     {
  49.       status = pressure.startPressure(3);
  50.       if (status != 0)
  51.       {
  52.         delay(status);
  53.         status = pressure.getPressure(P, T);
  54.         if (status != 0)
  55.         {
  56.           return (P);
  57.         }
  58.         else Serial.println("error retrieving pressure measurement\n");
  59.       }
  60.       else Serial.println("error starting pressure measurement\n");
  61.     }
  62.     else Serial.println("error retrieving temperature measurement\n");
  63.   }
  64.   else Serial.println("error starting temperature measurement\n");
  65. }
复制代码

startPressure(3)函数计算绝对压力值。 由于压力随温度和湿度的变化而变化,我们将初始压力存储在变量baseline中。 根据该值和瞬时压力,altitude(P,baseline)函数计算以米为单位的相对高度。


跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 700 | 回复: 1480



手机版|

GMT+8, 2024-4-19 17:55 , Processed in 0.139529 second(s), 6 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表