en:pfw:dht22
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
en:pfw:dht22 [2025-04-25 01:08] – [Source Code] mka | en: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:// | + | [[https:// |
+ | |||
+ | On page 2, under 4, "The definition of single-bus interface," | ||
{{ : | {{ : | ||
Line 76: | Line 78: | ||
</ | </ | ||
- | ==== Source Code ==== | + | ==== Numerical representation of the measured values |
- | [[en: | + | === 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: | ||
< | < | ||
- | \ Read DHT22. (bitbang) | + | : .hum ( hum -- ) 10 / . ." %rel" space ; |
- | \ TI MSP430G2553 Launchpad with noForth mv 2553 240101 | + | </ |
- | (* | + | === Temperature === |
- | To do: timeout | + | |
- | History | + | The next 16 bits are the temperature |
- | V0065 - Temperature | + | |
- | 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 | + | |
- | Previous versions: Successive approximation to the solution. | + | |
- | Patch millisecond | + | 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// |
- | See: config2553.f | + | < |
- | | + | : .tmp ( tmp -- ) |
- | | + | |
- | After COLD this value is active. | + | if [char] - |
+ | else [char] + | ||
+ | then emit | ||
+ | | ||
+ | 10 /mod 3 .r [char] . emit . \ --> TTT.T | ||
+ | [char] f decemit | ||
+ | space | ||
+ | ; | ||
+ | </ | ||
- | addr acronym registername | + | |
- | 020 P1IN Input | + | * And here you can see how this was discovered: [[en: |
- | 021 P1OUT | + | |
- | 022 P1DIR | + | |
- | 023 P1IFG | + | |
- | 024 P1IES | + | |
- | 025 P1IE Interrupt Enable | + | |
- | 026 P1SEL Port Select | + | |
- | 041 P1SEL2 | + | |
- | 027 P1REN | + | |
- | *) | + | |
- | asm\ | + | ==== Source Code - and what it was used for.==== |
- | hex | + | [[en:pfw:dht22-msp430g2553-noforth|DHT22 with Launchpad MSP430G2553 |
- | + | ||
- | \ helper | + | |
- | code cls ( -- ) s0 # sp mov next end-code | + | |
- | + | ||
- | 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\___ | + | |
- | 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 \ ___/ | + | |
- | tos sp -) mov | + | |
- | sun tos | + | |
- | \ get startpulse time | + | |
- | #0 moon | + | |
- | #1 024 & .b bic \ ___/ RISING EDGE | + | |
- | #1 023 & .b bic \ clear P1IFG | + | |
- | 40 # 021 & .b bic \ p6L\___ | + | |
- | 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 \ ___/ | + | |
- | tos sp -) mov | + | |
- | moon tos | + | |
- | \ 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, | + | |
- | #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 | + | |
- | 40 # 021 & .b bic \ p6L\___ | + | |
- | begin, ( D ) | + | |
- | #1 w sub | + | |
- | 0=? until, | + | |
- | \ read bit | + | |
- | 40 # 021 & .b bis \ __/ | + | |
- | 020 & w .b mov \ read data line: bit H or L | + | |
- | #1 w | + | |
- | \ tos sp -) mov | + | |
- | \ w tos | + | |
- | \ #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 | + | |
- | 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) | + | |
- | = 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..." | + | |
- | cr ." reading current data:" | + | |
- | r> 0 do | + | |
- | dm 40000 ms \ wait until the sensor is ready again. | + | |
- | dht22 | + | |
- | loop | + | |
- | ; | + | |
- | + | ||
- | shield nn\ | + | |
- | freeze | + | |
- | ( finis) | + | |
- | </ | + | |
+ | This program was used to test DHT22 modules before installation. The DHT22 modules were tested for functionality at room temperature, | ||
==== More information on the MSP430G2553 ==== | ==== More information on the MSP430G2553 ==== | ||
* [[https:// | * [[https:// | ||
* [[https:// | * [[https:// | ||
+ | |||
+ | ==== All about noForth ==== | ||
+ | |||
+ | [[https:// | ||
--- | --- | ||
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:// | https:// | ||
+ | |||
+ | 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)\\ |
// | // | ||
--- | --- | ||
en/pfw/dht22.1745536128.txt.gz · Last modified: 2025-04-25 01:08 by mka