使用BMP180传感器让您的下一个Arduino项目能够感知周围的世界。
这是一种专为测量大气压力而设计的基本传感器,它在两种情况下非常有用。 ● 当我们从海平面升至山峰时,气压会降低。这意味着通过测量气压我们可以确定高度。 因此,可以将此传感器用作高度计(Altimeter)。 ● 因为大气压力随着天气而变化,因此我们可以用它来监测天气的变化。
这些传感器使用起来相当简单,经过预先校准,不需要额外的组件,因此您可以立即开始测量气压、高度和温度。
硬件概述 该模块采用博世制造的最新一代数字压力和温度传感器 – BMP180。
BMP180可以测量300至1100 hPa(海拔9000m至-500m)的气压和-40°C至85°C的温度,精度为±1.0°C。
气压测量非常精确(低海拔噪声为0.25米),您甚至可以将其用作精度为±1米的高度计。
电源 该模块板载一颗3.3V稳压器LM6206 ,因此您可以放心地将它与Arduino等5V逻辑微控制器一起使用。
BMP180在测量期间消耗不到1mA,在空闲期间仅为5μA。 这种低功耗允许在电池驱动设备中实施。
I2C接口 该模块具有简单的两线I2C接口,可轻松连接您选择的任何微控制器。该模块具有硬连线I2C地址并设置为0x77H。
BMP180模块的引脚排列 BMP180模块只有4个引脚用于向外连接。 连接如下:
● VCC 是模块的电源,可以在3.3V到5V之间的电压。 ● GND 连接到Arduino的地。 ● SCL 是I2C接口的串行时钟引脚。 ● SDA 是I2C接口的串行数据引脚。
将BMP180模块连接到Arduino 让我们将BMP180模块连接到Arduino开发板。连接相当简单。首先将VIN引脚连接到Arduino上的5V输出并将GND接地。
现在我们只剩下用于I2C通信的引脚。在Arduino UNO R3开发板上,SDA和 SCL位于靠近AREF引脚的排针上。 它们也被称为 A5 (SCL) 和 A4 (SDA)。
安装必要的库 使用BMP180模块计算海拔高度和气压需要大量数学运算。 幸运的是,Adafruit BMP180库的编写隐藏了所有的复杂性,这样我们就可以发出简单的命令来读取温度、气压和高度数据。
要安装库,请导航至 Sketch > Include Library > Manage Libraries…等待库管理器下载库索引并更新已安装库的列表。
输入bmp180筛选搜索结果。 应该有几个条目。 查找Adafruit提供的Adafruit BMP085库。 单击该条目,然后选择安装。
Arduino代码 - 读取温度和气压 以下示意图将让您全面了解如何从BMP180模块读取温度和气压,并可以作为更多实际实验和项目的基础。 - #include <Wire.h>
- #include <Adafruit_BMP085.h>
- #define seaLevelPressure_hPa 1013.25
- Adafruit_BMP085 bmp;
-
- void setup() {
- Serial.begin(9600);
- if (!bmp.begin()) {
- Serial.println("Could not find a valid BMP085 sensor, check wiring!");
- while (1) {}
- }
- }
-
- void loop() {
- Serial.print("Temperature = ");
- Serial.print(bmp.readTemperature());
- Serial.println(" *C");
-
- Serial.print("Pressure = ");
- Serial.print(bmp.readPressure());
- Serial.println(" Pa");
- Serial.print("Altitude = ");
- Serial.print(bmp.readAltitude());
- Serial.println(" meters");
- Serial.print("Pressure at sealevel (calculated) = ");
- Serial.print(bmp.readSealevelPressure());
- Serial.println(" Pa");
- Serial.print("Real altitude = ");
- Serial.print(bmp.readAltitude(seaLevelPressure_hPa * 100));
- Serial.println(" meters");
-
- Serial.println();
- delay(500);
- }
复制代码
以下是串口监视器中输出的样子。
海平面气压每降低1hPa,高度计算就会产生大约8.5米的误差。 所以,我们得到的高度足够接近但不准确。
如果您知道当前随天气变化的海平面压力,您可以获得更准确的高度测量值。
代码说明 首先草图包括两个库,即Wire.h和Adafruit_BMP085.h。 - #include <Wire.h>
- #include <Adafruit_BMP085.h>
复制代码接下来,我们定义计算高度所需的seaLevelPressure_hPa变量。 将其更改为您所在位置的当前海平面气压。
我们还创建了一个bmp对象,以便可以访问与其相关的函数。 - #define seaLevelPressure_hPa 1013.25
- Adafruit_BMP085 bmp;
复制代码
在代码的setup()函数中,我们初始化串口通信并调用begin()函数。
begin()函数初始化I2C接口并检查芯片ID是否正确。 然后它使用软复位重置芯片并等待传感器在唤醒后进行校准。 - Serial.begin(9600);
- if (!bmp.begin()) {
- Serial.println("Could not find a valid BMP085 sensor, check wiring!");
- while (1) {}
- }
复制代码
在loop()函数中,我们使用以下函数从BMP180模块读取温度气压和高度。 ● readTemperature() 函数返回传感器的温度。 ● readPressure() 函数返回传感器的大气压力。 ● readAltitude(seaLevelPressure_hPa * 100) 函数根据指定的大气压力(以 hPa 为单位)计算海拔高度(以米为单位)。 ● readSealevelPressure() 函数计算海平面压力(以 hPa 为单位)。 - Serial.print("Temperature = ");
- Serial.print(bmp.readTemperature());
- Serial.println(" *C");
- Serial.print("Pressure = ");
- Serial.print(bmp.readPressure());
- Serial.println(" Pa");
- Serial.print("Altitude = ");
- Serial.print(bmp.readAltitude());
- Serial.println(" meters");
- Serial.print("Pressure at sealevel (calculated) = ");
- Serial.print(bmp.readSealevelPressure());
- Serial.println(" Pa");
- Serial.print("Real altitude = ");
- Serial.print(bmp.readAltitude(seaLevelPressure_hPa * 100));
- Serial.println(" meters");
复制代码
|