# Теория: как работают AHT20 и BMP280

## 1. AHT20 — влажность и температура

AHT20 — это две отдельные измерительные схемы под одним корпусом:

- **Влажность** измеряется ёмкостным сенсором: между двумя электродами находится полимерная плёнка, которая впитывает водяной пар из воздуха. Чем больше влаги впитала плёнка, тем выше её диэлектрическая проницаемость — а значит, выше ёмкость конденсатора, который эта плёнка образует. Электроника чипа измеряет эту ёмкость и переводит её в проценты относительной влажности (%RH — сколько водяного пара в воздухе относительно максимума, который воздух может удержать при этой температуре).
- **Температура** измеряется отдельным полупроводниковым датчиком внутри того же корпуса.

Оба значения приходят уже откалиброванными с завода — драйверу не нужно ничего компенсировать самому, за это отвечает Adafruit_AHTX0 внутри [`Aht20Driver::update()`](src/Aht20Driver.cpp).

**Характеристики (Aosong AHT20 datasheet V1.0, Table 1–2, стр.2):**

| Параметр | Диапазон | Точность (typical) |
| :--- | :--- | :--- |
| Влажность | 0…100 %RH | ±2 %RH |
| Температура | −40…+85 °C | ±0.3 °C |

Время отклика — около 8 секунд на 63% полного отклика для влажности (датчик "думает" не мгновенно, воде нужно время впитаться в плёнку). Именно поэтому в [`src/main.cpp:7`](src/main.cpp) стенд опрашивает датчики раз в 2 секунды, а не постоянно — более частый опрос не даст более свежих данных.

## 2. BMP280 — давление, температура, высота

BMP280 меряет давление пьезорезистивным элементом: тонкая кремниевая мембрана прогибается под давлением воздуха, а электроника чипа переводит этот прогиб в цифровое значение через 12 калибровочных коэффициентов, зашитых в чип на заводе (см. `BMP280_REGISTER_DIG_*` в Adafruit_BMP280 — тот самый смысл фразы "компенсация" в даташите).

**Характеристики (Bosch BMP280 datasheet DS001, rev.1.26, Table 2, стр.7):**

| Параметр | Диапазон | Точность |
| :--- | :--- | :--- |
| Давление | 300…1100 гПа | абсолютная **typ. ±1 гПа** (0…65 °C); относительная **±0.12 гПа** (изменение давления между двумя своими же измерениями, эквивалент ±1 м высоты) |
| Температура | −40…+85 °C | ±0.5 °C при 25 °C, до ±1.0 °C в 0…65 °C |

Важно не путать эти две точности: ±1 гПа — это на сколько показание датчика может отличаться от истинного давления. А ±0.12 гПа — это на сколько может "дрожать" разница между двумя последовательными измерениями одного и того же датчика при постоянном давлении. Для задачи "заметить, что человек поднялся на этаж" важна вторая цифра, а не первая — драйверу не нужна абсолютная точность, важна стабильность.

### Расчёт высоты

Чем выше над уровнем моря, тем разреженнее воздух и тем ниже давление. Зависимость приближённо описывается барометрической формулой; в [`Bmp280Driver::update()` (src/Bmp280Driver.cpp)](src/Bmp280Driver.cpp) она вызывается через `Adafruit_BMP280::readAltitude(seaLevelhPa)`. Чтобы формула дала верную высоту, ей нужно знать текущее давление на уровне моря (QNH) — это метеорологическая величина, которая меняется день ото дня. Без актуального QNH высота будет посчитана относительно "средней" атмосферы (`1013.25` гПа — значение по умолчанию в [`Bmp280Driver.h:60`](include/Bmp280Driver.h)), и ошибка может достигать десятков метров. Задать реальное QNH можно через `setSeaLevelPressureHpa()`.

## 3. Почему два датчика уживаются на одной шине I2C

I2C — это шина, где на двух проводах (SDA — данные, SCL — тактовый сигнал) может сидеть много устройств одновременно. Ведущий (ESP32) обращается к конкретному устройству по его адресу — как по номеру квартиры на одной лестничной клетке. Пока адреса разные, устройства не мешают друг другу:

- AHT20 всегда отвечает на `0x38` (адрес зашит в чип, не настраивается — Aosong AHT20 datasheet V1.0, п.7.3, стр.12).
- BMP280 отвечает на `0x76` или `0x77` в зависимости от того, куда на плате подключен вывод SDO (Bosch BMP280 datasheet DS001, rev.1.26, разд. 5.2). На большинстве готовых модулей SDO подтянут к VDD, поэтому используется `0x77` — это же значение стоит по умолчанию в [`Bmp280Driver.h:21,27`](include/Bmp280Driver.h).

## 4. Единицы измерения давления в этом компоненте

Оба датчика Bosch (и библиотека Adafruit) работают в паскалях (Па) — это единица СИ, поэтому `Bmp280Driver::Data::pressurePa` хранит именно паскали ([`Bmp280Driver.h:14`](include/Bmp280Driver.h)). В российской школьной традиции атмосферное давление принято мерить в мм рт.ст., поэтому тестовый стенд переводит паскали в мм рт.ст. только для вывода на экран — см. `PA_TO_MMHG` в [`src/main.cpp:10`](src/main.cpp). Коэффициент 133.322 — это физическое определение единицы "миллиметр ртутного столба" (вес столбика ртути высотой 1 мм при стандартном g), а не что-то специфичное для датчика.
