Помогите пожалуйста

Тема в разделе "Arduino & Shields", создана пользователем Rabby, 5 ноя 2018.

  1. Rabby

    Rabby Нуб

    Нужно сделать переключение режимов ленты при помощи кнопки.

    Код (C++):
    #include "FastLED.h"          // библиотека для работы с лентой

    #define LED_COUNT 120          // число светодиодов в кольце/ленте
    #define LED_DT 13             // пин, куда подключен DIN ленты

    int max_bright = 255;          // максимальная яркость (0 - 255)
    boolean adapt_light = 1;       // адаптивная подсветка (1 - включить, 0 - выключить)

    byte fav_modes[] = {2, 3, 33, 37, 27, 30,};  // список "любимых" режимов
    byte num_modes = sizeof(fav_modes);         // получить количество "любимых" режимов (они все по 1 байту..)
    unsigned long change_time, last_change, last_bright;
    int new_bright;

    int ledMode = 3;
    /*
      Стартовый режим
      0 - все выключены
      1 - все включены
      3 - кольцевая радуга
      888 - демо-режим
    */


    // цвета мячиков для режима
    byte ballColors[3][3] = {
      {0xff, 0, 0},
      {0xff, 0xff, 0xff},
      {0   , 0   , 0xff}
    };

    // ---------------СЛУЖЕБНЫЕ ПЕРЕМЕННЫЕ-----------------
    int BOTTOM_INDEX = 0;        // светодиод начала отсчёта
    int TOP_INDEX = int(LED_COUNT / 2);
    int EVENODD = LED_COUNT % 2;
    struct CRGB leds[LED_COUNT];
    int ledsX[LED_COUNT][3];     //-ARRAY FOR COPYING WHATS IN THE LED STRIP CURRENTLY (FOR CELL-AUTOMATA, MARCH, ETC)

    int thisdelay = 20;          //-FX LOOPS DELAY VAR
    int thisstep = 10;           //-FX LOOPS DELAY VAR
    int thishue = 0;             //-FX LOOPS DELAY VAR
    int thissat = 255;           //-FX LOOPS DELAY VAR

    int thisindex = 0;
    int thisRED = 0;
    int thisGRN = 0;
    int thisBLU = 0;

    int idex = 0;                //-LED INDEX (0 to LED_COUNT-1
    int ihue = 0;                //-HUE (0-255)
    int ibright = 0;             //-BRIGHTNESS (0-255)
    int isat = 0;                //-SATURATION (0-255)
    int bouncedirection = 0;     //-SWITCH FOR COLOR BOUNCE (0-1)
    float tcount = 0.0;          //-INC VAR FOR SIN LOOPS
    int lcount = 0;              //-ANOTHER COUNTING VAR
    // ---------------СЛУЖЕБНЫЕ ПЕРЕМЕННЫЕ-----------------

    void setup()
    {
      Serial.begin(9600);              // открыть порт для связи
      LEDS.setBrightness(max_bright);  // ограничить максимальную яркость

      LEDS.addLeds<WS2811, LED_DT, GRB>(leds, LED_COUNT);  // настрйоки для нашей ленты (ленты на WS2811, WS2812, WS2812B)
      one_color_all(0, 0, 0);          // погасить все светодиоды
      LEDS.show();                     // отослать команду

      randomSeed(analogRead(0));
    }

    void loop() {
      if (adapt_light) {                        // если включена адаптивная яркость
        if (millis() - last_bright > 500) {     // каждые полсекунды
          last_bright = millis();               // сброить таймер
          new_bright = map(analogRead(6), 1, 1000, 3, max_bright);   // считать показания с фоторезистора, перевести диапазон
          LEDS.setBrightness(new_bright);        // установить новую яркость
        }
      }

      if (millis() - last_change > change_time) {
        change_time = random(50000, 200000);                // получаем новое случайное время до следующей смены режима
        ledMode = fav_modes[random(0, num_modes - 1)];    // получаем новый случайный номер следующего режима
        change_mode(ledMode);                             // меняем режим через change_mode (там для каждого режима стоят цвета и задержки)
        last_change = millis();
      }
      /*
        if (Serial.available() > 0) {     // если что то прислали
          ledMode = Serial.parseInt();    // парсим в тип данных int
          change_mode(ledMode);           // меняем режим через change_mode (там для каждого режима стоят цвета и задержки)
        }
      */

      switch (ledMode) {
        case 999: break;                           // пазуа
        case  2: rainbow_fade(); break;            // плавная смена цветов всей ленты
        case  3: rainbow_loop(); break;            // крутящаяся радуга
        case 27: rgb_propeller(); break;           // RGB пропеллер
        case 30: new_rainbow_loop(); break;        // крутая плавная вращающаяся радуга
        case 33: colorWipe(0x00, 0xff, 0x00, thisdelay); break;                                // плавное заполнение цветом
        case 37: rainbowCycle(thisdelay); break;                                        // очень плавная вращающаяся радуга

      }
    }

    void change_mode(int newmode) {
      thissat = 255;
      switch (newmode) {
        case 0: one_color_all(0, 0, 0); LEDS.show(); break; //---ALL OFF
        case 1: one_color_all(255, 255, 255); LEDS.show(); break; //---ALL ON
        case 2: thisdelay = 60; break;                      //---STRIP RAINBOW FADE
        case 3: thisdelay = 20; thisstep = 10; break;       //---RAINBOW LOOP
        case 27: thisdelay = 100; thishue = 0; break;        //---RGB PROPELLER
        case 30: thisdelay = 15; break;                      //---NEW RAINBOW LOOP
        case 33: thisdelay = 50; break;                     // colorWipe
        case 37: thisdelay = 20; break;                     // rainbowCycle
     
        case 101: one_color_all(255, 0, 0); LEDS.show(); break; //---ALL RED
        case 102: one_color_all(0, 255, 0); LEDS.show(); break; //---ALL GREEN
        case 103: one_color_all(0, 0, 255); LEDS.show(); break; //---ALL BLUE
        case 104: one_color_all(255, 255, 0); LEDS.show(); break; //---ALL COLOR X
        case 105: one_color_all(0, 255, 255); LEDS.show(); break; //---ALL COLOR Y
        case 106: one_color_all(255, 0, 255); LEDS.show(); break; //---ALL COLOR Z
      }
      bouncedirection = 0;
      one_color_all(0, 0, 0);
      ledMode = newmode;
    }
    И можно еще добавить этот режим

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

    #define PIN 4
    #define NUM_LEDS 22  //Number of LEDs in the strip

    CRGBArray<NUM_LEDS> leds;
    uint8_t hue[NUM_LEDS];

    void setup(){
      FastLED.addLeds<NEOPIXEL, PIN>(leds, NUM_LEDS);
      for(int i = 0; i< NUM_LEDS; i++){
        hue[i] = 255/NUM_LEDS * i;
      }

      //Random RGB Sparkle Animation
      for(int j = 0; j < 100 ; j++){
        int dot = random(0,23);
        int hue = random(0,256);
        leds[dot] = CHSV(hue,255,175);
        FastLED.show();
        delay(50);
        leds[dot] = CRGB::Black;
      }
    }

    void loop(){
      //Rainbow Effect
      for(int i = 0; i< NUM_LEDS; i++){
        leds[i] = CHSV(hue[i]++, 255, 175);
      }
      FastLED.show();
      delay(8);
    }
     
     
    Последнее редактирование: 5 ноя 2018
  2. BAR__MEN

    BAR__MEN Гуру

    Пожалуйста, ознакомьтесь с этим и исправьте ошибки;)
     
    Tomasina нравится это.
  3. Un_ka

    Un_ka Гик

    Да , код надо вставлять правильно.
    Ты про прерывания почитай и операторы сравнения и всё будет просто.
     
  4. BAR__MEN

    BAR__MEN Гуру

    Сколько можно в прерывания всех тыкать?
    Или это лечение всех проблем?:confused::confused::eek::eek:
    Я за 4 года ни разу прерывания не использовал в деле, жив пока-что
     
  5. Un_ka

    Un_ka Гик

    Прерывания обычно облегчают жизнь с кнопками особено с большим кодом
    , а так новичкам легче.
     
  6. BAR__MEN

    BAR__MEN Гуру

    Для меня это никак не облегчает...
     
  7. parovoZZ

    parovoZZ Гуру

    кнопки надо опрашивать не более 50 раз в секунду. Автоматом вылечим дребезг. Что за спешка такая, что необходимо прям сейчас отрабатывать кнопку, а все остальные
    ???
     
    BAR__MEN и Tomasina нравится это.
  8. Un_ka

    Un_ka Гик

    Просто коды использую ,которые выполняются долго.
     
  9. SergeiL

    SergeiL Гуру

    Может и код приведёте, облегчающий жизнь с кнопками?
     
  10. parovoZZ

    parovoZZ Гуру

    В обработчик прерывания не рекомендуется вставлять долгоиграющие алгоритмы.
     
  11. Un_ka

    Un_ka Гик

    Наоборот у меня идёт долго выполняющийся код по кругу , прерывания лишь время между собой возвращают да переменную режима изменяют
     
  12. SergeiL

    SergeiL Гуру

    И ничего в ответ...
    Вот как всегда, просто пухнуть в воздух. :)
    Вы уж приучайтесь постоять за свои слова;)
     
  13. DetSimen

    DetSimen Гуру

    Ты просто готовить их не умеешь, а оне для асинхронности кода - в самый раз.
     
  14. parovoZZ

    parovoZZ Гуру

    оно для выполнения критичных ко времени исполнения секций кода. Асинхронность можно обеспечить тупо опрашивая флаги прерываний. Тем паче, что работу флагов не надо разрешать - они работают всегда.
     
    Un_ka нравится это.
  15. Un_ka

    Un_ka Гик

    А вот тут по подробней
     
  16. BAR__MEN

    BAR__MEN Гуру

    Подробнее читайте тут