Подключение датчик атмосферного давления BMP390 к Arduino
Сегодня расскажу о высокоточном датчике BMP390 атмосферного давления от компании Bosch Sensortec. Он предназначен для измерения абсолютного давления и температуры, отличается высокой точностью и малым энергопотреблением.

Технические характеристики
- Напряжение питания: 3.3В — 5В;
- Ток потребления: 3.2 мА;
- Диапазон давления: 300 – 1250 гПа (hPa);
- Диапазон температур: -40 … +85 °C;
- Максимальная частота I2C;
- Габаритные размеры: 15 х 15 х 2 мм;
- Вес: 1 грамма
Описание
Модуль оснащён датчиком BMP390, который позволяет измерять атмосферное давление в диапазоне от 300 до 1250 гПа, а также определять температуру в температурном диапазоне от -40 … +85 °C (по аналогии с модулем BMP280).
На плате реализованы интерфейсы I²C и SPI. Поскольку модуль работает от напряжения 3,3 В, на нём установлен стабилизатор напряжения XC6206, что позволяет подключать его к источнику 5 В. Для согласования уровней интерфейса I²C с 5 В предусмотрена транзисторная сборка 2N7002. Также на плате установлены подтягивающие резисторы, необходимые для корректной работы шины I²C.


Для удобства выведу электрическую схему модуля BMP390

Назначение контактов
► VCC — питание модуля 3.3-5В;
► GND — земля;
► SCL — линия тактирования I²C.
► SDA — линия данных I²C;
► GND — земля;
► SDO — определяет адрес на шине I2C или активирует режим SPI;
► SCB — линия данных для интерфейса SPI (вход/выход);
► INT — выходные сигналы прерываний для событий.
Подключение датчика BMP390 к Arduino UNO
Приведу пример схемы подключения датчика BMP390 к плате Arduino UNO, а также напишу простейший скетч, позволяющий выводить значения температуры и атмосферного давления непосредственно в последовательный интерфейс Arduino.
Необходимые детали
- Контроллер Arduino UNO R3 x 1 шт.
- Провода DuPont, 2,54 мм, 20 см x 1 шт.
- Модуль измерения давления, температуры BMP390 x 1 шт.
Подключение
Подключение довольно простое и осуществляется посредством протокола I²C. Для этого соедините контакты A5 и A4 платы Arduino UNO соответственно с выводами SCL и SDA датчика BMP390. Далее обеспечьте подачу питания, подключив выводы VCC и GND модуля к соответствующим контактам +5В и GND Arduino UNO.

Установка библиотеки
Для работы, будем использовать библиотеки «Adafruit_BMP3xx» скачать можно используя интегрированную среду разработки Arduino IDE», для этого откройте «Скетч → Подключение библиотеки → Менеджер библиотек…», так же выложу библиотеки в конце статьи.

Для работы библиотеки необходимо установить зависимые библиотеки, нажимаем «Установить все»

Программа
Открываем среду разработки Arduino IDE и загружаем первую программу в Arduino UNO.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
#include "Adafruit_BMP3XX.h" // Подключаем библиотеку для работы с датчиками BMP3XX (BMP388, BMP390). Adafruit_BMP3XX bmp; // Создаём объект bmp для работы с первым датчиком. void setup() { Serial.begin(9600); // Инициализируем последовательный порт для вывода данных в монитор. while (!Serial); // Ждём, пока порт не будет готов Serial.println("Adafruit BMP388 / BMP390 test"); // Выводим сообщение if (!bmp.begin_I2C()) // Если датчик не найден, выводим ошибку и останавливаем программу. { Serial.println("Could not find a valid BMP sensor, check wiring!"); while (1); } Serial.println("Initialization Success!"); // Сообщаем об успешной инициализации. Serial.print("Configuring BMP..."); // Настраиваем параметры датчика. bmp.setTemperatureOversampling(BMP3_OVERSAMPLING_8X); // Устанавливаем 8-кратное усреднение для температуры (повышает точность). bmp.setPressureOversampling(BMP3_OVERSAMPLING_4X); // Устанавливаем 4-кратное усреднение для давления. bmp.setIIRFilterCoeff(BMP3_IIR_FILTER_COEFF_3); // Включаем цифровой фильтр для сглаживания данных (коэффициент 3). bmp.setOutputDataRate(BMP3_ODR_50_HZ); // Устанавливаем частоту обновления данных — 50 Гц. Serial.println("DONE."); // Выводим сообщение Serial.println("----[START READING]-----"); // Выводим сообщение } void loop() { if (!bmp.performReading()) // Пытаемся выполнить чтение данных с датчика. { Serial.println("Failed to perform reading BMP :("); // Если чтение не удалось, выводим сообщение об ошибке. return; // Прерываем текущую итерацию цикла. } Serial.print("BMP Temperature = "); // Выводим температуру в градусах Цельсия. Serial.print(bmp.temperature); Serial.print(" *C"); Serial.print(" Pressure = "); // Выводим давление в гектопаскалях (гПа). Serial.print(bmp.pressure / 100.0); // Делим на 100 для перевода в гПа. Serial.println(" hPa"); delay(2000); // Пауза между измерениями — 2 секунды. } |
Если все правильно сделали при открытия мониторинга порта увидим показания с датчиков

Описание программы:
Сначала подключаются необходимые библиотеки для работы с датчиками BMP390 и создаем объект для работы с датчиками.
1 2 |
#include "Adafruit_BMP3XX.h" Adafruit_BMP3XX bmp; |
В функции setup, инициализируем последовательного порта со скорость 9600 бит/с., затем производим проверку доступности датчиков BMP390 и AHT20. Если датчик не найден, выводится сообщение об ошибке.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
void setup() { Serial.begin(9600); while (!Serial); Serial.println("Adafruit BMP388 / BMP390 test"); if (!bmp.begin_I2C()) { Serial.println("Could not find a valid BMP sensor, check wiring!"); while (1); } Serial.println("Initialization Success!"); Serial.print("Configuring BMP..."); bmp.setTemperatureOversampling(BMP3_OVERSAMPLING_8X); bmp.setPressureOversampling(BMP3_OVERSAMPLING_4X); bmp.setIIRFilterCoeff(BMP3_IIR_FILTER_COEFF_3); bmp.setOutputDataRate(BMP3_ODR_50_HZ); Serial.println("DONE."); Serial.println("----[START READING]-----"); } |
В основном цикле программы (loop) считываем данные, если не получается получить данные выводим сообщение об ошибке. Все показания отправляем в последовательный порт.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
void loop() { if (!bmp.performReading()) // Пытаемся выполнить чтение данных с датчика. { Serial.println("Failed to perform reading BMP :("); // Если чтение не удалось, выводим сообщение об ошибке. return; // Прерываем текущую итерацию цикла. } Serial.print("BMP Temperature = "); // Выводим температуру в градусах Цельсия. Serial.print(bmp.temperature); Serial.print(" *C"); Serial.print(" Pressure = "); // Выводим давление в гектопаскалях (гПа). Serial.print(bmp.pressure / 100.0); // Делим на 100 для перевода в гПа. Serial.println(" hPa"); delay(2000); // Пауза между измерениями — 2 секунды. } |
