Датчик DHT11 предназначен для измерения температуры и влажности как на отрытой местности, так и в закрытых помещениях. Диапазон измерений температуры у него составляет от 0°C до 50°C с точностью 1°C. Также он способен измерять влажность в диапазоне от 20% до 90% с точностью 1°C.
В данной статье мы рассмотрим подключение датчика температуры и влажности DHT11 к плате STM32F103C8, известной также под названием STM32 Blue Pill ("синяя таблетка").
Ранее на нашем сайте мы рассматривали применение датчика DHT11 в следующих проектах:
- измерение температуры и влажности с помощью Arduino и датчика DHT11;
- мониторинг температуры и влажности через Интернет с помощью Arduino;
- метеостанция на Raspberry Pi;
- подключение датчика DHT11 к NodeMCU ESP8266;
- веб-сервер на модуле ESP32 для измерения температуры и влажности.
Необходимые компоненты
- Отладочная плата STM32F103C8 (STM32 Blue Pill) (купить на AliExpress).
- Датчик температуры и влажности DHT11 (купить на AliExpress).
- ЖК дисплей 16x2 с модулем I2C (купить на AliExpress).
- Макетная плата.
- Соединительные провода.
Датчик температуры и влажности DHT11
Датчик DHT11 предназначен для измерения температуры и влажности. Он содержит встроенный 8-битный микроконтроллер для обработки измеряемых значений температуры и влажности и передачи их на выход датчика при помощи протокола one-wire – это означает что датчик имеет только один выходной контакт для передачи данных. Датчик откалиброван на заводе и легко подключается к любым современным микроконтроллерам.
Технические характеристики датчика DHT11:
- рабочее напряжение: от 3.5V до 5.5V;
- рабочий ток: 0.3mA;
- ток в режиме ожидания: 60uA;
- диапазон измеряемых температур: от 0°C до 50°C;
- диапазон измеряемых значений влажности: 20% до 90%;
- разрешающая способность измерения температуры и влажности: 16 бит;
- точность: ±1°C и ±1%.
Наименование контакта | Назначение контакта |
Vcc | напряжение питания от 3.5V до 5.5V |
Data | контакт данных, через него осуществляется передача значений температуры и влажности |
Ground | общий провод (земля) |
DHT11 - один из самых простых по подключению к микроконтроллерам датчиков.
Схема проекта
Схема подключения датчика DHT11 к плате STM32F103C8 (Blue Pill) представлена на следующем рисунке.
ЖК дисплей в нашем проекте подключен к плате STM32F103C8 с помощью модуля I2C – это значительно сокращает количество контактов, используемых для подключения ЖК дисплея. Если у вас нет подобного модуля I2C, то вы можете подключить ЖК дисплей 16х2 к плате STM32F103C8 обычным способом, без использования данного модуля.
Схема соединений между модулем I2C и платой STM32F103C8 приведена в следующей таблице.
Модуль I2C | Плата STM32F103C8 |
VCC | 5V |
GND | GND |
SDA | PB7 |
SCL | PB6 |
Схема соединений между датчиком DHT11 и платой STM32F103C8 приведена в следующей таблице.
Датчик DHT11 | Плата STM32F103C8 |
VCC | 5V |
GND | GND |
Data | PA1 |
Внешний вид собранной конструкции проекта приведен на следующем рисунке.
Подготовка Arduino IDE для программирования платы STM32F103C8
Поскольку для подключения ЖК дисплея 16х2 к плате STM32F103C8 мы используем модуль I2C нам необходимо сначала определить I2C адрес данного модуля. В нашем проекте контакты SCL и SDA модуля I2C подключены к контактам PB6 и PB7 платы STM32F103C8.
Чтобы определить I2C адрес модуля нам необходимо просканировать доступные адреса. Для этого выполните следующую последовательность шагов:
1. Удостоверьтесь что в вашей Arduino IDE установлен пакет для работы с платой STM32. Как установить данный пакет можно прочитать в данной статье.
2. Во время установки данного пакета автоматически установится и библиотека wire.
3. Для сканирования доступных I2C адресов запустите в Arduino IDE пример, расположенный в пункте меню: Files->Examples->Wire->I2C scanner wire. Но перед этим измените тип платы в Arduino IDE, выбрав пункт меню Tools->Board->Generic STM32F103C8 Series.
4. После этого загрузите код примера в плату STM32F103C8 и откройте окно монитора последовательной связи (serial monitor).
Запишите определенный таким образом I2C адрес модуля – в нашем случае он равен 0x27.
Далее нам необходимо скачать библиотеку для подключения ЖК дисплея по интерфейсу I2C. Скачать ее можно по следующей ссылке. Далее ее можно подключить в Arduino IDE используя пункт меню sketch->import library.
Для считывания данных с датчика DHT11 мы будем использовать библиотеку для работы с данным датчиком. Скачать ее можно по следующей ссылке.
Объяснение программы для платы STM32
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
Первым делом в программе подключим используемые библиотеки: Wire.h для работы с интерфейсом I2C, LiquidCrystal_I2C.h для подключения ЖК дисплея 16х2 к плате STM32 по интерфейсу I2C и DHT.h для работы с датчиком DHT11.
1 2 3 |
#include <Wire.h> #include <LiquidCrystal_I2C.h> #include <DHT.h> |
Далее дадим осмысленное название контакту PA1 платы STM32, к которому подключен датчик DHT11.
1 |
#define DHTPIN PA1 |
Затем укажем тип датчика DHT – в нашем случае это DHT11.
1 |
#define DHTTYPE DHT11 |
Далее создадим объект для работы с ЖК дисплеем 16x2 с указанием его I2C адреса – 0x27.
1 |
LiquidCrystal_I2C lcd(0x27, 16, 2); |
Также создадим объект для работы с датчиком DHT11.
1 |
DHT dht(DHTPIN, DHTTYPE); |
Затем в функции void setup() инициализируем ЖК дисплей.
1 |
lcd.begin(); |
И запустим в работу датчик DHT11.
1 |
dht.begin(); |
Включим подсветку ЖК дисплея, напечатаем на его экране приветственное сообщение и очистим его экран после задержки в 3 секунды.
1 2 3 4 5 6 7 |
lcd.backlight(); lcd.setCursor(0,0); lcd.print("CIRCUIT DIGEST"); lcd.setCursor(0,1); lcd.print("DHT11 with STM32"); delay(3000); lcd.clear(); |
Затем в функции void loop() будем непрерывно считывать с датчика DHT11 значения температуры и влажности и сохранять их в соответствующих переменных.
1 2 |
float t = dht.readTemperature(); float h = dht.readHumidity(); |
И, наконец, выведем считанные значения температуры и влажности на экран ЖК дисплея 16х2.
1 2 3 4 5 6 7 8 |
lcd.setCursor(0,0); lcd.print("Temp: "); lcd.print(t); lcd.print(" C"); lcd.setCursor(0,1); lcd.print("Humid: "); lcd.print(h); lcd.print(" %"); |
Тестирование работы проекта
Когда аппаратная часть проекта будет готова загрузите код программы в плату STM32 – после этого вы должны увидеть как на экране ЖК дисплея отобразится приветственное сообщение.
Если на дисплее ничего не отображается, проверьте с помощью потенциометра на обратной стороне модуля I2C контрастность дисплея – не установлена ли она на минимум.
Протестировать работу датчика DHT11 можно с помощью кондиционера как показано на следующем рисунке.
Более подробно работу проекта вы можете посмотреть на видео, приведенном в конце статьи.
Исходный код программы (скетча)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
#include <Wire.h> // библиотека для работы с протоколом I2C #include <LiquidCrystal_I2C.h> // библиотека для работы с ЖК дисплеем с помощью модуля I2C #include <DHT.h> // библиотека для работы с датчиком DHT #define DHTPIN PA1 #define DHTTYPE DHT11 LiquidCrystal_I2C lcd(0x27, 16, 2); // создаем объект для работы с ЖК дисплеем с помощью модуля I2C DHT dht(DHTPIN, DHTTYPE); // создаем объект для работы с датчиком DHT void setup() { // initialize the LCD lcd.begin(); dht.begin(); //инициализируем работы датчика DHT11 lcd.backlight(); // включаем подсветку ЖК дисплея lcd.setCursor(0,0); lcd.print("CIRCUIT DIGEST"); lcd.setCursor(0,1); lcd.print("DHT11 with STM32"); delay(3000); lcd.clear(); } void loop() { float h = dht.readHumidity(); // считываем значение влажности float t = dht.readTemperature(); // считываем значение температуры lcd.setCursor(0,0); lcd.print("Temp: "); lcd.print(t); lcd.print(" C"); lcd.setCursor(0,1); lcd.print("Humid: "); lcd.print(h); lcd.print(" %"); } |