2016-12-03 4 views
0

Ich habe eine ziemlich seltsame Skript-Herausforderung. Ich habe eine Extraktionseinheit, die ich über ein Python-Skript und ein reguläres Relay steuern möchte. Das Relais ist über GPIO BCM Pin 15 mit meinem RPi 3 Model B verbunden. Es ist geerdet und erhält 5V vom pin VCC Pin. So weit, ist es gut. Ich habe das Relais getestet und es schließt und öffnet wie erwartet.Python: Operationstimer beibehalten, während GPIO Pin Zustand ändert

Das Skript, das ich geschrieben habe, hat einen Abschnitt, der die Länge der Zeit definiert, für die es anhalten muss, bevor mit der nächsten Operation fortgefahren wird. Jede Operation erhält den Namen "geschlossen und offen". Beide Operationen müssen 21600 Sekunden dauern (6 Stunden). Wenn der geschlossene Vorgang (Extraktor an) abgeschlossen ist, beginnt die offene Operation (Extraktor aus) und ich möchte versuchen, mit dem Skript clever zu werden.

Was ich tun möchte, ist den Zähler der "offenen" Operation beizubehalten, während ich den Zustand von Pin 15 ändere. Also, während der offene Vorgang bis zu 21600 Sekunden zählt, möchte ich den Extraktor für 60 Sekunden einschalten (1 Minute), dann muss es für 300 Sekunden (5 Minuten) wieder ausgeschaltet werden. Ich habe versucht, es herauszufinden, aber es scheint wie jedes Mal, wenn ich den Zustand des Stiftes ändern, stoppt es den Zähler der offenen Operation und das Skript hört auf zu laufen oder schlägt fehl.

Ich kann nicht herausfinden, wie man den Timer bis zu 21600 Sekunden im offenen Betrieb hält, während ich den Zustand von Pin 15 ändere. Siehe unten, das ist das Skript, das ich für einige ausgeführt habe Monate. Es funktioniert gut, aber ich möchte es jetzt verbessern, indem ich das obige mache.

Damit Sie wissen, der Pi läuft kopflos in einer Strombox mit einem Plexi-Fenster, so dass ich den Relaisstatus sehen kann. Ich habe das Skript so eingerichtet, dass es automatisch beim Start mit rc.local ausgeführt wird, was perfekt funktioniert. Das erste Skript, das automatisch ausgeführt wird, ist ein GPIO-Bereinigungsskript, das den Status des Relays auf "offen" zurücksetzt (kein aktueller Fluss), falls es aus irgendeinem Grund geschlossen wird (normalerweise nicht). Das Extractor-Skript läuft dann und der Rest ist Geschichte. Ich starte den Pi nie neu, wenn die Relais nicht durcheinander geraten (was manchmal der Fall ist) und sie beginnen sich merkwürdig zu verhalten, als wären sie geschlossen, obwohl der Open-Betrieb begonnen hat, was bedeuten würde, dass sich der Zustand von Pin 15 geändert hat fand das heraus), aber es passiert nur einmal alle paar Wochen, aber das ist ein Gespräch für einen anderen Tag. Für jetzt würde ich gerne verstehen, wie ich dieses Skript bearbeiten kann, um die Absaugeinheit einzuschalten (1 Minute) und auszuschalten (5 Minuten), während der offene Operationszähler weiterläuft.

Wenn der geschlossene Betrieb erneut gestartet wird, kann die Absaugeinheit die vollen 6 Stunden laufen. Jede Hilfe von der Gemeinschaft wird sehr geschätzt. Danke allen.

# !/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 ... Ich verstehe, dass Pin-Status 'niedrig oder 0' bedeutet, dass kein Strom fließt, also sollte das Relais geöffnet sein. Umgekehrt bedeutet der Pin-Zustand "high" oder "1", dass Strom fließt, so dass das Relais geschlossen sein sollte. Dies ist hier nicht der Fall. Bei diesem Relais bedeutet niedrig geschlossen und hoch bedeutet offen. Das verwirrt mich, obwohl ich vielleicht mißverstanden habe, was niedrig und hoch eigentlich bedeutet.

Antwort

0

Sie haben zwei Möglichkeiten, zwei Prozesssignale während einiger Zeit mit einem anderen Betrieb fortzusetzen warten:

1 verschachtelten Schleifen

versuchen so etwas wie

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 Fäden tun

Threads sind einige Hintergrund pr ozesse, die automatisch ausgeführt werden.Sehen Sie sich ein Tutorial für Threads wie this one an.

Sie dann ein Gewinde einführen woud, die

  • Geschlossen Sekunden
  • Schalter Pin 15 bis auf
  • schläft Öffnen Sekunden
  • Schalter schläft Pin15 ausgeschaltet

Dieser Thread wird einmal gestartet und Ihre Hauptschleife kann sich dann um andere Whings kümmern.

Seite Bemerkung

Es ist ein weiteres interessantes Konzept Interrupts genannt. Sie können im Grunde eine Funktion definieren, die ausgeführt wird, wenn ein bestimmtes Ereignis eintritt (z. B. wenn der Status eines Lesestifts geändert wird = Drücken der Taste). This könnte ein gutes Beispiel sein, um mit Interrups zu beginnen.

+0

Danke Markus, ich entschuldige mich dafür, jetzt nur noch zu antworten. Die Zeit vergeht, wenn die Work-Life-Balance entgleist. Ihre Eingabe hat mir sehr geholfen :-) – Safjoe

Verwandte Themen