2017-05-09 24 views
0

這裏python相當新,並試圖分離出多個讀數的time.sleep函數。爲不同的動作分離time.sleep

while True: 
#read from a analog sensor on input 1 
d= grovepi.analogRead(1) 
#read from an analog sensor on input 2 
a= grovepi.analogRead(2) 
#read from an digital sensor on input 3 
(t,h)=grovepi.dht(3,0) 


#output the data 
#print (datetime,time) 
print('Timestamp: {:%Y-%m-%d %H:%M:%S}'.format(datetime.datetime.now())) 
print ("Noise:",d,"dB") 
print ("Light:",a,"lux") 
print ("Temperature:",t,"C") 
print ("Humidity:",h,"rH") 
grovelcd.setText("T:" + str(t) + " H:" + str(h) + " N:" + str(d)+ " L:" + str(a)) 

time.sleep(5) 

我想讀的是打印在不同的頻率,但仍然同時運行。

例如

print ("Noise:",d,"dB") 
time.sleep(3) 

print ("Light:",a,"lux") 
time.sleep(5) 

我理解這可能是一個簡單的語法問題,但我還沒有找到一個簡單的解決方案。

非常感謝

+0

'd','a','t'和'h'從哪裏來? – FamousJameous

+0

而真: \t'從上輸入一個模擬傳感器#閱讀1 \t d = grovepi.analogRead(1)從一個模擬傳感器 \t#閱讀上輸入2 \t一個= grovepi.analogRead(2) \t#從數字傳感器讀取輸入3 \t(t,h)= grovepi.dht(3,0)' – HCI

+0

請修改您的問題以包含該代碼。您的問題正下方有一個「編輯」鏈接。 – FamousJameous

回答

1

下面是使用線程的部分解決方案:

import threading 
import time 
import grovepi 

def take_analog_measurement(stop, lock, name, pin, units, period): 
    while not stop.is_set(): 
     with lock: 
      val = grovepi.analogRead(pin) 
     print(name, ': ', val, units, sep='') 
     time.sleep(period) 

def take_dht_measurement(stop, lock, pin, mtype, period): 
    while not stop.is_set(): 
     with lock: 
      temp, hum = grovepi.dht(pin, mtype) 
     print('Temperature: ', temp, ' C\nHumidity: ', hum, ' rH', sep='') 
     time.sleep(period) 

stop = threading.Event() 
grovepilock = threading.Lock() 
threads = [] 
threads.append(threading.Thread(target=take_analog_measurement, args=(stop, grovepilock, 'Noise', 1, 'dB', 3))) 
threads.append(threading.Thread(target=take_analog_measurement, args=(stop, grovepilock, 'Light', 2, 'lux', 5))) 
threads.append(threading.Thread(target=take_dht_measurement, args=(stop, grovepilock, 3, 0, 7))) 
for thread in threads: 
    thread.start() 

for thread in threads: 
    try: 
     thread.join() 
    except KeyboardInterrupt: 
     stop.set() 
     thread.join() 

print('done') 

我沒有GrovePi所以我不能與硬件測試,但我已經做了一些模擬試題。

這將讀取給定頻率下的每個傳感器並輸出該值。該鎖用於保護grovepi,因爲我不確定它是否是線程安全的。該事件用於指示所有線程停止(儘管它們必須等到它們實際停止之前才醒來)。

我不知道如何處理grovelcd.setText當每個變量以不同的頻率變化時。一種可能的解決方案可能是使用與所有傳感器線程共享的字典(和鎖)的另一個線程。然後LCD將在一段時間內更新並使用字典中的數據。

+0

偉大的,似乎做我想要的感謝! – HCI