fl { Temperature/Humidity Sensor(DHT11) PropForth 5.5 2015/04/14 20:24:54 DHT11 Propeller Vcc[1] ----- 3.3V | 4.7kohm | Data[2] ----- P0 GND[4] ----- GND } h1F8 wconstant ctra h1F9 wconstant ctrb h1FA wconstant frqa h1FB wconstant frqb h1FC wconstant phsa h1FD wconstant phsb \ =========================================================================== \ Constants \ =========================================================================== 0 wconstant data data 1 swap lshift constant datam d10880 wconstant 136usec d12800 wconstant 160usec d14720 wconstant 184usec d3400 wconstant 42.5usec d4000 wconstant 50usec d4600 wconstant 57.5usec \ =========================================================================== \ Variables \ =========================================================================== \ Save phs* counter variable array d156 allot \ Data from DHT11 variable DHT11 1 allot \ =========================================================================== \ Main \ =========================================================================== \ Receive serial data from DHT11 \ ( -- t/f ) t:receive success f:receive error : SingleWire h20000000 data or ctra COG! \ POS detector h30000000 data or ctrb COG! \ NEG detector 1 frqa COG! 1 frqb COG! \ Send request signal to DHT11(Lo during 18msec) data pinout d18 delms data pinin \ Check reply pulse from DHT11(Lo=80us,Hi=80us) \ Measure sum for Lo & Hi because Forth word can't measure reply from DHT11(Lo & Hi) 0 datam waitpeq \ Wait for data to go Lo cnt COG@ 1 datam waitpeq \ Wait for data to go Hi 0 datam waitpeq \ Wait for data to go Lo cnt COG@ swap - dup 160usec > if 184usec < if 1 else 0 then else 136usec > if 1 else 0 then then if \ Judgement bit[1 or 0] for 40bits \ 1st bit 0 phsa COG! 1 datam waitpeq \ Wait for data to go Hi 0 datam waitpeq \ Wait for data to go Lo phsa COG@ array L! \ 2nd bit 0 phsa COG! 1 datam waitpeq \ Wait for data to go Hi 0 datam waitpeq \ Wait for data to go Lo phsa COG@ array 4+ L! \ 3rd bit 0 phsa COG! 1 datam waitpeq \ Wait for data to go Hi 0 datam waitpeq \ Wait for data to go Lo phsa COG@ array 8 + L! \ 4th bit 0 phsa COG! 1 datam waitpeq \ Wait for data to go Hi 0 datam waitpeq \ Wait for data to go Lo phsa COG@ array d12 + L! \ 5th bit 0 phsa COG! 1 datam waitpeq \ Wait for data to go Hi 0 datam waitpeq \ Wait for data to go Lo phsa COG@ array d16 + L! \ 6th bit 0 phsa COG! 1 datam waitpeq \ Wait for data to go Hi 0 datam waitpeq \ Wait for data to go Lo phsa COG@ array d20 + L! \ 7th bit 0 phsa COG! 1 datam waitpeq \ Wait for data to go Hi 0 datam waitpeq \ Wait for data to go Lo phsa COG@ array d24 + L! \ 8th bit 0 phsa COG! 1 datam waitpeq \ Wait for data to go Hi 0 datam waitpeq \ Wait for data to go Lo phsa COG@ array d28 + L! \ 9th bit 0 phsa COG! 1 datam waitpeq \ Wait for data to go Hi 0 datam waitpeq \ Wait for data to go Lo phsa COG@ array d32 + L! \ 10th bit 0 phsa COG! 1 datam waitpeq \ Wait for data to go Hi 0 datam waitpeq \ Wait for data to go Lo phsa COG@ array d36 + L! \ 11th bit 0 phsa COG! 1 datam waitpeq \ Wait for data to go Hi 0 datam waitpeq \ Wait for data to go Lo phsa COG@ array d40 + L! \ 12th bit 0 phsa COG! 1 datam waitpeq \ Wait for data to go Hi 0 datam waitpeq \ Wait for data to go Lo phsa COG@ array d44 + L! \ 13th bit 0 phsa COG! 1 datam waitpeq \ Wait for data to go Hi 0 datam waitpeq \ Wait for data to go Lo phsa COG@ array d48 + L! \ 14th bit 0 phsa COG! 1 datam waitpeq \ Wait for data to go Hi 0 datam waitpeq \ Wait for data to go Lo phsa COG@ array d52 + L! \ 15th bit 0 phsa COG! 1 datam waitpeq \ Wait for data to go Hi 0 datam waitpeq \ Wait for data to go Lo phsa COG@ array d56 + L! \ 16th bit 0 phsa COG! 1 datam waitpeq \ Wait for data to go Hi 0 datam waitpeq \ Wait for data to go Lo phsa COG@ array d60 + L! \ 17th bit 0 phsa COG! 1 datam waitpeq \ Wait for data to go Hi 0 datam waitpeq \ Wait for data to go Lo phsa COG@ array d64 + L! \ 18th bit 0 phsa COG! 1 datam waitpeq \ Wait for data to go Hi 0 datam waitpeq \ Wait for data to go Lo phsa COG@ array d68 + L! \ 19th bit 0 phsa COG! 1 datam waitpeq \ Wait for data to go Hi 0 datam waitpeq \ Wait for data to go Lo phsa COG@ array d72 + L! \ 20th bit 0 phsa COG! 1 datam waitpeq \ Wait for data to go Hi 0 datam waitpeq \ Wait for data to go Lo phsa COG@ array d76 + L! \ 21th bit 0 phsa COG! 1 datam waitpeq \ Wait for data to go Hi 0 datam waitpeq \ Wait for data to go Lo phsa COG@ array d80 + L! \ 22th bit 0 phsa COG! 1 datam waitpeq \ Wait for data to go Hi 0 datam waitpeq \ Wait for data to go Lo phsa COG@ array d84 + L! \ 23th bit 0 phsa COG! 1 datam waitpeq \ Wait for data to go Hi 0 datam waitpeq \ Wait for data to go Lo phsa COG@ array d88 + L! \ 24th bit 0 phsa COG! 1 datam waitpeq \ Wait for data to go Hi 0 datam waitpeq \ Wait for data to go Lo phsa COG@ array d92 + L! \ 25th bit 0 phsa COG! 1 datam waitpeq \ Wait for data to go Hi 0 datam waitpeq \ Wait for data to go Lo phsa COG@ array d96 + L! \ 26th bit 0 phsa COG! 1 datam waitpeq \ Wait for data to go Hi 0 datam waitpeq \ Wait for data to go Lo phsa COG@ array d100 + L! \ 27th bit 0 phsa COG! 1 datam waitpeq \ Wait for data to go Hi 0 datam waitpeq \ Wait for data to go Lo phsa COG@ array d104 + L! \ 28th bit 0 phsa COG! 1 datam waitpeq \ Wait for data to go Hi 0 datam waitpeq \ Wait for data to go Lo phsa COG@ array d108 + L! \ 29th bit 0 phsa COG! 1 datam waitpeq \ Wait for data to go Hi 0 datam waitpeq \ Wait for data to go Lo phsa COG@ array d112 + L! \ 30th bit 0 phsa COG! 1 datam waitpeq \ Wait for data to go Hi 0 datam waitpeq \ Wait for data to go Lo phsa COG@ array d116 + L! \ 31th bit 0 phsa COG! 1 datam waitpeq \ Wait for data to go Hi 0 datam waitpeq \ Wait for data to go Lo phsa COG@ array d120 + L! \ 32th bit 0 phsa COG! 1 datam waitpeq \ Wait for data to go Hi 0 datam waitpeq \ Wait for data to go Lo phsa COG@ array d124 + L! \ 33th bit 0 phsa COG! 1 datam waitpeq \ Wait for data to go Hi 0 datam waitpeq \ Wait for data to go Lo phsa COG@ array d128 + L! \ 34th bit 0 phsa COG! 1 datam waitpeq \ Wait for data to go Hi 0 datam waitpeq \ Wait for data to go Lo phsa COG@ array d132 + L! \ 35th bit 0 phsa COG! 1 datam waitpeq \ Wait for data to go Hi 0 datam waitpeq \ Wait for data to go Lo phsa COG@ array d136 + L! \ 36th bit 0 phsa COG! 1 datam waitpeq \ Wait for data to go Hi 0 datam waitpeq \ Wait for data to go Lo phsa COG@ array d140 + L! \ 37th bit 0 phsa COG! 1 datam waitpeq \ Wait for data to go Hi 0 datam waitpeq \ Wait for data to go Lo phsa COG@ array d144 + L! \ 38th bit 0 phsa COG! 1 datam waitpeq \ Wait for data to go Hi 0 datam waitpeq \ Wait for data to go Lo phsa COG@ array d148 + L! \ 39th bit 0 phsa COG! 1 datam waitpeq \ Wait for data to go Hi 0 datam waitpeq \ Wait for data to go Lo phsa COG@ array d152 + L! \ 40th bit 0 phsa COG! 1 datam waitpeq \ Wait for data to go Hi 0 phsb COG! 0 datam waitpeq \ Wait for data to go Lo phsa COG@ array d156 + L! \ Check End signal 1 datam waitpeq \ Wait for data to go Hi phsb COG@ dup 50usec > if 57.5usec < if 1 else 0 then else 42.5usec > if 1 else 0 then then else 0 then \ array d40 0 do dup i 4 * + L@ . cr loop drop { if array 5 0 do 0 8 0 do 1 lshift \ Judgment whether i or 0 over i 4* + L@ 50usec > if 1 or then loop \ Save byte data DHT11 i + C! \ Next array address[array+(4*8)] d32 + loop drop \ Display Humidity and Temperature DHT11 C@ DHT11 1+ C@ DHT11 2+ C@ DHT11 3 + C@ + + + DHT11 4 + C@ = if \ RH DHT11 C@ . h2E emit DHT11 1+ C@ . . \ Temperature DHT11 2+ C@ . h2E emit DHT11 3 + C@ . ." degree" else ." checksum error" then cr else ." Receive-error" then } \ OHT11 5 0 do dup i + C@ . cr loop drop ; \ Get Humidity and Temperature from getting phs* [array] \ ( -- ) : calc_DHT11 array 5 0 do 0 8 0 do 1 lshift \ Judgment whether i or 0 over i 4* + L@ 50usec > if 1 or then loop \ Save byte data DHT11 i + C! \ Next array address[array+(4*8)] d32 + loop drop ; \ test checksum \ ( -- t/f ) t:success f:fault : checksum DHT11 C@ DHT11 1+ C@ DHT11 2+ C@ DHT11 3 + C@ + + + DHT11 4 + C@ = ; \ Display Humidity and Temperature \ ( -- ) : disp_DHT11 SingleWire \ Check if received data are valid if calc_DHT11 \ Display Humidity and Temperature checksum if \ RH DHT11 C@ . h2E emit DHT11 1+ C@ . ." %" space \ Temperature DHT11 2+ C@ . h2E emit DHT11 3 + C@ . ." degree" else ." checksum error" then else ." Receive-error" then ; : test1 cnt COG@ SingleWire . cnt COG@ swap - . ; \ 1817520ticks 22.710msec : test2 begin disp_DHT11 cr d2000 delms fkey? swap drop until ;