Поэтому блок кода, помещенный в цикл, выполняется первый раз
Значение 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 мс после включения не заметно глазу, т.к. очень скоро будет вновь вычислено, какой из светодиодов включать, и он будет включен — только что погашенный или следующий.