Добрый день! Нужна помощь! Я в этом деле только новичок, вот в проекте Бегущий огонек не могу разобраться с выражением int pin = FIRST_LED_PIN +( ms / 120) % 10; вот ms какое вообще число в себе содержит, зная, что функция millis возвращает количество миллисекунд, прошедших с момента включения или перезагрузки микроконтроллера, но все равно не понимаю. Вот полный скетч: #define FIRST_LED_PIN 2 #define LAST_LED_PIN 11 void setup() { for (int pin = FIRST_LED_PIN; pin <= LAST_LED_PIN; ++pin) pinMode(pin, OUTPUT); } void loop() { unsigned int ms = millis(); int pin = FIRST_LED_PIN + (ms / 120) % 10; digitalWrite(pin, HIGH); delay(10); digitalWrite(pin, LOW); }
Функция millis() каждую миллисекунду возвращает значение на 1 больше предыдущего, т.е. переменная ms каждую миллисекунду увеличивается на единицу. Переменная ms целочисленная, выражение ms/120 для нее означает целочисленное деление на 120, т.е. без дробной части. Вот эта скобка (ms/120) будет увеличиваться на 1 уже каждые 120 мс, здесь 120 есть время пробега огоньком одного светодиода. Выражение (ms/120)%10 дает остаток от целочисленного деления на 10, оно будет по кругу принимать значения 0..9, каждое следующее через 120 мс, это число есть номер светодиода в линейке, а 10 здесь - это количество светодиодов. Дальше делаем маленький фокус: подключаем все светодиоды по порядку начиная с FIRST_LED_PIN, в примере это пин 2. Теперь, если мы добавим к номеру светодиода номер первого пина, соответствующего крайнему светодиоду, то мы получим номер пина, который в этот момент должен быть в HIGH, чтобы светодиод горел. Включаем полученный пин, ждем 10мкс, выключаем. Т.к. функция loop() выполняется очень быстро, моргания светодиода мы не видим.
120 - общее время горения отдельного светодиода. 10 - количество светодиодов. %10 - перебор с 0 до 9 С учетом, что FIRST_LED_PIN = 2, то последовательно выдается сигнал на пины со 2-го по 12. Время управления каждым 120мс, потом переводят на другой. Вместо delay(10); лучше, наверное, написать delay(120); чтобы не было 12 включений-выключений за цикл управления. Не успел