Плавное включение и выключение адресных светодиодов

Тема в разделе "Arduino & Shields", создана пользователем Arturka43, 14 июл 2020.

  1. Arturka43

    Arturka43 Нуб

    Приветствую всех, прошу помощи. Планирую сделать светодиодную подсветку ног в автомобиль с помощью адресной ленты ws2812, написал код для ардуино, но столкнулся с проблемой - не могу заставить включаться постепенно + плавная смена цвета + плавное выключение. Смотрел интернет, описание библиотеки на GitHub, но не хватает знаний. Буду благодарен за любой пример как надо правильно делать и за любую помощь.

    Код (C++):
    #include <FastLED.h>

    #define NUM_LEDS 40 //Количество светодиодов
    #define DATA_PIN 10

    CRGB leds[NUM_LEDS];

    void setup() {
      FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);
      pinMode(10, OUTPUT);
      pinMode(4, INPUT);
      pinMode(6, INPUT);
      pinMode(7, INPUT);
      pinMode(12, INPUT);
      pinMode(9, INPUT);

      digitalWrite(10, 0);
    }

    void loop() {
      boolean button5 = digitalRead(4); // + от габаритов
      boolean button6 = !digitalRead(6); //левая перед
      boolean button7 = !digitalRead(7); //правая перед
      boolean button8 = !digitalRead(12); //правая зад
      boolean button9 = !digitalRead(9); //левая зад

      if (button6 == 1) // если есть условная "1" при открытии двери - зажигаем водительскую сторону белым цветом
          for (int i = 0; i < NUM_LEDS / 4; i++); {
            leds[i] = CHSV( 0, 0, 200);
            FastLED.show();
            delay(50);
          }
          else if (button5 == 1) // иначе  проверяем 1 на габаритах, если есть, то зажигаем красным.
            for (int i = 0; i < NUM_LEDS / 4; i++) {
              leds[i] = CHSV( 0, 255, 100);
              FastLED.show();
              delay(0);
            }
          else
            for (int i = 0; i < NUM_LEDS / 4; i++) { //если везде по 0 - заливаем чёрным.
              leds[i] = CRGB::Black;
              leds[i].nscale8( 192);
              FastLED.show();
              delay(50);
            }

          if (button7 == 1) // если есть условная "1" при открытии двери - зажигаем пассажирскую сторону белым цветом
            for (int i = NUM_LEDS / 4; i < NUM_LEDS * 2 / 4; i++) {
              leds[i] = CHSV( 0, 0, 200);
              FastLED.show();
              delay(10);
            }
          else if (button5 == 1) // иначе  проверяем 1 на габаритах, если есть, то зажигаем красным
            for (int i = NUM_LEDS / 4; i < NUM_LEDS * 2 / 4; i++) {
              leds[i] = CHSV( 0, 255, 100);
              FastLED.show();
              delay(0);
            }
          else
            for (int i = NUM_LEDS / 4; i < NUM_LEDS * 2 / 4; i++) { //если везде по 0 - заливаем чёрным.
              leds[i] = CRGB::Black;
              FastLED.show();
              delay(0);
            }

          if (button8 == 1) // если есть условная "1" при открытии двери - зажигаем заднюю правую сторону белым цветом
            for (int i = NUM_LEDS * 2 / 4; i < NUM_LEDS * 3 / 4; i++) {
              leds[i] = CHSV( 0, 0, 200);
              FastLED.show();
              delay(0);
            }
          else if (button5 == 1) // иначе  проверяем 1 на габаритах, если есть, то зажигаем красным
            for (int i = NUM_LEDS * 2 / 4; i < NUM_LEDS * 3 / 4; i++) {
              leds[i] = CHSV( 0, 255, 100);
              FastLED.show();
              delay(0);
            }
          else
            for (int i = NUM_LEDS * 2 / 4; i < NUM_LEDS * 3 / 4; i++) { //если везде по 0 - заливаем чёрным.
              leds[i] = CRGB::Black;
              FastLED.show();
              delay(10);
            }

          if (button9 == 1) // если есть условная "1" при открытии двери - зажигаем заднюю левую сторону белым цветом
            for (int i = NUM_LEDS * 3 / 4; i < NUM_LEDS; i++) {
              leds[i] = CHSV( 0, 0, 200);
              FastLED.show();
              delay(0);
            }
          else if (button5 == 1) // иначе  проверяем 1 на габаритах, если есть, то зажигаем красным
            for (int i = NUM_LEDS * 3 / 4; i < NUM_LEDS; i++) {
              leds[i] = CHSV( 0, 255, 100);
              FastLED.show();
              delay(0);
            }
          else
            for (int i = NUM_LEDS * 3 / 4; i < NUM_LEDS; i++) { //если везде по 0 - заливаем чёрным.
              leds[i] = CRGB::Black;
              FastLED.show();
              delay(0);
            }
        }
     
  2. Un_ka

    Un_ka Гуру

    Это будут отдельные действия. Включение и выключение в цикле for с изменением яркости и задержкой. Плавная смена цвета (по радуге?) В цикле while.
    Правильный подход! В HSV цветовом пространстве это сделать легче всего.
     
    Arturka43 нравится это.
  3. b707

    b707 Гуру

    Arturka43, покажите, где вы пытались сделать плавное включение. в вашем коде его нет
     
  4. parovoZZ

    parovoZZ Гуру

    Адресные в автомобиле работать не будут.
     
  5. SergeiL

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

    Совсем? :)
     
  6. b707

    b707 Гуру

    это он про свою машину, наверно.
     
    SergeiL нравится это.
  7. Airbus

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

    Почему?
     
  8. parovoZZ

    parovoZZ Гуру

    самое уязвимое место - это шина управления между светодиодами. Выходной и входной импедансы не так малы, чтобы сопротивляться помехам от наводок. Чтобы это всё как-то работало, необходимо светодиоды постоянно обновлять, даже если не меняется вообще ничего.
     
  9. Un_ka

    Un_ka Гуру

    Они же не будут возле проводов идущих к стартеру.
     
  10. SergeiL

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

    Не обращай внимания,
    @parovoZZ - теоретик, у него машина виртуальная ;)
     
  11. b707

    b707 Гуру

    не, ну в чем-то он наверно прав - если контроллер под капотом, а адресная лента в стопарях - наводки будут. Но если разместить контроллер прямо на ленте - думаю все не так страшно.

    Хотя сразу скажу - лично не проверял.
     
  12. SergeiL

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

    Про экранированный провод никто не слышал? :)
    Еще ни разу не сталкивался с наводками на практике.
    Что-то делаю не так как все? :)
     
  13. parovoZZ

    parovoZZ Гуру

    Стартер не при чём. У мена по периметру комнаты лента из 450 светодиодов. Так вот на искру от близлежащего выключателя они реагируют произвольными белыми вспышками. Причём реагируют те, которые ближе.
     
  14. DetSimen

    DetSimen Гуру

    Шапочку им надо. Из фольги.
     
    Andrey12 нравится это.
  15. ANV

    ANV Гуру

    На дорогу смотреть надо, а не на педали:D
     
  16. parovoZZ

    parovoZZ Гуру

    За весь опыт вождения авто был всего один случай, когда мозг потерял связь с ногой. Еду и размышляю: а на какой сука педали нога??? Благо это было во дворе и ехал на холостых. Чуть утопил педаль и ситуация перешла под полный контроль)
     
  17. Un_ka

    Un_ka Гуру

    Можете заснять? Очень интересно.:cool: @SergeiL наконец-то встретится с этим явлением.
     
    SergeiL нравится это.
  18. SergeiL

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

    Это будет как не нужно делать от @parovoZZ ? :)
     
  19. parovoZZ

    parovoZZ Гуру

    А как нужно? Ленту в экран поместить? Так это не сильно помогает от магнитных помех. Только от электрических. Причём электрические волны не будут проникать вовнутрь, но и изнутри тоже не вылезут.
     
  20. Arturka43

    Arturka43 Нуб

    Я читал описание библиотеки, пробовал вставлял код - не получалось. Поэтому код выложил без них. На выходных ещё раз попробую и скину код.

    Не дождался выходных, ниже код как пробовал. Проблема в том, что светодиоды включаются плавно, потом сразу выключаются плавно и так 10 раз, затем включаются (не плавно) и светодиоды выключаются последовательно (от 1 к 10). Что здесь не так? В программировании я если честно 0. Данный скетч писал по разным шаблонам/примерам

    Код (C++):
    #include <FastLED.h>

    #define NUM_LEDS 40 //Количество светодиодов
    #define DATA_PIN 10

    CRGB leds[NUM_LEDS];

    void setup() {
      FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);
      pinMode(10, OUTPUT);
      pinMode(4, INPUT);
      pinMode(6, INPUT);
      pinMode(7, INPUT);
      pinMode(12, INPUT);
      pinMode(9, INPUT);

      digitalWrite(10, 0);
    }

    void smooth_lighting(byte count) {
        for (int i = 0; i < 256; i++) {
          fill_solid(&leds[i], i < NUM_LEDS / 4, CHSV(0, 0, 100));
          LEDS.show(i);
          delay(5);
        }
        for (int i = 255; i >=0; i--) {
          LEDS.show(i);
          delay(5);
        }
      }


    void loop() {
      boolean button5 = digitalRead(4); // + от габаритов
      boolean button6 = !digitalRead(6); //левая перед
      boolean button7 = !digitalRead(7); //правая перед
      boolean button8 = !digitalRead(12); //правая зад
      boolean button9 = !digitalRead(9); //левая зад

      if (button6 == 1) // если есть условная "1" при открытии двери - зажигаем водительскую сторону белым цветом
          for (int i = 0; i < NUM_LEDS / 4; i++) {
            smooth_lighting(1);
            FastLED.show();      
          }
          else if (button5 == 1) // иначе  проверяем 1 на габаритах, если есть, то зажигаем красным
            for (int i = 0; i < NUM_LEDS / 4; i++) {
              leds[i] = CHSV( 0, 100, 100);
              FastLED.show();
              delay(50);
            }
          else
            for (int i = 0; i < NUM_LEDS / 4; i++) { //если везде по 0 - заливаем чёрным.
              leds[i] = CHSV( 0, 0, 0);
              FastLED.show();
              delay(50);
            }

          if (button7 == 1) // если есть условная "1" при открытии двери - зажигаем пассажирскую сторону белым цветом
            for (int i = NUM_LEDS / 4; i < NUM_LEDS * 2 / 4; i++) {
              leds[i] = CHSV( 0, 0, 100);
              FastLED.show();
              delay(50);
            }
          else if (button5 == 1) // иначе  проверяем 1 на габаритах, если есть, то зажигаем красным
            for (int i = NUM_LEDS / 4; i < NUM_LEDS * 2 / 4; i++) {
              leds[i] = CHSV( 0, 100, 100);
              FastLED.show();
              delay(50);
            }
          else
            for (int i = NUM_LEDS / 4; i < NUM_LEDS * 2 / 4; i++) { //если везде по 0 - заливаем чёрным.
              leds[i] = CHSV( 0, 0, 0);
              FastLED.show();
              delay(50);
            }

          if (button8 == 1) // если есть условная "1" при открытии двери - зажигаем заднюю правую сторону белым цветом
            for (int i = NUM_LEDS * 2 / 4; i < NUM_LEDS * 3 / 4; i++) {
              leds[i] = CHSV( 0, 0, 100);
              FastLED.show();
              delay(50);
            }
          else if (button5 == 1) // иначе  проверяем 1 на габаритах, если есть, то зажигаем красным
            for (int i = NUM_LEDS * 2 / 4; i < NUM_LEDS * 3 / 4; i++) {
              leds[i] = CHSV( 0, 100, 100);
              FastLED.show();
              delay(50);
            }
          else
            for (int i = NUM_LEDS * 2 / 4; i < NUM_LEDS * 3 / 4; i++) { //если везде по 0 - заливаем чёрным.
              leds[i] = CHSV( 0, 0, 0);
              FastLED.show();
              delay(50);
            }

          if (button9 == 1) // если есть условная "1" при открытии двери - зажигаем заднюю левую сторону белым цветом
            for (int i = NUM_LEDS * 3 / 4; i < NUM_LEDS; i++) {
              leds[i] = CHSV( 0, 0, 100);
              FastLED.show();
              delay(50);
            }
          else if (button5 == 1) // иначе  проверяем 1 на габаритах, если есть, то зажигаем красным
            for (int i = NUM_LEDS * 3 / 4; i < NUM_LEDS; i++) {
              leds[i] = CHSV( 0, 100, 100);
              FastLED.show();
              delay(50);
            }
          else
            for (int i = NUM_LEDS * 3 / 4; i < NUM_LEDS; i++) { //если везде по 0 - заливаем чёрным.
              leds[i] = CHSV( 0, 0, 0);
              FastLED.show();
              delay(50);
            }
    }
     
    Последнее редактирование: 17 июл 2020