2 votes

Entrée continue pour choisir la boucle while en Python

Je suis sur Raspberry Pi et j'utilise Python. J'aimerais recevoir une entrée continue d'un capteur de distance et faire en sorte que la valeur de la distance détermine s'il faut ou non envoyer une sortie.

J'ai une fonction de sortie, gogo, et une fonction de détection, sense, qui met à jour la valeur de la distance.

J'aimerais que la sortie démarre lorsque la distance est inférieure à 20 et que la sortie s'arrête lorsque la distance atteint le seuil de 20, mais la seule solution que je vois est une autre boucle.

Mon code ne fonctionne pas et je pense qu'il y a une bonne solution, mais je ne connais pas bien les boucles.

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)

distance = 40.0

TRIG = 4
ECHO = 18

GPIO.setup(TRIG,GPIO.OUT)
GPIO.setup(ECHO,GPIO.IN)
GPIO.setup(23, GPIO.OUT)
GPIO.setup(24, GPIO.OUT)
GPIO.setup(25, GPIO.OUT)

def gogo(): 
    Motor1A = 23
    Motor1B = 24
    Motor1E = 25

    GPIO.setup(Motor1A,GPIO.OUT)
    GPIO.setup(Motor1B,GPIO.OUT)
    GPIO.setup(Motor1E,GPIO.OUT)

    print "Turning motor on"
    GPIO.output(Motor1A,GPIO.HIGH)
    GPIO.output(Motor1B,GPIO.LOW)
    GPIO.output(Motor1E,GPIO.HIGH)

def sense():
    GPIO.output(TRIG, True)
    time.sleep(0.00001)
    GPIO.output(TRIG, False)

    while GPIO.input(ECHO) == False:
        start = time.time()

    while GPIO.input(ECHO) == True:
        end = time.time()

    sig_time = end-start

#CM:
    distance = sig_time / 0.000058

#inches:
#distance = sig_time / 0.000148

    print('Distance: {} centimeters'.format(distance))

while distance > 20.0:
    print (distance)
    sense()
else:
    print (distance)
    gogo()
    sense()

GPIO.cleanup()

2voto

Mohammad Athar Points 1100

Le problème, c'est le champ d'application ; distance est constamment dans votre code principal 40. Il n'est mis à jour que dans sense()

Tout d'abord, modifions sense pour qu'il renvoie la valeur de la distance

def sense():
    GPIO.output(TRIG, True)
    time.sleep(0.00001)
    GPIO.output(TRIG, False)

    while GPIO.input(ECHO) == False:
        start = time.time()

    while GPIO.input(ECHO) == True:
        end = time.time()

    sig_time = end-start

#CM:
    distance = sig_time / 0.000058

#inches:
#distance = sig_time / 0.000148

    print('Distance: {} centimeters'.format(distance))
    return distance

vous devriez également créer une fonction qui éteint le moteur

il faut définir la distance, et faire une boucle qui s'exécute indéfiniment. pour l'instant, votre boucle ne s'exécute que jusqu'à ce que la distance soit inférieure à 20

distance = sense()
while True:
    if distance > 20:
        <call motor off function here>
        print (distance)
    else:
        print (distance)
        gogo()
    distance = sense() #now we're checking distance every cycle

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X