PCDVD數位科技討論區

PCDVD數位科技討論區 (https://www.pcdvd.com.tw/index.php)
-   七嘴八舌異言堂 (https://www.pcdvd.com.tw/forumdisplay.php?f=12)
-   -   請問python讀取DHT22的問題 (https://www.pcdvd.com.tw/showthread.php?t=1122751)

dbzwin 2017-02-19 12:06 AM

請問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)

darkangel 2017-02-19 12:14 AM

把 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)

dbzwin 2017-02-19 12:27 AM

引用:
作者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

darkangel 2017-02-19 12:31 AM

我沒樹莓派,這應該是那行 read 有時會讀到空值。
可以加個 time.sleep(1) 跟 try: except TypeError: 看看。

dbzwin 2017-02-19 01:10 PM

目前可以更新了,但是時間會因為偵測而延遲數秒更新
謝謝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 02:21 PM

我不是python 專家,
但是一般寫程式不會隨便用While true , 這會一直跑不停, 且會有很多問題(時間不準,耗電耗用cpu資源等等).
你要做的事是, 起一個timer , 隔一段時間刷一次畫面(呼叫一個沒有while true 的刷畫面function).



:think:


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

vBulletin Version 3.0.1
powered_by_vbulletin 2025。