2016-12-03 25 views
0

我有一個相當好奇的腳本挑戰。我有一個提取單元,我試圖通過Python腳本和常規中繼來控制。繼電器使用GPIO BCM引腳15連接到我的RPi 3型號B,它接地,並從PI的VCC引腳接收5V。到現在爲止還挺好。我已經測試過繼電器,並按照預期關閉和打開。Python:在GPIO引腳狀態發生變化時保持操作定時器

我寫的腳本有一個部分,它定義了在繼續下一步操作之前必須暫停的時間長度。每個操作都被命名爲「關閉並打開」。這兩項操作必須持續21600秒(6小時)。當關閉操作(提取器開啓)結束時,開放操作(提取器關閉)開始,並且我想嘗試使用腳本來獲得靈巧。

我想要做的是在更改引腳15的狀態時保持「打開」操作的計數器。所以,當打開操作計數到21600秒時,我希望提取器打開60秒(1分鐘),然後它必須再次關閉300秒(5分鐘)。我試圖找出它,但它似乎任何時候我改變引腳的狀態,它停止打開操作的計數器和腳本停止運行或失敗。

當我改變引腳15的狀態時,我似乎無法弄清楚如何保持計時器計數高達21600秒,在打開的操作中。請看下面,這是我一直在運行的腳本個月。它運作良好,但我現在想通過上述方法來改進它。

爲了讓您知道,pi在一個帶有plexi-window的電箱中無頭運行,以便我可以看到接力狀態。我已經設置腳本在啓動時使用rc.local自動運行,它完美地工作。第一個自動運行的腳本是一個GPIO清理腳本,它可以將繼電器的狀態重置爲打開狀態(無電流),以防由於某種原因關閉(通常不會)。提取腳本然後運行,其餘的是歷史。除非繼電器感到困惑(有時候他們會這樣做),否則我不會重新啓動PI,即使打開操作已經開始,它們開始表現得很奇怪,就像保持關閉一樣,這意味着引腳15的狀態會改變,從而告訴繼電器打開(避難所想通了),但它只發生每幾週一次,但這是另一天的談話。現在我想了解如何編輯此腳本以在打開操作計數器繼續運行時(1分鐘)和關閉(5分鐘)之間切換提取器單元。

當關閉的操作再次啓動時,提取器單元可以運行整整6個小時。任何社區的幫助將不勝感激。謝謝大家。

# !/usr/bin/python 
import RPi.GPIO as GPIO 
import time 

GPIO.setmode(GPIO.BCM) 
GPIO.setwarnings(False) 

# init list with pin numbers 
pinList = [15] 

# Loop through pins and set mode and state to 'high'. 
for i in pinList: 
    GPIO.setup(i, GPIO.OUT) 
    GPIO.output(i, 1) 

# time to sleep between operations in the main loop 
Closed = 21600 
Open = 21600 

# main loop 
while True: 
    GPIO.output(15, 0) 
    print "Closed" 
    time.sleep(Closed); 

    GPIO.output(15, 1) 
    print "Open" 
    time.sleep(Open); 

PS ......我明白,引腳狀態'低或0'意味着沒有電流流動,所以繼電器應該打開。相反,引腳狀態爲「高電平」或「1」表示電流正在流動,繼電器應關閉。這裏不是這種情況。有了這個繼電器,低意味着關閉,高意味着打開。這使我感到困惑,儘管我可能誤解了低和高的實際含義。

回答

0

你有兩種選擇,兩種工藝的信號在等待一段時間才能繼續其他操作:

1個嵌套循環

嘗試做這樣的事情

while True: 
    print "Closed" 
    for ii in range(0,Closed): 
     GPIO.output(15, 0) 
     time.sleep(1); 
     #if HERE COMES YOUR CHECK FOR WHATEVER YOU WANT EXACTLY: 
     # DO SOMETHING 
    print "Open" 
    for ii in range(0,Open): 
     GPIO.output(15, 1) 
     time.sleep(1); 
     #if HERE COMES YOUR OTHER CHECK FOR WHATEVER YOU WANT EXACTLY: 
     # DO SOMETHING 

2個線程

線程是一些背景知識自動運行的過程。查看一些教程,例如this one

您woud引入一個線程然後,這

  • 睡閉秒
  • 開關銷15上
  • 睡覺打開秒
  • 開關引腳15爲關閉

此線程開始一次,然後你的主循環可以關心其他的話。

側此言

還有一種叫中斷有趣的概念。您基本上可以定義一個功能,當某個事件發生時(例如讀取引腳的狀態改變=按鈕按下時),該功能會被執行。 This可能是一個開始使用interrups的好例子。

+0

感謝Markus,我現在只是迴應道歉。工作生活平衡出軌時,時間過得很快。您的輸入非常有幫助:-) – Safjoe

相關問題