Подключение датчика AHT20 + BMP280 к Arduino UNO
Введение
Сегодня расскажу о комбинированном датчике AHT20 + BMP280, позволяющем одновременно измерять температуру, влажность воздуха и атмосферное давление (Дешевая замена BME280). Этот модуль широко применяется в метеорологических станциях, экологическом мониторинге, интеллектуальных системах управления домом и зданиями.

Технические характеристики
- Напряжение питания: 3,3В;
- Ток потребления: 1мА;
- Диапазон измерения и погрешность измерения: 0 — 100 % влажности (погрешность ±2%); — 40…+8585°C (погрешность ±0.3°C), 300…1100 гПа (погрешность ±1 гПа);
- Максимальная частота I2C: 400кГц;
- Габаритные размеры: 15 х 15 х 2 мм;
- Вес: 2 грамма
Описание
Модуль оснащен двумя датчиками: AHT20 и BMP280. Первый датчик, AHT20, обеспечивает точное измерение относительной влажности воздуха в диапазоне от 0% до 100%, а также фиксирует температуру окружающей среды в пределах от −40°C до +85°C. Второй датчик, BMP280, позволяет измерять атмосферное давление в интервале от 300 гПа до 1100 гПа и дополнительно определяет температуру в аналогичном температурном диапазоне.

Обмен данными с модулем осуществляется посредством протокола I²C, который позволяет подключать модуль к микроконтроллеру Arduino или другим контроллерам.
Назначение контактов
► VCC — питание модуля 3.3В;
► SDA — линия данных I²C;
► GND — земля;
► SDA — линия тактирования I²C.
Подключение модуля AHT20 и BMP280 к Arduino UNO
Приведу пример схемы подключения модуля AHT20+BMP280 к плате Arduino UNO, а также напишу простейший скетч, позволяющий выводить значения температуры, влажности и атмосферного давления непосредственно в последовательный интерфейс Arduino.
Необходимые детали
- Контроллер Arduino UNO R3 x 1 шт.
- Провода DuPont, 2,54 мм, 20 см x 1 шт.
- Модуль измерения давления, температуры и влажности BMP280 и AHT20 x 1 шт.
Подключение
Подключение довольно простое и осуществляется посредством протокола I²C. Для этого соедините контакты A5 и A4 платы Arduino UNO соответственно с выводами SCL и SDA обоих датчиков AHT20 и BMP280. Далее обеспечьте подачу питания, подключив выводы VCC и GND модуля к соответствующим контактам +5В и GND Arduino UNO. Обратите внимание, что уровень напряжения выхода логики Arduino UNO составляет 5В, тогда как сам модуль рассчитан на работу от 3,3В. Желательно применять преобразователь логических уровней, однако в данном примере мы пренебрегаем этим требованием. Проверяем еще раз схему и приступаем к загрузке скетча.

Установка библиотеки
Для работы, будем использовать библиотеки «Adafruit_BMP280» и «Adafruit_AHTX0» скачать можно используя интегрированную среду разработки Arduino IDE», для этого откройте «Скетч → Подключение библиотеки → Менеджер библиотек…», так же выложу библиотеки в конце статьи.
Установка «Adafruit_BMP280»

Для работы библиотеки необходимо установить зависимые библиотеки, нажимаем «Установить все»

Установка «Adafruit_AHTX0»

Для работы библиотеки необходимо установить зависимые библиотеки, нажимаем «Установить все»

Программа
Открываем среду разработки Arduino IDE и загружаем первую программу в Arduino UNO.
#include <Adafruit_BMP280.h> // Подключаем библиотеку для работы с датчиком BMP280
#include <Adafruit_AHTX0.h> // Подключаем библиотеку для работы с датчиком AHT20
Adafruit_BMP280 bmp; // Создаем объект для работы с датчиком BMP280
Adafruit_AHTX0 aht; // Создаем объект для работы с датчиком AHT20
void setup()
{
Serial.begin(9600); // Инициализируем последовательного порт на скорости 9600
if (!bmp.begin()) { // Инициализация BMP280
Serial.println("BMP280 sensor not found!");
while (1); // Останавливаемся, если датчик не обнаружен
}
if (!aht.begin()) { // Инициализация AHT20
Serial.println("AHT20 sensor not found!");
while (1); // Останавливаемся, если датчик не обнаружен
}
Serial.println("Sensors initialized.");
}
void loop()
{
sensors_event_t tempEvent, humidEvent;
// Запрашиваем обновление показаний температуры и влажности
aht.getEvent(&tempEvent, &humidEvent);
float temperature = tempEvent.temperature; // Читаем данные температуры с AHT20
float humidity = humidEvent.relative_humidity; // Читаем данные влажности с AHT20
float pressure = bmp.readPressure() / 133.3F; // Читаем данные давления с BMP280
// Выводим результаты в сериал-порт
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.println(" °C");
Serial.print("Humidity: ");
Serial.print(humidity);
Serial.println("%");
Serial.print("Pressure: ");
Serial.print(pressure);
Serial.println(" mm");
delay(2000); // Пауза перед следующим чтением
}
Если все правильно сделали при открытия мониторинга порта увидим показания с датчиков

Описание программы:
Сначала подключаются необходимые библиотеки для работы с датчиками BMP280 и AHT20.
#include <Adafruit_BMP280.h>
#include <Adafruit_AHTX0.h>
Создаются объекты для работы с датчиками.
Adafruit_BMP280 bmp;
Adafruit_AHTX0 aht;
В функции setup, инициализируем последовательного порта со скорость 9600 бит/с., затем производим проверку доступности датчиков BMP280 и AHT20. Если датчик не найден, выводится сообщение об ошибке.
Serial.begin(9600);
if (!bmp.begin()) {
Serial.println("BMP280 sensor not found!");
while (1);
}
if (!aht.begin()) {
Serial.println("AHT20 sensor not found!");
while (1);
}
Serial.println("Sensors initialized.");
В основном цикле программы (loop) данные температуры и влажности запрашиваются методом aht.getEvent() и помещаются в структуру типа sensors_event_t. Полученные значения сохраняются в переменных temperature и humidity. Далее считываются показания давления, которые затем делятся на коэффициент 133.3 для перевода полученных показаний в миллиметры ртутного столба (мм рт. ст.).
sensors_event_t tempEvent, humidEvent;
aht.getEvent(&tempEvent, &humidEvent);
float temperature = tempEvent.temperature;
float humidity = humidEvent.relative_humidity;
float pressure = bmp.readPressure() / 133.3F;
Далее, все показания отправляем в последовательный порт.
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.println(" °C");
Serial.print("Humidity: ");
Serial.print(humidity);
Serial.println("%");
Serial.print("Pressure: ");
Serial.print(pressure);
Serial.println(" mm");
