Температура и влажность являются одними из наиболее часто измеряемых параметров окружающей среды. Для измерения температуры и влажности в настоящее время создано очень много различных электронных датчиков, однако наиболее подходящим из них является датчик DHT11 как обладающий достаточно большими диапазонами измерений и приемлемой точностью получаемых результатов. Выходной контакт у этого датчика всего лишь один, поэтому его достаточно просто подключить к современным микроконтроллерам и электронным платформам.
В данной статье мы рассмотрим подключение датчика DHT11 к плате Raspberry Pi. Измеренные значения температуры и влажности мы будем отображать на экране ЖК дисплея 16x2. Ранее на нашем сайте мы уже использовали датчик DHT11 для создания метеостанции на основе Raspberry Pi. Также мы его подключали и к плате Arduino. Дополнительно вы можете посмотреть все проекты на нашем сайте, в которых был использован датчик DHT11.
Краткий обзор датчика DHT11
Датчик DHT11 может измерять температуру и относительную влажность (RH) окружающего воздуха и обладает следующими техническими характеристиками:
- диапазон измерения температуры: 0-50°C;
- точность измерения температуры: ±2 °C;
- диапазон измерения влажности: 20-90% RH;
- точность измерения влажности: ±5 %.
Обратите внимание на то, что относительная влажность не совпадает с "реальной" влажностью. Относительная влажность измеряет содержание воды в воздухе относительно температуры воздуха.
Внешний вид датчика показан на следующем рисунке.
Датчик DHT11 может изготавливаться как в форме модуля, так и в форме датчика, в данном проекте мы будем использовать датчик DHT11 в форме модуля. Отличия между этими формами лишь в том, что модуль кроме непосредственно датчика содержит еще конденсатор и подтягивающий резистор, подключенный к выходному контакту датчика. Если вы используете DHT11 в виде датчика, то не забудьте добавить в схему упомянутые конденсатор и подтягивающий резистор.
Установка библиотеки Raspberry Pi для работы с ЖК дисплеем
В нашем проекте мы измеренные значения температуры и влажности будем отображать на экране ЖК дисплея 16х2. Соответствующая библиотека для Raspberry Pi от компании Adafruit позволит нам достаточно просто взаимодействовать с ЖК дисплеем в 4-битном режиме. Поэтому откройте в Raspberry Pi окно терминала и выполните следующую последовательность шагов для установки указанной библиотеки.
Шаг 1. Установите git на вашу Raspberry Pi с помощью следующей ниже приведенной команды. Git позволяет клонировать любые файлы с репозитория Github (нужная нам библиотека находится там) и использовать их потом в вашей плате.
1 |
apt-get install git |
Шаг 2. Клонируйте нужную нам библиотеку с GitHub с помощью инструмента git.
1 |
git clone git://github.com/adafruit/Adafruit_Python_CharLCD |
Шаг 3. Смените каталог на тот, в который вы клонировали библиотеку.
1 |
cd Adafruit_Python_CharLCD |
Шаг 4. Внутри этого каталога будет установочный файл библиотеки с названием setup.py – его необходимо запустить на выполнение чтобы установить библиотеку.
1 |
sudo python setup.py install |
Установка библиотеки Raspberry Pi для работы с датчиком DHT11
Датчик DHT11 работает по принципу одного провода. Измеренные им значения температуры и влажности передаются через его выходной контакт в последовательном виде. Структуру этих передаваемых данных можно посмотреть в даташите на датчик DHT11, однако для нас в этом нет необходимости поскольку мы будем использовать специальную библиотеку для работы с датчиком.
Библиотека DHT11 от компании Adafruit может быть использована для работы с датчиками DHT11, DHT22 и некоторыми другими датчиками температуры, работающими по одному проводу. Процедура для установки этой библиотеки аналогична той, которую мы использовали для установки библиотеки для работы с ЖК дисплеем. Отличие будет только в ссылке на GitHub для скачивания библиотеки, в этом случае необходимая команда будет выглядеть следующим образом:
1 |
git clone https://github.com/adafruit/Adafruit_Python_DHT.git |
После этого используйте следующую последовательность команд:
1 2 3 |
cd Adafruit_Python_DHT sudo apt-get install build-essential python-dev sudo python setup.py install |
Схема проекта
Схема подключения датчика температуры и влажности DHT11 к плате Raspberry Pi представлена на следующем рисунке.
Поскольку и ЖК дисплей, и датчик DHT11 запитываются от +5V, то для их питания мы используем соответствующий контакт 5V платы Raspberry Pi. К выходному контакту датчика DHT11 подключен подтягивающий резистор 1 кОм, если вы используете датчик в виде модуля, то вам этот резистор будет не нужен (он уже есть в составе модуля датчика).
Подстроечный резистор 10 кОм подключен к контакту Vee ЖК дисплея для регулировки уровня его контрастности. Подключение остальных контактов показано на приведенной схеме. Вы можете изменить используемые в схеме контакты, но помните о том, что тогда вам будет необходимо изменить и в программе.
Схема расположения контактов ввода/вывода платы Raspberry Pi показана на следующем рисунке:
Внешний вид собранной на макетной плате конструкции проекта показан на следующем рисунке.
Объяснение программы для Raspberry Pi
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
В программе нам необходимо считывать значения температуры и влажности с датчика DHT11 и отображать их на экране ЖК дисплея. Поскольку мы уже скачали и установили библиотеки для работы с датчиком DHT11 и ЖК дисплеем, то код нашей программы в этом случае значительно упрощается.
В программе нам первым делом необходимо подключить (импортировать) используемые нами библиотеки.
1 2 3 |
import time #import time for creating delay import Adafruit_CharLCD as LCD #Import LCD library import Adafruit_DHT #Import DHT Library for sensor |
Далее нам необходимо объявить используемые переменные и контакты. Переменная sensor_name у нас будет ассоциирована со значением Adafruit_DHT.DHT11 поскольку в нашем проекте мы используем датчик DHT11. К контакту GPIO 17 у нас подключен выход датчика DHT11.
1 2 |
sensor_name = Adafruit_DHT.DHT11 #we are using the DHT11 sensor sensor_pin = 17 #The sensor is connected to GPIO17 on Pi |
Аналогичным образом мы объявим контакты, к которым подключен ЖК дисплей. В нашем проекте мы подключили его в 4-битном режиме, поэтому мы используем 4 контакта для передачи данных дисплею и 2 контакта для управления его работой. Также, если вы хотите управлять фоновой подсветкой дисплея, для этого необходимо будет подключить дополнительные контакты дисплея.
1 2 3 4 5 6 7 |
lcd_rs = 7 #RS of LCD is connected to GPIO 7 on PI lcd_en = 8 #EN of LCD is connected to GPIO 8 on PI lcd_d4 = 25 #D4 of LCD is connected to GPIO 25 on PI lcd_d5 = 24 #D5 of LCD is connected to GPIO 24 on PI lcd_d6 = 23 #D6 of LCD is connected to GPIO 23 on PI lcd_d7 = 18 #D7 of LCD is connected to GPIO 18 on PI lcd_backlight = 0 #LED is not connected so we assign to 0 |
Также, если хотите, вы можете подключить ЖК дисплей к плате Raspberry Pi в 8-битном режиме, но тогда количество свободных контактов платы будет меньше.
Библиотека для работы с ЖК дисплеем от компании Adafruit, которую мы скачали и установили, может работать с любыми ЖК дисплеями, поэтому в нашем проекте для данной библиотеки необходимо указать количество строк и столбцов нашего ЖК дисплея.
1 2 |
lcd_columns = 16 #for 16*2 LCD lcd_rows = 2 #for 16*2 LCD |
После этого мы можем инициализировать ЖК дисплей с помощью следующей команды:
1 2 |
lcd = LCD.Adafruit_CharLCD(lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6, lcd_d7, lcd_columns, lcd_rows, lcd_backlight) #Send all the pin details to library |
Вначале работы программы мы покажем на экране ЖК дисплея (на второй строчке – для этого используется символ \n) небольшое приветственное сообщение и затем после задержки 2 секунды приступим к выполнению основной программы.
1 2 |
lcd.message('DHT11 with Pi \n -CircuitDigest') #Give a intro message time.sleep(2) #wait for 2 secs |
Бесконечный цикл в нашей программе мы будем формировать с помощью команды:
1 |
while 1: #Infinite Loop |
В этом цикле мы каждые 2 секунды будем считывать значения температуры и влажности с выхода датчика и отображать их на экране ЖК дисплея.
Для считывания значений температуры и влажности с датчика DHT11 мы будем использовать функцию humidity, temperature = Adafruit_DHT.read_retry(sensor_name, sensor_pin). Считанные значения мы будем отображать на экране ЖК дисплея с помощью следующего фрагмента кода:
1 2 3 4 5 |
lcd.clear() #Clear the LCD screen lcd.message ('Temp = %.1f C' % temperature) # Display the value of temperature lcd.message ('\nHum = %.1f %%' % humidity) #Display the value of Humidity time.sleep(2) #Wait for 2 sec then update the values |
Тестирование работы проекта
Запустите программу проекта (приведена в конце статьи) на выполнение. После этого на ЖК дисплее сначала должно отобразиться приветственное сообщение, а потом на нем должны начать отображаться значения температуры и влажности как показано на следующем рисунке.
Если на экране ЖК дисплея ничего не отображается, а программа не выдает никаких ошибок, проверьте соединения с ЖК дисплеем и отрегулируйте потенциометром его контрастность.
Исходный код программы на Python
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 |
import time # библиотека для использования задержек в программе import Adafruit_CharLCD as LCD # библиотека для работы с ЖК дисплеем import Adafruit_DHT #библиотека для работы с датчиком DHT11 sensor_name = Adafruit_DHT.DHT11 # мы используем датчик DHT11 sensor_pin = 17 # выход датчика подключен к контакту GPIO17 платы lcd_rs = 7 #RS of LCD is connected to GPIO 7 on PI lcd_en = 8 #EN of LCD is connected to GPIO 8 on PI lcd_d4 = 25 #D4 of LCD is connected to GPIO 25 on PI lcd_d5 = 24 #D5 of LCD is connected to GPIO 24 on PI lcd_d6 = 23 #D6 of LCD is connected to GPIO 23 on PI lcd_d7 = 18 #D7 of LCD is connected to GPIO 18 on PI lcd_backlight = 0 #LED is not connected so we assign to 0 lcd_columns = 16 #для ЖК дисплея 16*2 lcd_rows = 2 # для ЖК дисплея 16*2 lcd = LCD.Adafruit_CharLCD(lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6, lcd_d7, lcd_columns, lcd_rows, lcd_backlight) # инициализируем ЖК дисплей lcd.message('DHT11 with Pi \n -CircuitDigest') # показываем приветственное сообщение time.sleep(2) # ждем 2 секунды while 1: # бесконечный цикл humidity, temperature = Adafruit_DHT.read_retry(sensor_name, sensor_pin) # считываем значения температуры и влажности с датчика и сохраняем их в соответствующих переменных lcd.clear() # очищаем экран ЖК дисплея lcd.message ('Temp = %.1f C' % temperature) # отображаем значение температуры lcd.message ('\nHum = %.1f %%' % humidity) # отображаем значение влажности (на 2-й строчке дисплея) time.sleep(2) # ждем 2 секунды, после чего обновляем данные |