Подключение AHT10 к STM32 c HAL по I2C (датчик температуры и влажности)
Основные параметры
Разрешение температуры: 0.01 °C
Разрешение влажности: 0.024%
Приобрести на 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$/шт.
- два адреса
У этой компашки есть еще датчики, более нафаршированные, но их на али найдено не было.
В общем, единственное что его может спасти это проверка и сравнение точности, а также неизменяемость показаний (особенно влажности) через время использования в полевых условиях.
Также советую ознакомится (будет полезным!):
- Советы по проектированию печатных плат при использовании датчиков температуры поверхностного монтажа
- Простейший фильтр значений для получения качественных показаний





У Вас не правильная обработка данных по rh. Посмотрите библиотеки ардуино на гитхабе.