雖然是一個很普通的sensor(!?), 最近在看code跟datasheet的內容, 發現很多對不上的地方
在一開始的MCU傳送訊號時, 會先送出 >18ms 的signal, 然後再等待20~40 us, 接下來是讀取DHT回傳的bit
------------------------------------------------------------------
在Adafuit的範例裡:
https://github.com/adafruit/Adafruit_Python_DHT/blob/master/source/Raspberry_Pi_2/pi_2_dht_read.c
// Set pin high for ~500 milliseconds.
pi_2_mmio_set_high(pin);
sleep_milliseconds(500);
// Set pin low for ~20 milliseconds.
pi_2_mmio_set_low(pin);
busy_wait_milliseconds(20);
在另一個範例裡:
https://github.com/szazo/DHT11_Python/blob/master/dht11.py
# send initial high
self.__send_and_sleep(RPi.GPIO.HIGH, 0.05)
# pull down to low
self.__send_and_sleep(RPi.GPIO.LOW, 0.02)
------------------------------------------------------------------
這兩個的寫法, MCU分別傳 500ms(adafruit) 與 50ms(szazo)的訊號(high), 然後等待(low) 20 ms的時間.
只是看datasheet的說明, 應該傳送 20ms 就夠了
至於等待(low)的時間長度, 應該是要包含後面的DHT回傳資料的區間
假設回傳的都是1 (120us), 40 bit 就是 40 * 120 us
再加上DHT response (160us), 還有MCU wait time (20~40 us)
總共是 40*120 + 160 + 40 = 5000 us = 5ms
理論上, MCU送 20ms 的訊號(high), 然後再等待(low) 5 ms, 應該就可以了
實測之後會發現, 等待(low) 5 ms 會有問題, 10ms會比較穩定一點
所以code可以改成 傳送20ms的訊號(high), 然後等待10ms (low)
可是規格書有提到, 最多只能每秒測一次
所以時間寫大一點好像也沒差 XD
-----
為什麼blogger不能直接 ctrl+v 貼上圖片啊, 這樣好麻煩... zzz