2020年2月3日 星期一

DHT11的datasheet閱讀心得(?


雖然是一個很普通的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


沒有留言: