import wiringpi2 as gpio owpin=8 #第8腳為1-wire腳 def getval(owpin): tl=[] #存放每個數據位的時間 tb=[] #存放數據位 gpio.wiringPiSetup() #初始化wiringpi庫 gpio.pinMode(owpin,1) #設置針腳為輸出狀態 gpio.digitalWrite(owpin,1) #輸出高電平 gpio.delay(1) gpio.digitalWrite(owpin,0) #拉低20ms開始指令 gpio.delay(25) gpio.digitalWrite(owpin,1) #抬高20-40us gpio.delayMicroseconds(20) gpio.pinMode(owpin,0) #設針腳為輸入狀態 while(gpio.digitalRead(owpin)==1): pass #等待DHT11拉低管腳 for i in range(45): #測試每個數據周期的時間(包括40bit數據加一個發送開始標志 tc=gpio.micros() #記下當前us數(從初始化開始算起,必要時重新初始化) ''' 一個數據周期,包括一個低電平,一個高電平,從DHT11第一次拉低信號線開始 到DHT11發送最后一個50us的低電平結束(然后被拉高,一直維持高電平,所以 最后的完成標志是一直為高,超過500ms) ''' while(gpio.digitalRead(owpin)==0):pass while(gpio.digitalRead(owpin)==1): if gpio.micros()-tc>500: #如果超過500ms就結束了 break if gpio.micros()-tc>500: #跳出整個循環 break tl.append(gpio.micros()-tc) #記錄每個周期時間的us數,存到tl這個列表 # print(tl) #反注釋后可打印時間列表 tl=tl[1:] #去掉第一項,剩下40個數據位 for i in tl: if i>100: #若數據位為1,時間為50us低電平+70us高電平=120us tb.append(1) else: tb.append(0) #若數據位為0,時間為50us低電平+25us高電平=75us #這里取大於100us就為1 # print(tb) #反注釋可查看每一位狀態 return tb def GetResult(owpin): for i in range(10): SH=0;SL=0;TH=0;TL=0;C=0 result=getval(owpin) # print(len(result)) if len(result)==40: for i in range(8): #計算每一位的狀態,每個字8位,以此為濕度整數,濕度小數,溫度整數,溫度小數,校驗和 SH*=2;SH+=result[i] SL*=2;SL+=result[i+8] TH*=2;TH+=result[i+16] TL*=2;TL+=result[i+24] C*=2;C+=result[i+32] if ((SH+SL+TH+TL)%256)==C and C!=0: break else: print("Read Sucess,But checksum error! retrying") else: print("Read failer! Retrying") gpio.delay(200) return SH,SL,TH,TL SH,SL,TH,TL=GetResult(owpin) print("濕度:",SH,SL,"溫度:",TH,TL)