RPi LED 在最大或最小亮度时停止工作

RPi LED stops working when max or min brightness

我为我的学校作业写了一个代码:

Write a function to change the brightness (pwm) of the led with the press of an input switch. The first press and hold increases the brightness, next press will decrease it.

它在 0 到 100 之间时有效,但当它达到 0 或 100 时它就停止工作。这是代码:

import RPi.GPIO as GPIO

def main():

    sw = 17
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(sw, GPIO.IN, pull_up_down=GPIO.PUD_UP)
    GPIO.setup(2, GPIO.OUT)
    pwm_red=GPIO.PWM(2,500)
    pwm_red.start(100)
    bright=0
    state=0
    while 1:
        if swin=GPIO.input(sw)
            if state== 1 and bright !=100: '''I put bright !=100 becuase without it, it would just kick me out of the loop when hits 100'''
                bright=bright+1
                pwm_red.ChangeDutyCycle(bright)
                print(bright)
                while GPIO.input(sw)==1:
                    state=0

            if state ==0 and bright !=0:
                bright=bright-1
                pwm_red.ChangeDutyCycle(bright)
                print(bright)
                while GPIO.input(sw)==1:
                    state=1

有人可以帮我找到解决办法吗?我制作了这段代码的多个版本,它们都有这个问题。我试图 Google 这个问题,但那里什么也没有。我可以让它永远不会达到 100 或 0,但这不是正确的解决方案。我希望它被关闭(当它是 99.999999 时它仍然打开)

老实说,令我惊讶的是当前的编码完全有效。我会在这里更改逻辑,在事件循环中的第一个 if 之后立即检查按钮状态。

尝试类似下面的东西,我还没有测试过

import RPi.GPIO as GPIO
from time import sleep

def main():

    sw = 17
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(sw, GPIO.IN, pull_up_down=GPIO.PUD_UP)
    GPIO.setup(2, GPIO.OUT)
    pwm_red=GPIO.PWM(2, 50) # 50 Hz should be fine
    bright=100
    pwm_red.start(bright)
    state=-1

    while True:
        while GPIO.input(sw) 
            while GPIO.input(sw) and (0 <= bright + state <= 100):
                bright += state
                pwm_red.ChangeDutyCycle(bright)
                print(bright)
                sleep(0.1)

            sleep(0.1)

        state *= -1

        # Avoid excessive polling
        while not GPIO.input(sw):
            sleep(0.1)
def main2():
sw=17
GPIO.setmode(GPIO.BCM)
GPIO.setup(sw, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setwarnings(False)
GPIO.setup(2, GPIO.OUT)
pwm_red = GPIO.PWM(2, 50)
pwm_red.start(100)
bright=100
state=-1
while True:
    swin=GPIO.input(sw)
    while swin == False:
        if state == 1 and bright !=100:

            bright+=5
            pwm_red.ChangeDutyCycle(bright)
            print(bright)
            while GPIO.input(sw)==1:
                state *= -1
            time.sleep(0.1)
        if bright == 100:
            state *=-1
            time.sleep(0.3)
        if bright == 0:
            state *=-1

            time.sleep(0.3)
        if state == -1 and bright !=0:
            bright-=5
            pwm_red.ChangeDutyCycle(bright)
            print(bright)

            while GPIO.input(sw)==1:
                state *= -1
            time.sleep(0.1)