alors que les conditions ne sont pas remplies en python
-
21-12-2019 - |
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()
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.