Метеостанція на AHT20 + BMP280: температура, вологість, тиск і точка роси
Модуль AHT20+BMP280 коштує як один BME280, а міряє те саме. Підключаємо два датчики до однієї шини I2C, рахуємо точку роси і розбираємося, чому BMP280 не бачить бібліотека BME280 і навпаки.
Про проєкт
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)рахує висоту за стандартним тиском. Для точних метрів підставте поточний тиск на рівні моря з найближчої метеостанції.