Всем привет! Собрал задание "Бегущий огонек", запустилось хорошо, но через какое-то время на индикаторе начинаются глюки, сделал видео: Глюк начинается примерно с 30 секунды и концу видео прекращается. Если перезагрузить Ардуино кнопкой - снова сначала все хорошо, а потом опять глюк. Код: #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() { int ms = millis(); int pin = FIRST_LED_PIN + (ms / 120) % 10; digitalWrite(pin, HIGH); delay(10); digitalWrite(pin, LOW); } Подскажите - в чем может быть проблема? Спасибо!
И не просто long, а unsigned long. В долгоиграющих проектах с этим можно влететь - получить такой же глюк, только не игрушечный.
А что за телодвижение int pin = FIRST_LED_PIN + (ms / 120) % 10; и почему int ms = millis(); в void loop()?
Это последовательный перебор пинов путем вычисления остатка от деления на 10 и сложения с первым. Обеспечивает постоянный цикл. Можно было бы через for или while но так круче. А с int здесь просто ошибочка.
зачем millis в переменную сохранять, если нигде больше не используется? int pin = FIRST_LED_PIN + (millis()/ 120) % 10; так не проще?
Проще. Но с сохранением в переменную в обучающем примере полезнее, для вящего понимания разрядности возвращаемого функцией millis, как мне представляется.
Вообще-то нежелательно в основном теле и тем более в цикле описывать переменные, неизвестно как память освобождается при переинициализации переменной, возможно переполнение памяти из-за мусора.