Эффекты для RGB ленты

Тема в разделе "Arduino & Shields", создана пользователем Максим B, 28 июн 2019.

  1. Максим B

    Максим B Гуру

    Всем привет.

    Помогите сделать простые эффекты для ленты:

    1. Восход солнца (плавный переход с плавного светло-желтового - в желтый)
    2. Закат ( переход с желтого в красный)
    3. Эффект дождя (меняется со светло-синего до темно-синего
    4. Эффект костра

    Хотя бы примерно. Исходный код который сейчас:

    Код (Text):

    //Управлениее RGB лентой (код из книги Блума)

    const int BLED=3;    //Blue LED on Pin 9
    const int GLED=6;   //Green LED on Pin 10
    const int RLED=5;   //Red LED on Pin 11
    const int BUTTON1=2;    //The Button is connected to pin 2
    const int BUTTON2=4;    //The Button is connected to pin 2


    boolean lastButton1 = LOW;    //Last Button State
    boolean currentButton1 = LOW; //Current Button State

    boolean lastButton2 = LOW;    //Last Button State
    boolean currentButton2 = LOW; //Current Button State


    int ledMode = 0;             //Cycle between LED states

    void setup()
    {
      pinMode (BLED, OUTPUT);   //Set Blue LED as Output
      pinMode (GLED, OUTPUT);   //Set Green LED as Output
      pinMode (RLED, OUTPUT);   //Set Red LED as Output
      pinMode (BUTTON1, INPUT);  //Set button as input (not required)
      pinMode (BUTTON2, INPUT);  //Set button as input (not required)
    }

    /*
    * Debouncing Function
    * Pass it the previous button state,
    * and get back the current debounced button state.
    */
    boolean debounce1(boolean last)
    {
      boolean current = digitalRead(BUTTON1);    //Read the button state
      if (last != current)                       //if it's different...
      {
        delay(5);                                  //wait 5ms
        current = digitalRead(BUTTON1);      //read it again
      }
      return current;                             //return the current value
    }

    boolean debounce2(boolean last)
    {
      boolean current = digitalRead(BUTTON2);    //Read the button state
      if (last != current)                       //if it's different...
      {
        delay(5);                                  //wait 5ms
        current = digitalRead(BUTTON2);      //read it again
      }
      return current;                             //return the current value
    }

    /*
    * LED Mode Selection
    * Pass a number for the LED state and set it accordingly
    */
    void setMode(int mode)
    {
      //RED
      if (mode == 1)
      {
        digitalWrite(RLED, HIGH);
        digitalWrite(GLED, LOW);
        digitalWrite(BLED, LOW);
      }
      //GREEN
      else if (mode == 2)
      {
        digitalWrite(RLED, LOW);
        digitalWrite(GLED, HIGH);
        digitalWrite(BLED, LOW);
      }
      //BLUE
      else if (mode == 3)
      {
        digitalWrite(RLED, LOW);
        digitalWrite(GLED, LOW);
        digitalWrite(BLED, HIGH);
      }
      //PURPLE (RED+BLUE)
      else if (mode == 4)
      {
        analogWrite(RLED, 127);
        analogWrite(GLED, 0);
        analogWrite(BLED, 127);
      }
      //TEAL (BLUE+GREEN)
      else if (mode == 5)
      {
        analogWrite(RLED, 0);
        analogWrite(GLED, 127);
        analogWrite(BLED, 127);
      }
      //ORANGE (GREEN+RED)
      else if (mode == 6)
      {
        analogWrite(RLED, 127);
        analogWrite(GLED, 127);
        analogWrite(BLED, 0);
      }
      //WHITE (GREEN+RED+BLUE)
      else if (mode == 7)
      {
        analogWrite(RLED, 85);
        analogWrite(GLED, 85);
        analogWrite(BLED, 85);
      }
      //OFF (mode = 0)
      else
      {
        digitalWrite(RLED, LOW);
        digitalWrite(GLED, LOW);
        digitalWrite(BLED, LOW);
      }
    }

    void loop()
    {
      currentButton1 = debounce1(lastButton1);  
      currentButton2 = debounce2(lastButton2);
      //read debounced state
      if (lastButton1 == LOW && currentButton1 == HIGH) //if it was pressed...
      {
        ledMode++;                                    //increment the LED value
      }
      lastButton1 = currentButton1;

      if (lastButton2 == LOW && currentButton2 == HIGH) //if it was pressed...
      {
        ledMode++;                                    //increment the LED value
      }
      lastButton2 = currentButton2;    

      //reset button value
      //if you’ve cycled through the different options, reset the counter to 0
      if (ledMode == 8) ledMode = 0;
      setMode(ledMode);                              //change the LED state
    }

     
    Эффекты есть на канале Гу***а - но там как-то сложно ))

    Использовать буду кнопок 6 или 8 на разных пинах (как джойстики). Так и плодить дальше debounce1, debounce2, ... debounce8? Спасибо.
     
  2. parovoZZ

    parovoZZ Гуру

    все эффекты надо создавать в пространстве HSV, а не RGB. У меня скоро будет статья по этому поводу.
     
    DetSimen нравится это.
  3. b707

    b707 Гуру

    Код для обычной RGB ленты, не адрессной. На такой никаких особо "эффектов" не сделаешь, вся лента всегда будет светится только одним цветом
     
  4. b707

    b707 Гуру

    в журнале Nature ? :) - не обижайся :)
    С интересом почитал бы.
     
  5. parovoZZ

    parovoZZ Гуру

    Bitch Electronic;//s
     
  6. otis

    otis Гик

    Как написали выше переходи на w2812. Можно делать экраны. Есть софт.
     
  7. Daniil

    Daniil Гуру

    А как сделать эффект костра? Хорошо что пояснили воходы/закаты/дождя, но как огонь сделать? Он же шумоподобный.
    Не, понятно, что если постараться то можно все описать математикой - вопрос, только, что такое "простой эффект костра", это как краску цвета кофе?
     
  8. otis

    otis Гик

    Открою секрет на лед экранах не кто не пишет софт. Все что ты перечислел делают на прогрммах для создания эффектов. Jinx Led Matrix control одна из них. Правда автор забросил ее с 2016года. Но она работает.
    Поэтому если это просто лента на шкафу или по потолку то в инете есть куча примеров на ардуино. А если у тебя 2812 и притом не лента а экран вот тут уже можно думать о дожде или о тетрисе.
     
  9. Максим B

    Максим B Гуру

    у алекса гу**а есть на канале
     
  10. Максим B

    Максим B Гуру

    мне проф не надо, так для ребенка - хоть через fade
     
  11. Airbus

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

    И что там сложного?Там как раз все разжевано.Даже ссылки есть что и где купить.
     
  12. Максим B

    Максим B Гуру

    Оно то, но там надо все ждать и заказывать, а сделал я сейчас. На счт подключения каждой кнопки (у меня их 3) - код получился вот такой:

    Код (Text):

    //2019 рабочая версия

    //Управлениее RGB лентой (код из книги Блума)

    // подключениее платы  смотри схему на http://wiki.amperka.ru/%D0%BA%D0%BE%D0%BD%D1%81%D0%BF%D0%B5%D0%BA%D1%82-arduino:%D0%BA%D0%BD%D0%BE%D0%BF%D0%BA%D0%B0  Схема с подтягивающим резистором

    const int BLED=3;    //Blue LED on Pin 9
    const int GLED=6;   //Green LED on Pin 10
    const int RLED=5;   //Red LED on Pin 11
    const int BUTTON1=2;    //The Button is connected to pin 2
    const int BUTTON2=8;    //The Button is connected to pin 2
    const int BUTTON3=9;    //The Button is connected to pin 2

    boolean lastButton1 = LOW;    //Last Button State
    boolean currentButton1 = LOW; //Current Button State

    boolean lastButton2 = LOW;    //Last Button State
    boolean currentButton2 = LOW; //Current Button State

    boolean lastButton3 = LOW;    //Last Button State
    boolean currentButton3 = LOW; //Current Button State

    int ledMode = 0;             //Cycle between LED states

    void setup()
    {
      pinMode (BLED, OUTPUT);   //Set Blue LED as Output
      pinMode (GLED, OUTPUT);   //Set Green LED as Output
      pinMode (RLED, OUTPUT);   //Set Red LED as Output
      pinMode (BUTTON1, INPUT);  //Set button as input (not required)
      pinMode (BUTTON2, INPUT);  //Set button as input (not required)
      pinMode (BUTTON3, INPUT);  //Set button as input (not required)
     
      pinMode (13, OUTPUT);
      pinMode (12, OUTPUT);
      pinMode (11, OUTPUT);
     
    }

    /*
    * Debouncing Function
    * Pass it the previous button state,
    * and get back the current debounced button state.
    */
    boolean debounce1(boolean last)
    {
      boolean current = digitalRead(BUTTON1);    //Read the button state
      if (last != current)                       //if it's different...
      {
        delay(5);                                  //wait 5ms
        current = digitalRead(BUTTON1);      //read it again
      }
      return current;                             //return the current value
    }

    boolean debounce2(boolean last)
    {
      boolean current = digitalRead(BUTTON2);    //Read the button state
      if (last != current)                       //if it's different...
      {
        delay(5);                                  //wait 5ms
        current = digitalRead(BUTTON2);      //read it again
      }
      return current;                             //return the current value
    }

    boolean debounce3(boolean last)
    {
      boolean current = digitalRead(BUTTON3);    //Read the button state
      if (last != current)                       //if it's different...
      {
        delay(5);                                  //wait 5ms
        current = digitalRead(BUTTON3);      //read it again
      }
      return current;                             //return the current value
    }

    /*
    * LED Mode Selection
    * Pass a number for the LED state and set it accordingly
    */
    void setMode(int mode)
    {
      //RED
      if (mode == 1)
      {
        digitalWrite(RLED, HIGH);
        digitalWrite(GLED, LOW);
        digitalWrite(BLED, LOW);
      }
      //GREEN
      else if (mode == 2)
      {
        digitalWrite(RLED, LOW);
        digitalWrite(GLED, HIGH);
        digitalWrite(BLED, LOW);
      }
      //BLUE
      else if (mode == 3)
      {
        digitalWrite(RLED, LOW);
        digitalWrite(GLED, LOW);
        digitalWrite(BLED, HIGH);
      }
      //PURPLE (RED+BLUE)
      else if (mode == 4)
      {
        analogWrite(RLED, 127);
        analogWrite(GLED, 0);
        analogWrite(BLED, 127);
      }
      //TEAL (BLUE+GREEN)
      else if (mode == 5)
      {
        analogWrite(RLED, 0);
        analogWrite(GLED, 127);
        analogWrite(BLED, 127);
      }
      //ORANGE (GREEN+RED)
      else if (mode == 6)
      {
        analogWrite(RLED, 127);
        analogWrite(GLED, 127);
        analogWrite(BLED, 0);
      }
      //WHITE (GREEN+RED+BLUE)
      else if (mode == 7)
      {
        analogWrite(RLED, 85);
        analogWrite(GLED, 85);
        analogWrite(BLED, 85);
      }
      //OFF (mode = 0)
      else
      {
        digitalWrite(RLED, LOW);
        digitalWrite(GLED, LOW);
        digitalWrite(BLED, LOW);
      }
    }

    void loop()
    {
     
      digitalWrite (13, HIGH); // включить светодиод
      digitalWrite (12, LOW); // включить светодиод
      digitalWrite (11, LOW); // включить светодиод

      currentButton1 = debounce1(lastButton1);  
      currentButton2 = debounce2(lastButton2);
      currentButton3 = debounce3(lastButton3);
      //read debounced state
      if (lastButton1 == LOW && currentButton1 == HIGH) //if it was pressed...
      {
        ledMode++;                                    //increment the LED value
      }
      lastButton1 = currentButton1;

      if (lastButton2 == LOW && currentButton2 == HIGH) //if it was pressed...
      {
        ledMode++;                                    //increment the LED value
      }
      lastButton2 = currentButton2;  

     if (lastButton3 == LOW && currentButton3 == HIGH) //if it was pressed...
      {
        ledMode++;                                    //increment the LED value
      }
      lastButton3 = currentButton3;    

      //reset button value
      //if you’ve cycled through the different options, reset the counter to 0
      if (ledMode == 8) ledMode = 0;
      setMode(ledMode);                              //change the LED state
    }


     
    Код можно упростить или если работает так оставить? =)
     
  13. parovoZZ

    parovoZZ Гуру

    Ну тот же fade. В HSV это будет выглядеть так:
    увеличить яркость
    Код (C++):
    HSV.V++;
    уменьшить яркость
    Код (C++):
    HSV.V--;
    Пробежаться по всей палитре цветов:
    Код (C++):
    HSV.H--;
    "Вынырнуть" из белого в заданный цвет
    Код (C++):
    HSV.S = 0;
    HSV.S++;
    А как это всё будет в RGB?
     
  14. otis

    otis Гик

    Максим. Одни вопрос у Вас именно лента или вы из ленты сделали матрицу(несколько кусков соединили последовательно). У меня есть костер но он на матрице из 2812диодов с размером10высота и 20ширина делал для камина другу.
     
  15. Максим B

    Максим B Гуру

    Обычная лента - нет матрицы не делал.
     
  16. otis

    otis Гик

    Ну тогда это вам нечем не поможет. У меня это на экран.