Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



Исследование DHT11 и DHT22

Сообщений 1 страница 5 из 5

1

Исследование DHT11 и DHT22

Ссылки по теме -  1   2

Библиотека Bascom 2.0.7.8, написана пользователем форума "Пётр"  -  здесь

Исходник для компилятора Bascom, версий ниже 2.0.7.8

$map       ' Получаем карту распределения памяти компилятором Bascom
  $regfile = "m328pdef.dat"
  $crystal = 8000000
  $framesize = 32       ' Размер области используемой и необходимой для преобразований
  $hwstack = 16       ' Размер аппаратного стека
  $swstack = 40       ' Размер программного стека

  $baud = 4800 : Ucsr0a.1 = 1       ' Скорость трансляции Baud * 2 = 9600 бод

'  Ubrr0 = 12        ' 4800, данные на стр. 190 документации на МК (http://www.atmel.com/Images/Atmel-8271- … mplete.pdf)
'  Ucsr0a.1 = 1      ' Скорость трансляции Baud * 2 = 9600 бод

   Print "Usart 9600"

'-------------------  Конфигурация подключения LCD  ----------------------------
  Config Lcdpin = Pin , Rs = Portc.0 , E = Portc.1 , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5
  Config Lcd = 20 * 4
  Cursor Off Noblink
  Cls

  Deflcdchar 0 , 4 , 10 , 4 , 32 , 32 , 32 , 32 , 32       ' Знак градуса

  Locate 1 , 1
  Lcd " Tecї гaїАёєa DHT22 "       ' "Тест датчика DHT22"

'----------------  Конфигурация вывода МК для работы DHT22  --------------------

  Ddr_dht22 Alias Ddrb.4
  Pin_dht22 Alias Pinb.4
  Port_dht22 Alias Portb.4

  Dim Цикл_dht22 As Byte
  Dim Temp_dht22_byte As Byte
  Dim Флаг_ошибка_dht22 As Byte
  Dim Флаг_данные_dht22 As Byte
  Dim Контрольная_сумма_dht22 As Byte
  Dim Temp_контрольная_сумма_dht22 As Byte

  Dim Влажность_word As Word
  Dim Влажность_low_byte As Byte At Влажность_word Overlay
  Dim Влажность_high_byte As Byte At Влажность_word + 1 Overlay

  Dim Температура_integer As Integer
  Dim Температура_low_byte As Byte At Температура_integer Overlay
  Dim Температура_high_byte As Byte At Температура_integer + 1 Overlay

  Dim Влажность_str As String * 8
  Dim Температура_str As String * 8

'===============================================================================

  Главный_цикл:

'===============================================================================

     If Флаг_данные_dht22 <> 0 Then

         If Флаг_ошибка_dht22 = 0 Then

             Locate 3 , 1
             Lcd "B»a¶ЅocїД: " ; Влажность_str ; " %"       ' "Влажность: "

             Locate 4 , 1
             Lcd "Teјѕepaїypa: " ; Температура_str ; Chr(0) ; "C"       ' "Температура: "

             Print "Влажность " ; Влажность_str ; "%"
             Print "Температура " ; Температура_str ; "°C"
             Print
             Print

           Else

             Locate 3 , 1
             Lcd "OБёІєa АїeЅёЗ DHT22 " ; Флаг_ошибка_dht22       ' "Ошибка чтения DHT22"
             Locate 4 , 1
             Lcd "OБёІєa АїeЅёЗ DHT22 " ; Флаг_ошибка_dht22       ' "Ошибка чтения DHT22"

             Print "Ошибка чтения DHT22 " ; Флаг_ошибка_dht22
             Print
             Print

             Флаг_ошибка_dht22 = 0

         End If

         Флаг_данные_dht22 = 0
         Goto Главный_цикл
     End If

     Waitms 500

     Gosub Чтение_dht22

'===============================================================================
  Goto Главный_цикл
End
'===============================================================================

'===============================================================================
  Чтение_dht22:
'-------------------------------------------------------------------------------

    Ddr_dht22 = 1       ' Делаем вывод МК выходом
    Port_dht22 = 0       ' Прижимаем вывод МК к земле

    Waitms 20       ' Ждем не менее 18 ms

    Ddr_dht22 = 0       ' Делаем вывод МК входом

    Waitus 40       ' Ждем 40 мкс

    If Pin_dht22 = 1 Then       ' Если на нем по прежнему "1"
        Флаг_ошибка_dht22 = 1       ' Значит датчик не ответил
        Goto Выход_чтение_dht22       ' Выходим из подпрограммы
    End If

  'Если датчик ответил и прижал вывод МК к земле продолжаем работу
    Waitus 80       ' Ждем еще 80 мкс

    If Pin_dht22 = 0 Then       ' Если на линии по прежнему "0"
        Флаг_ошибка_dht22 = 2       ' Значит с датчиком что-то не так
        Goto Выход_чтение_dht22       ' Выходим из подпрограммы
    End If

  'Если все нормально и датчик ответил правильно, тогда продолжаем

    Gosub Ждём_0

    Gosub Прием_dht22

    Влажность_high_byte = Temp_dht22_byte

    Gosub Прием_dht22

    Влажность_low_byte = Temp_dht22_byte

    Gosub Прием_dht22

    Температура_high_byte = Temp_dht22_byte

    Gosub Прием_dht22

    Температура_low_byte = Temp_dht22_byte

    Gosub Прием_dht22

    Temp_контрольная_сумма_dht22 = Temp_dht22_byte

    Контрольная_сумма_dht22 = Влажность_high_byte + Влажность_low_byte
    Контрольная_сумма_dht22 = Контрольная_сумма_dht22 + Температура_high_byte
    Контрольная_сумма_dht22 = Контрольная_сумма_dht22 + Температура_low_byte

    If Контрольная_сумма_dht22 = Temp_контрольная_сумма_dht22 Then

        If Температура_high_byte.7 = 1 Then
            Температура_integer = 32767 - Температура_integer
        End If

        Влажность_str = Str(влажность_word)
        Влажность_str = Format(влажность_str , "   0.0")

        Температура_str = Str(температура_integer)
        Температура_str = Format(температура_str , " 0.0")

    End If       ' If Контрольная_сумма_dht22 = Temp_контрольная_сумма_dht22 And Temp_контрольная_сумма_dht22 <> 0 Then

   Выход_чтение_dht22:
     Флаг_данные_dht22 = 1
'-------------------------------------------------------------------------------
  Return
'===============================================================================
  Прием_dht22:
'================================
    Temp_dht22_byte = 0       ' Сбрасываем переменную
    For Цикл_dht22 = 7 To 0 Step -1
        Gosub Ждём_1
        Waitus 30       ' После появления "1" ждем 30 мкс
        If Pin_dht22 = 1 Then       ' Если на выводе МК "1"
            Temp_dht22_byte.цикл_dht22 = 1
            Gosub Ждём_0
          Else       ' Иначе, если появился "0"
            Temp_dht22_byte.цикл_dht22 = 0
        End If
    Next Цикл_dht22
  Return
'================================
  Ждём_0:
    If Pin_dht22 <> 0 Then
        Goto Ждём_0
    End If
  Return
'================================
  Ждём_1:
    If Pin_dht22 = 0 Then
        Goto Ждём_1
    End If
  Return
'===============================================================================

Модель для Протеуса, написана пользователем форума "Пётр" - здесь

Симуляция Протеус 7.10 + исходник Bascom 2.0.7.1 + русский HD44780  -  скачать

http://sf.uploads.ru/t/o7qec.jpg http://sf.uploads.ru/t/7cVgY.jpg

+2

2

Тестирование датчика DHT22

Симуляция + исходник + видео  -  скачать

+2

3

Все вопросы  -  здесь

0

4

Работа DHT11 + DHT22

Исходник + симуляция  -  скачать

http://s7.uploads.ru/t/PXban.jpg

+4

5

Nord написал(а):

Предлагаю дополнить "Исследования DHT11 b DHT22" следующей информацией, чтоб избежать в дальнейшем "граблей", подобным моим... ;)

