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

Тема в разделе "Arduino & Shields", создана пользователем ALeska811, 23 апр 2020.

  1. ALeska811

    ALeska811 Нерд

    Всем привет. Пытался сделать подсветку и выставлять цвета пультом.
    Просто выставить цвет получилось.


    Код (C++):
    #include "IRremote.h"
    #define NUM_LEDS 1
    #include "FastLED.h"
    CRGB leds[NUM_LEDS];
    IRrecv irrecv(2); // указываем вывод, к которому подключен приемник
    int spd;
    byte counter;
    decode_results results;
    bool lgb;
    void setup() {
      spd = 5;
       FastLED.addLeds<WS2811, 5, RGB>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
      FastLED.setBrightness(50);
      Serial.begin(9600); // выставляем скорость COM порта
      irrecv.enableIRIn(); // запускаем прием
      leds[0] = CRGB(0, 0, 0);
            FastLED.show();
    }

    void loop() {
     
      if ( irrecv.decode( &results )) { // если данные пришли
        Serial.println( results.value, HEX );
        switch ( results.value ) {
        case 0x6D:
             leds[0] = CRGB(255, 0, 0);
             FastLED.show();
            break;
        case 0x1006D:
             leds[0] = CRGB(255, 0, 0);
             FastLED.show();
            break;
        case 0x6E:
            leds[0] = CRGB(0, 255, 0);
            FastLED.show();
            break;
        case 0x1006E:
            leds[0] = CRGB(0, 255, 0);
            FastLED.show();
            break;
        case 0x6F:
            leds[0] = CRGB(255, 255, 0);
            FastLED.show();
            break;
         case 0x1006F:
            leds[0] = CRGB(255, 255, 0);
            FastLED.show();
            break;
        case 0x70:
            leds[0] = CRGB(0, 0, 255);
            FastLED.show();
            break;
        case 0x10070:
            leds[0] = CRGB(0, 0, 255);
            FastLED.show();
            break;
        }  
       
        irrecv.resume(); // принимаем следующую команду
      }
    }
    А вот запустить динамическое переливание нет. При нажатие на кнопку пульта запускалось переливание.
    Но вот потом приёмник переставал правильно принимать сигналы, а писал белиберду.


    Код (C++):
    #include "IRremote.h"
    #define NUM_LEDS 144
    #include "FastLED.h"
    CRGB leds[NUM_LEDS];
    byte counter;
    bool lgb;
    int spd;
    IRrecv irrecv(2); // Указываем пин, к которому подключен приемник
    decode_results results;
    void setup()
    {
      spd = 5;
       FastLED.addLeds<WS2811, 5, GRB>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
      FastLED.setBrightness(50);

      Serial.begin(9600); // Выставляем скорость COM порта
      irrecv.enableIRIn(); // Запускаем прием
      leds[0] = CHSV(0, 0, 0);
      FastLED.show();
    }
    void loop() {
     
      if (irrecv.decode(&results)) // Если данные пришли
      {
        Serial.println(results.value,HEX);
        if (results.value == 0x2C){//кнопка play
          lgb = true;
        }
        irrecv.resume();
      }
      if (lgb == true){
        for (int i = 0; i < NUM_LEDS; i++ ) {        
        leds[i] = CHSV(counter + i * 2, 255, 255);
       
      }
      counter++;      
      FastLED.show();
      delay(5);    
      }
     
    }
    Пробовал несколько раз . Одно и тоже
     
  2. parovoZZ

    parovoZZ Гуру

    ИК биты от команд необходимо принимать в прерываниях и складывать в буфер (формировать команду). В паузах (а точнее, когда формируется пауза для защелкивания данных в ленте) парсить принятую команду. FAST led хорошая библиотека, но убогая из-за bit-bang.
     
  3. ALeska811

    ALeska811 Нерд

    так что посоветуете?
     
  4. parovoZZ

    parovoZZ Гуру

    досконально изучить предмет, чтобы понимать, как всё работает.
     
  5. ALeska811

    ALeska811 Нерд

    ой
    спасибо, разобрался