watterott ;title =
Ergebnis 1 bis 5 von 5

Thema: DHT11 und DHT21

  1. #1
    Kabelträger
    Registriert seit
    07.11.2016
    Alter
    56
    Beiträge
    14

    DHT11 und DHT21

    Hi, habe den Code für den DHT11 bzw. DHT21 wiedergefunden.
    Stammt hier aus diesem Forum.
    Verfasser mir leider nicht bekannt. Sorry.
    Konnte Code bisher nicht testen.

    Code:
    $regfile = "m8def.dat"
    $crystal = 4000000
    $hwstack = 100
    $swstack = 40
    $framesize = 100
    
    Declare Function Get_dht11() As Byte
    
    Dim Dht_daten(5) As Byte                                    'Array für empfangene Daten
    Dim Luftfeuchtigkeit As Byte At Dht_daten(1) Overlay
    Dim Temperatur As Byte At Dht_daten(3) Overlay
    Dim Crc_ergebniss As Byte At Dht_daten(5) Overlay
    
    'Config DHT
    Dht_write Alias Portc.0                                     'Empfange Daten vom DHT-Sensor
    Dht_read Alias Pinc.0                                       'Schreibe Daten zum DHT-Sensor
    Dht_io Alias Ddrc.0                                         'Umschalten der Datenrichtung write/read
    
    '10ms Interrupt
    Config Timer0 = Timer , Prescale = 256
    Const Timerpreset = 100
    Dim Timer_tick As Word
    Dim Sec_tick As Bit
    Timer0 = Timerpreset
    On Timer0 Timer0_isr
    Enable Timer0
    
    ' ----- LCD-Display konfigurieren -----
    Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
    Config Lcd = 16 * 2
    Initlcd
    Cursor Off Noblink                                          ' Blinkenden Cursor abschalten
    Cls                                                         ' Bildschirm löschen
    
    Enable Interrupts
    Sec_tick = 0
    
    Set Dht_io                                                  'Daten senden
    Set Dht_write                                               'Ausgang high
    
    Do
    
       'Jede Sekunde eine Messung
       If Sec_tick = 1 Then
    
          Reset Sec_tick
    
          If Get_dht11() = 1 Then                               'Daten richtig empfangen
    
             Locate 1 , 1
             Lcd "Rh:" ; Luftfeuchtigkeit ; " % " ; " CRC:" ; Crc_ergebniss
             Locate 2 , 1
             Lcd "T :" ; Temperatur ; " C"
    
          Else                                                  'Fehlercod ausgeben
    
             Cls
             Locate 1 , 1
             Lcd Get_dht11()
    
          End If
    
       End If
    
    Loop
    
    End
    
    Function Get_dht11() As Byte
    
       Local Array_index As Byte                                'Index für Array
       Local Bit_position As Byte                               'Bit-Position im Byte
       Local Crc_check As Byte                                  'Berechnung CRC
    
       'Start Übertragung
       Set Dht_io                                               'Daten Senden
       Reset Dht_write                                          'Ausgang auf low
       Waitms 18                                                '18ms auf low
    
       Set Dht_write                                            'Ausgang auf high
       Waitus 30                                                'Ausgang muss 20-40µs high sein
       Reset Dht_io                                             'Daten Empfangen
       Waitus 40                                                'DHT sendet 80µs low => hier halbe Periode
       If Dht_read = 1 Then                                     'ist der Eingang nach 40µs immer noch high
          Get_dht11 = 2                                         'Fehlercode => 2
          Exit Function                                         'Function verlassen
       End If
    
       Waitus 80                                                'Eingang muss nach weiteren 80 µs wartzeit eigendlich high sein
       If Dht_read = 0 Then                                     'ist der Eingang low
          Get_dht11 = 3                                         'Fehlercode => 3
          Exit Function                                         'Function verlassen
       End If
    
       While Dht_read = 1 : Wend                                'warten bis Eingang auf low geht => Startsequenz beendet
    
       '40 Daten-Bit's empfangen und in Daten-Array schreiben
       'Byte 1 => Vorkomma Luftfeuchtigkeit
       'Byte 2 => Nachkomma Luftfeuchtigkeit
       'Byte 3 => Vorkomma Temperatur
       'Byte 4 => Nachkomma Temperatur
       'Byte 5 => CRC
       For Array_index = 1 To 5                                 '5 Byte => Dht_daten(5)
          For Bit_position = 7 To 0 Step -1                     '8 Bit => höheres Bit zu erst
             While Dht_read = 0 : Wend                          'warten bis der Eingang auf high geht => dauer 50µs
             '26-28us high => entspricht 0
             '70us high => entspricht 1
             Waitus 30                                          '30µs warten und schauen wie der Eingang ist
             If Dht_read = 1 Then                               'bei "1" ist der Eingang nach 30µs immer noch high
                Dht_daten(array_index).bit_position = 1         '"1" an Bitposition schreiben
                While Dht_read = 1 : Wend                       'warten bis Eingang wieder auf low geht
             Else                                               'bei "0" ist der Eingang nach 30µs low
                Dht_daten(array_index).bit_position = 0         '"0" an Bitposotion schreiben
             End If
          Next                                                  'ein Bit empfangen
       Next
    
       Set Dht_io                                               'Daten Senden
       Set Dht_write                                            'Ausgang high
    
       'Vergleich Summe der ersten 4 Bytes des Array, mit dem 5. Byte des Array
       Crc_check = Dht_daten(1) + Dht_daten(2)
       Crc_check = Crc_check + Dht_daten(3)
       Crc_check = Crc_check + Dht_daten(4)
       If Crc_check = Dht_daten(5) Then
          Get_dht11 = 1                                         'Alles in Ordnung
       Else
          Get_dht11 = 4                                         'Fehlercode => 4
       End If
    
    End Function
    
    Timer0_isr:
       Timer0 = Timerpreset
       Incr Timer_tick
       If Timer_tick = 100 Then
          Timer_tick = 0
          Set Sec_tick
       End If
    Return
    Gruß RoBue

  2. #2
    Moderator Avatar von Trexis5
    Registriert seit
    02.11.2016
    Ort
    Neu-Ulm
    Beiträge
    66
    Ich habe den schon getestet, Code geht.

  3. #3
    Kabelträger
    Registriert seit
    11.11.2016
    Beiträge
    1
    Moin,

    den hatte ich damals reingestellt. Der geht.

  4. #4
    Platinenputzer Avatar von Sk8erboi
    Registriert seit
    08.11.2016
    Ort
    Koblenz
    Alter
    29
    Beiträge
    32
    Ich habe eine Stunde für das Auslesen der Bits programmiert,
    einen weiteren Timer verbraucht und zum Schluss diesen schlanken Code hier genommen.
    Manchmal denkt man zu kompliziert.

    Funktioniert auch bei mir, danke fürs veröffentlichen.

  5. #5
    Moderator Avatar von Trexis5
    Registriert seit
    02.11.2016
    Ort
    Neu-Ulm
    Beiträge
    66
    So geht es mir auch oft.
    Gruß Holger
    link zu mir..

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •