Датчик DHT11 является самым дешевым цифровым датчиком, позволяющий измерять температуру и влажность окружающей среды. При цене в 2$ конечно от него нельзя многого ожидать, но для домашнего показометра он вполне сгодится.
Технические характеристики:
Предел измерения температур: 0-50°С (±2°С)
Предел измерения влажности: 20-80% ( ±5%)
Напряжение питания: 3-5,5V
Энергопотребление:
Измерение: 0,5-2,5мА
Передача данных: 0,2-1мА
Ожидание: 0,1-0,15 мА
Опрос датчика с частотой не чаще 1 раз в секунду
Для связи с контроллером используется однопроводная шина с открытым коллектором, поэтому обязательна подтяжка резистором 5-10кОм к плюсу питания.
Ниже приведены временные диаграммы занятости шины. Для инициирования измерений, контроллер должен подать стартовый сигнал – прижать шину к земле на 18-20 мс. после чего отпустить линию и следить за уровнем на ней. Датчик, обнаружив сигнал и подождав пока уровень снова станет высоким, сам прижимает шину к земле. Он будет держать низкий уровень все время пока идет измерение и преобразование результатов. Как только преобразования закончились, датчик отпускает линию, тем самым сообщая о готовности к передаче данных. Контроллер, в свою очередь, зафиксировав этот сигнал, начинает принимать данные.
кликабельно
Перед отправкой каждого бита датчик прижимает шину к земле на 50 мкс . Передающиеся по шине единицы и нули отличаются друг от друга длительностью высокого уровня, который держится на линии после начала передачи.
Передача бита «0»
Передача бита «1»
Данные от датчика передаются в виде посылки, состоящих из 40 бит идущих в таком порядке:
8 бит целая часть влажности + 8 бит десятая часть влажности + 8 бит целая часть температуры + 8 бит десятая часть температуры + 8 бит контрольной суммы.
Программа для работы с датчиком DHT11 в Bascom-AVR приведена ниже:
$regfile = “m8def.dat”
$crystal = 16000000
‘конфигурация подключения дисплея к портам МК
Config Lcd = 16 * 2
Config Lcdpin = Pin,Rs=Portc.5,E=Portc.4,Db4=Portc.3,Db5=Portc.2,Db6=Portc.1,Db7=Portc.0
Cursor Off
Cls
‘объявление подпрограммы
Declare Sub Get_th(t As Byte , H As Byte)
Config Serialin = Buffered , Size = 128
Config Serialout = Buffered , Size = 128
‘подключение датчика к PortD.6
Dht_put Alias Portd.6
Dht_get Alias Pind.6
Dht_io_set Alias Ddrd.6
Dim T As Byte ‘перееменная для хранения температуры
Dim H As Byte ‘переменная для хранения влажности
Dim Crc As Byte ‘переменная для хранения байта четности
Dim Mybyte As Byte
Dim Sensor_data As String * 40 ‘сюда будут записываться данные отсылаемые датчиком
Dim Tmp_str8 As String * 8
Dim Count As Byte ‘переменная для подсчета принятых бит
Enable Interrupts
Set Dht_io_set
Set Dht_put
Lcd “AVRproject.ru”
Lowerline
Lcd “DHT11 sensor”
Do
Waitms 1500
Call Get_th(t , H)
Cls
Lcd “TMP: ” ; T ; “C”
Lowerline
Lcd “PHP: ” ; H ; “%”
Loop
Sub Get_th(t As Byte , H As Byte)
Count = 0
Sensor_data = “”
Set Dht_io_set ‘делаем PD.6 выходом
Reset Dht_put ‘прижимаем шину к земле
Waitms 25 ‘ждем не менее 18мс
Set Dht_put ‘отпускаем шину
Waitus 40
Reset Dht_io_set ‘делаем PD.6 входом
Waitus 40 ‘ждем 40 мкс
If Dht_get = 1 Then ‘если на нем по прежнему 1
H = 1 ‘значит датчик не ответил
Exit Sub ‘выходим из подпрограммы
End If
‘если датчик ответил и прижал шину к земле продолжаем работу
Waitus 80 ‘ждем еще 80 мкс
If Dht_get = 0 Then ‘если на линии по прежнему 0
H = 2 ‘значит датчик сошел с ума
Exit Sub ‘выходим из подпрограммы
End If
‘если все нормально и датчик ответил правильно, тогда продолжаем
While Dht_get = 1 : Wend ‘ждем пока на шине появится 1
Do ‘начинаем принимать 40 бит данных
While Dht_get = 0 : Wend ‘ждем появления на шине 0
Waitus 30 ‘после появления 0 ждем 30мкс
If Dht_get = 1 Then ‘если на шине 1
Sensor_data = Sensor_data + “1” ‘записываем в переменную эту единицу
While Dht_get = 1 : Wend ‘и ждем пока датчик отправит следующий бит
Else ‘иначе, если там был 0
Sensor_data = Sensor_data + “0” ‘записываем этот 0 в переменную
End If
Incr Count ‘увеличиваем счетчик на 1
Loop Until Count = 40 ‘повторяем пока счетчик не досчитает до 40
Set Dht_io_set
Set Dht_put
‘начинаем раскладывать полученные данные
Tmp_str8 = Left(sensor_data , 8) ‘берем левые 8 символов переменной
H = Binval(tmp_str8) ‘это целая часть влажности
Tmp_str8 = Mid(sensor_data , 17 , 8) ‘вытаскиваем 8 символов из середины
T = Binval(tmp_str8) ‘это целая часть температуры
Tmp_str8 = Right(sensor_data , 8) ‘правые 8 символов
Crc = Binval(tmp_str8) ‘проверочные данные
‘проверка контрольной суммы
Mybyte = T + H ‘складываем значение температуры и влажности
If Mybyte <> Crc Then ‘если контрольная сумма не сошлась
H = 3 ‘значит полученные данные не верны
End If
End Sub ‘возвращаемся в главный цикл программы
Датчик подключен к микроконтроллеру к выводу PortD.6, и выводит на дисплей целые части температуры и влажности. Схему подключения не привожу, так как думаю все ясно из кода выше. Результат:
Взято с: