AHT20 и AHT21 представляют собой недорогие датчики температуры и влажности, которые по функционалу похожи на датчик DHT22. Датчики AHT20 и AHT21 взаимозаменяемы. Но в отличие от датчика DHT22, с датчиков AHT20 и AHT21 мы можем считывать данные так часто, как нам будет необходимо. Для подключения датчики используют стандартный интерфейс I2C, поэтому их легко подключить ко всем современным микроконтроллерам. В данной статье мы рассмотрим их подключение к плате Arduino.
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress).
- Датчик температуры и влажности AHT20 (купить на AliExpress).
Датчик AHT20
Первоначально датчик AHT20 был разработан компанией Adafruit и он до сих пор продается в ее официальном магазине под названием Adafruit AHT20. Но в последнее время появилось достаточно много более дешевых китайских клонов этого датчика.
Точность измерения температуры датчиком AHT20 составляет +-0.3 °C, а точность измерения влажности +- 2%.
Сравнение технических характеристик датчиков AHT21 и AHT20 приведено в следующей таблице.
Распиновка (назначение контактов) датчика AHT20 представлено на следующем рисунке.
Примечание: на рисунке изображен внешний вид датчика Adafruit AHT20, внешний вид и расположение контактов у его китайских клонов могут отличаться.
VIN – контакт для подачи питания. Для подачи питания на датчик используйте напряжение логического уровня, с которым работает ваш микроконтроллер/плата. К примеру, если вы подключаете его к плате Arduino, которая работает с логическими уровнями 5V, то и в качестве напряжения питания для датчика вы должны использовать 5V.
GND - общий провод.
SCL – линия синхронизации (тактовых импульсов) в интерфейсе I2C. Логический уровень равен величине напряжения на контакте VIN. Имеет внутренний подтягивающий резистор 10 кОм.
SDA – линия передачи данных в интерфейсе I2C. Логический уровень равен величине напряжения на контакте VIN. Имеет внутренний подтягивающий резистор 10 кОм.
Контакты SCL и SDA датчика AHT20 могут работать с уровнями напряжений от 2.7V и 5.5V, поэтому их можно подключать как к плате Arduino, работающей с логическими уровнями 5V, так и к плате Raspberry Pi, работающей с логическими уровнями 3.3V.
Схема проекта
Схема подключения датчика AHT20 к плате Arduino представлена на следующем рисунке.
На рисунке изображена плата Adafruit Metro, но данная схема подключения будет аналогична для любых плат Arduino.
На плате датчика AHT20 установлен стабилизатор напряжения питания и конвертер уровней для шины I2C, датчик можно подключать как к 5, так и к 3,3 вольтовой логике. Рекомендуемая частота опроса шины I2C: от 8 до 30 сек.
Подготовка Arduino IDE для работы с датчиком AHT20
Для работы с датчиком AHT20 в Arduino IDE необходимо установить библиотеку Adafruit AHTx0. Ее можно установить с помощью менеджера библиотек (Library Manager). Выберите пункт меню Manage Libraries в Arduino IDE.
В открывшемся менеджере библиотек выполните поиск Adafruit AHTx0. После этого в результатах поиска выберите библиотеку Adafruit AHTx0.
Затем то же самое необходимо повторить для библиотеки Adafruit BusIO.
Примечание: в русскоязычном сегменте интернета для работы с датчиком AHT20 также рекомендуют библиотеку https://github.com/enjoyneering/AHT10.
Откройте пример, расположенный по адресу File -> Examples -> Adafruit AHTx0 -> adafruit_aht_test, и загрузите его в плату Arduino. Затем откройте окно монитора последовательной связи (Tools->Serial Monitor) и установите в нем скорость 115200. Вы должны будете увидеть в нем выводимые значения температуры и влажности.
Исходный код программы (скетча)
Данный фрагмент кода является частью стандартной библиотеки и позволяет считывать данные температуры и влажности с датчика AHT20. Код данного примера можно также посмотреть на Github.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
#include <Adafruit_AHTX0.h> Adafruit_AHTX0 aht; void setup() { Serial.begin(115200); Serial.println("Adafruit AHT10/AHT20 demo!"); if (! aht.begin()) { Serial.println("Could not find AHT? Check wiring"); while (1) delay(10); } Serial.println("AHT10 or AHT20 found"); } void loop() { sensors_event_t humidity, temp; aht.getEvent(&humidity, &temp);// populate temp and humidity objects with fresh data Serial.print("Temperature: "); Serial.print(temp.temperature); Serial.println(" degrees C"); Serial.print("Humidity: "); Serial.print(humidity.relative_humidity); Serial.println("% rH"); delay(500); } |