Очень часто в Интернет-магазинах можно встретить модуль датчиков в виде маленькой печатной платы, на которой размещена микросхема BMP280 совместно с преобразователем температуры и влажности AHT20. Вместе они образуют комбинированный модуль датчиков BMP280 + AHT20, что очень удобно и идеально подходит для построения бюджетной и достаточно точной домашней метеостанции.
В рамках этой статьи мы подробно рассмотрим эти преобразователи, а в качестве практики применим их для сборки домашней метеостанции на базе ESP32 с выводом данных на TFT-дисплей ST7735.

Содержание
- Общее описание
- Устройство и принцип работы
- Параметры и характеристики
- Модуль (плата) датчиков
- Схема подключения
- Программный код (скетч)
- Заключение
Общее описание
BMP280 – это цифровой барометр от Bosch Sensortec, который аналогично своему предшественнику BMP180 построен по технологии MEMS (Micro-Electro-Mechanical Systems — микроэлектромеханическая система). Его главное отличие в лучшей точности (±0,12 гПа против ±1 гПа) и термокомпенсации, а также меньшие энергопотребление и размеры.
Интегральная схема включает в себя два ключевых преобразователя:
– пьезорезистивный барометрический, который измеряет абсолютное атмосферное давление (АД) в диапазоне от 300 до 1100 гПа (гектоПаскалей, где 1 гПа = 100 Па = 100 Н/м² ≈ 0,75 мм рт. ст.). Этот диапазон покрывает приблизительно от -500 до +9000 метров относительно моря;
– встроенный термопреобразователь. Это не отдельный элемент, а часть самой структуры кремниевого чипа. Он представляет собой p-n переход кремниевого диода, что-то наподобие LM335. Преобразователь предназначен, в первую очередь, для определения степени нагрева кристалла с пьезорезистивным сенсором, что крайне необходимо для тепловой компенсации показаний барометра. То есть определять степень прогретости воздуха в помещении этим измерительным каналом будет не совсем корректно из-за высокой погрешности (более ±1 ̊C).
Кроме того, что данная модель имеет более высокую точность, чем её предшественница, она отличается двойным интерфейсом передачи данных: I2C или SPI. Благодаря этому обеспечивается высокая гибкость и вариативность работы с сенсором, включая различные варианты подключения, возможность опрашивать сразу несколько чипов, повышенная скорость передачи данных.
AHT20 – цифровой датчик температуры и относительной влажности воздуха от ASAIR Microelectronics, который также построен на базе MEMS-технологии. Он оснащён цифровым выходом по I2C, что упрощает интеграцию в микроконтроллерные проекты.
Интегральная схема включает в себя следующие преобразователи:
– полупроводниковый емкостной преобразователь на основе тонкоплёночного полимера, который позволяет измерять относительную влажность воздуха с точностью ±2%;
– термопреобразователь на базе интегрированного в кремниевую структуру полупроводникового элемента (аналогично тому, как устроено в BMP280). Важное отличие данного преобразователя в том, что он изначально спроектирован не только для термокомпенсации показаний емкостного преобразователя, но и как полноценный отдельный канал измерения температуры воздуха вокруг микросхемы с точностью ±0,3 °C.
Обе микросхемы идеально подходят для создания домашней метеостанции, системы мониторинга микроклимата в изолированных камерах.
Устройство и принцип работы
BMP280. Данная интегральная схема в основном повторяет устройство и принцип работы своего предшественника. Но эта модель не просто улучшенный аналог BMP180, а качественная эволюция.
Основой прибора является по прежнему кремниевая мембрана с пьезорезистивным чувствительным элементом, однако применена обновленная MEMS-структура. Запатентованный компанией Bosch процесс производства MEMS APSM (Advanced Porous Silicon Membrane – усовершенствованная пористая кремниевая мембрана) обеспечивает полную герметичность полости сенсора. Благодаря этой технологии достигается высокая электромагнитная устойчивость чувствительных пьезорезистивных элементов, а также высокая точность, линейность и долговременная стабильность измерений.
Важным новшеством стало добавление в состав сенсора аппаратного программируемого цифрового IIR-фильтра (Infinite Impulse Response) низких частот с бесконечной импульсной характеристикой, который предназначен для подавления кратковременных помех (хлопки дверей, порывы ветра, вибрации).
AHT20. Принцип работы цифрового датчика основан на двух физических эффектах: адсорбция водяного пара полимерной пленкой и изменение электронных свойств полупроводника от степени нагрева.
В основе прибора лежит единый кремниевый чип, на котором интегрированы два независимых чувствительных элемента и специализированная микросхема (ASIC).
ASIC (Application‑Specific Integrated Circuit) – это специализированная интегральная схема, разработанная для выполнения строго определённого набора задач. Кристалл заключен в компактный SMD-корпус 3×3 мм, на верхней крышке которого находится микроскопическое окно для доступа воздуха. Чувствительный элемент для измерения влажности представляет собой полимерный микроскопический плоский конденсатор, встроенный прямо в кремниевую подложку. Вместо традиционного диэлектрика между обкладками конденсатора находится тончайшая (порядка нескольких микрон) пленка специального полимерного материала. Этот материал обладает обратимой адсорбцией (поглощение на поверхности) молекул воды из окружающего воздуха.
Когда влажность воздуха повышается, молекулы воды проникают в полимерную пленку. Молекулы воды, будучи полярными, значительно увеличивают диэлектрическую проницаемость полимера. Ёмкость плоского конденсатора прямо пропорциональна диэлектрической проницаемости материала между обкладками.
Таким образом, изменение влажности приводит к изменению диэлектрической проницаемости полимера (диэлектрика конденсатора), что влияет на прямое изменение электрической емкости сенсора.
Обкладки этого миниатюрного конденсатора созданы методом фотолитографии на кремнии. Весь этот элемент занимает площадь менее 1 мм². Для защиты от загрязнений, но сохранения доступа к воздуху, он покрыт пористым полимерным слоем.
Кстати, может возникнуть вопрос, а чем же емкостной MEMS-сенсор отличается от устаревших резистивных или емкостных сенсоров с подложкой. Резистивные датчики (например, SYH-2R или ZS05) измеряют изменение сопротивления гигроскопического материала, они менее стабильны. А емкостные сенсоры на основе полимеров, как герой нашей статьи, измеряют изменение ёмкости, что обеспечивает лучшую линейность, меньшее влияние загрязнений и значительно более высокую долговременную стабильность. В этом их ключевое преимущество.
В непосредственной близости от емкостного чувствительного элемента находится интегрированный термосенсор. Его работа основана на фундаментальном свойстве полупроводника (кремния) – зависимости напряжения на p-n переходе от температуры. Этот эффект используется в так называемых band-gap (запрещенная зона) источниках опорного напряжения, которые здесь работают как высокоточный термометр.
Термопреобразователь представляет собой транзисторную структуру, сформированную в том же кристалле кремния, что и остальная часть чипа, в процессе производства. Он не имеет отдельного корпуса или мембраны, а измеряет степень нагрева самого кристалла чипа, что критически важно для компенсации.
Свойства полимерной пленки для влажности и параметры электронных схем сильно зависят от степени нагрева. Без компенсации это привело бы к огромной погрешности. Поэтому измерения температуры выполняются постоянно и синхронно с измерениями влажности. Эти данные используются для математической компенсации теплового дрейфа емкостного преобразователя в реальном времени.
Отдельно нужно отметить, что встроенный термодатчик предназначен не только для термокомпенсации показаний емкостного преобразователя. Он также выступает как полноценный отдельный канал измерения температуры. Благодаря крайне низкому энергопотреблению всего прибора, термосенсор практически не подвержен саморазогреву от собственной работы. Поэтому температура кристалла чипа быстро приходит в тепловое равновесие с окружающей средой (при условии теплоизоляции от других источников тепла вокруг интегральной схемы).
Оба аналоговых чувствительных элемента подключены к многофункциональной микросхеме ASIC, которая включает в себя специализированные измерительные входные цепи для каждого канала и аналого-цифровой преобразователь (АЦП). Полученные «сырые» цифровые коды поступают в блок цифровой обработки (DSP – Digatal Signal Processor). Используя уникальные калибровочные коэффициенты (они индивидуальны для каждого чипа и записываются в его энергонезависимую память при заводском тестировании в климатических камерах), цифровой сигнальный процессор проводит три основные операции:
– корректирует нелинейность характеристик сенсоров;
– компенсирует взаимное влияние преобразователей;
– рассчитывает итоговые значения температуры в градусы Цельсия (̊C) и относительной влажности в %RH (RH – Relative Humidity).
Относительная влажность (RH – Relative Humidity) – это отношение количества водяного пара в воздухе к максимальному количеству, которое воздух может содержать при данной температуре, выраженное в процентах.
Параметры и характеристики

