Лучшая простая библиотека для работы с датчиками DHT11/DHT22/AM2302/AM2301 для STM32 с использованием HAL.
- Поддержка датчиков DHT11/DHT22/AM2302/AM2301
- Автоматическая проверка контрольной суммы
- Не требуются таймеры и прерывания
- Возможность опроса нескольких датчиков
- Автоматический контроль частоты опроса 0.5 Гц для DHT11 и 1 Гц для DHT22
- Возможность включения внутреннего подтягивающего резистора (требуется для работы с датчиками без обвязки)
- Настройте проект в CubeMX. Настройте порт к которому подключен датчик на ввод. Сгенерируйте проект.
- Скопируйте
DHT.h
иDHT.c
в папки проектаInc
иSrc
соответственно. При необходимости подключите файлы в IDE. - Создайте переменную типа
DHT_sensor
, указав в нём порт, тип датчика, и, если у вас датчик без обвязки, включите подтяжку линии данных. - Для получения данных с датчика вызовите
DHT_getData()
указав в аругменте переменную датчика.
#include "DHT.h"
#include <stdio.h>
#include <string.h>
...
int main(void) {
...
//Создание объекта дачика DHT11, подключенного к PB4, подтяжка линии данных выключена
static DHT_sensor livingRoom = {GPIOB, GPIO_PIN_4, DHT11, GPIO_NOPULL};
...
while(1) {
//Буффер для печати текста
char msg[40];
//Получение данных с датчика
DHT_data d = DHT_getData(&livingRoom);
//Печать данных в буффер
sprintf(msg, "\fLiving room: Temp %d°C, Hum %d%%", (uint8_t)d.temp, (uint8_t)d.hum);
//Отправка текста в UART
HAL_UART_Transmit(&huart2, (uint8_t*)msg, strlen(msg), 0xFF);
}
}
#include "DHT.h"
#include <stdio.h>
#include <string.h>
...
int main(void) {
...
//Создание объекта дачика DHT22, подключенного к PC1, подтяжка линии данных включена
static DHT_sensor bedRoom = {GPIOC, GPIO_PIN_1, DHT22, GPIO_PULLUP};
...
while(1) {
//Буффер для печати текста
char msg[40];
//Получение данных с датчика
DHT_data d = DHT_getData(&bedRoom);
//Печать данных в буффер
sprintf(msg, "\fBed room: Temp %2.1f°C, Hum %2.1f%%", d.temp, d.hum);
//Отправка текста в UART
HAL_UART_Transmit(&huart2, (uint8_t*)msg, strlen(msg), 0xFF);
}
}
UPD: Люди подсказывают о необходимости флага -u _printf_float
в опциях линкера для печати чисел с плавающей точкой.
#include "DHT.h"
#include <stdio.h>
#include <string.h>
...
int main(void) {
...
DHT_sensor livingRoom = {GPIOB, GPIO_PIN_4, DHT11, GPIO_NOPULL};
DHT_sensor bedRoom = {GPIOC, GPIO_PIN_1, DHT22, GPIO_PULLUP};
...
while(1) {
//Буффер для печати текста
char msg[40];
//Получение данных с датчика DHT11
DHT_data d = DHT_getData(&livingRoom);
//Печать данных в буффер
sprintf(msg, "\fLiving room: Temp %d°C, Hum %d%%\r\n", (uint8_t)d.temp, (uint8_t)d.hum);
//Отправка текста в UART
HAL_UART_Transmit(&huart2, (uint8_t*)msg, strlen(msg), 0xFF);
//Получение данных с датчика DHT22
d = DHT_getData(&bedRoom);
//Печать данных в буффер
sprintf(msg, "Bed room: Temp %2.1f°C, Hum %2.1f%%", d.temp, d.hum);
//Отправка текста в UART
HAL_UART_Transmit(&huart2, (uint8_t*)msg, strlen(msg), 0xFF);
}
}
О: Проверьте подключение датчика - убедитесь в правильности и надёжности соединений, в наличии питания, а так же в верно указанном порте в коде. Так же проверьте обратную часть датчика - если пластик оплавлен, то датчик неисправен.
О: Дробная часть температуры имеется только у датчиков фирмы ASAIR.
О: Он скорее всего будет работать в однопроводном режиме как и DHT11.
О: Порты МК и DHT11/DHT22 рабатают в режиме открытого стока, поэтому линии данных требуется подтяжка к питанию. Если вы используете голый датчик без какой-либо обвязки, то включите внутренний подтягивающий резистор микроконтроллера, указав GPIO_PULLUP.
Предложения или найденные баги можно сообщить в Telegram http://t.me/quen0n или ВКонтакте https://vk.com/quenon