2013-04-17 72 views
2

這是我在Python中的第一篇文章和第一個項目。我試圖通過控制一些條件硬件傳感器:我該如何連續檢查一段時間內的小時?

  1. 如果傳感器感知移動,發送電子郵件和睡眠
  2. elif的時間範圍爲不工作小時,然後睡覺,直到上午9點
  3. 其他睡眠半秒,等待傳感器

到目前爲止,第一條件和最後一個條件的工作。也就是說,如果沒有移動,重複睡眠(0.5)直到傳感器激活。

Issue:我在中間部分遇到問題,時間不在9-5之間。如果我在9或5之前運行代碼,它會一直睡到9am達到預期的程度,但是如果代碼已經在9-5之間運行(等待移動),則中間狀態不會觸發。它陷入了睡眠(0.5)。

我不是那麼有經驗,但我有一個模糊的想法,第二個過程應該有助於追蹤時間。有什麼建議麼?這是代碼。

def pir_init(): 
    while True: 
     m = datetime.datetime.now().time().minute #loop through for current time 
     h = datetime.datetime.now().time().hour  
     if h < 9:           
      print("Sleeping...") 
      time_sleep = (9 - h) * 3600 
      time.sleep(time_sleep) 
     elif h > 16: 
      print("Sleeping...") 
      time_sleep = ((24 - h) + 9) * 3600 
      time.sleep(time_sleep) 
     elif io.input(pir_pin): 
      print("PIR ALARM") 
      send_gmail() 
      time.sleep(10)  #cooldown to prevent email spew 
     else: 
      print "Waiting..." 
      time.sleep(0.5)  #sleep and wait for movement 
      print m 
    print "Loop End" 


# main 
if time_elements[0] > '0' and time_elements[0] < '6': #Weekdays 
    if get_hour > 8 and get_hour < 17:    #Hour Range 
     pir_init() 
    elif get_hour > 16: 
     print("Initialization at 9am...") 
     time_sleep = ((24 - get_hour) + 9) * 3600 
     time.sleep(time_sleep) 
     pir_init()    #initiate sensor 
    elif get_hour < 9: 
     print("Initialization at 9am...") 
     time_sleep = (9 - get_hour) * 3600 
     time.sleep(time_sleep) 
     pir_init() 
else: 
    #to be completed 
    print time_elements[0] 
    print "bad weekday" 
+1

您的代碼示例中有很多縮進問題,我只指出它是因爲您說這是您的第一個Python項目,所以我想讓你有機會在人們提供實際邏輯幫助之前給你一個清理格式的機會 –

+0

也可以通過在頂部添加'from datetime import datetime'和'datetime.now()。 ().hour' –

+0

我假設這是基於這個設備和代碼? http://learn.adafruit.com/adafruits-raspberry-pi-lesson-12-sensing-movement/software –

回答

1

你必須更新你的while循環中的time_elements,使程序使用當前時間的條件下,以測試它是否應當睡覺,直到上午9否則,如果不更新while循環中的time_elements,如果程序第一次沒有進入該條件,它將永遠不會進入。

這解釋了你注意到的行爲;實際上,您的time_elements的定義在此處未顯示...

+0

這聽起來像是正確的方法來完成這個。我理解時間應該傳遞給函數pir_init(current_time)嗎? – Futureproof

+0

不,您不應該將它作爲參數傳遞,因爲您必須在循環中獲取當前時間並在每次迭代中更新它。你可以這樣做導入日期時間: 導入日期時間 ,然後在循環內: date = datetime.datetime.now() ... elif date.hour <9或date.hour> 17: time.sleep(time_sleep ) –

+0

感謝您的澄清。我希望時間被傳遞和更新的原因是因爲當程序最初啓動時,它應該以while循環的相同方式休眠或激活傳感器。我想我必須在循環內外重複使用相同的時間公式。 – Futureproof

相關問題