BMP280
Сенсор способен работать в трёх основных режимах:
1) Sleep Mode (режим сна). В этом режиме ничего не измеряется, лишь только ожидается команда. Ток потребления минимальный, меньше микроампера;
2) Normal Mode (автоматический цикл). Преобразователь настраивается один раз, а затем постоянно и автоматически циклически работает: выполнил измерение, после чего уснул на заданное время, потом проснулся и вновь выполнил новое измерение. В этом режиме эффективно работает встроенный цифровой фильтр, который сглаживает резкие скачки давления от хлопка дверью или порыва ветра. Это режим для постоянного мониторинга — в смартфоне или навигационном устройстве;
3) Forced Mode (одиночное измерение). По команде от внешнего микроконтроллера датчик просыпается, делает один полный цикл измерений (сначала температуру, потом давление), записывает результат в свои внутренние регистры и снова засыпает. Это режим для экономии энергии, когда измерения нужны редко – например, в домашней метеостанции, которая обновляет данные раз в минуту.
Точность и скорость настраиваются. Пользователь может выбирать качество каждого измерения. Можно пожертвовать точностью ради скорости и экономии энергии (режим «ультра низкое потребление» – Ultra low power), а можно заставить датчик проводить многократное усреднение для получения сверхточных данных (режим «ультра высокое разрешение» – Ultra high resolution).
Всё управляется через регистры. Пользователь задаёт базовые параметры (режим работы, точность, время паузы, степень фильтрации), а всю сложную математическую обработку по термокомпенсации и фильтрации сигнала чип выполняет сам. Ниже представлены таблицы из официальной документации к микросхеме с параметрами режимов работы:


