我有一段用于控制中继的Python代码。我正在使用SunFounder 2 Channel 5V Relay Shield Module for Arduino。
请参阅下面的代码部分,了解我们如何初始化相关GPIO以及如何在发生中断时激活它们。
def initGPIO ():
GPIO.setmode(GPIO.BOARD)
GPIO.setup(23, GPIO.OUT, initial=GPIO.LOW)
: : :
def onLight(delay):
GPIO.output(23,True)
time.sleep(delay)
GPIO.output(23,False)
问题是,一旦onLight被调用,继电器始终处于ACTIVATE模式。尽管我试图在延迟后尝试在GPIO 23上输出0V。请告诉我们问题的位置
答案 0 :(得分:0)
我读了你的程序段,发现它与中断无关。也许这就是"中断"在标题中吓跑了人们。
您的代码可以通过下面的2步伪代码来描述。
init GPIO pin。
将引脚设置为高电平,延迟,将引脚设置为低电平。
你没有提到延迟时间。如果您使用循环时间小于10毫秒,或者您实际上正在使用中断,则可能会使事情变得复杂。
我建议您移除中断部分,并使任何循环超过10ms,这是线圈的最大操作时间,如下所示。
我使用代码段进行100ms循环和10ms循环时间。我发现线圈延迟约5ms。我想知道你的中断函数是否太快而不能错过它。
我正在使用HCT125将gpio引脚信号从3V3逻辑上移到5V0逻辑,因为我担心3v3信号不够强(可能导致电路不工作),如下所述。
我编写了以下测试程序,无论是否使用HCT125都可以使用。
# *** relay01.02 tlfong01 2018mayhkt1627 ***
#!/usr/bin/python3
# Description
# Function = loop turning relay on/off
# Hardware = rpi3B
# Logical level 3V3 to 5V0 up shifter = HCT125
# Software = stretch 2018Apr, python3.6.4
# Relay = phtotcoupler 807C
# Coil = Songle SRD-05VDC-SL-C
# Note: this program works with or without the up shifter HCT125
import RPi.GPIO as GPIO
from time import sleep
# *** Config ***
relayPin = 20
# *** Setup cleanup ***
def setGpioMode():
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
return
def cleanupGpio():
GPIO.cleanup()
return
def setupDigiOutPin(digiOutPin):
GPIO.setup(digiOutPin, GPIO.OUT)
GPIO.output(digiOutPin, GPIO.LOW)
return
# *** Set high/low/toggle digiOutPin ***
def setDigiOutPinHigh(digiOutPin):
GPIO.output(digiOutPin, GPIO.HIGH)
return
def setDigiOutPinLow(digiOutPin):
GPIO.output(digiOutPin, GPIO.LOW)
return
def toggleDigiOutPin(digiOutPin, highSeconds, lowSeconds, toggleCount):
for i in range(toggleCount):
setDigiOutPinHigh(digiOutPin)
sleep(highSeconds)
setDigiOutPinLow(digiOutPin)
sleep(lowSeconds)
return
# *** Init/Cleanup/Test ***
def init():
setGpioMode()
setupDigiOutPin(relayPin)
return
def cleanup():
cleanupGpio()
return
def test():
print('Begin turning on/off relay every 100mS')
init()
toggleDigiOutPin(digiOutPin = relayPin, highSeconds = 0.1, lowSeconds = 0.1, toggleCount = 10000)
print('End of test')
cleanup()
return
def main():
test()
return
# *** Main ***
if __name__ == '__main__':
main()
# *** End ***
您的问题中提到的继电器,SunFounder 2通道DC 5V继电器模块带光电耦合器低电平触发器扩展板实际上是低电平激活。
要验证我的猜测,您可以执行以下操作。