Вложенные циклы - оператор if в цикле while

Я пробовал много вариантов кода, подобного этому, но не могу заставить его работать так, как я логически предполагал, что он будет работать. Я что-то упустил в синтаксисе или нарушил какие-то правила? Все работает независимо, но не вместе.

int switchS = 0;
int var = 1;   

void setup() {
    pinMode(1,INPUT);
    pinMode(7,OUTPUT);
    digitalWrite(7,LOW);
}

void loop() {  
    switchS = digitalRead(1);  
    while(var == 1)  
    {  
        digitalWrite(7,HIGH);  
        delay(100);  
        digitalWrite(7,LOW);  
        delay(100);  
        if(switchS == HIGH)  
        {  
            var = 0;  
        }  
    }  
    delay(5000);  
    var = 1;
}

, 👍1

Обсуждение

Я написал ответ на то, что, как я думаю, вы спрашиваете, но, пожалуйста, будьте более конкретными в своем вопросе. "работайте так, как я логически думаю, что это будет работать" Мы не можем видеть в вашей голове, поэтому мы не знаем, о чем вы думаете, как это должно работать. В каждом вопросе «не работает» вы должны четко указать, что вы ожидаете от кода и что он делает на самом деле. Таким образом, мы можем предоставить более качественные ответы., @chrisl


1 ответ


Лучший ответ:

1

Думаю, вы хотите, чтобы цикл while завершался, когда переключатель переходит в положение HIGH. (Вы не объяснили это в своем вопросе)

В настоящее время переменная switchS не может изменяться, пока код находится в цикле while. Переменная var изменяется только тогда, когда switchS имеет ВЫСОКОЕ значение. Итак, если switchS имеет НИЗКИЙ уровень в начале цикла while, у вас бесконечный цикл.

Вместо этого вы можете прочитать состояние переключателя внутри цикла while, а не за его пределами. Переменная switchS не будет автоматически отслеживать состояние переключателя. Вы должны явно прочитать это. Как этот вариант вашего кода:

int switchS = 0;
int var = 1;   

void setup() {
    pinMode(1,INPUT);
    pinMode(7,OUTPUT);
    digitalWrite(7,LOW);
}

void loop() {    
    while(var == 1)  
    {  
        digitalWrite(7,HIGH);  
        delay(100);  
        digitalWrite(7,LOW);  
        delay(100);
        switchS = digitalRead(1);  // Я переместил эту строку в цикле while, чтобы считывать переключатель на каждой итерации цикла
        if(switchS == HIGH)  
        {  
            var = 0;  
        }  
    }  
    delay(5000);  
    var = 1;
}

Примечание. Вы используете контакт 1 в качестве входного контакта. На Uno это последовательный контакт (UART), который используется для связи с ПК. Если у вас достаточно свободных контактов, вы не должны использовать контакты 0 и 1, чтобы не блокировать последовательную связь, если только она вам действительно не нужна и вы не знаете, что делаете.

,

Да, это то, что я пытался сделать, я как раз собирался уточнить, но вы уже ответили. Большое спасибо, не могу поверить, что пропустил это., @eatsmypasta

@eatsmypasta Пожалуйста, отметьте ответ., @the busybee