← До всіх проєктів
Сенсори Початковий

Метеостанція на AHT20 + BMP280: температура, вологість, тиск і точка роси

Модуль AHT20+BMP280 коштує як один BME280, а міряє те саме. Підключаємо два датчики до однієї шини I2C, рахуємо точку роси і розбираємося, чому BMP280 не бачить бібліотека BME280 і навпаки.

Складність
Початковий
Час
40 min
Категорія
Сенсори
Оновлено

Про проєкт

BME280 міряє температуру, вологість і тиск одним чипом, але коштує дорожче і часто трапляється підробка — BMP280 з написом «BME280». Популярна альтернатива — плата з двома чипами: AHT20 (температура і вологість) і BMP280 (тиск і температура). Обидва сидять на одній шині I2C, тож проводів стільки ж.

Що потрібно

  • ESP32 DevKit
  • Модуль AHT20 + BMP280 (або два окремі модулі)
  • 4 дроти

Схема

Модуль ESP32
VIN / VCC 3V3
GND GND
SDA GPIO21
SCL GPIO22

На комбінованому модулі резистори підтяжки I2C вже є. Адреси різні: AHT20 — 0x38, BMP280 — 0x77 (на окремих фіолетових модулях BMP280 часто 0x76: вивід SDO підтягнуто до GND). Якщо не певні — запустіть I2C-сканер.

BMP280 чи BME280

Чипи схожі зовні і сумісні за регістрами температури й тиску, але мають різний Chip ID: BMP280 — 0x58, BME280 — 0x60. Бібліотеки перевіряють його в begin():

  • Adafruit_BME280 на BMP280 поверне false — вологості в цього чипа просто немає;
  • Adafruit_BMP280 на BME280 теж поверне false, хоча можна викликати bmp.begin(0x76, 0x60).

Симулятор відтворює обидві ситуації і пише в «Проблеми», який саме чип знайдено.

Точка роси

Відносна вологість сама по собі мало що каже: 60 % при 25 °C і при 5 °C — зовсім різна кількість води. Точка роси — температура, при якій ця вода почне конденсуватися. Її рахують за формулою Магнуса:

γ = ln(RH/100) + a·T/(b + T), Td = b·γ/(a − γ), де a = 17.62, b = 243.12 °C.

Якщо стіна або вікно холодніші за точку роси — на них буде волога і згодом цвіль.

Код

// Метеостанція: AHT20 (температура, вологість) + BMP280 (тиск) на одній шині I2C
#include <Wire.h>
#include <Adafruit_AHTX0.h>
#include <Adafruit_BMP280.h>

Adafruit_AHTX0 aht;
Adafruit_BMP280 bmp;

float dewPoint(float t, float rh) {   // формула Магнуса
  const float a = 17.62, b = 243.12;
  float g = log(rh / 100.0) + a * t / (b + t);
  return b * g / (a - g);
}

void setup() {
  Serial.begin(115200);
  Wire.begin();
  if (!aht.begin()) {
    Serial.println("AHT20 не знайдено");
    while (true) delay(1000);
  }
  if (!bmp.begin(0x77)) {   // окремий модуль BMP280 — найчастіше 0x76
    Serial.println("BMP280 не знайдено");
    while (true) delay(1000);
  }
  bmp.setSampling(Adafruit_BMP280::MODE_NORMAL, Adafruit_BMP280::SAMPLING_X2,
                  Adafruit_BMP280::SAMPLING_X16, Adafruit_BMP280::FILTER_X16,
                  Adafruit_BMP280::STANDBY_MS_500);
}

void loop() {
  sensors_event_t humidity, temp;
  aht.getEvent(&humidity, &temp);   // вимір триває ~80 мс
  float t = temp.temperature;
  float rh = humidity.relative_humidity;
  float hpa = bmp.readPressure() / 100.0;
  Serial.printf("%.1f °C  %.0f %%  роса %.1f °C  %.1f гПа\n", t, rh, dewPoint(t, rh), hpa);
  delay(2000);
}

Тиск і погода

Абсолютне значення тиску залежить від висоти над морем, тому для прогнозу дивляться на зміну за 3 години: падіння більше ніж на 3 гПа — погода псується, зростання — покращується. Зберігайте вимір раз на 10 хвилин у кільцевий буфер на 18 значень і порівнюйте останнє з першим.

Поради

  • Температуру беріть з AHT20. BMP280 стоїть поруч і гріється від плати; його термометр потрібен в основному для компенсації тиску.
  • Не ставте плату біля ESP32. Wi-Fi гріє чип на 2–5 °C — модуль виносять на проводі або в окремий відсік корпусу з отворами.
  • Висота. bmp.readAltitude(1013.25) рахує висоту за стандартним тиском. Для точних метрів підставте поточний тиск на рівні моря з найближчої метеостанції.