因此,我正在编写一个基本程序,使用电位计打开LED,这是我的代码:
def pot():
import RPi.GPIO as GPIO
import time
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(4, GPIO.OUT)
GPIO.setup(22, GPIO.IN)
GPIO.output(4, GPIO.LOW)
try:
while True:
if (GPIO.input(22) == GPIO.HIGH):
print("switch activated")
GPIO.output(4, GPIO.HIGH)
if (GPIO.input(22) == GPIO.LOW):
GPIO.output(4, GPIO.LOW)
else:
GPIO.output(4, GPIO.LOW)
except KeyboardInterrupt:
GPIO.cleanup()
pot()
当我激活电位器时,我只想要"开关激活"打印一次,但我希望LED继续运行,直到我关闭电位器。由于代码是"开关激活"当锅被激活时,显然会不断打印。我尝试使用休息和其他类似的东西,但他们都结束了程序或关闭了LED。我该如何解决这个问题?
答案 0 :(得分:1)
由于您希望LED继续发光,它就像添加另一个循环一样简单。这是您的代码的(稍微)修改版本应该有效:
def pot():
import RPi.GPIO as GPIO
import time
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(4, GPIO.OUT)
GPIO.setup(22, GPIO.IN)
GPIO.output(4, GPIO.LOW)
try:
while True:
if (GPIO.input(22) == GPIO.HIGH):
print("switch activated")
# modified part
while (GPIO.input(22) == GPIO.HIGH):
GPIO.output(4, GPIO.HIGH)
# end modification
else:
GPIO.output(4, GPIO.LOW)
except KeyboardInterrupt:
GPIO.cleanup()
pot()
另一种方法是打开LED并等待引脚22
的输入转为LOW
。只需更改修改后的部分如下。
# modified part
GPIO.output(4, GPIO.HIGH)
while (GPIO.input(22) == GPIO.HIGH):
pass
# end modification
答案 1 :(得分:0)
显然你想让LED对信号做出持续反应,但只在信号发生变化时打印信息。
执行此操作的方法是使用变量跟踪状态。
注意:我对循环中嵌套的GPIO.input调用感到困惑。看起来这些都是多余的,因为如果GPIO.input的返回值发生了变化,它将在下一次迭代中处理......
try:
state = None
while True:
signal = GPIO.input(22)
GPIO.output(4, signal)
if signal != state:
if signal == GPIO.HIGH:
print("switch activated")
else:
print("switch deactivated")
state = signal
except KeyboardInterrupt:
GPIO.cleanup()
答案 2 :(得分:0)
输出也可以作为输入进行检查。因此,您可以将逻辑更改为仅在当前较低时将输出设置为高。
def pot():
import RPi.GPIO as GPIO
import time
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(4, GPIO.OUT)
GPIO.setup(22, GPIO.IN)
GPIO.output(4, GPIO.LOW)
# Initialize state
state = GPIO.LOW
try:
while True:
# Set the output high only if the input is high and the output is low
if (GPIO.input(22) == GPIO.HIGH) and (GPIO.input(4) == GPIO.LOW):
print("switch activated")
GPIO.output(4, GPIO.HIGH)
# If you want, you could do the same here and add a check on the output to
# only turn it low if it is currently high
elif (GPIO.input(22) == GPIO.LOW):
GPIO.output(4, GPIO.LOW)
except KeyboardInterrupt:
GPIO.cleanup()
pot()
答案 3 :(得分:-1)
如果您只希望执行一次,则需要将string(FIND "${OpenCV_SOURCE_DIR}" "${__abs_dir}" strPosSrc)
string(FIND "${OpenCV_SOURCE_DIR}" "${__abs_dir}" strPosBin)
if (strPosSrc EQUALS 0 OR strPosBin EQUALS 0)
移出循环。