PCDVD數位科技討論區
PCDVD數位科技討論區   註冊 常見問題 標記討論區為已讀

回到   PCDVD數位科技討論區 > 其他群組 > 七嘴八舌異言堂
帳戶
密碼
 

回應
 
主題工具
dbzwin
Amateur Member
 

加入日期: Feb 2004
文章: 38
請問python讀取DHT22的問題

最近用樹莓派裝上DHT22跟20*4的I2C顯示器
程式寫下面那樣,但是卻只有時間及日期有循環更新
問度跟濕度只會讀取第一次,怎麼會這樣

import RPi.GPIO as GPIO
import Adafruit_DHT
import I2C_LCD_driver
import time

mylcd = I2C_LCD_driver.lcd()
DHT_TYPE = Adafruit_DHT.DHT22
DHT_PIN = 4
humidity, temp = Adafruit_DHT.read(DHT_TYPE, DHT_PIN)

while True:
mylcd.lcd_display_string("Time: %s" %time.strftime("%H:%M:%S"), 1)
mylcd.lcd_display_string("Date: %s" %time.strftime("%m/%d/%Y"), 2)
mylcd.lcd_display_string("Humidity: %d %%" % humidity, 4)
mylcd.lcd_display_string("temperature: %d C" % temp, 3)
     
      
舊 2017-02-19, 12:06 AM #1
回應時引用此文章
dbzwin離線中  
darkangel
Major Member
 
darkangel的大頭照
 

加入日期: Aug 2001
文章: 211
把 read 那行移到 while 迴圈裡試試如下。

代碼:
import RPi.GPIO as GPIO
import Adafruit_DHT
import I2C_LCD_driver
import time

mylcd = I2C_LCD_driver.lcd()
DHT_TYPE = Adafruit_DHT.DHT22
DHT_PIN  = 4

while True:
    mylcd.lcd_display_string("Time: %s" %time.strftime("%H:%M:%S"), 1)
    mylcd.lcd_display_string("Date: %s" %time.strftime("%m/%d/%Y"), 2)
    humidity, temp = Adafruit_DHT.read(DHT_TYPE, DHT_PIN)
    mylcd.lcd_display_string("Humidity:    %d %%" % humidity, 4)
    mylcd.lcd_display_string("temperature: %d C" % temp, 3)
 
__________________
滿招損 謙受益
舊 2017-02-19, 12:14 AM #2
回應時引用此文章
darkangel離線中  
dbzwin
Amateur Member
 

加入日期: Feb 2004
文章: 38
引用:
作者darkangel
把 read 那行移到 while 迴圈裡試試如下。


import RPi.GPIO as GPIO
import Adafruit_DHT
import I2C_LCD_driver
import time

mylcd = I2C_LCD_driver.lcd()
DHT_TYPE = Adafruit_DHT.DHT22
DHT_PIN = 4

while True:
mylcd.lcd_display_string("Time: %s" %time.strftime("%H:%M:%S"), 1)
mylcd.lcd_display_string("Date: %s" %time.strftime("%m/%d/%Y"), 2)
humidity, temp = Adafruit_DHT.read(DHT_TYPE, DHT_PIN)
mylcd.lcd_display_string("Humidity: %d %%" % humidity, 4)
mylcd.lcd_display_string("temperature: %d C" % temp, 3)


會出現錯誤@@
Traceback (most recent call last):
File "data_time.py", line 14, in <module>
mylcd.lcd_display_string("Humidity: %d %%" % humidity, 4)
TypeError: %d format: a number is required, not NoneType
舊 2017-02-19, 12:27 AM #3
回應時引用此文章
dbzwin離線中  
darkangel
Major Member
 
darkangel的大頭照
 

加入日期: Aug 2001
文章: 211
我沒樹莓派,這應該是那行 read 有時會讀到空值。
可以加個 time.sleep(1) 跟 try: except TypeError: 看看。
__________________
滿招損 謙受益
舊 2017-02-19, 12:31 AM #4
回應時引用此文章
darkangel離線中  
dbzwin
Amateur Member
 

加入日期: Feb 2004
文章: 38
目前可以更新了,但是時間會因為偵測而延遲數秒更新
謝謝dark angel的幫忙

最後改好的程式碼如下
import RPi.GPIO as GPIO
import Adafruit_DHT
import I2C_LCD_driver

from time import *
import time
mylcd = I2C_LCD_driver.lcd()


while True:


humidity, temp = Adafruit_DHT.read_retry(22, 4)
mylcd.lcd_display_string("Time: %s" %time.strftime("%H:%M:%S"), 1)
mylcd.lcd_display_string("Date: %s" %time.strftime("%m/%d/%Y"), 2)

mylcd.lcd_display_string("temperature: %.2f C" % temp, 3)
mylcd.lcd_display_string("Humidity: %.2f %%" % humidity, 4)
舊 2017-02-19, 01:10 PM #5
回應時引用此文章
dbzwin離線中  
打工吧魔王大人
*停權中*
 
打工吧魔王大人的大頭照
 

加入日期: May 2014
您的住址: 某個不大不小的島
文章: 628
我不是python 專家,
但是一般寫程式不會隨便用While true , 這會一直跑不停, 且會有很多問題(時間不準,耗電耗用cpu資源等等).
你要做的事是, 起一個timer , 隔一段時間刷一次畫面(呼叫一個沒有while true 的刷畫面function).




此文章於 2017-02-19 02:22 PM 被 打工吧魔王大人 編輯.
舊 2017-02-19, 02:21 PM #6
回應時引用此文章
打工吧魔王大人離線中  


回應


POPIN
主題工具

發表文章規則
不可以發起新主題
不可以回應主題
不可以上傳附加檔案
不可以編輯您的文章

vB 代碼打開
[IMG]代碼打開
HTML代碼關閉



所有的時間均為GMT +8。 現在的時間是12:40 PM.


vBulletin Version 3.0.1
powered_by_vbulletin 2025。