С помощью выражения for мы организуем цикл со счетчиком. В данном случае для настройки портов на выход. Чтобы сделать такой цикл, нужно:
Инициализировать переменную-счетчик, присвоив ей первоначальное значение. В нашем случае:int pin = FIRST_LED_PIN
Указать условие, до достижения которого будет повторяться цикл. В нашем случае: pin <= LAST_LED_PIN
Определить правило, по которому будет изменяться счетчик. В нашем случае ++pin (см. ниже об операторе ++).
Например, можно сделать цикл for (int i = 10; i > 0; i = i - 1). В этом случае:
Переменной i присваивается значение 10
Это значение удовлетворяет условию i > 0
Поэтому блок кода, помещенный в цикл, выполняется первый раз
Значение i уменьшается на единицу, согласно заданному правилу, и принимает значение 9
Блок кода выполняется второй раз.
Всё повторяется снова и снова вплоть до значения i равного 0
Когда i станет равна 0, условие i > 0 не выполнится, и выполнение цикла закончится
Контроллер перейдет к коду, следующему за циклом for
Помещайте код, который нужно зациклить, между парой фигурных скобок {}, если в нем больше одной инструкции.
Переменная-счетчик, объявляемая в операторе for, может использоваться внутри цикла. Например, в данном эксперименте pin последовательно принимает значения от 2 до 11 и, будучи переданной вpinMode, позволяет настроить 10 портов одной строкой, помещенной в цикл.
Переменные-счетчики видны только внутри цикла. Т.е. если обратиться к pin до или после цикла, компилятор выдаст ошибку о необъявленной переменной.
Конструкция i = i - 1 в пояснении выше не является уравнением! Мы используем оператор присваивания = для того, чтобы в переменную i поместить значение, равное текущему значению i, уменьшенному на 1.
Выражение ++pin — это т.н. оператор инкремента, примененный к переменной pin. Эта инструкция даст тот же результат, что pin = pin + 1
Аналогично инкременту работает оператор декремента--, уменьшающий значение на единицу. Подробнее об этом в статье про арифметические операции.
Тип данных unsigned int используют для хранения целых чисел без знака, т.е. тольконеотрицательных. За счет лишнего бита, который теперь не используется для хранения знака, мы можем хранить в переменной такого типа значения до 65 535.
Функция millis возвращает количество миллисекунд, прошедших с момента включения или перезагрузки микроконтроллера. Здесь мы используем ее для отсчета времени между переключениями светодиодов.
С помощью выражения (ms / 120) % 10 мы определяем, который из 10 светодиодов должен гореть сейчас. Перефразируя, мы определяем какой отрезок длиной в 120 мс идет сейчас и каков его номер внутри текущего десятка. Мы добавляем порядковый номер отрезка к номеру того порта, который в текущем наборе выступает первым.
То, что мы гасим светодиод с помощью digitalWrite(pin, LOW) всего через 10 мс после включения не заметно глазу, т.к. очень скоро будет вновь вычислено, какой из светодиодов включать, и он будет включен — только что погашенный или следующий.