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)
我为我的学校作业写了一个代码:
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)