Взаимодействие BMP180, датчика атмосферного давления и температуры, с Arduino

Добавлено 12 февраля 2020 в 22:25

Добавьте в свой следующий проект на Arduino возможность отслеживать состояние окружающей среды с помощью датчика BMP180.

Взаимодействие BMP180, датчика атмосферного давления и температуры, с Arduino
Взаимодействие BMP180, датчика атмосферного давления и температуры, с Arduino

Это простой датчик, разработанный специально для измерения атмосферного давления, и он действительно полезен для двух вещей.

  • По мере того, как мы поднимаемся от уровня моря до горной вершины, атмосферное давление снижается. Это означает, что, измеряя давление, мы можем определить высоту. Таким образом, мы можем использовать этот датчик в качестве альтиметра (высотомера).
  • Поскольку атмосферное давление меняется в зависимости от погоды, мы можем использовать его для мониторинга изменений погоды.

Эти датчики довольно просты в использовании, предварительно откалиброваны и не требуют дополнительных компонентов, поэтому вы можете начать измерение атмосферного давления, высоты над уровнем моря и температуры воздуха в самые кратчайшие сроки.

Обзор железа

В основе модуля лежит цифровой датчик давления и температуры нового поколения производства Bosch – BMP180.

Чип BMP180

BMP180 может измерять атмосферное давление от 300 гПа до 1100 гПа (что соответствует высотам от 9000 до -500 метров над уровнем моря) и температуру от -40°C до 85°C с точностью ±1,0°C.

Рисунок 1 Чип BMP180 на модуле
Рисунок 1 – Чип BMP180 на модуле

Измерения давления настолько точны (небольшой шум соответствует колебаниям высоты 0,25 м), что вы даже можете использовать его в качестве альтиметра с точностью ±1 метр.

Рисунок 2 Технические характеристики датчика BMP180
Рисунок 2 – Технические характеристики датчика BMP180

Требования к питанию

Модуль поставляется со встроенным стабилизатором 3,3В LM6206, поэтому вы можете без проблем использовать его с микроконтроллером с логикой 5 В, например, с Arduino.

Рисунок 3 Стабилизатор 3,3 В на модуле BMP180
Рисунок 3 – Стабилизатор 3,3 В на модуле BMP180

BMP180 потребляет менее 1 мА во время измерений и только 5 мкА в режиме ожидания. Такое низкое энергопотребление позволяет использовать его в устройствах с батарейным питанием.

Интерфейс I2C

Модуль использует простой двухпроводной интерфейс I2C, поэтому его можно легко подключить к любому микроконтроллеру по вашему выбору.

Адрес на шине I2C данного модуля установлен аппаратно, он равен 0x77HEX.

Распиновка модуля BMP180

Модуль BMP180 имеет только 4 вывода, связывающих его с внешним миром. Назначение выводов показано ниже:

Рисунок 4 Распиновка модуля BMP180
Рисунок 4 – Распиновка модуля BMP180

VIN – вывод для подключения источника питания для модуля, напряжение питания может находиться в диапазоне от 3,3 до 5 В.

GND подключается к выводу земля на Arduino

SCL – это вывод синхронизации для интерфейса I2C.

SDA – вывод данных для интерфейса I2C.

Подключение модуля BMP180 к Arduino

Давайте подключим модуль BMP180 к Arduino.

Подключение довольно простое. Начните с соединения выводов GND на модуле и на плате Arduino, затем подключите вывод VIN к выводу 5V на Arduino.

Теперь остаются выводы, которые используются для связи I2C. Обратите внимание, что у разных плат Arduino для I2C используются разные выводы. На платах Arduino с разводкой R3 SDA (линия передачи данных) и SCL (линия синхронизации) находятся на разъеме выводов рядом с выводом AREF. Они также известны как A5 (SCL) и A4 (SDA).

Если у вас Arduino Mega, выводы будут отличаться! Вам необходимо использовать цифровые выводы 21 (SCL) и 20 (SDA). В таблице ниже приведены выводы, использующиеся для I2C на разных платах Arduino.

Выводы шины I2C на разных платах Arduino
 SCLSDA
Arduino UnoA5A4
Arduino NanoA5A4
Arduino Mega2120
Leonardo/Micro32

Следующая диаграмма показывает, как всё подключить.

Рисунок 5 Подключение модуля BMP180 к Arduino
Рисунок 5 – Подключение модуля BMP180 к Arduino

Установка необходимых библиотек

Расчет высоты и барометрического давления с помощью модуля BMP180 требует много математики. К счастью, была написана библиотека Adafruit BMP180, чтобы скрыть все сложности, и мы могли бы выполнять простые команды для считывания данных о температуре, атмосферном давлении и высоте.

Чтобы установить библиотеку, перейдите в раздел «Скетч»→ «Подключить библиотеку» → «Управлять библиотеками…». Подождите, пока менеджер библиотек загрузит индекс библиотек и обновит список установленных библиотек.

Рисунок 6 Установка библиотеки Arduino – выбор управления библиотеками в Arduino IDE
Рисунок 6 – Установка библиотеки Arduino – выбор управления библиотеками в Arduino IDE

Отфильтруйте результаты поиска, набрав «bmp180». Там должно быть пара записей. Ищите библиотеку Adafruit BMP085 by Adafruit. Нажмите на эту запись, а затем выберите «Установка».

Рисунок 7 Установка библиотеки Arduino BMP180
Рисунок 7 – Установка библиотеки Arduino BMP180

Код 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);
}

Вот как выглядит вывод в мониторе последовательного порта.

Рисунок 8 Вывод в мониторе последовательного порта
Рисунок 8 – Вывод в мониторе последовательного порта

Каждое снижение давления на уровне моря на 1 гПа приводит к ошибке 8,5 м в расчетах высоты. Поэтому высота, которую мы получаем, достаточно близка, но не точна.

Вы можете получить более точное измерение высоты, если знаете текущее давление на уровне моря, которое будет зависеть от погоды.

Данный код предполагает, что текущее давление на уровне моря составляет 1013,25 миллибар, что равно 101325 Паскалям. Вот почему переменная seaLevelPressure_hPa установлена в 1013.25.

Объяснение кода

Скетч начинается с включения двух библиотек, а именно 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 и проверяет правильность идентификатора чипа. Затем она программно перезапускает микросхему и ждет окончания калибровки датчика после запуска.

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

В функции основного цикла для считывания с модуля BMP180 показаний температуры, атмосферного давления и высоты мы используем следующие функции:

  • функция readTemperature() возвращает от датчика температуру;
  • функция readPressure() возвращает от датчика атмосферное давление;
  • функция readAltitude(seaLevelPressure_hPa * 100) вычисляет высоту (в метрах) исходя из текущего атмосферного давления (в гПа);
  • функция readSealevelPressure() вычисляет давление на уровне моря (в гПа).
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");

Теги

ArduinoАтмосферное давлениеДатчикДатчик барометрического давленияДатчик температурыИзмерениеИзмерение температурыТемпература

На сайте работает сервис комментирования DISQUS, который позволяет вам оставлять комментарии на множестве сайтов, имея лишь один аккаунт на Disqus.com.

В случае комментирования в качестве гостя (без регистрации на disqus.com) для публикации комментария требуется время на премодерацию.