Перекрестная проверка моего кода (детектор движения с использованием Raspberry pi)

#python-3.x #raspberry-pi

#python-3.x #raspberry-pi

Вопрос:

Зуммер не перестает гудеть, хотя я дал 2-секундный сон и скажите мне, как прекратить дублировать один и тот же оператор внутри цикла for

 import RPi.GPIO as GPIO 
import time

sensor=13
buzzer=26

GPIO.setwarning(False)
GPIO.cleanup()
GPIO.setmode(GPIO.BCM)
GPIO.setup(sensor,GPIO.IN)
GPIO.setup(buzzer,GPIO.OUT)

print("Initializing PIR sensor...")
     
time.sleep(2)

print("PIR ready...")
print("")

def infinity():

while True: yield
for i in infinity():
     pass 
     if GPIO.input(sensor)==True:

          GPIO.output(buzzer,GPIO.HIGH)
          time.sleep(2)
          print("Motion Detected")

     else:

          GPIO.output)buzzer,GPIO.LOW)
          print("Motion not detected")
          time.sleep(2)
  

«Пренебрегайте, если вы видите какую-либо опечатку, такую маленькую ошибку, потому что я не могу скопировать код из VNC, вместо этого я его ввел»

Комментарии:

1. Привет, добро пожаловать в SO, пожалуйста, убедитесь, что предоставленный вами код не содержит опечаток. И действителен, насколько вам известно.

Ответ №1:

Чтобы бесконечно проверять движение и печатать "Motion Detected" только при первом обнаружении движения, просто используйте detected флаг:

 def infinity():
    detected = False
    while True:
         if GPIO.input(sensor) == True:
              GPIO.output(buzzer, GPIO.HIGH)
              if not detected:
                  print("Motion Detected")
                  detected = True
              time.sleep(2)
              GPIO.output(buzzer, GPIO.LOW)
  

Однако представьте, что вы должны были обнаружить движение один раз, а через две секунды движение больше не было обнаружено. Если движение было обнаружено снова, скажем, через 10 секунд, я подозреваю, что вы захотите, чтобы оно снова печаталось "Motion Detected" . Таким образом, чтобы печатать "Motion Detected" только каждый раз, когда движение обнаружено после того, как оно ранее не было обнаружено, вы хотели бы использовать этот код:

 def infinity():
    detected = False
    while True:
         if GPIO.input(sensor) == True:
              GPIO.output(buzzer, GPIO.HIGH)
              if not detected:
                  print("Motion Detected")
                  detected = True
              time.sleep(2)
              GPIO.output(buzzer, GPIO.LOW)
         else:
             detected = False
  

Таким образом, сбрасывается detected флаг каждый раз, когда движение не обнаружено.

Комментарии:

1. Сэр, как остановить дублирование инструкции в цикле for

2. Вы имеете в виду, что не хотите "Motion Detected" печатать? Я не понимаю, каковы ваши намерения. С помощью этого кода поведение должно быть следующим: проверьте, обнаружено ли движение. Если это так, активируется звуковой сигнал и "Motion Detected" выводится на печать, затем программа приостанавливается на 2 секунды. Через две секунды звуковой сигнал отключается, и движение проверяется снова. При обнаружении движения зуммер снова включается и "Motion Detected" снова печатается … и так далее. Он ведет себя так? Что бы вы хотели, чтобы он делал вместо этого?

3. Да, вы правы.. В первый раз, когда датчик обнаружит какое-либо движение, он напечатает «обнаружено движение», а во второй раз, если датчик обнаружит его, напечатает то же самое, но я хочу напечатать сообщение «Обнаружено движение» только один раз, даже если датчик обнаруживает движения неоднократно. Надеюсь, вы поняли мои сомнения

4. @srivenky Я отредактировал решение. Пожалуйста, не забудьте принять и поддержать его, если он сработал для вас, или прокомментировать здесь, чтобы уточнить или указать на ошибки.

5. Можете ли вы дать свой контактный номер! поскольку программа не работает, или вы можете связаться со мной, сам шривенький из ИНДИИ, свяжитесь со мной через WhatsApp: 7010307722. Я поддержал его.