Подключение AHT10 к STM32 c HAL по I2C (датчик температуры и влажности)

Основные параметры

Диапазон измерения температуры: от -40 °C до +85 °C
Диапазон измерения относительной влажности: 0-100%
Погрешность температуры: Δ0.4 °C
Разрешение температуры: 0.01 °C
Погрешность влажности: Δ2%
Разрешение влажности: 0.024%
Время измерения: 75 мс
Напряжение питания МС: 1.5-3.6 В
Напряжение питание платы: 1.8-6 В
Потребляемая мощность (измерение/сон): 70 мкВт/0.9 мкВт
Особенности: два адреса, нет CRC
Области применения: системы отопления/вентиляции/кондиционирования, осушители, испытательные стенды, автомобили, термостаты, регистраторы, увлажнители, медицинское оборудования
Связь: I²C
Размеры: 4 x 5 x 1.6 мм
Цена: от 1.2$

Приобрести на Aliexpress

AHT10 High Precision Digital Temperature and Humidity Sensor
Цена: 1.17$

AHT10 High Precision Sensor
Цена: 1.24$

AHT10 I2C Sensor
Цена: 1.23$ + 0.49$ = 1.72$

AHT10 Sensor 10pcs
Цена: 0.8$/шт.

Схема подключения AHT10 к STM32

Здесь уже есть подключены подтягивающие резисторы.

Кроме этого можно подключать напрямую к 5В (есть преобразователь уровней).

Создание проекта в STM32Cube

Все то же самое, как здесь:  Подключение HTU21D к STM32 c HAL по I2C (датчик температуры и влажности)

Также включим прерывание от Таймера 4, которое будет происходить с частотой f = 10 Гц (каждые 100 мс).

Данные на датчик

Адрес

Можно изменить с помощью резистора на плате.

Команда для запроса измерения

Здесь кроме команды нужно отправить еще два параметра (согл. док.), но работает и без них  .

*Думаю китайцы упразднили эти дополнительные параметры, как команду инициализации.

Выражение для преобразования температуры, °C

Выражение для преобразования относительной влажности, %

Данные отправляются пакетом, то есть все сразу [СТАТУС][Отн. влажность][Температура]:

Программирование

Сначала переменные

/* Variables for AHT10 */ uint8_t AHT10_RX_Data[6]; uint32_t AHT10_ADC_Raw; float AHT10_Temperature; uint8_t AHT10_TmpHum_Cmd = 0xAC; #define AHT10_Adress 0x38 << 1

Чтение с использование функции задержки

HAL_I2C_Master_Transmit(&hi2c1, AHT10_Adress, &AHT10_TmpHum_Cmd, 1, 100); HAL_Delay(100); // Delay must be > 75 ms HAL_I2C_Master_Receive(&hi2c1, AHT10_Adress, (uint8_t*)AHT10_RX_Data, 6, 100); /* Convert to Temperature in °C */ AHT10_ADC_Raw = (((uint32_t)AHT10_RX_Data[3] & 15) << 16) | ((uint32_t)AHT10_RX_Data[4] << 8) | AHT10_RX_Data[5]; AHT10_Temperature = (float)(AHT10_ADC_Raw * 200.00 / 1048576.00) - 50.00; Delay(50);

Чтение без использования функции задержки

Сначала создаем дополнительные переменные:

uint8_t T_100ms = 255; uint8_t AHT10_Switcher = 255;

В обработчике прерывания от таймера будем присваивать значение глобальной переменной T_100ms = 255;

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if(htim->Instance == TIM4) { /* Set every 500ms */ T_100ms = 255; } }

В главном цикле:

if(T_100ms) { if(AHT10_Switcher) HAL_I2C_Master_Transmit_IT(&hi2c1, AHT10_ADRESS, &AHT10_TmpHum_Cmd, 1); else { HAL_I2C_Master_Receive_IT(&hi2c1, AHT10_ADRESS, (uint8_t*)AHT10_RX_Data, 6); if(~AHT10_RX_Data[0] & 0x80) { /* Convert to Temperature in °C */ AHT10_ADC_Raw = (((uint32_t)AHT10_RX_Data[3] & 15) << 16) | ((uint32_t)AHT10_RX_Data[4] << 8) | AHT10_RX_Data[5]; AHT10_Temperature = (float)(AHT10_ADC_Raw * 200.00 / 1048576.00) - 50.00; /* Convert to Relative Humidity in % */ AHT10_ADC_Raw = ((uint32_t)AHT10_RX_Data[1] << 12) | ((uint32_t)AHT10_RX_Data[2] << 4) | (AHT10_RX_Data[3] >> 4); AHT10_Humidity = (float)(AHT10_ADC_Raw*100.00/1048576.00); } } /* Invert */ AHT10_Switcher = ~AHT10_Switcher; /* Nullify */ T_100ms = 0; }

Код для преобразования взят отсюда: https://www.youtube.com/watch?v=FwvEymeN2Wk

Как происходит получение числа показано здесь:

Проверка

В итоге получаем нужные значение в окне просмотра.

Преобразование в относительную влажность закоментировано, т.к. походу из-за демонтажа защитного кожуха был сломан этот сенсор .

Логический анализатор

Разборка

Интересно взглянуть что внутри, ведь металлическая крышка снимается.

Видим первичный преобразователь для относительной влажности, тонкие соединительные проводки, а все остальное залито черной компаундом.

Здесь хорошо видно перфорированную структура верхней обкладки.

К сожалению, провода были случайно оторваны от сенсора, так что вскрывать не советую.

Скачать

aht10_datasheet_temperature_humidity_sensor_(EN).pdf Техническая документация на AHT10 (англ).
Немного обрезанная версия.

aht10_datasheet_temperature_humidity_sensor_(CN).pdf Техническая документация на AHT10 (кит).

https://github.com/Egoruch/AHT10-STM32-HAL
(ссылка на GitHub)

AHT10-STM32-HAL-master.zip
(прямая ссылка)
Рабочий проект STM32CubeMX + Keil.

Видеообзор

Итого

Вещь интересная, но со своими недостатками.

  • более громоздкий корпус
  • нет проверки целостности данных
  • больше время отклика
  • больше время измерения
  • меньше диапазон температур
  • запрашиваем все сразу

    *в сравнении с HTU21D

и преимуществами:

  • цена от 0.8$/шт.
  • два адреса

У этой компашки есть еще датчики, более нафаршированные, но их на али найдено не было.

В общем, единственное что его может спасти это проверка и сравнение точности, а также неизменяемость показаний (особенно влажности) через время использования в полевых условиях.

Также советую ознакомится (будет полезным!):

253
RSS
Нет комментариев. Ваш будет первым!
Загрузка...