Нужна помощь!!! Бегущий огонек

Тема в разделе "Флудилка", создана пользователем Plusinator56, 2 апр 2015.

  1. Plusinator56

    Plusinator56 Нуб

    Добрый день! Нужна помощь! Я в этом деле только новичок, вот в проекте Бегущий огонек не могу разобраться с выражением 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);
    }
     
    Последнее редактирование: 2 апр 2015
  2. Unixon

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

    running_light.png
     
    Последнее редактирование: 3 апр 2015
  3. Plusinator56

    Plusinator56 Нуб

    Блин, хоть убей, все равно не могу понять. Можешь пожалуйста подробно все изложить?
     
  4. Unixon

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

    Функция 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() выполняется очень быстро, моргания светодиода мы не видим.
     
    Tomasina нравится это.
  5. Unixon

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

    Короче говоря,
    Код (Text):
    int pin = PIN_FIRST_LED + (millis() / LED_PERIOD) % NUM_LEDS;
     
  6. Plusinator56

    Plusinator56 Нуб

    Вот теперь уже понятно. Спасибо тебе большое))
     
  7. X-Dron

    X-Dron Гик

    120 - общее время горения отдельного светодиода.
    10 - количество светодиодов. %10 - перебор с 0 до 9
    С учетом, что FIRST_LED_PIN = 2, то последовательно выдается сигнал на пины со 2-го по 12. Время управления каждым 120мс, потом переводят на другой.
    Вместо delay(10); лучше, наверное, написать delay(120); чтобы не было 12 включений-выключений за цикл управления.
    Не успел :)
     
    Последнее редактирование: 4 апр 2015
    Tomasina нравится это.
  8. Plusinator56

    Plusinator56 Нуб

    Спасибо:)