В чистом виде данные из микросхемы поступают на внешнее устройство в виде числовых отсчётов АЦП: «сырой» код термопреобразователя (adc_T), «сырой» код барометра (adc_P). Также передаются индивидуальные для чипа калибровочные коэффициента из энергонезависимой памяти.
По специальным формулам, представленным в технической документации к прибору, вычисляется текущее абсолютное АД. Всю эту работу выполняет библиотека (например, Adafruit-BMP280-Library), поэтому не будем на этом останавливаться.
Каждый чип в процессе производства на заводе проходит индивидуальную калибровку при трёх известных значениях давления и температуры. Персонально в энергонезависимую память микросхемы записывается 12 уникальных коэффициентов:
1) тепловые коэффициенты (3 штуки)
dig_T1 – масштабный коэффициент;
dig_T2 – линейный коэффициент;
dig_T3 – квадратичный коэффициент;
2) Коэффициенты компенсации показаний давления (9 штук)
dig_P1 – масштабный коэффициент
dig_P2…dig_P9 – полиномиальные коэффициенты разного порядка для компенсации нелинейности.
Эти коэффициенты необходимы, чтобы компенсировать технологический разброс толщины мембраны, механические напряжения от корпуса микросхемы, неидеальность параметров пьезорезисторов (сопротивление и его температурный коэффициент).
AHT20
Автоматического циклического режима здесь нет — периодичность измерений полностью задаётся внешней программой. Когда нужно получить данные, микроконтроллер посылает специальную команду — датчик просыпается, синхронно измеряет и температуру, и влажность, укладывается примерно в 80 миллисекунд, после чего снова засыпает.
Управление сводится к трём основным командам: проверить статус, запустить измерение и, если нужно, инициализировать преобразователь после включения.
Сами данные приходят в виде «сырых» 20-битных чисел – одно для температуры, другое для влажности. Однако, в отличие от BMP280, где все калибровочные коэффициенты доступны для внешней обработки, AHT20 проводит всю коррекцию внутри себя, своим специализированным чипом (ASIC), который калибруется на заводе. Температура измеряется встроенным полупроводниковым термометром и тут же используется для компенсации теплового дрейфа ёмкостного сенсора влажности. Пользователю остаётся только подставить полученные «сырые» значения в две простые формулы из документации, чтобы получить привычные градусы Цельсия и проценты влажности.
По аналогии с микросхемой барометра все математические операции выполняет готовая библиотека, например Adafruit_AHTX0. Вся коррекция нелинейности, смещения и тепловой зависимости вшита в логику прибора и выполняется автоматически.
Модуль датчиков BMP280 + AHT20
Как уже упоминалось в начале статьи, в Интернете часто можно встретить в продаже готовый комбинированный модуль BMP280 + AHT20 на одной миниатюрной плате 14×14 мм со всей необходимой обвязкой:

