Последовательное включение светодиодов с различной задержкой

Тема в разделе "Arduino & Shields", создана пользователем дядя Саша, 12 мар 2017.

  1. Прошу помощи уважаемые форумчане! Имеется Ard-UNO, которое включает последовательно 11 светодиодов, но с одинаковой задержкой, программу брал в интернете, все работает. Но нужно, что бы они загорались так же поочередно и можно было бы регулировать задержку между диодами, независимо друг от друга. Это возможно? В программировании не силен, на 6-ом десятке лет плохо идет процесс обучения. Направьте на путь истинный пожалуйста.
     
  2. Tomasina

    Tomasina Сушитель лампочек Модератор

    где ваш код?
     
  3. Вот он.
    byte i; // задаем переменную для цифровых выходов
    byte LedMax = 13; // максимальное количество выходов (диодов)

    void setup() {

    // задаем пины со 2 по 13, как выходы (OUTPUT)

    for(i=2; i<LedMax; i++) {
    pinMode(i, OUTPUT);
    }

    }

    void loop() {
    // последовательно зажигаем светодиоды с 2 по 13 выход

    for(i=2; i<LedMax; i++) {
    digitalWrite(i, HIGH);
    delay(5000);
    }

    delay(1000); // ставим паузу в 1 секунду

    }
    Там дальше продолжение было, они гасли в обратной последовательности. Но это мне не надо и код отсек лишний. А надо чтоб зажглись и так все и осталось. М.б. и
    delay(1000); // ставим паузу в 1 секунду тоже лишнее. Ну вот так как то.
     
  4. Tomasina

    Tomasina Сушитель лампочек Модератор

    Код (C++):
    // количество светодиодов
    const byte numLeds = 12;

    // массив0 с номерами пинов, к которым подключены светодиоды
    const byte ledPin[numLeds] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}; // порядок может быть не последовательным

    // массив1 с длительностью свечения для каждого светодиода, мсек
    const unsigned int duration[numLeds] = {50, 100, 150, 200, 250, 300, 350, 400, 450, 500, 550, 600};

    // массив2 с длительностью паузы перед включением следующего светодиода, мсек
    const unsigned int pause[numLeds] = {100, 300, 100, 300, 0, 0, 0, 0, 500, 500, 0, 250};

    void setup()
    {
      // задаем пины из массива0, как выходы (OUTPUT)
      for (byte i = 0; i < numLeds; i++) pinMode(ledPin[i], OUTPUT);
    }

    void loop()
    {
      // зажигаем светодиоды на заданную в массиве1 длительность, потом гасим и сразу зажигаем следующий
      for (byte i = 0; i < numLeds; i++)
      {
        digitalWrite(ledPin[i], HIGH);
        delay(duration[i]);
        digitalWrite(ledPin[i], LOW);
      }

      // последовательно гасим все
      for (byte i = 0; i < numLeds; i++)
      {
        digitalWrite(ledPin[i], LOW);
        delay(80);
      }

      // зажигаем светодиод, потом ждем заданную в массиве2 паузу и зажигаем следующий
      for (byte i = 0; i < numLeds; i++)
      {
        digitalWrite(ledPin[i], HIGH);
        delay(pause[i]);
        digitalWrite(ledPin[i], LOW);
      }

      // последовательно гасим все, в обратном порядке
      delay(500);
      for (byte i = 0; i < numLeds; i++)
      {
        digitalWrite(numLeds - ledPin[i], LOW);
        delay(100);
      }

      while(1);  // тупим и больше ничего не делаем до нажатия Reset
    }
     
  5. Tomasina огромное спасибо!!! Сегодня вечером загружу в свое железо и обязательно отпишусь.
     
  6. Tomasina, все работает, только немного поменял состояние "высокое! на "низкое", что бы предыдущий не гаснул и задержки поменял. А так все здорово! В личку номер тлф скинь, счет немного пополню, выручил сильно, может еще обращюсь. Учить буду С++...:-(
    // количество светодиодов
    const byte numLeds = 12;

    // массив0 с номерами пинов, к которым подключены светодиоды
    const byte ledPin[numLeds] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}; // порядок может быть не последовательным

    // массив1 с длительностью свечения для каждого светодиода, мсек
    const unsigned int duration[numLeds] = {5000, 1000, 1500, 2000, 2500, 3000, 3500, 4000, 4500, 5000, 5500, 6000};

    // массив2 с длительностью паузы перед включением следующего светодиода, мсек
    const unsigned int pause[numLeds] = {1000, 3000, 1000, 3000, 1000,1000, 1000, 1000, 5000, 5000, 1000, 2500};

    void setup()
    {
    // задаем пины из массива0, как выходы (OUTPUT)
    for (byte i = 0; i < numLeds; i++) pinMode(ledPin, OUTPUT);
    }

    void loop()
    {

    // зажигаем светодиод, потом ждем заданную в массиве2 паузу и зажигаем следующий
    for (byte i = 0; i < numLeds; i++)
    {
    digitalWrite(ledPin, HIGH);
    delay(pause);
    digitalWrite(ledPin,HIGH);
    }

    // последовательно гасим все, в обратном порядке
    delay(5000);
    for (byte i = 0; i < numLeds; i++)
    {
    digitalWrite(numLeds - ledPin, LOW);
    delay(10);
    }

    while(1); // тупим и больше ничего не делаем до нажатия Reset
    }
     
  7. Tomasina

    Tomasina Сушитель лампочек Модератор

    тогда вот это лишнее, оно повторно включает уже включенный светодиод:
    Код (C++):
    digitalWrite(ledPin,HIGH);
    delay(pause);
    digitalWrite(ledPin,HIGH);  // вот это лишнее
    Поможешь советом следующему новичку, это сплачивает сильнее ;)
     
  8. Принял. Новичкам тяжко осваивать, но без этого (учебы) никак. Спрошу еще пару вопросов, наберусь наглости.
    Мне на базе этого скетча нужно чтоб первый светодиод погас через 5 сек. и больше не включался, а третий включился, после второго (второй не гаснет), поморгал в течении 3 сек с частотой 4-5Гц (0.2-0.25 сек.) и тоже отрубился. Остальные как и в программе дальше отработали друг за другом. Можно конечно поставить две линии задержки + мультивибратор, если программно сложно будет реализовать. Что подскажите?
     
    Последнее редактирование: 14 мар 2017
  9. Подскажите пожалуйста, что нужно добавить в код (пост №4), чтобы с выводов 11, 12, 13 пропал высокий уровень. С 2 по 10 все в норме, но надо все их загасить.