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.
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