风筝
发表于: 2023-2-23 21:45:56 | 显示全部楼层

使用BMP180传感器让您的下一个Arduino项目能够感知周围的世界。


这是一种专为测量大气压力而设计的基本传感器,它在两种情况下非常有用。

●    当我们从海平面升至山峰时,气压会降低。这意味着通过测量气压我们可以确定高度。 因此,可以将此传感器用作高度计(Altimeter)。

●   因为大气压力随着天气而变化,因此我们可以用它来监测天气的变化。


这些传感器使用起来相当简单,经过预先校准,不需要额外的组件,因此您可以立即开始测量气压、高度和温度。


硬件概述

该模块采用博世制造的最新一代数字压力和温度传感器 – BMP180。


BMP180可以测量300至1100 hPa(海拔9000m至-500m)的气压和-40°C至85°C的温度,精度为±1.0°C。

BMP180-Chip-On-The-Module.jpg


气压测量非常精确(低海拔噪声为0.25米),您甚至可以将其用作精度为±1米的高度计。


电源

该模块板载一颗3.3V稳压器LM6206 ,因此您可以放心地将它与Arduino等5V逻辑微控制器一起使用。

BMP180-Module-3V3-Regulator.jpg


BMP180在测量期间消耗不到1mA,在空闲期间仅为5μA。 这种低功耗允许在电池驱动设备中实施。


I2C接口

该模块具有简单的两线I2C接口,可轻松连接您选择的任何微控制器。该模块具有硬连线I2C地址并设置为0x77H。


BMP180模块的引脚排列

BMP180模块只有4个引脚用于向外连接。 连接如下:

BMP180-Module-Pinout.png


●    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)。

Wiring-BMP180-Module-with-Arduino.png


安装必要的库

使用BMP180模块计算海拔高度和气压需要大量数学运算。 幸运的是,Adafruit BMP180库的编写隐藏了所有的复杂性,这样我们就可以发出简单的命令来读取温度、气压和高度数据。


要安装库,请导航至 Sketch > Include Library > Manage Libraries…等待库管理器下载库索引并更新已安装库的列表。

Manage-Libraries.png


输入bmp180筛选搜索结果。 应该有几个条目。 查找Adafruit提供的Adafruit BMP085库。 单击该条目,然后选择安装。

BMP180-Arduino-Library-Installation.png


Arduino代码 - 读取温度和气压

以下示意图将让您全面了解如何从BMP180模块读取温度和气压,并可以作为更多实际实验和项目的基础。

  1. #include <Wire.h>
  2. #include <Adafruit_BMP085.h>
  3. #define seaLevelPressure_hPa 1013.25

  4. Adafruit_BMP085 bmp;
  5.   
  6. void setup() {
  7.   Serial.begin(9600);
  8.   if (!bmp.begin()) {
  9.         Serial.println("Could not find a valid BMP085 sensor, check wiring!");
  10.         while (1) {}
  11.   }
  12. }
  13.   
  14. void loop() {
  15.     Serial.print("Temperature = ");
  16.     Serial.print(bmp.readTemperature());
  17.     Serial.println(" *C");
  18.    
  19.     Serial.print("Pressure = ");
  20.     Serial.print(bmp.readPressure());
  21.     Serial.println(" Pa");

  22.     Serial.print("Altitude = ");
  23.     Serial.print(bmp.readAltitude());
  24.     Serial.println(" meters");

  25.     Serial.print("Pressure at sealevel (calculated) = ");
  26.     Serial.print(bmp.readSealevelPressure());
  27.     Serial.println(" Pa");

  28.     Serial.print("Real altitude = ");
  29.     Serial.print(bmp.readAltitude(seaLevelPressure_hPa * 100));
  30.     Serial.println(" meters");
  31.    
  32.     Serial.println();
  33.     delay(500);
  34. }
复制代码

以下是串口监视器中输出的样子。

BMP180-Temperature-Pressure-Altitude-Output.png


海平面气压每降低1hPa,高度计算就会产生大约8.5米的误差。 所以,我们得到的高度足够接近但不准确。


如果您知道当前随天气变化的海平面压力,您可以获得更准确的高度测量值。


代码说明

首先草图包括两个库,即Wire.h和Adafruit_BMP085.h。

  1. #include <Wire.h>
  2. #include <Adafruit_BMP085.h>
复制代码

接下来,我们定义计算高度所需的seaLevelPressure_hPa变量。 将其更改为您所在位置的当前海平面气压。


我们还创建了一个bmp对象,以便可以访问与其相关的函数。

  1. #define seaLevelPressure_hPa 1013.25

  2. Adafruit_BMP085 bmp;
复制代码

在代码的setup()函数中,我们初始化串口通信并调用begin()函数。


begin()函数初始化I2C接口并检查芯片ID是否正确。 然后它使用软复位重置芯片并等待传感器在唤醒后进行校准。

  1. Serial.begin(9600);

  2. if (!bmp.begin()) {
  3.     Serial.println("Could not find a valid BMP085 sensor, check wiring!");
  4.     while (1) {}
  5. }
复制代码

在loop()函数中,我们使用以下函数从BMP180模块读取温度气压和高度。

●    readTemperature() 函数返回传感器的温度。

●    readPressure() 函数返回传感器的大气压力。

●    readAltitude(seaLevelPressure_hPa * 100) 函数根据指定的大气压力(以 hPa 为单位)计算海拔高度(以米为单位)。

●    readSealevelPressure() 函数计算海平面压力(以 hPa 为单位)。

  1. Serial.print("Temperature = ");
  2. Serial.print(bmp.readTemperature());
  3. Serial.println(" *C");

  4. Serial.print("Pressure = ");
  5. Serial.print(bmp.readPressure());
  6. Serial.println(" Pa");

  7. Serial.print("Altitude = ");
  8. Serial.print(bmp.readAltitude());
  9. Serial.println(" meters");

  10. Serial.print("Pressure at sealevel (calculated) = ");
  11. Serial.print(bmp.readSealevelPressure());
  12. Serial.println(" Pa");

  13. Serial.print("Real altitude = ");
  14. Serial.print(bmp.readAltitude(seaLevelPressure_hPa * 100));
  15. Serial.println(" meters");
复制代码

跳转到指定楼层
yefan
发表于: 2023-4-14 17:09:12 | 显示全部楼层

大神,如何用arduino制作支持rs485通信的传感器,麻烦解惑,我用了MAX485模块,但是发现没法与上位机进行485通信
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 700 | 回复: 1480



手机版|

GMT+8, 2024-4-13 16:58 , Processed in 0.202930 second(s), 6 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

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

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