Работа с датчиком влажности DHT11 в Bascom-AVR

  Датчик 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, и выводит на дисплей целые части температуры и влажности. Схему подключения не привожу, так как думаю все ясно из кода выше. Результат:

Документация на DHT11

Взято с:

avrproject.ru

Категория: AVR

Написать коментарий

*
= 4 + 4

Добавить изображение

Последние статьи