Помогите разобраться(переделка скетча_p070_running_bar.ino)Решено

Тема в разделе "Arduino & Shields", создана пользователем Андрей77, 1 янв 2017.

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

    Jeremy Blum Нерд

    А в чём проблема?
     
    RGB-светодиод нравится это.
  3. В том ,что показывает тускло(индикаторы еле светятся)
     
  4. ZAZ-965

    ZAZ-965 Гуру

    Попробуйте увеличить время свечения светодиода, для секундного переключения 10 мс свечения мало
    Код (C++):
    digitalWrite(pin, HIGH);
    delay(200);
    digitalWrite(pin, LOW);
     
  5. Спасибо ,но не помогло. и Резисторы местами менял,и время разное ставил-че делать то?
    А оригинал(скетч из примера) залил и яркость зашибись,глаз радует
     
  6. Jedi

    Jedi Гик

    Помогу, но Вы бы могли и сами догадаться.
    Первое. В setup() совершенно необязательно выдумывать декремент, нет никакой разницы, в каком порядке объявлять пины выводами, только запутаться могли бы (и запутались). На loop() порядок объявления не влияет.
    Второе.
    Вот тут в Вашей формуле "int pin = LAST_LED_PIN - (ms / 1000) % 10;" есть отличие от примера, найдите его.
    millis() - время в миллисекундах с момента запуска платы, % - остаток от деления Х на Y, остальное - как в арифметике
     
    Последнее редактирование: 5 янв 2017
  7. С первым понятно,а изменение millis ? пробовал и 120, и 500 ставил,без разницы так же тускло светит.
    даже вот так уже(прикольно вышло):
    int pin = LAST_LED_PIN - (ms / 120) % 10;
    // включаем нужный светодиод на 10 миллисекунд, затем —
    // выключаем. На следующем проходе цикла он снова включится,
    // если гореть его черёд, и мы вообще не заметим отключения
    digitalWrite(pin, LOW);
    delay(10);
    digitalWrite(pin, HIGH);
    }
    - яркость по прежнему никакая(
    На самопальной ардуине сейчас попробую еще
     
    Последнее редактирование: 5 янв 2017
  8. Jedi

    Jedi Гик

    Вы уверены, что хотите знать ответ почему или все-таки сами разберетесь? Стыдно ведь будет ;)
     
  9. i7-4WaSobiw.jpg самопал тоже не помог(
     
  10. пофиг, просветите неуча)
     
  11. Jedi

    Jedi Гик

    Как хотите... Вспоминаем поговорку про то, что враг хорошего

    Как работает оператор цикла:
    Переменной pin присваивается начальное значение (LAST_LED_PIN = 11);
    Проверяется условие pin <= FIRST_LED_PIN (11 <= 2 ? );
    ПОКА условие НЕ ВЫПОЛНЯЕТСЯ, то выполняется тело цикла, после выполнения цикла в нашем случае производится декремент переменной (уменьшение на 1).
    Если условие ВЫПОЛНЯЕТСЯ, то тело цикла пропускается и передается управление следующему оператору в программе.
    У Вас 11 больше 2, цикл НЕ ВЫПОЛНЯЕТСЯ, все пины остались входами (по умолчанию они именно входы, но там есть и подтягивающий резистор). Вы их не переназначили.
    Что нужно сделать - догадаетесь? Поменяли направление счета цикла - меняйте и условие выхода
     
    Последнее редактирование: 5 янв 2017
  12. Спасибо что возитесь со мной,тока еще больше запутался.
    Вот к примеру попроще сделал:
    #define LED_PIN 2
    #define LED_PIN 11

    void setup()
    {

    for (int pin = 11; pin <= 2; --pin)
    pinMode(LED_PIN, OUTPUT);
    }

    void loop()
    {

    unsigned int ms = millis();

    int pin = 11 - (ms / 120) % 10;

    digitalWrite(pin, HIGH);
    delay(10);
    digitalWrite(pin, LOW);
    }
     
  13. Jedi

    Jedi Гик

    Издеваетесь? :)
    Поставьте себя на место компьютера :)
    У Вас 11 яблок, ПОКА у Вас будет яблок МЕНЬШЕ или равно двум, то бросайте их в авоську и бегите играть в футбол.
    Сколько времени Вы будете стоять с яблоками?
     
    Последнее редактирование: 5 янв 2017
  14. Сорри, непоменяный знак был
     
  15. Jedi

    Jedi Гик

    Говорил же... Стыдно будет :)
     
  16. Завтра уже додумывать буду, все равно чей-то не то получилось
     
  17. Спасибо ,сам бы когда еще допербы:)
     
  18. Jedi

    Jedi Гик

    for (int pin = LAST_LED_PIN; pin >= FIRST_LED_PIN; --pin) pinMode(pin, OUTPUT);
    //Выполнять до тех пор, пока pin начинается
    // с 11 (LAST_LED_PIN) и больше или равно 2 (FIRST_LED_PIN).
    //После выполнения каждого круга уменьшить pin на 1

    и другой вариант, тоже рабочий

    for (int pin = FIRST_LED_PIN; pin <= LAST_LED_PIN; ++pin) pinMode(pin, OUTPUT);
    //Выполнять до тех пор, пока pin начинается
    // с 2 (FIRST_LED_PIN) и меньше или равно 11 (LAST_LED_PIN).
    //После выполнения каждого круга увеличить pin на 1
     
    Андрей77 нравится это.
  19. Как правильно вы заметили выше: все эти FIRST_LED_PIN и LAST_LED_PIN - только путают .
    Поэтому лучше упростить несколько:
    #define LED_PIN 2
    #define LED_PIN 11

    void setup()
    {

    for (int pin = 11; pin >= 2; --pin)
    pinMode(pin, OUTPUT);
    }

    void loop()
    {

    unsigned int ms = millis();

    int pin = 11 - (ms / 500) % 10;

    digitalWrite(pin, HIGH);
    delay(200);
    digitalWrite(pin, LOW);
    }
    и допер все таки - почему яркости небыло,надо было просто в pinMode не LED_PIN, а pin
    указать.. и все дела:)
     
  20. Jedi

    Jedi Гик

    Вы сами себя запутали. В начале ветки возьмите свой собственный код и там у Вас и стоит pin. Единственное, что у Вас там неверно, так это условие выхода из цикла.