如何同时通过 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 设置为什么,因此如果使用开关更改它,它不会继续设置它。它仍然会改变它,虽然当前的光照条件不是它最后设置的。
我目前正在开发一个 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 设置为什么,因此如果使用开关更改它,它不会继续设置它。它仍然会改变它,虽然当前的光照条件不是它最后设置的。