Приветствую Вас Гость | RSS

       КОНТРОЛЛЁРЫ
Четверг, 09.05.2024, 01:59
Главная » 2012 » Ноябрь » 30 » Борьба за влажность с DHT11
21:14
Борьба за влажность с DHT11
Достался по случаю датчик температуры и влажности. Привлекла простота считывания и доступность информации в инете. Да и цена не берет за горло.
 
 
С описанием датчика и протоколом можно ознакомиться по этой ссылке 
Скачал типичный код  на picbasic pro
DEFINE LOADER_USED  1  ' uses a bootloader
 DEFINE LCD_DREG PORTB ' Задать порт PIC-микроконтроллера для передачи данных на ЖКИ 
DEFINE LCD_DBIT 0 ' Задать  порт PORTB, который будет подключен к выводу DB4 ЖКИ 
DEFINE LCD_RSREG PORTD        '  сигнал RS на ЖКИ 
DEFINE LCD_RSBIT 5                '  сигнал RS на ЖКИ 
DEFINE LCD_EREG PORTD          ' сигнал E на ЖКИ 
DEFINE LCD_EBIT 7             '                 сигнал E на ЖКИ 
DEFINE LCD_BITS 4               '  Задать 4-битный режим обмена информацией для ЖКИ 
DEFINE LCD_LINES 2   'опред тип ЖКИ'
 define lcd_commandus 2000              'время задержки между командами на ЖКИ'
 define lcd_dataus 50
 pause 1000
TRISd.1 = 0 
symbol dht = portd.1
dlimp    var byte
tempcel  var byte
tempdrob var byte
vlagcel  var byte
vlagdrob var byte
summa    var word
     i   var byte
 podgotovka:
summa=0
dht = 1                        'port b на выход
pauseus 50
dht = 0                       'прижимаем к земле
pauseus 20                     'ждем не меньше 18
dht =1                         
pauseus 40                             
pulsin dht,0,dlimp              
If dlimp > 130 Then 
lcdout $fe,1,"NET dat4ika"
goto podgotovka
endif
dlimp=0
for i=7 to 0 step -1
pulsin dht ,1,dlimp
if dlimp > 70 then
tempcel = tempcel+1
endif
next i
for i=7 to 0 step -1
pulsin dht ,1,dlimp
if dlimp > 70 then
tempdrob = tempdrob+1
endif
next i
for i=7 to 0 step -1
pulsin dht ,1,dlimp
if dlimp > 70 then
vlagcel = vlagcel+1
endif
next i
for i=7 to 0 step -1
pulsin dht ,1,dlimp
if dlimp > 70 then
vlagdrob = vlagdrob+1
endif
next i
for i=7 to 0 step -1
pulsin dht ,1,dlimp
if dlimp > 70 then
tempcel = tempcel+1
endif
next i
lcdout $fe,1,  "T=", #tempcel,".", #tempdrob   '
lcdout $fe,$c0,"H=", #vlagcel,".",#vlagdrob
goto podgotovka
end
 
После долгих мучений код так и не заработал.
Датчик был подключен к pic с выводом на жки. Кварц на 4 мгц. На индикатор приходил какой-то мусор.  
Разбирательство привело к пониманию , что контроллер не поспевает за датчиком. Или датчик слишком торопиться.
Пришлось несколько модернизировать и вот что получилось :
 
DEFINE LCD_DREG PORTB 
DEFINE LCD_DBIT 0   ' вывод порта PORTB, который будет подключен к выводу DB4 ЖКИ 
DEFINE LCD_RSREG PORTD '  сигнал RS на ЖКИ 
DEFINE LCD_RSBIT 5 '  сигнал RS на ЖКИ 
DEFINE LCD_EREG PORTD '  сигнал E на ЖКИ 
DEFINE LCD_EBIT 7 '  сигнал E на ЖКИ 
DEFINE LCD_BITS 4 ' Задать 4-битный режим обмена информацией для ЖКИ 
DEFINE LCD_LINES 2   'опред тип ЖКИ'
 define lcd_commandus 2000   'время задержки между командами на ЖКИ'
 define lcd_dataus 50
 
 symbol dht = portd.1   'даем имя порту с датчиком 