На плате размещены только минимально необходимые элементы: подтягивающие резисторы 4,7 кОм и фильтрующий конденсатор 100 нФ. Стабилизатора напряжения нет, поэтому внешнее питание строго не более 3,3 В.
Схема подключения BMP280 + AHT20 к ESP32
Для построения метеостанции воспользуемся отладочной платой NodeMCU-32S (38 pin), построенной на базе модуля ESP-WROOM-32.
Обе микросхемы используют интерфейс I2C, что позволяет подключить их к одним и тем же пинам на ESP32.
Выводить показания будем на TFT-дисплей (контроллер ST7735S) с диагональю 0,96 дюйма и разрешением 80×160 пикселей. Ниже представлена таблица подключений сенсора и дисплея к отладочной плате.

Далее представлена схема подключения модуля климатических сенсоров и дисплея ST7735S к ESP32, а также фотография собранного макета:


Программный код (скетч)
Проект создавался в среде программирования Arduino IDE 2. Осенью 2025 года компания Qualcomm купила итальянскую компанию Arduino. Теперь доступ к официальному сайту затруднён. Поэтому, чтобы скачать среду разработки, можно воспользоваться официальным репозиторием на GitHub.
Если нужно настроить среду для работы с ESP32, то подробная инструкция представлена в статье про Интернет-часы на базе ESP32-C3 или про микрофон INMP441.
Для взаимодействия с TFT-дисплеем воспользуемся библиотекой tft_eSPI, как наиболее быстрой и эффективной для данной задачи. Подробная инструкция по настройке этой библиотеки приведена в статье про лазерный дальномер VL53L0X.
Что касается работы с барометрическим сенсором, то применим популярную и простую библиотеку Adafruit-BMP280-Library. Она обеспечивает оптимальный набор функций и достаточно проста для понимания новичкам.
Для получения данных с AHT20 воспользуемся библиотекой Adafruit_AHTX0. Также для успешной компиляции может понадобиться библиотека Adafruit_Sensor. Оба преобразователя используют интерфейс I2C, поэтому нужно уточнить их адреса:

