如何同时通过 LDR 和按钮控制 LED?

How to control LEDs via a LDR and a button as well?

我目前正在开发一个 Node-RED 网络应用程序来控制带有开关按钮的多个 LED。接下来,使用 Python 脚本读取 LDR 值。该值将用于确定外面是亮还是暗。天黑时,必须启用一个 LED,其他 LED 禁用,亮时则相反。

#!/usr/bin/env python 
import cgitb ; cgitb.enable() 
import spidev 
import time 
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.OUT)
GPIO.setup(18, GPIO.OUT)
GPIO.setup(27, GPIO.OUT)
GPIO.setup(22, GPIO.OUT)

spi = spidev.SpiDev() # create spi object
spi.open(0,0) # open spi port 0, device CS0 pin 24

# read SPI data 8 possible adc's (0 thru 7) 
def readadc(adcnum): 
 if ((adcnum > 7) or (adcnum < 0)): 
    return -1 
 r = spi.xfer2([1,(8+adcnum)<<4,0]) 
 adcout = ((r[1]&3) << 8) + r[2] 
 return adcout 

如您所见,由于 while 循环,此脚本的其余部分继续执行。

while True:
    tmp0 = readadc(0) # read channel 0 
    if(tmp0 > 500):
        msg = "LIGHT"
        GPIO.output(17, False)
    else:
        msg = "DARK"
        GPIO.output(17, True)
        GPIO.output(18, False)
        GPIO.output(22, False)
        GPIO.output(27, False)
    time.sleep(0.3)
    print msg

最后,我不能同时使用两者。一旦我点击一个开关,LED 就会亮起 1 秒。我需要找到一种方式来结合这两种方法。有什么建议吗?

IF 您想要的是让光照条件决定初始 LED 状态,以及在光照条件发生变化时更新状态;但是开关会覆盖这些直到光线条件发生变化,这应该会有所帮助:

light_set = None
while True:
    tmp0 = readadc(0) # read channel 0 
    if(tmp0 > 500) and light_set != "LIGHT":
        msg = "LIGHT"
        light_set = msg
        GPIO.output(17, False)
    else if light_set != "DARK":
        msg = "DARK"
        light_set = msg
        GPIO.output(17, True)
        GPIO.output(18, False)
        GPIO.output(22, False)
        GPIO.output(27, False)
    time.sleep(0.3)
    print msg

这应该 "remember" 此代码部分最后将 LED 设置为什么,因此如果使用开关更改它,它不会继续设置它。它仍然会改变它,虽然当前的光照条件不是它最后设置的。