Главная » Статьи » Как подключить |
Работа с датчиком влажности DHT11 в Bascom-AVR
Датчик DHT11 является самым дешевым цифровым датчиком, позволяющий измерять температуру и влажность окружающей среды. При цене меньше одного бакса от него нельзя многого ожидать, но для домашнего показометра он вполне сгодится.
Купить сей датчик можно здесь
Технические характеристики:
Предел измерения температур: 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, и выводит на дисплей целые части температуры и влажности. Схему подключения не привожу, так как думаю все ясно из кода выше. Результат: | |
Просмотров: 52989 | Комментарии: 67
| Теги: |
Всего комментариев: 67 | 1 2 3 » | ||||||||||||||||||||||||||
| |||||||||||||||||||||||||||
1-30 31-60 61-67 | |||||||||||||||||||||||||||
авторизация
рубрики
Проекты [46] |
Как подключить [32] |
Инструменты [3] |
Полезная информация [18] |
Объявления [3] |
метки