#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. Я поддержал его.