Выключить датчик движения PIR - PullRequest
0 голосов
/ 19 апреля 2020

просто нужен быстрый совет, если кто-то может помочь. Я закончил код для моего проекта будильника, используя 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)

, и он должен делать это, когда я деактивирую будильник, что теоретически, проблема в том, если я положу руку перед Пир все еще обнаруживает движение. Я хочу, чтобы он вообще не обнаруживал и не искал движение.

1 Ответ

0 голосов
/ 19 апреля 2020

Основная проблема, которую я вижу, это то, что у вас есть ИК-датчик, безусловно связанный с состоянием тревоги. Вы пытаетесь исправить это, выключив / заменив датчик после ввода кода снятия с охраны, или по какой-либо причине система переходит в режим снятия с охраны.

  1. PIR должен работать постоянно. Вы хотите, чтобы ваша программа имела этот сырой релейный сигнал от датчика независимо от того, что происходит.
  2. В строках кода внутри вашей функции 'callback' вы устанавливаете состояние активации тревоги только на основе текущего состояние ИК-датчика. Вам нужно включить условие состояния охраны перед тем, как установить Activate в True. Например:
 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 приведет к срабатыванию тревоги. .

Я предполагаю, что у вас есть callback () для al oop, и система проверяет состояние вывода 11 каждый n-й? Если это так, то вы, вероятно, захотите ограничить состояние «Активировано аварийным сигналом», чтобы активировать аварийный сигнал только один раз за каждый инцидент, тогда как в случае зацикливания приведенный выше код будет запускать аварийный сигнал каждый цикл при правильных условиях. Вы хотите активировать тревогу только при следующих условиях: Armed == True, и PIR переходит из False в True. Это называется «мгновенной» логикой c, где мы игнорируем непрерывное состояние 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')) 

Есть несколько других вещей, которые я бы порекомендовал вам изменить, но я думаю, что это решит проблему для вас. Другие предложения появятся в комментариях к этому ответу.

...