dlimp1    var byte      ' переменная для первого импульса
dlimp     var byte[40]  ' массив для 40 остальных импулсов
vlagcel   var byte      'переменная для целой влажности- первые 8 импульсов
tempcel   var byte      'перем для целой температуры - следующ через 8
summa     var word      'перемен для суммы ( контрольная цифра)
     i    var byte     
                                ' для дробных не создаю даже переменных , там все нули 
       podgotovka:
pause 1000              ' устаканиваем
clear                   'обнуляем все наши перемнные!
TRISd.1 = 0             'задаем порт д.1 на выход
dht = 1   : pause 10    'даем на датчик 1 и ждем
dht = 0   : pause 25    'прижимаем к земле и ждем
dht =1                   'отпускаем и ждем
trisd.1 = 1 : pauseus 40   ' задаем порт на вход
pulsin dht,1,dlimp1      ' меряем самый первый сигнал,он должен быть не       
if dlimp1 <8 then        ' менее 8 - (при этой частоте 8*10 = 80мск),если нет , 
goto podgotovka          '  то возвращаемся к длине 1 импульса
endif
 
pulsin dht,1,dlimp[0]:pulsin dht,1,dlimp[1]:pulsin dht,1,dlimp[2]:pulsin dht,1,dlimp[3] 
pulsin dht,1,dlimp[4]:pulsin dht,1,dlimp[5]:pulsin dht,1,dlimp[6]:pulsin dht,1,dlimp[7]
 
pulsin dht,1,dlimp[8]:pulsin dht,1,dlimp[9]:pulsin dht,1,dlimp[10]:pulsin dht,1,dlimp[11]   
pulsin dht,1,dlimp[12]:pulsin dht,1,dlimp[13]:pulsin dht,1,dlimp[14]:pulsin dht,1,dlimp[15]    
 
pulsin dht,1,dlimp[16]:pulsin dht,1,dlimp[17]:pulsin dht,1,dlimp[18]:pulsin dht,1,dlimp[19]
pulsin dht,1,dlimp[20]:pulsin dht,1,dlimp[21]:pulsin dht,1,dlimp[22]:pulsin dht,1,dlimp[23] 
 
pulsin dht,1,dlimp[24]:pulsin dht,1,dlimp[25]:pulsin dht,1,dlimp[26]:pulsin dht,1,dlimp[27]  
pulsin dht,1,dlimp[28]:pulsin dht,1,dlimp[29]:pulsin dht,1,dlimp[30]:pulsin dht,1,dlimp[31]
 
pulsin dht,1,dlimp[32]:pulsin dht,1,dlimp[33]:pulsin dht,1,dlimp[34]:pulsin dht,1,dlimp[35]  
pulsin dht,1,dlimp[36]:pulsin dht,1,dlimp[37]:pulsin dht,1,dlimp[38]:pulsin dht,1,dlimp[39]
 
' считываеам последующие 40 импульсов и не тратя времени на обработку сразу записываем
' их в массив, потом в свободной обстановке, без спешки мы их тихонечко обработаем
' у этого датчика нет дробных частей влажности и температуры - всегда идут нули
'но считывать  их все равно надо ,что бы не нарушать порядок следования элементов массива
 
 for i= 0 to 7           ' всё, все размеры импульсов в массиве , датчик отдыхает,
if dlimp[7-i] > 5 then   ' а мы начинаем преобразовывать из длительности импульса
vlagcel =vlagcel+(1<<i)  ' нули и единицы
endif
next i
for i= 0 to 7            ' вынимаем по очереди все длины импульсов - здесь уже 
if dlimp[23-i] > 5 then  ' идут данные целой температуры,относим к 0 или 1
tempcel = tempcel+(1<<i) 'отделив единицы сносим-умножаем на разряд
endif
next i
 for i= 0 to 7              '
if dlimp[39-i] > 5 then     '
summa = summa+(1<<i)         '
endif
next i
if summa <> (vlagcel+tempcel) then ' делаем проверку - суммируем влажности и температуры
goto podgotovka                     '
endif
lcdout $fe,1,"Vlag=",#vlagcel
lcdout $fe,$c0,"Temp=",#tempcel
goto podgotovka
end
 
этот код работает и работает довольно стабильно, правда, длина значительно больше.
Возможно,если задать частоту 20 мГц можно применить короткий код, мне не пришлось это проверить.
 
Просмотров: 13953 | Добавил: Underground | Теги: Pic16F628A, программа PICbasic Pro, датчик влажности, DHT11, измерение влажности | Рейтинг: 0.0/0
Всего комментариев: 0