按钮开关在控制电路中其实是作为一个类似感应器的存在,通过检测按钮开关是否被按下,将信号发送给处理器,然后处理器通知其它的执行器做出相应的动作。而不是直接用按钮开关来控制执行部件。
需要值得注意的是当按钮开关连接到输入引脚时,如果您没有将输入引脚连接到任何东西,它将“浮动(float)”。换句话说,读入的值是未定义的,因为它在按下按钮或开关之前未连接到任何东西。由于受到电源干扰,它可能会大幅改变值。
为了解决这个问题,我们使用上拉或下拉电阻。这样,就可以设置输入的默认值。如果采用硬件的方式,可以使用上拉/下拉电阻,也可以采用软件的方式。在硬件方式中,通常使用输入通道和 3.3V(上拉)或 0V(下拉)之间的 10K 电阻;在软件方式中,RPi.GPIO 模块允许您配置 Broadcom SOC 以执行此操作:
GPIO.setup(channel, GPIO.IN, pull_up_down=GPIO.PUD_UP)
# or
GPIO.setup(channel, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
其中 channel 是基于您指定的编号系统的通道号 – BOARD 或 BCM。在Proteus中建立以下电路连接:

GPIO 40号pin作为输入pin,用来接受按钮开关的开关信号,GPIO 38号pin作为输出Pin,通过输出高低电平开控制led灯。输入以下代码:
from time import sleep
import RPi.GPIO as GPIO
delay=.1
inPin=40
outPin=38
GPIO.setmode(GPIO.BOARD)
GPIO.setup(outPin,GPIO.OUT)
GPIO.setup(inPin,GPIO.IN,pull_up_down=GPIO.PUD_UP)
while True:
readVal = GPIO.input(inPin)
print(readVal)
if readVal == 1:
GPIO.output(outPin,0)
if readVal == 0:
GPIO.output(outPin,1)
sleep(delay)
其中:
GPIO.setup(inPin,GPIO.IN,pull_up_down=GPIO.PUD_UP)
输入Pin设置为上拉电阻意味着引脚默认读数为高电平 (1),当按下按钮时,它会接地,使其变为低电平 (0)再通过下面的逻辑:
readVal = GPIO.input(inPin)
print(readVal)
if readVal == 1:
GPIO.output(outPin,0)
if readVal == 0:
GPIO.output(outPin,1)
当输入为高电平1时,输出为低电平0;当输入为低电平0,输出为高电平1,这样按钮在没被按下时,灯不亮,按下按钮并保持时灯亮。运行结果:

添加一个追踪按钮状态的变量可以实现用按钮来开关LED:
from time import sleep
import RPi.GPIO as GPIO
# Pin Setup
inPin = 40 # Button pin
outPin = 38 # LED pin
delay = 0.1
# State variables
led_state = False # Tracks LED state (False = off, True = on)
prev_button = 1 # Tracks previous button state for edge detection
GPIO.setmode(GPIO.BOARD)
GPIO.setup(outPin, GPIO.OUT)
GPIO.setup(inPin, GPIO.IN, pull_up_down=GPIO.PUD_UP)
while True:
# Read current button state
current_button = GPIO.input(inPin)
# Check for button press (transition from 1 to 0)
if current_button == 0 and prev_button == 1:
# Toggle LED state
led_state = not led_state
# Update LED
GPIO.output(outPin, led_state)
# Small delay to avoid button bounce
sleep(0.2)
# Update previous button state
prev_button = current_button
sleep(delay)
