樹莓派溫度傳感器DHT11讀取數據

      網友投稿 876 2022-05-30

      樹莓派作為一個完整的主機,除了能在上面跑系統外,也提供了40個引腳提供電路開發的功能。本來我在工作中常接觸linux,但沒啥機會接觸硬件,正好手頭上有一臺raspberry 3b,本來是用來學linux相關的包的,閑的沒事,網上買了幾個傳感器玩玩。很短時間就能上手從dht11讀取數據了,雖然也看了好多文檔,GPIO學起來還是挺簡單的。

      第一次寫gpio程序, 我還是參考了別人的代碼,主題代碼基本一樣,這里我多解釋下我的代碼吧。 重要的是這里有幾個magic number,比如cnt 小于100和cnt > 12。

      首先我們可以在網上找下DHT11的相關文檔。你向傳感器發送一個復位信號(大于18us的低電位,然后高電位),然后傳感器會傳送40-50us的低電位,緊接著40-50us的高電位。在往后就是以12-14us間隔的40個數據位了。

      40個數據位編碼方式如下。

      byte4 byte3 byte2 byte1 byte0 01010101 00000000 10101010 00000000 01010101 -------- -------- -------- -------- -------- 整數 小數 整數 小數 校驗位 ------------------ ------------------ 濕度 溫度

      這里有個校驗位,是為了確保數據傳輸的準確性的。如果byte1+byte2+byte3+byte4 == byte0,數據傳輸就是正確的。不過DHT11小數位是不工作的,所以只需要考慮byte2+byte4就行了。

      26-28us的高電平為0,116-118us的高電平為1。我代碼里并沒有以時間間隔作為判斷,而是用了cnt 這個while循環計數器,因為我嘗試過用時間。測試得到一次while空循環帶計數器+1,基本上需要0.8us左右,但如果while循環里加上接口數據讀取,一次循環基本上就要6us左右了,果然外部IO的速度比較慢。

      這里我經過多次測試,發現計數器cnt>=12作為1的判斷準確率較高。這就是我magicnumber 12的由來。 還有另外一個magicnumber 100,這個數字主要是用來應對復位信號沒發送成功,程序陷入死循環的情況。我用的是樹莓派3B,不同版本的樹莓派性能不一樣,可能magicnumber也不一樣。

      我用的是BCM模式的4引腳,也就是板子上的7號引腳作數據傳輸,另外兩根引腳接地和3.3v電壓即可。

      下面就是代碼了

      樹莓派從溫度傳感器DHT11讀取數據

      #!/usr/bin/python import RPi.GPIO as GPIO import time pin = 4 data = [] GPIO.setmode(GPIO.BCM) time.sleep(2) GPIO.setup(pin, GPIO.OUT) GPIO.output(pin, GPIO.HIGH) GPIO.output(pin, GPIO.LOW) time.sleep(0.04) GPIO.output(pin, GPIO.HIGH) GPIO.setup(pin, GPIO.IN) while GPIO.input(pin) == GPIO.LOW: continue while GPIO.input(pin) == GPIO.HIGH: continue i = 0 while i < 40: cnt = 0 while GPIO.input(pin) == GPIO.LOW: continue while GPIO.input(pin) == GPIO.HIGH: cnt += 1 if cnt > 100: break if cnt < 12: data.append(0) else: data.append(1) i += 1 humidity_bit = data[0:8] humidity_point_bit = data[8:16] temperature_bit = data[16:24] temperature_point_bit = data[24:32] check_bit = data[32:40] humidity = 0 humidity_point = 0 temperature = 0 temperature_point = 0 check = 0 for i in range(8): humidity += humidity_bit[i] * 2 ** (7-i) humidity_point += humidity_point_bit[i] * 2 ** (7-i) temperature += temperature_bit[i] * 2 ** (7-i) temperature_point += temperature_point_bit[i] * 2 ** (7-i) check += check_bit[i] * 2 ** (7-i) tmp = humidity + humidity_point + temperature + temperature_point if check == tmp: print "temperature :", temperature, "*C, humidity:", humidity, "%" else: print "wrong" GPIO.cleanup()

      單片機 硬件開發

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:利器 | 接口自動化測試框架 RESTAssured 實踐(三):對 Response 結果導出
      下一篇:Python爬蟲入門教程 86-100 Python爬蟲框架在多來一個Ruia,解決問題的途徑再次增多。
      相關文章
      国产精品亚洲成在人线| 亚洲AV无码专区国产乱码不卡| 亚洲精品天堂在线观看| 亚洲AV成人一区二区三区AV| 亚洲AV成人无码久久WWW| 亚洲天堂2017无码中文| 亚洲国产精品综合久久网各| 久久久亚洲欧洲日产国码是AV | 亚洲日韩小电影在线观看| 亚洲精品亚洲人成在线观看下载| 亚洲aⅴ天堂av天堂无码麻豆| 亚洲成av人在线观看网站 | 亚洲伦理中文字幕| 亚洲首页国产精品丝袜| 亚洲欧洲日韩极速播放| 亚洲色最新高清av网站| 亚洲精品久久久久无码AV片软件| 亚洲熟妇AV一区二区三区浪潮 | 亚洲国产成人精品青青草原| 亚洲国产高清视频在线观看| 亚洲人成网站在线观看播放青青| 亚洲精品免费在线视频| 亚洲人成毛片线播放| 亚洲综合偷自成人网第页色| 亚洲另类自拍丝袜第1页| 亚洲国产午夜精品理论片| 亚洲人成7777影视在线观看| 亚洲午夜在线播放| 亚洲精品无码专区久久| 日本亚洲欧美色视频在线播放| 亚洲AV无码男人的天堂| 精品国产亚洲一区二区三区在线观看 | 无码乱人伦一区二区亚洲一| 亚洲一区精品中文字幕| 亚洲综合婷婷久久| 亚洲va成无码人在线观看| 亚洲xxxx视频| 日韩精品亚洲专区在线影视| 亚洲国产精品尤物YW在线观看| 亚洲精品白浆高清久久久久久| 亚洲一区爱区精品无码|