Ich habe gerade begonnen, Himbeer-Pi-Entwicklung mit Python zu lernen und habe eine einfache RGB-LED-Schaltung auf meinem Steckbrett installiert, dann habe ich dies mit Pubnub verbunden, um es von einem kleinen Web-Interface zu steuern, das ich gerade gebaut sendet einen Methodennamen und RGB-Werte über Pubnub, wo das Python-Skript den bestimmten Kanal abonniert hat.Ich kann kein laufendes Python-Skript beenden
from pubnub import Pubnub
import RPi.GPIO as G
import time
pubnub = Pubnub(publish_key="****", subscribe_key="****")
def callback(message, channel):
globals()[message['method']](message['data'])
def error(message):
print("ERROR: " + str(message))
def connect(message):
print("CONNECTED")
def reconnect(message):
print("RECONNECTED")
def disconnect(message):
print("DISCONNECTED")
G.setmode(G.BCM)
red_channel_pin = 18
green_channel_pin = 23
blue_channel_pin = 24
G.setup(red_channel_pin, G.OUT)
G.setup(green_channel_pin, G.OUT)
G.setup(blue_channel_pin, G.OUT)
pwm_red = G.PWM(red_channel_pin,500)
pwm_red.start(100)
pwm_green = G.PWM(green_channel_pin,500)
pwm_green.start(100)
pwm_blue = G.PWM(blue_channel_pin,500)
pwm_blue.start(100)
def set_rgb_values(data):
pwm_red.ChangeDutyCycle(float(data['red']))
pwm_green.ChangeDutyCycle(float(data['green']))
pwm_blue.ChangeDutyCycle(float(data['blue']))
try:
pubnub.subscribe(channels="rasprgb",callback=callback, error=error, connect=connect, reconnect=reconnect, disconnect=disconnect)
except KeyboardInterrupt:
print('Cleaning Up')
G.cleanup()
pubnub.unsubscribe(channel='rasprgb')
All dies funktioniert, außer für den Versuch, das Programm zu schließen und den GPIO-Pins aufzuzuräumen, abmelden aus dem Kanal usw.
In der Vergangenheit habe ich verwendet, um eine while True:
Schleife und das hat funktioniert , aber da will ich nicht etwas in einer Schleife, hier zu tun, möchte ich nur eine Verbindung öffnen und offen lassen, bis ich kündigen sie eine Schleife Sinn hier
Schlagen Ctrl + C
nur ausgibt KeyboardInterrupt
aber es nicht machen scheint nicht den Ausnahmeblock
Wie kann ich dies erreichen, um GPIO-Pins zu terminieren und zu bereinigen?
UPDATE
Nach Refactoring signal
hier zu verwenden ist, was ich jetzt habe ersetzt die try...except
(vorausgesetzt ich sie am Anfang der Datei importiert haben)
def sig_handler(signal,frame):
print('Cleaning Up')
G.cleanup()
pubnub.unsubscribe(channel='rasprgb')
sys.exit(0)
pubnub.subscribe(channels="rasprgb",callback=callback, error=error, connect=connect, reconnect=reconnect, disconnect=disconnect)
signal.signal(signal.SIGINT, sig_handler)
jedoch Drücken ctrl + c
noch schließt das Programm nicht und führt den Bereinigungscode aus
Haben Sie versucht, C trl-D? –
nein, aber es scheint 'ctrl + d' schließt nur die Shell, wenn ich das Skript erneut ausführen warnt es über die Pins wird bereits verwendet, also muss ich wirklich tun, dass Reinigung – Jordan