Ниже представлен очень подробно прокомментированный листинг кода:
// Подключение необходимых библиотек
#include <Wire.h> // Библиотека для работы с шиной I2C (протокол обмена данными с датчиками)
#include <Adafruit_BMP280.h> // Библиотека для работы с датчиком BMP280 (давление и температура)
#include <Adafruit_AHTX0.h> // Библиотека для работы с датчиком AHT20 (температура и влажность)
#include <TFT_eSPI.h> // Библиотека для работы с TFT-дисплеем (графический экран)
// СОЗДАНИЕ ОБЪЕКТОВ (ЭКЗЕМПЛЯРОВ КЛАССОВ)
TFT_eSPI tft = TFT_eSPI(); // Создание объекта 'tft' для управления TFT-дисплеем
Adafruit_BMP280 bmp; // Создание объекта 'bmp' для работы с датчиком BMP280
Adafruit_AHTX0 aht; // Создание объекта 'aht' для работы с датчиком AHT20
// ОБЪЯВЛЕНИЕ ГЛОБАЛЬНЫХ ПЕРЕМЕННЫХ ДЛЯ ХРАНЕНИЯ ДАННЫХ
float pressure_raw; // Переменная для хранения сырых данных о давлении в паскалях (Па)
float pressure; // Переменная для хранения давления в гектопаскалях (гПа)
float temp_bmp; // Переменная для хранения температуры с датчика BMP280 (°C)
float humidity; // Переменная для хранения влажности с датчика AHT20 (%)
float temp_aht; // Переменная для хранения температуры с датчика AHT20 (°C)
float pressure_mmHg; // Переменная для хранения давления в миллиметрах ртутного столба (мм рт. ст.)
unsigned long previousMillis = 0; // Переменная для хранения времени последнего обновления (в миллисекундах)
const long interval = 2000; // Константа, задающая интервал обновления данных (2000 мс = 2 секунды)
// ФУНКЦИЯ SETUP() - ВЫПОЛНЯЕТСЯ ОДИН РАЗ ПРИ ЗАПУСКЕ УСТРОЙСТВА
// Здесь происходит инициализация всех компонентов системы
void setup() {
// ИНИЦИАЛИЗАЦИЯ ПОСЛЕДОВАТЕЛЬНОГО ПОРТА (SERIAL)
Serial.begin(115200); // Открытие Serial-порта для отладки со скоростью 115200 бод
// (позволяет выводить данные в монитор порта Arduino IDE)
// ИНИЦИАЛИЗАЦИЯ ШИНЫ I2C
Wire.begin(21, 22); // Инициализация I2C шины с указанием номеров пинов:
// 21 - SDA (линия данных), 22 - SCL (линия тактовых импульсов)
// Эти пины характерны для плат ESP32
// НАСТРОЙКА TFT-ДИСПЛЕЯ
tft.init(); // Инициализация дисплея (настройка драйвера, установка начальных параметров)
tft.setRotation(3); // Установка ориентации дисплея (3 = поворот на 270 градусов)
tft.fillScreen(TFT_BLACK); // Заливка всего экрана черным цветом (очистка экрана)
tft.setTextColor(TFT_WHITE, TFT_BLACK); // Установка цвета текста (белый) и фона (черный)
// НАСТРОЙКА ПАРАМЕТРОВ ТЕКСТА
tft.setTextSize(1); // Установка размера шрифта (минимальный размер, обычно 8x10 пикселей)
tft.setTextDatum(MC_DATUM); // Установка точки привязки текста (MC = Middle Center - центр по горизонтали и вертикали)
// Это значит, что координаты текста будут указывать на его центр
// ВЫВОД ЗАГОЛОВКА И ИНФОРМАЦИИ О ЗАГРУЗКЕ
tft.setTextSize(2); // Установка увеличенного размера шрифта для заголовка
tft.drawString("Meteostation", tft.width()/2, 10); // Вывод строки "Meteostation" по центру экрана (x = ширина/2, y = 10)
tft.drawLine(0, 30, tft.width(), 30, TFT_CYAN); // Рисование горизонтальной синей линии под заголовком
tft.setTextSize(1); // Возврат к обычному размеру шрифта
tft.setCursor(5, 35); // Установка курсора в позицию (5 пикселей от левого края, 35 от верхнего)
tft.println("Initialization..."); // Вывод сообщения о начале инициализации
// ИНИЦИАЛИЗАЦИЯ ДАТЧИКОВ
bool sensors_ok = true; // Флаг, указывающий на успешную инициализацию всех датчиков
// Попытка инициализации датчика BMP280
if (!bmp.begin(0x77)) { // Вызов метода begin() для инициализации BMP280 с адресом 0x77 (или 0x76)
// Если инициализация не удалась (метод вернул false)...
tft.println("BMP280 не найден!"); // Вывод сообщения об ошибке на дисплей
sensors_ok = false; // Установка флага в false (не все датчики инициализированы)
}
// Попытка инициализации датчика AHT20
if (!aht.begin()) { // Вызов метода begin() для инициализации AHT20 (адрес 0x38 по умолчанию)
// Если инициализация не удалась...
tft.println("AHT20 не найден!"); // Вывод сообщения об ошибке на дисплей
sensors_ok = false; // Установка флага в false
}
// ЕСЛИ ВСЕ ДАТЧИКИ УСПЕШНО ИНИЦИАЛИЗИРОВАНЫ
if (sensors_ok) {
tft.fillRect(0, 35, tft.width(), 15, TFT_BLACK); // Стирание строки "Initialization..." черным прямоугольником
// НАСТРОЙКА ПАРАМЕТРОВ BMP280 ДЛЯ ОПТИМАЛЬНОЙ РАБОТЫ
bmp.setSampling(Adafruit_BMP280::MODE_NORMAL, // Режим работы: NORMAL (периодические измерения)
Adafruit_BMP280::SAMPLING_X2, // Температура: oversampling x2 (компромисс между точностью и энергопотреблением)
Adafruit_BMP280::SAMPLING_X16, // Давление: oversampling x16 (высокая точность)
Adafruit_BMP280::FILTER_X16, // Фильтр: коэффициент x16 (сглаживание резких изменений)
Adafruit_BMP280::STANDBY_MS_500); // Время ожидания между измерениями: 500 мс
delay(1000); // Пауза 1 секунда для стабилизации работы датчиков после настройки
}
tft.fillScreen(TFT_BLACK); // Полная очистка экрана черным цветом (подготовка к основному циклу)
}
// ФУНКЦИЯ LOOP() - ВЫПОЛНЯЕТСЯ БЕСКОНЕЧНО В ЦИКЛЕ ПОСЛЕ ЗАВЕРШЕНИЯ SETUP()
void loop() {
// Чтение данных со всех датчиков и сохранение в глобальные переменные
readSensors();
// Отображение считанных данных на TFT-дисплее
displayData();
// Вывод тех же данных в Serial Monitor для отладки
printSerialData();
// Пауза 300 миллисекунд перед следующим циклом измерений
// Это ограничивает частоту обновления до ~3 раз в секунду
delay(300);
}
// ФУНКЦИЯ readSensors() - ЧТЕНИЕ ДАННЫХ С ДАТЧИКОВ
void readSensors() {
// ЧТЕНИЕ ДАННЫХ С BMP280 (ДАВЛЕНИЕ И ТЕМПЕРАТУРА)
temp_bmp = bmp.readTemperature(); // Чтение температуры в градусах Цельсия
pressure_raw = bmp.readPressure(); // Чтение сырых данных о давлении в Паскалях
// Преобразование давления в гПа (гектоПаскали)
// 1 гПа = 100 Па, поэтому делим на 100
pressure = pressure_raw / 100.0F;
// Преобразование давления в мм рт. ст.
// Коэффициент 0.00750062 - это 1 Па в мм рт. ст.
pressure_mmHg = pressure_raw * 0.00750062;
// ЧТЕНИЕ ДАННЫХ С AHT20 (ТЕМПЕРАТУРА И ВЛАЖНОСТЬ)
sensors_event_t humidity_event, temp_event; // Создание структур для хранения событий датчика
aht.getEvent(&humidity_event, &temp_event); // Получение данных с датчика AHT20
temp_aht = temp_event.temperature; // Извлечение температуры из структуры temp_event
humidity = humidity_event.relative_humidity; // Извлечение влажности из структуры humidity_event
}
// ФУНКЦИЯ displayData() - ВЫВОД ДАННЫХ НА TFT-ДИСПЛЕЙ
void displayData() {
tft.setTextSize(1); // Установка размера шрифта 1 (минимальный)
tft.setTextColor(TFT_YELLOW, TFT_BLACK); // Установка цвета текста желтый на черном фоне
// ВЫВОД ТЕМПЕРАТУРЫ С BMP280
tft.setCursor(0, 0); // Установка курсора в левый верхний угол (0, 0)
tft.printf("Temp (BMP280) : "); // Вывод подписи к значению
tft.setTextColor(TFT_WHITE, TFT_BLACK); // Смена цвета на белый для вывода значения
tft.printf("%.1f ", temp_bmp); // Вывод температуры с одним знаком после запятой
tft.print(char(247)); // Вывод символа градуса (код 247 в таблице ASCII)
tft.printf("C"); // Вывод буквы C (Celsius)
// ВЫВОД ДАВЛЕНИЯ В ГПА
tft.setTextColor(TFT_YELLOW, TFT_BLACK); // Возврат к желтому цвету для подписи
tft.setCursor(0, 15); // Установка курсора на следующую строку (15 пикселей от верха)
tft.printf("Press (BMP280): "); // Вывод подписи
tft.setTextColor(TFT_WHITE, TFT_BLACK); // Смена цвета на белый для значения
tft.printf("%.1f hPa", pressure); // Вывод давления в гПа с одним знаком после запятой
// ВЫВОД ДАВЛЕНИЯ В ММ РТ. СТ.
tft.setTextColor(TFT_YELLOW, TFT_BLACK); // Возврат к желтому цвету для подписи
tft.setCursor(0, 30); // Установка курсора на третью строку (30 пикселей от верха)
tft.printf("Press (BMP280): "); // Вывод подписи (такой же, как выше)
tft.setTextColor(TFT_WHITE, TFT_BLACK); // Смена цвета на белый для значения
tft.printf("%.1f mmHg", pressure_mmHg); // Вывод давления в мм рт. ст.
// ВЫВОД ТЕМПЕРАТУРЫ С AHT20
tft.setTextColor(TFT_YELLOW, TFT_BLACK); // Возврат к желтому цвету для подписи
tft.setCursor(0, 45); // Установка курсора на четвертую строку (45 пикселей от верха)
tft.printf("Temp (AHT20) : "); // Вывод подписи (обратите внимание на пробелы для выравнивания)
tft.setTextColor(TFT_WHITE, TFT_BLACK); // Смена цвета на белый для значения
tft.printf("%.1f ", temp_aht); // Вывод температуры с AHT20
tft.print(char(247)); // Вывод символа градуса
tft.printf("C"); // Вывод буквы C
// ВЫВОД ВЛАЖНОСТИ С AHT20
tft.setTextColor(TFT_YELLOW, TFT_BLACK); // Возврат к желтому цвету для подписи
tft.setCursor(0, 60); // Установка курсора на пятую строку (60 пикселей от верха)
tft.printf("Hum (AHT20) : "); // Вывод подписи
tft.setTextColor(TFT_WHITE, TFT_BLACK); // Смена цвета на белый для значения
tft.printf("%.1f %%", humidity); // Вывод влажности с одним знаком после запятой и символом %
// Двойной символ %% нужен, потому что % в printf - специальный символ
}
// ФУНКЦИЯ printSerialData() - ВЫВОД ДАННЫХ В SERIAL MONITOR
void printSerialData() {
Serial.println("Метеостанция sprytron.ru (BMP280 + AHT20)"); // Вывод заголовка в Serial Monitor
Serial.printf("Температура (BMP280): %.1f °C\n", temp_bmp); // Температура с BMP280
Serial.printf("Давление: %.1f гПа\n", pressure); // Давление в гПа
Serial.printf("Давление: %.1f мм рт. ст.\n", pressure_mmHg); // Давление в мм рт. ст.
Serial.printf("Температура (AHT20): %.1f °C\n", temp_aht); // Температура с AHT20
Serial.printf("Влажность: %.1f %%\n", humidity); // Влажность в процентах
Serial.println(); // Пустая строка для разделения циклов вывода
}
После сборки схемы и загрузки кода на ESP32, данные с датчиков начнут отображаться на TFT-дисплее и в мониторе порта:

Заключение
Рассмотренный в статье комбинированный модуль BMP280 + AHT20 является отличным дуэтом для создания достаточно точной домашней метеостанции. Их простота подключения, наличие готовых библиотек и высокая точность делают их идеальным выбором для DIY-проектов, образовательных целей и систем мониторинга окружающей среды. Совместное использование этих датчиков позволяет получать полную картину атмосферных условий в помещении: температуру, влажность и абсолютное атмосферное давление.
Несмотря на существование более современного функционального аналога BME280, который представляет собой сразу «3 в 1», рассмотренный в статье модуль является наилучшей альтернативой, поскольку он намного дешевле и имеет более точный канал измерения температуры окружающей среды.
