Запрос Do Loop не останавливается

Я новичок в программировании Arduino и хотел бы задать вопрос.

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

Я пытаюсь заставить три светодиода (красный, желтый, зеленый) зацикливаться 5 раз (в цикле выполнения).

Для этого я создал целочисленную переменную (x) и инициализировал ее значением 0.

Затем я каждый раз увеличиваю x на 1.

Однако я не могу заставить их прекратить цикл, когда x больше 5. Программа работает должным образом для всего остального (горит зеленый светодиод, подождите 1 секунду, горит желтый светодиод, подождите 1 секунду, горит красный светодиод, а затем зацикливается). ).

   //устанавливаем контакты светодиода
int greenPin = 13;
int yellowPin = 12;
int redPin = 11;

void setup()
{
  pinMode(greenPin, OUTPUT);      // устанавливает цифровой вывод в качестве выхода
  pinMode(yellowPin, OUTPUT);
  pinMode(redPin, OUTPUT);
}

void loop(){
int x = 0;

 do {
  digitalWrite(greenPin, HIGH);   // включает светодиод
  delay(1000);                  // ждем секунду
  digitalWrite(greenPin, LOW); 
  digitalWrite(yellowPin, HIGH);    // выключает светодиод
  delay(1000);
  digitalWrite(yellowPin, LOW);// ждем секунду
  digitalWrite(redPin, HIGH);    // выключает светодиод
  delay(1000);
  digitalWrite(redPin, LOW);
 }
   while(x<=5); {
    x = x + 1;
   }
}

, 👍0

Обсуждение

Переместите оператор приращения внутрь цикла do while, @chrisl


1 ответ


1

Крисл уже дал подсказку.

Однако, чтобы добавить комментарий с примером кода, я использую поле ответа.

В C у вас есть более или менее два типа циклов:

  • для
  • делать / пока

Во-первых, вы заранее знаете, сколько итераций у вас есть, во-вторых, когда это зависит от внешнего ввода (например, когда вы ожидаете значение, полученное из цикла).

В вашем случае лучше использовать цикл for, чтобы получить:

for (x = 0; x < 6; x++)
{
   ...
}

Что это значит?

  1. Инициализирует x значением 0 (первая часть оператора for)
  2. Проверяет условие x < 5' (вторая часть оператораfor). Если false, продолжается с первого оператора после телаfor` (после скобки }).
  3. Выполняет тело цикла (внутри скобок)
  4. Увеличивает x (третья часть инструкции for)
  5. Продолжается с 2

Также довольно часто условие включает начальный элемент диапазона (x = 0), но исключает конечный элемент диапазона (x < 6), поэтому оно выполняется в последний раз с x == 5.

,

Спасибо за ответы. Когда я изучаю это, я пытаюсь выполнить упражнение, подобное приведенному ниже: Зеленый светодиод горит Подождите 1 сек. Зеленый светодиод не горит Желтый светодиод горит Подождите 1 сек. Желтый светодиод не горит Красный светодиод горит.. Сделайте это в течение 5 итераций. В упражнении указано, что я должен использовать цикл do while. Поскольку я специально ограничен вышеуказанными условиями, @Mr Digs

@MrDigs хорошо, если у упражнения есть это ограничение, сделайте это. Просто в данном случае это не самый обычный способ. Вы можете попробовать оба варианта для себя, чтобы увидеть разницу, если у вас есть время., @Michel Keijzers