Датчики Отличаются форматом передачи данных.

DHT11
Передает в формате BYTE+BYTE+BYTE+BYTE+BYTE.
Каждый байт имеет свое значение.

0000 0010 1001 0010 0000 0001 0000 1101 1010 0010
  Byte0  *  Byte1  *  Byte2  *  Byte3  *  Byte4
Byte0 - 8 бит целая часть влажности
Byte1 - 8 бит десятая часть влажности
Byte2 - 8 бит целая часть температуры
Byte3 - 8 бит десятая часть температуры
Byte4 - 8 бит контрольной суммы.

При этом дробные части всегда по нулям.

Подсчет контрольной суммы:
Byte4 = Byte0 + Byte1 + Byte2 + Byte3

DHT22
Передаёт в формате WORD+WORD+BYTE.
Т.е., к примеру влажность 65,8% передаёт как целое число 658.
Но контрольная сумма складывается по байтно.

0000 0010 1001 0010 0000 0001 0000 1101 1010 0010
  Byte0  *  Byte1  *  Byte2  *  Byte3  *  Byte4
Byte0 - 8 бит старший байт влажности
Byte1 - 8 бит младший байт влажности
Byte2 - 8 бит старший байт температуры
Byte3 - 8 бит младший байт температуры
Byte4 - 8 бит контрольной суммы.

Методика расчета:

Влажность:00000010 10010010 = 02 92 (Hex)= 2*256 + 9*16 + 2 = 658
=> Влажность = 65.8%RH

Температура:0000 0001 0000 1101 = 10 DH (Hex) = 1*256 + 0*16 + 13 = 269
=> Температура= 26.9С

Подсчет контрольной суммы:
Byte4 = Byte0 + Byte1 + Byte2 + Byte3

+3