# 溫濕度感測器本範例使用DHT-11

首先將DHT-11的VCC接腳接至樹莓派的1腳,DATA接至7腳,GND接至6腳。 樹莓派接腳圖 DHT-11簡易介紹 DATA腳用於微處理器與DHT-11之間的通訊,一次通訊時間為4ms左右,數據分為小數與整數,一次完整的數據傳輸為40bits。 數據格式:8bits濕度整數數據+8bits濕度小數數據 +8bits溫度整數數據+8bits溫度小數數據 +8bits校驗和 數據傳輸正確時,8bits的校驗和等於8bits濕度整數數據+8bits濕度小數數據+8bits溫度整數數據+8bits溫度小數數據之和。 使用者發送一次開始信號之後,DHT-11從低功耗模式轉到高速模式,等待主機開始信號結束後,DHT-11發送響應信號,送出40bits的數據,當數據傳輸完之後,DHT-11會切回至低功耗模式直到再次接到開始訊號。 以下為使用python的範例程式

import RPi.GPIO as GPIO //載入GPIO函式庫
import time //載入TIME函式庫
while(1):
 channel =7 
 data = []
 j = 0
 GPIO.setmode(GPIO.BOARD)//使用電路板上定義的腳位
 time.sleep(1)
 GPIO.setup(channel, GPIO.OUT) //設定7腳為輸出
 GPIO.output(channel, GPIO.LOW) //發送開始訊號
 time.sleep(0.02)
 GPIO.output(channel, GPIO.HIGH)
 GPIO.setup(channel, GPIO.IN) //7腳設定為輸入
 while GPIO.input(channel) == GPIO.LOW:
   continue
 while GPIO.input(channel) == GPIO.HIGH:
   continue
 while j < 40: //擷取DHT-11傳送過來的資料
   k = 0
   while GPIO.input(channel) == GPIO.LOW:
     continue
   while GPIO.input(channel) == GPIO.HIGH:
     k += 1
     if k > 100:
       break
   if k < 8:
     data.append(0)
   else:
     data.append(1)
   j += 1
 print ("sensor is working.")
 print (data)
 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")
   print ("temperature :", temperature, "*C, humidity :", humidity, "% check :", check, ", tmp :", tmp)
   GPIO.cleanup()
 time.sleep(5)