User 13166132 Ответов: 1

В то время как истинная петля питона


Я делаю датчик парковки с rasberry pi и python это код :
import RPi.GPIO as GPIO
import time
#from picamera import PiCamera
from time import sleep
from gpiozero import MotionSensor
import smtplib

sender = '*****@gmail.com'
reciever = '*****@gmail.com'

def BlueLED (): #Blue LED Function 

    GPIO.output(27, GPIO.HIGH)
    time.sleep(3)
    GPIO.output(27, GPIO.LOW)


def RedLED (): #Red LED Function

    GPIO.output(22,GPIO.HIGH)
    time.sleep(3)
    GPIO.output(22, GPIO.LOW)

def Buzzer (): #Buzzer Function 

    GPIO.output(17, GPIO. HIGH)
    time.sleep(3)
    GPIO.output(17, GPIO.LOW)


def email(sender,reciever,msg):
    try :
        server = smtplib.SMTP('smtp.gmail.com',587)
        server.ehlo()
        server.starttls()
        server.login(sender,'******')
        server.sendmail(sender,reciever,msg)
        server.close()

        print('Email sent!')

    except :
        print('Error')
    
try :

    GPIO.setmode(GPIO.BCM)
    #camera = PiCamera()
    pir = MotionSensor(4)
    GPIO.setwarnings(False)
    
    
    GPIO.setup(27, GPIO.OUT) #blueLED
    GPIO.setup(22, GPIO.OUT) #redLED
    GPIO.setup(17, GPIO.OUT) #buzzer
    GPIO.setup(18, GPIO.OUT) #tempsensor

    GPIO.setup(21, GPIO.IN, pull_up_down = GPIO.PUD_UP) #entry button

    count = 0

    while True :

        if (pir.motion_detected):
            print('Motion Detected')

            #Calling the buzzer function 
            #Buzzer()

            #The content that is going to be sent via email 

                       
            msg = """Subject : Car Park 

            (Picture) """

            email(sender,reciever,msg)

          
    

            print('\nPlease press the button for the gate to open')

         

            while True :

                if(GPIO.input(21) == False):
                    if (count < 5):
                        BlueLED()
                        print('\nThere are ',(5-count), ' parking spaces empty ')

                    else :
                        RedLED()
                        print('\nSorry but the parking is full')
                        
                    count = count + 1

                   

except Exception as ex :
    print('Error occured',ex)


Моя проблема заключается в том, что первый цикл while не работает, то есть если датчик движения срабатывает, ничего не происходит, но вы можете нажать кнопку, и количество увеличится. Я предполагаю, что есть простое решение этой проблемы, но оно, похоже, не приходит на ум. Буду рад вашей помощи, Спасибо

Что я уже пробовал:

Попробовал сначала нажать на кнопку и она заработала но была не так логична правильна на мой взгляд

Richard MacCutchan

Что "не работать" значит? Мы не можем видеть ваш экран, поэтому понятия не имеем, что здесь происходит или какую кнопку вы нажимаете.

0x01AA

Я не знаю python, но для меня это выглядит так, как будто вы должны разорвать внутренний цикл после RedLED(). Только предположение :)

[no name]

х

1 Ответов

Рейтинг:
1

Jochen Arndt

Как уже отмечалось 0x01AA:
Внутренний цикл while никогда не остается после того, как движение было обнаружено.

Если быть более точным:
Ваша внешняя петля работает и петляет до тех пор, пока не будет обнаружено движение. Тогда у вас есть еще один бесконечный цикл while, который предотвращает возврат к внешнему циклу.

Таким образом, вы должны удалить внутренний оператор while loop или оставить цикл с помощью перерыв[^] заявление.

Вы должны избегать использования бесконечных циклов без условий разрыва. При таком использовании вы можете использовать только один из них в приложении, потому что его можно оставить, только убив приложение.