Первое сравнение с городской сводкой меня обескуражило: датчик печатал 751, а Гисметео показывал 763. Двенадцать миллиметров расхождения — это без малого двести метров высоты; я уже гуглил возврат датчика, пока не сложил единицы: датчик честно печатал гектопаскали, я читал их как миллиметры, а городская сводка вообще пересчитана к уровню моря. Три разных величины, три системы отсчёта — и одна точка, где все они обязаны сходиться.
BMP280 измеряет давление в паскалях: readPressure() возвращает, скажем, 100137 паскалей. Поделили на сто — получили 1001,4 гектопаскаля, как в метеосводках. Эти же гектопаскали умножили на 0,750062 — получили 751 миллиметр ртутного столба, как на настенном барометре. Ни одна из этих цифр не говорит про высоту напрямую: высота считается из давления арифметикой, и тут прячется вторая половина сюрпризов — формуле нужен уровень моря, которого у вас на столе нет.
В этом уроке разведём все три единицы, соберём перевод в миллиметры одной строкой, откалибруем высотомер по известной точке и проговорим честную погрешность: десять метров плывут от погоды, и датчик тут не виноват. К концу у вас будет скетч, который печатает кадр в трёх единицах сразу — и вы перестанете гадать, кому верить.
Три единицы и один перевод
Паскаль — родная единица чипа, с неё начинается любой кадр. Атмосферное давление у земли живёт в полосе примерно от 970 до 1040 гектопаскалей: ниже 1005 — циклон и осадки вероятнее, выше 1020 — антициклон и яснее. Диапазон датчика шире — от 300 до 1100 гПа: это и пятикилометровая высота, и глубокий циклон. Метеорологи печатают гектопаскали, настенный барометр — миллиметры ртутного столба, и оба правы: это одна величина в разных шкалах.
Перевод арифметически прост, но ориентиры стоит держать в голове, чтобы мгновенно ловить вранье в собственных формулах: 1013,25 гПа — это ровно 760 мм рт. ст., один гектопаскаль — 0,75 миллиметра. Значит, падение с 1013 на 1009 гПа — минус три миллиметра. Если после ваших вычислений норма вышла 7600 мм или 76 мм — ищите потерянный или лишний множитель, а не датчик: чаще всего путают паскали с гектопаскалями и умножают не ту ступень. Мнемоника на стену: деление на сто и умножение на три четверти — больше ничего в переводе нет.
Отдельная тонкость — сводки о погоде приводят давление к уровню моря: показание 751 мм на двенадцатом этаже и сводка 763 — не расхождение, а две разные физические величины. Барометр на столе меряет давление там, где стоит; чтобы сравнивать с городом, нужен пересчёт — им и займёмся.
| Величина | Ориентир | Откуда берётся |
|---|---|---|
| Паскали, Па | 100137 | readPressure() возвращает сразу в паскалях |
| Гектопаскали, гПа | 1001,4 | паскали поделить на 100 |
| Мм рт. ст. | 751,0 | гектопаскали умножить на 0,750062 |
| Норма на уровне моря | 1013,25 гПа = 760 мм | константа стандартной атмосферы |
| Циклон | до 1005 гПа ≈ 754 мм | ниже — осадки вероятнее |
| Антициклон | от 1020 гПа ≈ 765 мм | выше — ясная погода |
Высота по давлению считается барометрической формулой, и в библиотеке Adafruit для неё есть готовый метод readAltitude(). Ему нужен один аргумент — давление на уровне моря прямо сейчас, и вот главный подвох: константа 1013,25 подходит только тем, кто живёт на берегу при нормальной погоде. В средней полосе циклон легко уводит уровень моря на двадцать гектопаскалей — и высота уезжает на все сто шестьдесят метров, не сходясь ни с картой, ни с окном.
Калибровка проста и делается один раз на точку. Узнайте высоту своего места по карте — у моего дома 148 метров над морем. Зафиксируйте показание датчика на этой точке, скажем 988,2 гПа. Подберите аргумент readAltitude так, чтобы метод вернул 148: при давлении 988,2 это где-то 1024 гПа — и это ваше рабочее p0 на сегодня. Циклон завтра сдвинет и его, поэтому в серьёзных станциях p0 уточняют автоматически; разбор есть в уроке про барометр-высотомер, а для комнаты хватает ручной подгонки раз в месяц.
Проверка тоже есть, и она приятная: лифт. Этаж жилого дома — около трёх метров, то есть примерно 0,36 гектопаскаля или 0,27 миллиметра ртутного столба. Проезд девяти этажей должен сдвинуть высоту на 27 метров — если сдвинулась, формула и датчик работают, и калибровке можно верить. Я проверяю так каждый новый барометр: две минуты в лифте дают больше уверенности, чем час сверок с интернетом.
// BMP280: паскали, гектопаскали, мм рт. ст. и высота #include <Wire.h>#include <Adafruit_BMP280.h> Adafruit_BMP280 bmp;float p0 = 1024.0; // мой уровень моря после калибровки void setup() { Serial.begin(9600); bmp.begin(0x76);} void loop() { float pPa = bmp.readPressure(); // паскали, например 98820 float gPa = pPa / 100.0; // гектопаскали float mm = gPa * 0.750062; // мм ртутного столба float h = bmp.readAltitude(p0); // метры по моей калибровке Serial.print("gPa="); Serial.print(gPa, 1); Serial.print(" mm="); Serial.print(mm, 1); Serial.print(" h="); Serial.println(h, 1); delay(1000);}Порядок строк важен: readPressure() отдаёт паскали, и все производные считаются из одного чтения — так кадр остаётся согласованным, даже если давление дрогнет между вызовами. Сначала паскали превращаются в гектопаскали делением на сто, потом гектопаскали умножаются на 0,750062 — константу перевода в миллиметры. Четвёртый знак в ней нужен высотомерам, домашнему барометру хватает и 0,75. Если захочется видеть осадки в долях гектопаскаля, печатайте и четвёртый знак — только помните, что это уже шум, а не сигнал. Аргумент readAltitude — тот самый p0 из калибровки: подставили 1024,0 — высота сошлась с картой.
Значения дрожат на последние доли гектопаскаля — это штатный шум, и с ним работают окном: среднее из восьми-шестнадцати замеров сидит почти неподвижно и в мониторе, и на графике из урока про Serial Plotter. Печатайте пары gPa= и mm= — кадры лягут на график отдельными рядами, а не одной кривой. Для верности испытайте датчик лифтом: девять этажей — это 27 метров и 3,4 гПа, цифры сходятся лучше любого теста на столе.
Погрешность: что плывёт и при каких условиях
Формула честна при условиях. У земли один гектопаскаль — это примерно восемь с половиной метров высоты; выше градиент меняется, и на километровой отметке гектопаскаль стоит уже десяток метров. Для дома, дачи и лифта линейное правило хватает с запасом: три десятых миллиметра на этаж, четыре метра на каждый миллиметр ртутного столба.
Температура тоже входит в формулу, и библиотека подставляет показания кристалла: у окна зимой датчик увидит холодный воздух вместо комнатного, и высота качнётся на метры. Держите модуль вдали от сквозняка и прямого солнца — нагрев корпуса на пару градусов сдвигает высоту заметно сильнее, чем шум давления.
И правило ритма: барометру незачем опрашиваться чаще раза в секунду — давление за минуту сдвигается на доли гектопаскаля, а кристалл греется от работы. Требование то же, что у DHT в уроке про интервал опроса: чаще — не точнее, а горячее. За окно в мороз и обратно датчик ходит на метры — не брак, а честная плата за перенос формулы в чужую температуру.
Теперь у вас барометр, который говорит на трёх языках: паскали для формул, гектопаскали для синоптиков, миллиметры для настенной классики — и высотомер, откалиброванный по вашей точке. Осталось главное: заставить цифры рассказывать про завтра. Один замер — фотография, а прогноз живёт в тренде; как держать историю замеров, считать дельту за три часа и не поверить шуму — финальный урок цикла. А если хочется видеть давление рядом с температурой и влажностью — тот же модуль уже стоит в метеостанции с DHT22 на той же паре A4/A5, без лишних проводов и конфликтов адресов: два датчика на одной шине не мешают друг другу.
- 1. readPressure() вернул 100940. Сколько это в мм рт. ст.?
- 2. Какой аргумент нужен readAltitude() и зачем?
- 3. Норма 1013,25 гПа — сколько это в миллиметрах ртутного столба?
- 4. За три часа давление упало с 1013 на 1009 гПа. Сколько это в мм рт. ст.?
- 5. Почему высота по барометру за ночь уплыла на десять метров?
- readPressure() даёт паскали: делить на 100 — гектопаскали; гектопаскали, умноженные на 0,750062, — мм рт. ст.; 1013,25 гПа — это 760 мм.
- readAltitude(p0) требует давление уровня моря прямо сейчас: константа 1013,25 годится только для идеальной погоды.
- Калибровка на точку: известная высота дома плюс подгон p0 — и высотомер сходится с картой.
- У земли один гектопаскаль — примерно 8,5 метра высоты; этаж — три десятых миллиметра ртутного столба.
- Десятиметровые плывы за ночь — это погода, а не датчик: тренду верьте больше, чем абсолюту.
Частые вопросы по теме урока
- readPressure() вернул 100940. Сколько это в мм рт. ст.?
- 100940 Па — это 1009,4 гПа после деления на сто; умножаем их на 0,750062 и получаем 757 мм. Вариант 75,7 — потерянный десяток, 1009,4 — гектопаскали. 757,0
- Какой аргумент нужен readAltitude() и зачем?
- Барометрическая формула сравнивает давление на месте с уровнем моря. Без свежего p0 высота уедет на десятки метров уже при обычном циклоне. давление на уровне моря сейчас — база для формулы
- Норма 1013,25 гПа — сколько это в миллиметрах ртутного столба?
- Ровно 760: константа стандартной атмосферы. Полезно держать пару 1013/760 в голове — на ней мгновенно ловится перепутанный множитель. 760
- За три часа давление упало с 1013 на 1009 гПа. Сколько это в мм рт. ст.?
- Четыре гектопаскаля умножить на 0,75 — три миллиметра. Такая скорость падения за три часа — уже сигнал приближающегося фронта. на 3
- Почему высота по барометру за ночь уплыла на десять метров?
- Давление за ночь изменилось, и формула честно пересчитала высоту. Абсолют плывёт от погоды; доверять стоит тренду, а не абсолюту. сдвинулся уровень моря из-за циклона