User Tools

Site Tools


en:pfw:dht22

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
en:pfw:dht22 [2025-04-25 01:08] – [Source Code] mkaen:pfw:dht22 [2025-04-26 16:16] (current) – [Numerical representation of the measured values] mka
Line 37: Line 37:
 The microcontroller needs to carefully time these pulses to correctly interpret the data sent by the DHT22. Libraries for popular platforms like Arduino and Raspberry Pi handle these timing-critical operations. The microcontroller needs to carefully time these pulses to correctly interpret the data sent by the DHT22. Libraries for popular platforms like Arduino and Raspberry Pi handle these timing-critical operations.
  
-[[https://wiki.forth-ev.de/lib/exe/fetch.php/pfw:am2302-en-aosong.pdf|am2302-en-aosong.pdf]] This Aosong document has the correct data, although it is a creepy English translation.+[[https://wiki.forth-ev.de/lib/exe/fetch.php/pfw:am2302-en-aosong.pdf|am2302-en-aosong.pdf]] This Aosong document has the correct data, although it is a creepy English translation.  
 + 
 +On page 2, under 4, "The definition of single-bus interface," pin 2 of the sensor is called **SDA, Serial Data**. A table and a figure show the pin assignment of the AM2302.
  
 {{ :en:pfw:dht22-response.png?nolink |Screenshot of the 40-bit response on the SDA line. (PulsView Logic Analyser)}} {{ :en:pfw:dht22-response.png?nolink |Screenshot of the 40-bit response on the SDA line. (PulsView Logic Analyser)}}
Line 76: Line 78:
 </code> </code>
  
-==== Source Code ====+==== Numerical representation of the measured values ====
  
-[[en:pfw:dht22-msp430g2553-noforth|DHT22 with Launchpad MSP430G2553]]+=== Humidity ===
  
 +The first 16 bits coming from the DHT22 are the relative humidity in tenths of a percent. They can be processed directly with the 16-bit noForth and correspond to a positive integer. Rounded to whole digits for display purposes.
 +Here is an excerpt from the noforth source code:
  
 <code> <code>
-\ Read DHT22 (bitbang+.hum hum --   10 / . ." %rel" space  ;   
-\ TI MSP430G2553 Launchpad with noForth mv 2553 240101 +</code>
  
-(*  +=== Temperature ===
-To do: timeout +
  
-History +The next 16 bits are the temperature in tenths of a degree CelsiusTemperatures from zero degrees and higher can be processed directly using the 16-bit noForth; they correspond to a positive integer.
-V0065 - Temperature in tenths of a degree. mk 20250424 +
-V0064 - Loops named with ( A ) ... ( D ). Variants of loops B and D studied. This loop variation of B and D work well. Comments revised. mk 20250423 05:25 +
-V0063 - Cleaned up the code. Data output reduced to the essentials. mk 20250421 02:04 +
-V0062 Works well, output rounded to whole digits. mk 20250419 21:51 +
-Previous versions: Successive approximation to the solution.+
  
-Patch millisecond to 100 microseconds.  +Temperatures below zero degrees are represented by the DHT22 as follows: The MSB of the 16-bits is set, but otherwise the temperature is specified as a positive integer. This number format //does not correspond// to the two's complement of noForthHere, the MSB must first be evaluated to determine the sign. The sign is prepended for output. The measured value can then be further processed as a positive integer.  Whole degrees are displayed to the left of the decimal point, tenths to the right. The unit °C is specified. 
-Seeconfig2553.f +<code> 
-  00c7 10B2 rom!   +: .tmp ( tmp -- )   
-  hex 10B2 DMP +  dup hx 8000 and hx 8000 =  \ check MSB 
-After COLD this value is active.+      if [char] -  
 +      else [char] +  
 +      then emit 
 +  hx 7fff and ( tmp -- +tmp )    \ reset MSB 
 +  10 /mod 3 .r [char] . emit .    \ --> TTT.T 
 +  [char] f decemit  [char] C emit  \ print °C 
 +  space 
 +  ;   
 + </code>
  
-addr acronym registername +  * This is already included in the following source code.\\ 
-020  P1IN    Input +  * And here you can see how this was discovered: [[en:pfw:dht22tmpformat|The temperature format of the DHT22]]
-021  P1OUT   Output  +
-022  P1DIR   Direction +
-023  P1IFG   Interupt Flag +
-024  P1IES   Interrupt Edge Select +
-025  P1IE    Interrupt Enable +
-026  P1SEL   Port Select +
-041  P1SEL2  Port Select2 +
-027  P1REN   Resistor Enable  +
-*)+
  
  
-asm\    +==== Source Code - and what it was used for.====
  
-hex +[[en:pfw:dht22-msp430g2553-noforth|DHT22 with Launchpad MSP430G2553 and noForth]]
- +
-\ helper +
-code cls ( -- ) s0 # sp mov  next end-code  \ clear stack +
- +
-code p1H     #1 021 & .b bis   next end-code \ set lines +
-code p1L     #1 021 & .b bic   next end-code +
-code p6H   40 # 021 & .b bis   next end-code +
-code p6L   40 # 021 & .b bic   next end-code +
- +
- +
-\ Assign DHT22 data line to pin p1.0, controll pin to p1.6 +
-: Pio ( -- )  \ set I/O function +
-  41 027 *bic \ p1ren off +
-  41 025 *bic \ p1ie  disable interrupt +
-  41 026 *bic \ P1SEL I/0 +
-  41 041 *bic \ P1SEL2 I/0  +
-  41 022 *bis \ set out for P1.0, P1.6 +
-  ; +
- +
-: wakeup ( -- ) \ notify sensor to prepare the data +
-  pio p1H p6H 1 ms  p1L 10 ms  ( p6L ) p1H  ; \ 1 ms == 100┬Ás ! +
- +
-Code @data ( -- sun moon hum tmp chk chksum )  \ read sensor data +
- \ get response time  +
-  #1 022 & .b bic \ p1,0 IN +
-  #0 sun      mov    +
-  #1 024 & .b bis \ FALLING EDGE\__ +
-  #1 023 & .b bic  \ clear P1IFG  +
-40 # 021 & .b bic \ p6L\___  (for logic analyser) +
-  begin, ( A )       \ wait for edge  +
-    #1 023 & .b bit  \ test bit  +
-    \ Z: Set if result is zero, reset otherwise +
-    \ C: Set if result is not zero, reset otherwise (.NOT. Zero) +
-  cc? while,  +
-    #1 sun add +
-  repeat,    +
-40 # 021 & .b bis \ ___/p6H  (for logic analyser) +
-  tos sp -) mov    +
-  sun tos   mov   ( -- sun ) +
- \ get startpulse time +
-  #0 moon     mov    +
-  #1 024 & .b bic \ ___/ RISING EDGE +
-  #1 023 & .b bic  \ clear P1IFG  +
-40 # 021 & .b bic \ p6L\___  (for logic analyser) +
-  begin, ( B )       \ wait for edge +
-    #1 023 & .b bit  \ test bit  +
-   \ Z: Set if result is zero, reset otherwise +
-   \ C: Set if result is not zero, reset otherwise (.NOT. Zero) +
-   cc? while, +
-   #1 moon add +
-  repeat,    +
-40 # 021 & .b bis \ ___/p6H  (for logic analyser) +
-  tos sp -)  mov    +
-  moon tos   mov   ( -- moon ) +
- \ read 40 bits to array +
-  #0 xx mov  \ init array +
-  #0 yy mov +
-  #0 zz mov  +
-  dm 40 # day mov +
-  begin, ( C ) +
-    #1 023 & .b bic \ clear P1IFG  +
-    begin,           \ wait for edge +
-      #1 023 & .b bit \ test IFG +
-      \ Z: Set if result is zero, reset otherwise +
-      \ C: Set if result is not zero, reset otherwise (.NOT. Zero) +
-    cs? until, +
-    \ wait to read bit +
-    moon w mov  +
- w w add      2*moon, Loop D is about twice as fast as loop B. +
-40 # 021 & .b bic \ p6L\___  (for logic analyser)  +
-    begin, ( D ) +
-      #1 w sub   +
-    0=? until, +
- \ read bit +
-40 # 021 & .b bis  \ __/p6H  (for logic analyser) +
-    020 & w .b mov  \ read data line: bit H or L +
-    #1 w       bia   \ get bit +
-      \ tos sp -) mov   +
-      \ w tos     mov  ( ... -- ... bit ) \ test +
-      \ #1 sr bic  \ clear carry bit +
- \ shift left all bits +
-    zz zz add    +
-    yy yy addc +
-    xx xx addc +
-    w  zz bix   \ = xor : write data bit +
-  #1 day sub +
-  0=? until, \ 40 bits are read +
-  \ adjust bits +
-  8 # day mov  \ lshift 40 bits up 8x -> xx=hum yy=tmp  +
-  begin, +
-    zz zz add  +
-    yy yy addc +
-    xx xx addc +
-    #1 day sub +
-  0=? until, +
-  \ push data to stack +
-  tos sp -)  mov   xx tos mov  ( -- xx )  +
-  tos sp -)  mov   yy tos mov  ( -- yy )  +
-  zz swpb  \ get upper byte +
-  tos sp -)  mov   zz tos mov  ( -- zz.b )  +
-  \ calculate checksumme +
-  #0 w mov +
-  xx w .b add   xx swpb   xx w .b add +
-  yy w .b add   yy swpb   yy w .b add +
-  tos sp -)  mov   +
-  w tos   mov +
-next end-code +
- +
-\ display  +
-decimal +
-: (dht22) ( -- sun moon hum tmp chk chksum ) +
-  cls wakeup @data  +
-  ; +
- +
-: decemit ( c -- ) \ print c from DEC special character set  +
-  hx 1B emit  [char] ( emit  [char] 0 emit   emit  +
-  hx 1B emit  [char] ( emit  [char] B emit   \ back to normal output +
-  ; +
- +
-.tmp ( tmp -- )   +
-  10 /mod 3 .r [char] , emit . +
-  [char] f decemit  +
-  [char] C emit space +
-  ;  \ ja, geht. +
- +
-   +
-: .hum ( hum -- )  \ rounded to whole percent +
-  10 / . ." %rel" space  +
-  ;   +
-  +
-: dht22 -- ) \ print temperatur and humidity +
-  cr (dht22)   ( 2 + ) \ add 2 for 'else' part +
-  = if ." chk  " else ." chksum error" cls exit then +
-  .tmp space space  .hum space space +
-  \ ( sun moon -- ) drop drop  +
-    ( sun moon -- )  . .      \ testing +
-  ; +
- +
-(* +
-The DHT22 starts its next measurement AFTER the query and saves the values.  +
-These are output with the next query, so they are old.  +
-For up-to-date values, query twice.  +
-There must be more than 2 seconds between each query, otherwise the DHT22 will not respond again. +
-*) +
-     +
-: test ( n -- ) +
-  >r +
-  cr ." discard old values..." (dht22) cls  +
-  cr ." reading current data:" +
-  r> 0 do    +
-    dm 40000 ms  \ wait until the sensor is ready again. +
-    dht22   +
-  loop +
-  ; +
- +
-shield nn\ +
-freeze +
-( finis) +
-</code>+
  
 +This program was used to test DHT22 modules before installation. The DHT22 modules were tested for functionality at room temperature, pre-sorted in this way, and then frozen in a bag of moist sand in the freezer and tested again. One module displayed incorrect temperature values ​​in frost conditions, the display of negative values ​​did not comply with the specifications.
 ==== More information on the MSP430G2553 ==== ==== More information on the MSP430G2553 ====
  
   * [[https://www.ti.com/lit/ug/slau144j/slau144j.pdf|MSP430x2xx Family guide SLAU144J.PDF]]   * [[https://www.ti.com/lit/ug/slau144j/slau144j.pdf|MSP430x2xx Family guide SLAU144J.PDF]]
   * [[https://www.ti.com/lit/ds/symlink/msp430g2553.pdf|MSP430G2553 datasheet SLAS735J.PDF]], port data on page 49ff   * [[https://www.ti.com/lit/ds/symlink/msp430g2553.pdf|MSP430G2553 datasheet SLAS735J.PDF]], port data on page 49ff
 +
 +==== All about noForth ====
 +
 +[[https://home.hccnet.nl/anij/nof/noforth.html| noforth.html - find your version, docmentation,  tool.f and asm.f here.]]
  
 --- ---
Line 293: Line 136:
 To work with the embedded noForth system I use //e4thcom// by Manfred Mahlow. To work with the embedded noForth system I use //e4thcom// by Manfred Mahlow.
 https://wiki.forth-ev.de/doku.php/projects:e4thcom https://wiki.forth-ev.de/doku.php/projects:e4thcom
 +
 +Sometimes I also use Windows and Teraterm, for example, to log longer MCU outputs to a file. I also prefer it for testing parts of the source code using copy and paste.
  
 === Logic Analyser === === Logic Analyser ===
  
-AZDelivery Logic Analyzer 8 CH, 24MHz. (Amazon)+AZDelivery Logic Analyzer 8 CH, 24MHz. (Amazon)\\
 //PulseView// is a Qt-based logic analyzer and oscilloscope GUI for sigrok. //PulseView// is a Qt-based logic analyzer and oscilloscope GUI for sigrok.
  
 --- ---
  
en/pfw/dht22.1745536128.txt.gz · Last modified: 2025-04-25 01:08 by mka