В уроке «Программирование Arduino урок 3 — цикл for», мы узнали, как использовать цикл «for» для организации работы контроллера. Этот тип цикла используется повсеместно и с лихвой перекрывает «потребность в зацикленных операциях». Однако существует еще один тип цикла - «while». Цикл while ничем не лучше, чем цикл for, просто он использует в работе другие принципы.
В большинстве случаем можно выбирать, какой из двух типов циклов использовать. В уроке 14 мы использовали «while» для приостановки программы, до момента введения пользователем требуемых данных. В этом уроке мы более подробно рассмотрим, как работают этот цикл на примере платформы Arduino.
Продолжим работу со схемой, состоящую из 2-х светодиодов.
Кроме того, мы продолжим работать с кодом, который мы дорабатывали в 14 уроке.
Назад в прошлое: контроллер запрашивает у пользователя данные, ожидает ввода, а затем присваивает полученные значения переменным blinkNumberGreen и blinkNumberRed. Это позволяет пользователю управлять количество миганий каждого из 2-х светодиодов.
Для расширения мировоззрения программиста, стоит научиться использовать два типа циклов для реализации одних и тех же задач, а в дальнейшем уже можно демонстрировать симпатии к тому либо иному типу.
Давайте разбираться, как это работает:
int z = 1 ; // объявляем переменную и присваиваем ей значение 1
while (z<=10) { //запускаем цикл while
Serial.println(z); //выводим текущее значение переменной z через последовательный порт
z=z+1 // увеличиваем значение переменной z на 1
} // завершаем цикл
Цикл while будет продолжать выполнять команды до тех пор, пока «условие», описанное в круглых скобках, истинно. В приведенном выше примере, цикл будет продолжать выполнять команды пока z меньше или равно 10. В теле цикла отрабатываются 2 команды:
- Выведение значения переменной через последовательный порт;
- Увеличение значение переменной на 1 (по-научному – инкрементирование).
Благодаря увеличению значения переменной, в конечном итоге, программа выйдет из цикла. Если, представить на секунду, что мы забыли указать эту строку или произойдёт, какой-то сбой, то программа благополучно зациклится (иными словами зависнет).
Цикл начинает свою работу с того, что проверяет истинность условия. Если, z меньше или равно 10, то программа отрабатывает цикл. Затем следует повторная проверка условия и т.д. Когда значение переменной достигнет z = 11, условие больше не будет истинным. Программа не отработает цикл и перейдёт в следующую строку, идущую сразу после фигурной скобки цикла.
Достаточно теории, переходим к практике. Заменим циклы for в исходном коде, на циклы while.
Мигалка в исполнении цикла FOR:
for (int i = 1; i <= blinkNumberGreen; i++) // запускаем цикл for
{
Serial.print (" Зелёный мигнул ");
Serial.println (i);
digitalWrite (greenLed, HIGH); //включаем зелёный светодиод
delay (timeOnGreenLed); //ждём
digitalWrite (greenLed, LOW); //выключаем зелёный светодиод
delay (timeOffGreenLed); //ждём
}
Мигалка в исполнении цикла WHILE:
int i=1; //объявляем переменную и присваиваем ей значение 1
while (i <= blinkNumberGreen)
{ //запускаем цикл while
Serial.print (" Зелёный мигнул ");
Serial.println(i);
digitalWrite(greenLed,HIGH); //включаем зелёный светодиод
delay(timeOnGreenLed); //ждём
digitalWrite(greenLed,LOW); //выключаем зелёный светодиод
delay(timeOffGreenLed); //ждём
i=i+1 //увеличиваем значение переменной на 1
}
Сохраняем программу и загружаем прошивку в контроллер. Смотрим на результат.
lesson_15
Продолжение следует…