Использование библиотек IRremote и FastLED

Тема в разделе "Проводная и беспроводная связь", создана пользователем Makar_Net, 11 авг 2019.

  1. Makar_Net

    Makar_Net Нуб

    Вся суть в том, что код ,при нажатие кнопки на пульте, приходит не тот. При зажатии кнопки пульта приходит код в HEX 0x50C5D1F, что в DEC 84 696 351‬. При работе отдельно от библиотеки FastLED работает корректно и приходит код HEX 1176 97CD‬, а по DEC 292 984 781‬. Я рискнул подумать что пульт не успевает передать данные при нажатии, т.к в десятичной системе числа при зажатии разные (при работе с FastLED число меньше, чем при обычной работе). Я пробовал вставить костыли в прогу по типу задержки программы до тех пор, пока не будет выбрана нужная команда. То есть пока не будут выставлены настройки такие как яркость, скорость движения и т.д., отправки значений на ленту не будет. Программа с костылем работала, но я к сожалению добавил туда новые ошибки и сохранил при переделке.
    И вся проблема стоит в приеме кнопки.

    В коде присутствуют лишние операторы, но это для доработок.

    Код (C++):

    void loop() {
      IRpolling();
      //  IRincome();
      if (!ONstate) {
        NEW_SET();
        //    mainloop();
        //    ChangePalettePeriodically();

        static uint8_t startIndex = 0;
        startIndex = startIndex + 1; /* motion speed */

        FillLEDsFromPaletteColors( startIndex);
      }
      IRdata = 0;
    }

    void mainloop () {

    }
    void FillLEDsFromPaletteColors( uint8_t colorIndex) {
      uint8_t brightness = 255;
      for ( int i = 0; i < NUM_LEDS; i++) {
        leds[i] = ColorFromPalette( currentPalette, colorIndex, set_brightness, currentBlending);
        colorIndex += set_colorIndex;
      }
      FastLED.show();
      FastLED.delay(1000 / UPDATES_PER_SECOND);
    }

    void ChangePalettePeriodically() {
      if ( this_mode ==  1)  {
        currentPalette = RainbowColors_p;
        currentBlending = LINEARBLEND;
      }
      if ( this_mode == 2)  {
        currentPalette = RainbowStripeColors_p;
        currentBlending = NOBLEND;
      }
      if ( this_mode == 3)  {
        currentPalette = RainbowStripeColors_p;
        currentBlending = LINEARBLEND;
      }
    }

    void IRpolling() {
      if (IRLremote.available()) {
        auto data = IRLremote.read();
        if (data.command != 292984781) {
          IRdata = data.command;
          IR_flag = true;
        }
        Serial.print("0x");
        Serial.println(data.command, HEX);

      }
      switch (IRdata) {
        // режимы
        case BUTT_1: this_mode = 0; IR_true = true;
          break;
        case BUTT_2: this_mode = 1; IR_true = true;
          break;
        case BUTT_3: this_mode = 2; IR_true = true;
          break;
        case BUTT_4: this_mode = 3; IR_true = true;
          break;
        case BUTT_5: this_mode = 4; IR_true = true;
          break;
        case BUTT_6: this_mode = 5; IR_true = true;
          break;
        case BUTT_7: this_mode = 6; IR_true = true;
          break;
        case BUTT_8: this_mode = 7; IR_true = true;
          break;
        case BUTT_9: this_mode = 8; BUTT_HASH_SET = false; BUTT_OK_SET = false; IR_true = true;
          Serial.println("B9");
          break;
        //      case BUTT_0: fullLowPass();
        //        break;
        case BUTT_STAR: ONstate = !ONstate; FastLED.clear(); BUTT_HASH_SET = false; BUTT_OK_SET = false; IR_true = true;
          Serial.println("STAR"); Serial.print("ONstate="); Serial.println(ONstate);
          break;
        case BUTT_HASH: BUTT_HASH_SET = !BUTT_HASH_SET; BUTT_OK_SET = false; IR_true = true;
          Serial.println("HASH"); Serial.print("HASH="); Serial.println(BUTT_HASH_SET);
          break;
        case BUTT_OK: BUTT_OK_SET = !BUTT_OK_SET; BUTT_HASH_SET = false; IR_true = true;
          Serial.println("OK"); Serial.print("BUTT_OK_SET="); Serial.println(BUTT_OK_SET);
          break;
      }
    }

    void NEW_SET() {
      if (BUTT_OK_SET) {
        switch (IRdata) {
          case BUTT_UP:
            set_brightness = set_brightness + 20;
            if (set_brightness >= 240) set_brightness = 20;
            FastLED.setBrightness(set_brightness);
            Serial.println("+BR");
            break;
          case BUTT_DOWN:
            set_brightness = set_brightness - 20;
            if (set_brightness <= 0) set_brightness = 240;
            FastLED.setBrightness(set_brightness);
            Serial.println("-BR");
            break;
          case BUTT_LEFT:
            UPDATES_PER_SECOND = UPDATES_PER_SECOND - 10;
            if (UPDATES_PER_SECOND < 10) UPDATES_PER_SECOND = 100;
            Serial.println("-SP");
            break;
          case BUTT_RIGHT:
            UPDATES_PER_SECOND = UPDATES_PER_SECOND + 10;
            if (UPDATES_PER_SECOND > 100 ) UPDATES_PER_SECOND = 10;
            Serial.println("+SP");
            break;
        }
      }
      if (BUTT_HASH_SET) {
        switch (IRdata) {
          case BUTT_UP:
            set_colorIndex = set_colorIndex + 0.2;
            if (set_colorIndex >= 5.0) set_colorIndex = 0.2;
            Serial.println("+IN");
            break;
          case BUTT_DOWN:
            set_colorIndex = set_colorIndex - 0.2;
            if (set_colorIndex <= 0.0) set_colorIndex = 5.0;
            Serial.println("-IN");
            break;
        }
      }
    }
     
    Последнее редактирование: 11 авг 2019
  2. NikitOS

    NikitOS Король шутов Администратор

    Makar_Net нравится это.
  3. Makar_Net

    Makar_Net Нуб

    Спасибо большое, я уже сколько не могу эту ошибку исправить.

    ВНИМАНИЕ всем тем, кто сталкиваться с той проблемой будет.
    Ссылка на код, что комментом выше работает для библиотеки "IRremote.h".
    У меня же стоит библиотека "IR!!!L!!!remote.h". Для решения проблемы вам нужно будет сделать это:
    Код (C++):
    if (!IRLremote.receiving())
        animation();
    В этом цикле
    Код (C++):
        animation();
    Код (C++):
    void animation() {
      static uint8_t startIndex = 0;
      startIndex = startIndex + 1; /* motion speed */

      FillLEDsFromPaletteColors( startIndex);
    if (!IRLremote.receiving())
      FastLED.show();
      FastLED.delay(1000 / UPDATES_PER_SECOND);
    }
    Перед FastLED.show(); вам нужно вставить if (!IRLremote.receiving())

    Так же можете встреть проблему с НЕплавным движение пикселей на ленте после включение строк что с моей библиотекой, что с той.
    Я перепрошил ардуино с комментированием опроса пульта затем убрал комментирование строки и все пропало.
    Возможно что то связано с ШИМ сигналом! Но у меня почему то при смене пина подключения ленты эта проблема не выскакивала больше. http://forum.amperka.ru/threads/Про...нием-ir-remote-и-ШИМ-ардуино-нано.8619/page-2
     
  4. Makar_Net

    Makar_Net Нуб