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

Это код:

def check_ultra():
    global arduinoSerialData, y, i, x
    while True:
        if arduinoSerialData.inWaiting() > 1:
            myData = arduinoSerialData.readline()
            myData = str(myData)
            myData = myData.replace("b'", '')
            myData = myData.replace("\\r\\n'", str(0))
            myData = myData.replace("\\r00.000", str(0))
            myData = myData.replace("\\r00.000", str(0))
            if "c" in myData:
                myData = myData.replace("c", str(0))

                if y == 1:
                    y = 3
                    if float(myData) > 15:
                        x = 0
                    return y, x
                else:
                    if float(myData) < 15 and float(myData) > 1:
                        y = 1
                        x = 0
                        return y, x
            elif "a" in myData:
                myData = myData.replace("a", str(0))
                if y == 2:
                    y = 3
                    if float(myData) > 15:
                        x = 0
                    return y, x
                else:
                    if float(myData) < 15 and float(myData) > 1:
                        y = 2
                        x = 0
                        return y, x
            else:
                y = 0
                return y


set_servo1_angle(0)
set_servo2_angle(90)
go_out_count = 0
m1 = 0
count = 3
y = 0
i = 0
x = 0
while y == None or y == 0 or x == 1:
    # i = 0
    # y = None
    check_ultra()
    if y == 1 and x == 0:
        print("1")
        sleep(2)
    elif y == 2 and x == 0:
        print('2')
        sleep(2)

В настоящее время он печатает 1 каждый раз, когда датчик 1 заблокирован, но затем завершает код. Я хочу сделать так, чтобы каждый раз, когда я блокирую датчик, он печатал соответствующий оператор печати, независимо от того, сколько раз я блокирую датчик. Я пытался добавить много переменных, чтобы помочь, но они не работали. Как сделать так, чтобы цикл повторялся?


person strilz    schedule 09.08.2020    source источник
comment
Значит, последний цикл заканчивается слишком рано? Мне кажется, что как только y==1 и x==0 цикл напечатается, а затем все условия while станут ложными, поэтому программа завершится. Сделайте этот последний цикл более похожим на while True:, если хотите, чтобы он продолжал повторяться.   -  person barny    schedule 09.08.2020
comment
Если я сделаю это пока правда, это будет продолжаться вечно, даже если датчики не сработают.   -  person strilz    schedule 10.08.2020
comment
Логика того, что вы хотите, совсем не ясна - пожалуйста, отредактируйте свой вопрос, чтобы объяснить, что именно вы на самом деле хотите, очень конкретно и четко указав условие, при котором программа должна выйти, и если она не выйдет ему придется зацикливаться или делать что-то еще.   -  person barny    schedule 10.08.2020


Ответы (2)


Ваш самый внешний цикл имеет следующее условие: y==None or y==0 or x==1. Операторы if в нем будут напечатаны только в том случае, если все эти условия равны False. Это означает, что цикл гарантированно завершится на первой распечатке.

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

while True:
    check_ultra()
    ...

Кстати, старайтесь избегать глобальных переменных. Они могут иметь непредсказуемые побочные эффекты, когда вы устанавливаете их в давно забытых местах, и обычно затрудняют поддержку кода. Вместо этого используйте аргументы и возвращаемые значения.

Например:

def check_ultra(arduinoSerialData, x, y):
    while True:
        if arduinoSerialData.inWaiting() > 1:
            myData = arduinoSerialData.readline()
            myData = str(myData)
            myData = myData.replace("b'", '')
            myData = myData.replace("\\r\\n'", str(0))
            myData = myData.replace("\\r00.000", str(0))
            myData = myData.replace("\\r00.000", str(0))
            if "c" in myData:
                myData = float(myData.replace("c", "0"))

                if y == 1:
                    if myData > 15:
                        return 0, 3
                    return x, 3
                elif 1 < myData < 15:
                        return 0, 1
                return x, y
            elif "a" in myData:
                myData = float(myData.replace("a", "0"))
                if y == 2:
                    if myData > 15:
                    return 0, 3
                elif 1 < myData < 15:
                    return 0, 2
                return x, y
            else:
                return x, 0

Вы бы назвали это как

x, y = check_ultra(arduinoSerialData, x, y)
person Mad Physicist    schedule 09.08.2020

Оператор break завершает цикл while, поэтому попробуйте заменить его на pass, например:

elif y == 2:
   print('2')
   pass
person Stefan J.    schedule 09.08.2020
comment
нет, пробовал, не помогло. Спасибо за помощь! - person strilz; 09.08.2020