关闭PIR运动传感器



如果有人能帮忙,只需要一个快速的建议。我完成了警报项目的代码,使用kivy作为gui,使用python作为脚本。然而,我的问题是运动传感器。我可以检测运动是高还是低,没有问题。然而,有没有一种方法可以阻止运动传感器检测到处于低或错误状态,比如说,如果我输入了解除锁定引脚。似乎一旦警报被激活,它就无法关闭。代码可以根据要求提交,但我希望有一个简单的方法来实现这一点。

def callback(self):  
global Activated, Armed
if GPIO.input(11)==False:
Activated = False
Armed = True
elif GPIO.input(11) == True:   
Activated = True
Armed = False
else:
pass
if Activated == True:
self.info.text = '!!Intruder Alert!!'
self.info.background_color = [1, 1, 0, 1]
GPIO.output(16,1)
GPIO.output(22, 1)
GPIO.output(18,0)
#self.txt_display.text = ''
#time.sleep(3)
#disarm = int(input('Enter deactivation code'))  
else:
pass
def reset_notice(self):
self.info.text = 'Alarm disarmed'
def armAlarm(self):
global Activated, Armed
if self.txt_display.text == str(pincode):
Clock.schedule_once(lambda dt: self.indicated(), 3)
Armed = True
Activated = False
GPIO.output(22, 0)
GPIO.output(18, 1)
GPIO.output(16,1)
time.sleep(0.5)
GPIO.output(16,0)
elif self.txt_display.text != str(pincode):
Armed = False
Activated = False
self.txt_display.text = ''
self.info.text = '**Incorrect Pin**'
self.info.background_color = [1, 1, 1, 1]
Clock.schedule_once(lambda dt: self.reset_notice(), 3)
self.info.background_color = [0, 1, 0, 1]
if Armed == False:
Clock.schedule_interval(lambda dt: self.callback(), 0.5)
else:
self.reset_alarm()

在kv文件中,当我按下一个按钮时,它会运行armAlarm功能,如果警报被激活,pir也会被激活,如果检测到入侵者,蜂鸣器就会熄灭,蜂鸣器为16。

def disarmAlarm(self):
global Activated, Armed
Armed = True
Activated = False

if Armed == True:
if Activated == False:
if self.txt_display.text == str(pincode):
self.info.text = 'Alarm disarmed'
self.info.background_color = [0, 1, 0, 1]
self.txt_display.text = ''
Armed = False
Activated = False
GPIO.output(16,0)
GPIO.output(22, 0)
GPIO.output(18, 0)
GPIO.setup(11, GPIO.IN)
print('Alarm deactivated')
def disarmAlarm(self):
global Activated, Armed
Armed = True
Activated = True
if Armed == True:
if Activated == True:
if self.txt_display.text == str(pincode):
self.info.text = 'Alarm disarmed'
self.info.background_color = [0, 1, 0, 1]
self.txt_display.text = ''
Armed = False
Activated = False
GPIO.output(16,0)
GPIO.output(22, 0)
GPIO.output(18, 0)
print('Alarm deactivated')  

def pir_off(self):
GPIO.input(11) == False      
def reset_alarm(self):
global Activated, Armed
Armed = False
Activated = False
if Armed == False:
if Activated == False:
Clock.schedule_interval(lambda dt: self.pir_off(), 0.1)

当我解除警报时,它应该这样做,理论上,问题是如果我把手放在pir前面,它仍然能检测到运动。我想完全阻止它检测或寻找运动。

我看到的主要问题是PIR传感器无条件链接到报警状态。您正试图通过在输入解除防护代码后关闭/更换传感器来解决此问题,或者由于任何原因,系统进入解除防护模式。

  1. PIR应始终运行。不管发生什么,你都希望你的程序有来自传感器的原始继电器馈电
  2. 在函数"callback"内的代码行中,您仅根据PIR传感器的当前状态设置报警激活状态。在将"激活"设置为"真"之前,您需要包含报警"武装"状态的条件。例如:
def callback(self):  
global Activated, Armed
#we dont care if the PIR goes to False. This only matters for lighting systems and 
#the like.
if GPIO.input(11) == False:
pass
elif GPIO.input(11) == True  and  Armed == True:   
Activated = True

以上示例接收所有PIR数据作为原始数据,只有PIR==True状态与Armed==True状态相结合才会触发警报。

  1. 我假设你在一个循环上有callback((,系统每n次检查引脚11的状态?如果是这种情况,那么您可能希望将报警激活状态限制为每次事件只触发一次报警,而如果循环,则当条件合适时,上述代码将在每个周期重新触发报警。您只想在以下情况下触发警报:Armed==True,PIR从False转换为True。这被称为"瞬时"逻辑,我们忽略PIR的连续状态,只关心状态何时发生变化。看起来是这样的:
def callback(self):  
global Activated, Armed, PIRRawState
if GPIO.input(11) == False:
if PIRRawState == True:
PIRRawState = False
elif GPIO.input(11) == True:   
if PIRRawState == False:
PIRRawState = True
if Armed == True:
activateAlarm()
def activateAlarm(self):
self.info.text = '!!Intruder Alert!!'
self.info.background_color = [1, 1, 0, 1]
GPIO.output(16,1)
GPIO.output(22, 1)
GPIO.output(18,0)
#self.txt_display.text = ''
#time.sleep(3)
#disarm = int(input('Enter deactivation code')) 

我建议你改变其他一些事情,但我认为这会为你解决问题。其他建议将出现在对此答案的评论中。

最新更新