В качестве датчика измерения давления в любительской метеостанции используется BMP180 (GY-68). Рассмотрим, что из себя представляет этот датчик, каким образом его можно подключить к контроллеру, а также приведем пример программы, получающей значения давления и температуры с датчика и выводящего его в последовательный порт.
Описание
Датчик BMP-180 предназначен для измерения атмосферного давления в диапазоне от 300 до 1100 гектопаскалей. Производитель - компания BOSH. Выполнен в виде модуля GY-68, используемого в любительской схемотехнике с использованием Arduino. Помимо любительских конструкций модуль часто используется в полетных контроллерах (мультикоптерах, квадрокоптерах, воздушных шарах, зондах, дельтапланах).

Датчик имеет I2C интерфейс, что позволяет его довольно просто подключать к платформе Arduino и ESP. Количество измерений в секунду может достигать 128, но обычно используют одно измерение в секунду, что увеличивает точность и экономит ток потребления.
Датчик BMP180 возвращает величину давления в гектопаскалях (гПа) (1 гПа = 100 Паскалей = 1мБар). Чтобы получить родные глазу мм рт.ст (миллиметр ртутного столба) требуется произвести пересчет 1 hPa = 0.75006375541921 mmHg
Характеристики датчика
- Диапазон измерения: 300... 1100гПа (+9000... -500м относительно уровня моря)
- Напряжение питания: 1.8... 3.6В
- Интерфейс: I2C
- Дополнительно: измерение температуры
- Диапазон измерения температуры: от 0 до 65 °C
- Точность измерения температуры: ± 2 °C
- Рабочая температура: от -40 ° C ~ +85 ° C
Подключение датчика к контроллеру
VIN - питание +3.3В
GND - земля
SCL - интерфейс I2C IO5 (GPIO5, D1)
SDA - интерфейс I2C IO4 (GPIO4, D2)

Программа получения давления и температуры
Для обмена данными с датчиком используется библиотека BMP180 Breakout Arduino Library и библиотека Wire для работы с I2C.
Поскольку давление зависит от температуры, то перед измерением давления происходит её замер.
#include <SFE_BMP180.h>
#include <Wire.h>
SFE_BMP180 pressure;
void setup() {
Serial.begin(115200);
Serial.println("starting");
if (pressure.begin())
Serial.println("BMP180 init success");
else
{
Serial.println("BMP180 init fail (disconnected?)\n\n");
while(1); // Pause forever.
}
}
void loop() {
char status;
double T,P,p0,a;
// до измерения давления должна быть измерена температура
status = pressure.startTemperature(); // начало измерения температуры
if (status != 0){
delay(status); // необходимая задержка перед фактическим измерением
status = pressure.getTemperature(T); // фактическое измерение температуры
if (status != 0){
Serial.print("Temperature: "); // Вывод температуры
Serial.print(T,2);
Serial.println(" C, ");
status = pressure.startPressure(3); // начало измерения давления аргумент 0.. 3, где 3 - самое точное измерение
if (status != 0) {
delay(status); // необходимая задержка перед фактическим измерением
status = pressure.getPressure(P,T); // фактическое измерение давления
if (status != 0) {
Serial.print("Absolute pressure: "); // Вывод давления
Serial.print(P,2);
Serial.print(" mbar, ");
Serial.print(P*0.7500637554192,2); // пересчет в ммРтст
Serial.println(" mmHg");
} else {
Serial.println("error retrieving pressure measurement\n");
}
} else {
Serial.println("error starting pressure measurement\n");
}
} else {
Serial.println("error retrieving temperature measurement\n");
}
} else {
Serial.println("error starting temperature measurement\n");
}
delay(5000);
}
Прошиваем контроллер и открываем монитор порта.
Пример вывода в порт:
