Взаимодействие BMP180, датчика атмосферного давления и температуры, с Arduino
Добавьте в свой следующий проект на Arduino возможность отслеживать состояние окружающей среды с помощью датчика BMP180.
Это простой датчик, разработанный специально для измерения атмосферного давления, и он действительно полезен для двух вещей.
- По мере того, как мы поднимаемся от уровня моря до горной вершины, атмосферное давление снижается. Это означает, что, измеряя давление, мы можем определить высоту. Таким образом, мы можем использовать этот датчик в качестве альтиметра (высотомера).
- Поскольку атмосферное давление меняется в зависимости от погоды, мы можем использовать его для мониторинга изменений погоды.
Эти датчики довольно просты в использовании, предварительно откалиброваны и не требуют дополнительных компонентов, поэтому вы можете начать измерение атмосферного давления, высоты над уровнем моря и температуры воздуха в самые кратчайшие сроки.
Обзор железа
В основе модуля лежит цифровой датчик давления и температуры нового поколения производства Bosch – BMP180.
Чип BMP180
BMP180 может измерять атмосферное давление от 300 гПа до 1100 гПа (что соответствует высотам от 9000 до -500 метров над уровнем моря) и температуру от -40°C до 85°C с точностью ±1,0°C.
Измерения давления настолько точны (небольшой шум соответствует колебаниям высоты 0,25 м), что вы даже можете использовать его в качестве альтиметра с точностью ±1 метр.
Требования к питанию
Модуль поставляется со встроенным стабилизатором 3,3В LM6206, поэтому вы можете без проблем использовать его с микроконтроллером с логикой 5 В, например, с Arduino.
BMP180 потребляет менее 1 мА во время измерений и только 5 мкА в режиме ожидания. Такое низкое энергопотребление позволяет использовать его в устройствах с батарейным питанием.
Интерфейс I2C
Модуль использует простой двухпроводной интерфейс I2C, поэтому его можно легко подключить к любому микроконтроллеру по вашему выбору.
Адрес на шине I2C данного модуля установлен аппаратно, он равен 0x77HEX.
Распиновка модуля BMP180
Модуль BMP180 имеет только 4 вывода, связывающих его с внешним миром. Назначение выводов показано ниже:
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.
SCL | SDA | |
---|---|---|
Arduino Uno | A5 | A4 |
Arduino Nano | A5 | A4 |
Arduino Mega | 21 | 20 |
Leonardo/Micro | 3 | 2 |
Следующая диаграмма показывает, как всё подключить.
Установка необходимых библиотек
Расчет высоты и барометрического давления с помощью модуля BMP180 требует много математики. К счастью, была написана библиотека Adafruit BMP180, чтобы скрыть все сложности, и мы могли бы выполнять простые команды для считывания данных о температуре, атмосферном давлении и высоте.
Чтобы установить библиотеку, перейдите в раздел «Скетч»→ «Подключить библиотеку» → «Управлять библиотеками…». Подождите, пока менеджер библиотек загрузит индекс библиотек и обновит список установленных библиотек.
Отфильтруйте результаты поиска, набрав «bmp180». Там должно быть пара записей. Ищите библиотеку Adafruit BMP085 by Adafruit. Нажмите на эту запись, а затем выберите «Установка».
Код 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);
}
Вот как выглядит вывод в мониторе последовательного порта.
Каждое снижение давления на уровне моря на 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");