2017-05-13 9 views
2

私は初心者プログラマーです。私はコモドールで64日間Basicでコードすることを学びました。最近、私はRaspberry Pi 3と8チャンネルのリレーボードを購入し、GPIOピンを介してリレーボードを制御するためにPython 3.xでスクリプトを書いています。私が書いたスクリプトは動作しますが、それはあまり効率的ではないと思われます。どんな批評や助言も高く評価されます。rpi3 GPIOピンとPythonスクリプトの切り替え

私は、数字が入力されたときにピンの状態を切り替えるようにスクリプトを変更したいと言われています。現在、ユーザーが数字を入力すると、ピンは数秒間アクティブになり、その後シャットダウンします。ユーザーが同じ番号を再び選択するまで、ピンはアクティブのままにしておきたいと思います。私はかなりうまくいくものを作ることができると確信していますが、私の最初の考えはもう一度それをオフにする別のループを開始することでしょう。それが意味をなさないかどうかわかりませんが、私はそれがエレガントで効率的にコード化されたソリューションではないと確信しています。

ご意見やご協力をいただければ幸いです。

import RPi.GPIO as GPIO # import the GPIO Library 
import time # import system time 

GPIO.setmode(GPIO.BCM) # set pin numbering 

PinList = [2, 3, 4, 17, 27, 22, 10, 9] # init list with pin numbers 

SleepTime = 4 # set sleep delay variable 

for i in PinList:  # loop through pins and set mode and state to 'low' 
GPIO.setup(i, GPIO.OUT) 
GPIO.output(i, GPIO.HIGH) 

# Get user input, turn on the appropriate GPIO pin, pause, then turn it off. 

    while True: 
    choice = input("\nEnter a number between 1 and 8.\nEnter 0 to exit: ") 
    if choice == '0': 
    break 

    if choice == '1': 
    print("You chose 1") 
    GPIO.output(9, GPIO.LOW) 
    time.sleep(SleepTime) 
    GPIO.output(9, GPIO.HIGH) 

    elif choice == '2': 
    print("You chose 2") 
    GPIO.output(10, GPIO.LOW) 
    time.sleep(SleepTime) 
    GPIO.output(10, GPIO.HIGH) 

    elif choice == '3': 
    print("You chose 3") 
    GPIO.output(22, GPIO.LOW) 
    time.sleep(SleepTime) 
    GPIO.output(22, GPIO.HIGH) 

    elif choice == '4': 
    print("You chose 4") 
    GPIO.output(27, GPIO.LOW) 
    time.sleep(SleepTime) 
    GPIO.output(27, GPIO.HIGH) 

    elif choice == '5': 
    print("You chose 5") 
    GPIO.output(17, GPIO.LOW) 
    time.sleep(SleepTime) 
    GPIO.output(17, GPIO.HIGH) 

    elif choice == '6': 
    print("You chose 6") 
    GPIO.output(4, GPIO.LOW) 
    time.sleep(SleepTime) 
    GPIO.output(4, GPIO.HIGH) 

    elif choice == '7': 
    print("You chose 7") 
    GPIO.output(3, GPIO.LOW) 
    time.sleep(SleepTime) 
    GPIO.output(3, GPIO.HIGH) 

    elif choice == '8': 
    print("You chose 8") 
    GPIO.output(2, GPIO.LOW) 
    time.sleep(SleepTime) 
    GPIO.output(2, GPIO.HIGH) 

    else: 
    print("\nThat is not a valid input.") 

print ("\n Quit") 

GPIO.cleanup() # Reset GPIO pin settings 

答えて

0

私はPiコーディングにPythonを使用していませんが、私はその言語をよく知っています。あなたのコードをきれいに整理して、あなたが望むアクションを得る素早くドラムアップされたサンプルがあります。ピンは2回目に選択されるまでその最後の状態にとどまり、反対の状態にトグルします。

if/elseステートメントの束を使用する代わりに、すべてのピンを辞書の選択番号にマップし、ユーザーの選択をdictにキーとして渡してBCMピン番号を取り戻し、それは直接です。ほとんどの場合、さらにエラーチェックを追加することをお勧めします(たとえば、ユーザーがアルファベットで送信する場合)。

import RPi.GPIO as GPIO 

GPIO.setmode(GPIO.BCM) 

pins = { 
    1: 9, 
    2: 10, 
    3: 22, 
    4: 27, 
    5: 17, 
    6: 4, 
    7: 3, 
    8: 2 
} 

for pin in pins.values(): 
    GPIO.setup(pin, GPIO.OUT) 

while True: 
    choice = int(input("\nenter a pin number (0 to exit): ")) 

    if choice == 0: 
     exit() 

    if choice not in pins.keys(): 
     print("\ninvalid selection...\n") 
     continue 

    pin = pins[choice] 

    print("working on pin {}\n".format(pin)) 

    GPIO.output(pin, not GPIO.input(pin)) 

    print("pin {}: status {}\n".format(pin, GPIO.input(pin))) 

GPIO.cleanup() 
+0

素晴らしい提案!非常にエレガントで効率的です。私には2つの問題がありました。何らかの理由で私のPiは 'exit()'コマンドが好きではなかった。私は '休憩'のためにそれを交換し、それは正常に働いた。第2に、コンマがないために「8」が選択されたときに爆撃されました。今はうまく動作します。助けてくれてありがとう。 – Mekanik

+0

便利だったのでうれしいです@Mekanik!私はあなたが 'import sys'を信じて、' sys.exit() 'を使って出口の問題を回避するべきだと思います。現実的には、 'break'がより良い可能性があります。そうすれば、' cleanup() 'がすべて呼び出されます。 – stevieb