Вложенные циклы - оператор 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;
}
@eatsmypasta, 👍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
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
Я написал ответ на то, что, как я думаю, вы спрашиваете, но, пожалуйста, будьте более конкретными в своем вопросе. "работайте так, как я логически думаю, что это будет работать" Мы не можем видеть в вашей голове, поэтому мы не знаем, о чем вы думаете, как это должно работать. В каждом вопросе «не работает» вы должны четко указать, что вы ожидаете от кода и что он делает на самом деле. Таким образом, мы можем предоставить более качественные ответы., @chrisl