Глюк "Бегущий огонек"

Тема в разделе "Arduino & Shields", создана пользователем abakushkin, 2 авг 2014.

  1. abakushkin

    abakushkin Нуб

    Всем привет!

    Собрал задание "Бегущий огонек", запустилось хорошо, но через какое-то время на индикаторе начинаются глюки, сделал видео:


    Глюк начинается примерно с 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);
    }

    Подскажите - в чем может быть проблема?
    Спасибо!
     
  2. видимо из за переполнения переменной ms
     
  3. abakushkin

    abakushkin Нуб

    Прописать long?
     
  4. Unixon

    Unixon Оракул Модератор

    Да, ведь millis() и возвращает long.
     
  5. ИгорьК

    ИгорьК Гуру

    И не просто long, а unsigned long. В долгоиграющих проектах с этим можно влететь - получить такой же глюк, только не игрушечный.
     
    Unixon нравится это.
  6. Airbus

    Airbus Радиохулиган Модератор

    А что за телодвижение int pin = FIRST_LED_PIN + (ms / 120) % 10; и почему int ms = millis(); в void loop()?
     
  7. ИгорьК

    ИгорьК Гуру

    Это последовательный перебор пинов путем вычисления остатка от деления на 10 и сложения с первым. Обеспечивает постоянный цикл. Можно было бы через for или while но так круче.
    А с int здесь просто ошибочка.
     
  8. Sid

    Sid Нуб

    Поясните пожалуйста для новичка как прописывать Long и что делать с int?
     
  9. geher

    geher Гуру

    unsigned long int ms = millis();
     
  10. klimenkov

    klimenkov Нерд

    зачем millis в переменную сохранять, если нигде больше не используется?
    int pin = FIRST_LED_PIN + (millis()/ 120) % 10;
    так не проще?
     
    ZaikaBlogs нравится это.
  11. geher

    geher Гуру

    Проще.
    Но с сохранением в переменную в обучающем примере полезнее, для вящего понимания разрядности возвращаемого функцией millis, как мне представляется.
     
  12. Zel522

    Zel522 Нерд

    Вообще-то нежелательно в основном теле и тем более в цикле описывать переменные, неизвестно как память освобождается при переинициализации переменной, возможно переполнение памяти из-за мусора.