Симулятор BMP280 онлайн: давление и высота без модуля
BMP280 — второй датчик, на котором я обжёгся: на этапе учебного «прогноза погоды» давал странные 950 гПа, а высота над уровнем моря гуляла ±50 м. Оказалось, я забыл readAltitude(1013.25) — без опорного давления пересчёт бессмысленен. В браузере этот урок усваивается за минуту: подвигайте ползунок давления, посмотрите, как readPressure и readAltitude связаны, и как ошибка в опорном давлении уносит высоту на десятки метров.
Модуль ставится на стенд симулятора из каталога: зелёный провод с меткой BMP, на плашке — SDA/SCL на A4/A5. begin(0x76) печатает «[BMP280 найден по адресу 0x76]» — то, что выведет живой сканер шины. Ниже — стартовый скетч, пересчёт высоты с опорным уровнем, тренд давления за час и честная граница модели.
Что видно на стенде
BMP280 в каталоге — деталь «Барометр BMP280»: два провода SDA/SCL на A4/A5, зелёный провод с меткой BMP. На плашке устройства два ползунка — температура и давление в гПа. Двигаете давление — readPressure() отдаёт значение в Па (гПа × 100), readAltitude(1013.25) пересчитывает высоту по формуле 44330·(1−(p/p0)^0.1903). Адрес 0x76 по умолчанию, как у Adafruit_BMP280. Ловушка про 950 гПа из заголовка — здесь: поднимите ползунок давления до 1025 гПа, и высота уйдёт в минус 120 м от стандарта, потому что формула честно считает вас «ниже уровня моря».
- begin(0x76) печатает «[BMP280 найден по адресу 0x76]»: подтверждение, что датчик на шине, как в реальном I2C-сканере.
- readPressure() в Па: ползунок в гПа, число умножается на 100 — как в библиотеке Adafruit.
- readAltitude(seaLevel): формула 44330·(1−(p/p0)^0.1903); без аргумента — берётся 1013.25 гПа.
- readTemperature() с шумом ±0,2 °C: как живой датчик без калибровки.
- setSampling/setMode: заглушки — настройки в браузере не влияют на readings, но и не роняют скетч.
Стартовый скетч: давление и высота
#include <Wire.h>#include <Adafruit_BMP280.h> Adafruit_BMP280 bmp; void setup() { Wire.begin(); Serial.begin(9600); if (!bmp.begin(0x76)) { Serial.println("BMP280 ne naiden"); while (1); } Serial.println("BMP280 na meste");} void loop() { float t = bmp.readTemperature(); long p = bmp.readPressure(); // Па float h = bmp.readAltitude(1013.25); // опорное давление в гПа Serial.print("T="); Serial.print(t, 1); Serial.print(" P="); Serial.print(p); Serial.print(" H="); Serial.println(h, 1); delay(500);}Запустите скетч, подвигайте ползунок давления — монитор печатает давление в Па и высоту, пересчитанную от 1013.25 гПа. Подняли давление — высота ушла в минус, опустили — выросла. Полный разбор формулы пересчёта и того, что подставлять вместо 1013.25 в горной местности, ведёт урок про давление и высоту.
Тренд давления за час: прогноз погоды
#include <Wire.h>#include <Adafruit_BMP280.h> Adafruit_BMP280 bmp;float istoriya[12]; // 12 точек по 5 минутint idx = 0;unsigned long last = 0; void setup() { Wire.begin(); Serial.begin(9600); bmp.begin(0x76);} void loop() { if (millis() - last >= 300000) { // 5 мин = 300 000 мс last += 300000; istoriya[idx % 12] = bmp.readPressure() / 100.0; // гПа idx++; if (idx >= 12) { float trend = istoriya[(idx - 1) % 12] - istoriya[idx % 12]; Serial.print("TREND za chas: "); Serial.print(trend, 1); Serial.println(" gPa"); } }}Тренд за час: рост на 1-2 гПа — к ясной погоде, падение на 3-5 гПа — к дождю и ветру; в браузере вы поднимаете давление сами, на плате ждать час скучно. Методика и фильтр скользящего среднего разобраны в уроке про прогноз погоды по тренду давления.
Граница: модель против живого модуля
| Проверка | Симулятор | Только железо |
|---|---|---|
| begin(0x76) и проверка связи | да: печатает «найден» | то же, плюс реальные 0x76/0x77 |
| readPressure() в Па и readTemperature() | да: ползунок → число | то же, плюс шум ±0,2 °C |
| readAltitude(1013.25) пересчёт высоты | да: формула как в библиотеке | то же, плюс температура собственной платы |
| Калибровка по эталонному давлению | нет: модель без смещения | да — снимают в ясный день на уровне моря |
| Шум и кратковременные колебания | минимальный: ±4 Па | да — ветер и тяга воздуха в комнате |
| Влажность BME280 (не BMP280) | нет: это BMP, без гигрометра | BME280 — да; см. отдельный урок |
Браузер знает давление, а не датчик: шум ±4 Па — слепок с живого модуля, а калибровочное смещение не заложено. На живой плате у BMP280 бывает систематический сдвиг ±2 гПа от партии — лечится калибровкой по эталону, и в браузере её не проверить. Если в проекте нужен ещё и гигрометр — у BMP280 его нет, нужен BME280, и разница разобрана в уроке про DHT22 против BME280.
Грабли BMP280
- Забытый begin(0x76): в браузере датчик «находится» по умолчанию, на плате — только по правильному адресу. Сверьте адрес перемычкой SDO: 0x76 при земле, 0x77 при +3V3.
- readAltitude без аргумента: опорное давление 1013.25 гПа — это «уровень моря в стандарте», а не ваше текущее. Подставляйте давление из эталона, иначе высота врет на десятки метров.
- Высота в минус при высоком давлении: давление выше 1013.25 гПа — вы «ниже уровня моря» по формуле. Так и должно быть, если вы в Москве при 1025 гПа — высота минус 120 м от стандарта.
- Перепутанные BMP280 и BME280: у второго есть readHumidity(), у первого нет. В браузере BME280-скетч без влажности работает, с readHumidity() — нет.
- 3V3 против 5V: модуль 3,3-вольтовый, на 5V-логике нужен согласователь; в браузере это не учитывается, на плате — обязательно, иначе кристалл деградирует.