【问题标题】:Toggling rpi3 GPIO pins with a Python script使用 Python 脚本切换 rpi3 GPIO 引脚
【发布时间】:2017-05-13 20:31:20
【问题描述】:

我是一个新手程序员。我在 Commodore 64 天学会了 Basic 编码。最近,我购买了一个 Raspberry Pi 3 和一个 8 通道继电器板,并正在用 Python 3.x 编写一个脚本来通过 GPIO 引脚控制继电器板。我编写的脚本有效,但我怀疑它不是很有效。任何批评或建议将不胜感激。

话虽如此,我想更改脚本以在输入数字时切换引脚的状态。目前,当用户输入一个数字时,该引脚会激活几秒钟然后关闭。我希望引脚保持活动状态,直到用户再次选择相同的数字。我相当肯定我可以编写一些可行的代码,但是,我最初的想法是启动另一个循环,将其再次关闭。不确定这是否有意义,但我确信这不是一个优雅或高效编码的解决方案。

任何建议或帮助将不胜感激。

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

【问题讨论】:

    标签: python python-3.x raspberry-pi raspberry-pi3


    【解决方案1】:

    我不使用 Python 进行我的 Pi 编码,但我非常熟悉该语言。这是一个快速鼓起的示例,可以相当多地清理您的代码,并为您提供所需的操作;在第二次选择之前,该引脚将保持其最后一个状态,这会将其切换到相反的状态。

    我们没有使用一堆if/else 语句,而是简单地将所有引脚映射到字典中的选择编号,并将用户的选择作为键扔到字典中,以获取 BCM 引脚编号并采取行动直接上它。您几乎肯定会希望添加进一步的错误检查(例如,如果用户发送 alpha 字符):

    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()
    

    【讨论】:

    • 好建议!非常优雅和高效。我确实有2个问题。出于某种原因,我的 Pi 不喜欢“exit()”命令。我把它换成“休息”,效果很好。其次,当我选择“8”时它被炸毁了,这是由于缺少逗号引起的。现在工作正常。感谢您的帮助。
    • 我很高兴它有用@Mekanik!我相信如果你import sys,然后使用sys.exit(),你应该可以解决退出问题。但实际上,break 可能更好,这样cleanup() 在所有情况下都会被调用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-27
    • 2021-11-05
    • 2015-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-30
    相关资源
    最近更新 更多