Question

Eh bien, j'essaie de développer une alarme domestique qui prend des photos en fonction des retours reçus d'un module PIR (en utilisant Raspberry Pi et ses GPIO).

Le problème est le suivant.Lorsque le PIr est déclenché, prend 5 photos, puis passe à une fonction qui reste à rechercher un autre déclencheur pendant les 5 secondes suivantes OU jusqu'à ce qu'il soit à nouveau déclenché.

Il ne s'éteint que si les 5 secondes se sont écoulées (time.time() < start + secs) et qu'aucun mouvement n'est détecté (Curren_State reste == 0)

Bloc de code avec lequel j'ai des problèmes :

#secs is received as a parameter (let's say the integer 5)

while time.time() < start + secs or not Current_State==True:
    Current_State = GPIO.input(GPIO_PIR)
    if Current_State==1:
        takePics(3)

LE PROBLÈME:Quand je fais cette condition (sans le OU) :

while time.time() < start + secs:
     #CODE

Le script semble fonctionner normalement :si les 5 secondes se sont écoulées, il s'éteint.Mais si j'ajoute à la condition while (*ou non Current_State==True*), cela ne répond tout simplement pas à la première condition puisque j'affiche dans chaque boucle la comparaison de temps temps() et début + secondes et je vois que le premier est plus gros que le second et continue d'exécuter le while.

Je suis donc encore en train de développer le code mais le code ressemble plus ou moins à ceci.Au cas où le code suivant ne serait pas bien résumé : http://pastebin.com/0xP4Le1U

# Import required Python libraries

# Here I define GPIO stuff

# Photo dimensions and rotation

# global variables
Current_State=0
Previous_State=0


def takePics(nPics):
    #Here I take pics

def reCheck:
    global Current_State, alert

    alert=0
    start = time.time()
    Current_State = 0

    while time.time() < start + secs or not Current_State==True:
        Current_State = GPIO.input(GPIO_PIR)
        if Current_State==1:
            takePics(3)

            #If there's no movement, this alert remains =0 
            #and will exit the "while" from which it was called 
            alert=1

#Here I have more functions like sendEmail and so on

def main():
    #main code

    while True:

         #SOME CODE

         if Current_State==1 and Previous_State==0:
            print "----> Motion detected!"

            Previous_State = 1
            alert=1

            #sendMail()
            switchLightON() # Switch on the light using the relay
            takePics(5)

            while alert==1:
                reCheck(4) # we check again in case movement was detected in reCheck

if __name__ == "__main__":
    main()
Était-ce utile?

La solution

Changement or à and.En option, envisagez de simplifier not Current_State==True à Current_State is not True ou juste not Current_State si Current_State est un booléen.

while time.time() < start + secs and Current_State is not True:
    Current_State = GPIO.input(GPIO_PIR)
    if Current_State==1:
        takePics(3)

Cela bouclera jusqu'à ce que soit secs les secondes se sont écoulées ou Current_State cesse d'être vrai.L'astuce est que while ne s'arrête que lorsque son état est FAUX. or est faux seulement si les deux les conditions sont fausses, and est faux si soit la condition est fausse.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top