Skip to content

Latest commit

 

History

History
110 lines (106 loc) · 6.93 KB

README.md

File metadata and controls

110 lines (106 loc) · 6.93 KB

DHT

Лучшая простая библиотека для работы с датчиками DHT11/DHT22/AM2302/AM2301 для STM32 с использованием HAL.

Возможности

  • Поддержка датчиков DHT11/DHT22/AM2302/AM2301
  • Автоматическая проверка контрольной суммы
  • Не требуются таймеры и прерывания
  • Возможность опроса нескольких датчиков
  • Автоматический контроль частоты опроса 0.5 Гц для DHT11 и 1 Гц для DHT22
  • Возможность включения внутреннего подтягивающего резистора (требуется для работы с датчиками без обвязки)

Использование

  1. Настройте проект в CubeMX. Настройте порт к которому подключен датчик на ввод. Сгенерируйте проект.
  2. Скопируйте DHT.h и DHT.c в папки проекта Inc и Src соответственно. При необходимости подключите файлы в IDE.
  3. Создайте переменную типа DHT_sensor, указав в нём порт, тип датчика, и, если у вас датчик без обвязки, включите подтяжку линии данных.
  4. Для получения данных с датчика вызовите DHT_getData() указав в аругменте переменную датчика.

Примеры кода

Вывод данных датчика DHT11 в UART без дробной части

#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);
  }
}

DHT11

Вывод данных датчика DHT22 в UART с программной подтяжкой линии данных

#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);
  }
}

DHT22

UPD: Люди подсказывают о необходимости флага -u _printf_float в опциях линкера для печати чисел с плавающей точкой.

Вывод данных датчиков DHT11 и DHT22 в UART

#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);
  }
}

DHT22

FAQ

В: Не могу получить данные с датчика, всегда получается -128, что делать?

О: Проверьте подключение датчика - убедитесь в правильности и надёжности соединений, в наличии питания, а так же в верно указанном порте в коде. Так же проверьте обратную часть датчика - если пластик оплавлен, то датчик неисправен.

В: Почему у моего DHT11 нет дробной части температуры?

О: Дробная часть температуры имеется только у датчиков фирмы ASAIR.

DHT11

В: Что насчёт DHT12?

О: Он скорее всего будет работать в однопроводном режиме как и DHT11.

В: Для чего и когда нужно включать подтяжку линии данных?

О: Порты МК и DHT11/DHT22 рабатают в режиме открытого стока, поэтому линии данных требуется подтяжка к питанию. Если вы используете голый датчик без какой-либо обвязки, то включите внутренний подтягивающий резистор микроконтроллера, указав GPIO_PULLUP.

Обратная связь, нужна помощь?

Предложения или найденные баги можно сообщить в Telegram http://t.me/quen0n или ВКонтакте https://vk.com/quenon