Управление пиксельной светодиодной лентой ИК пультом

resident82
Offline
Зарегистрирован: 28.04.2016

Здравствуйте!
Подскажите пожалуйста в чем дело. Хочу ик-пультом управлять эффектами на ленте. По отдельности ик приемник принимает стабильные значения кнопок, но если включить в loop() функцию анимации ленты, то на каждую кнопку пульта при нажатии приходят каждый раз разные значения, что делает невозможным их обработку

#include "FastLED.h"
#include <IRremote.h>
#define LED_COUNT 31
#define LED_PIN 3
#define RECV_PIN 11

struct CRGB leds[LED_COUNT];

uint8_t hue = 29;
int del = 20;
byte idex = 255;
byte meteorLength = 30;

IRrecv irrecv(RECV_PIN);
decode_results results;

void setup() {
  delay(2000);
  LEDS.addLeds<WS2812B, LED_PIN, GRB>(leds, LED_COUNT);
  LEDS.setBrightness(200);

  Serial.begin(9600);
  irrecv.enableIRIn();
}

void loop(){
 irControll();
 meteorShower();
}

void irControll() {
  if (irrecv.decode(&results)) {
  Serial.println(results.value, HEX);

  switch ( results.value ) {
  case 0xF700FF:
  del +=10;
  break;
  case 0xFF02FD:
  del -=10;
  break;
  }
  irrecv.resume();
  }
}

void meteorShower(){
  // код анимации светодиодов
  delay(del);
}

 

spa-sam
Offline
Зарегистрирован: 14.12.2012

У меня та же проблема, только с  библиотекой neomatrix. Я пробовал через другую атмегу подключать пульт, а её соеденять по uart, i2c... везде разные "грабли". Осталась идея - через nrf24 )). Я сделал панельку 8х24  и запустил на ней часы, плюс через nrf24 получает температуру за бортом. Так вот, с приёмом проблем нет и температура выводится без проблем, а значит можно принять любой параметр. Понимаю, что глупо звучит, но я уже замучался прикручивать ir пульт к матрице (

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

resident82 пишет:

 По отдельности ик приемник принимает стабильные значения кнопок, но если включить в loop() функцию анимации ленты, то на каждую кнопку пульта при нажатии приходят каждый раз разные значения, что делает невозможным их обработку

Видимо, Вы говорите о строке 28 - если её убрать, то всё тановится нормально?

Можно, сделать следующее:

1. Запустить код без этой строки, нажать несколько раз одну кнопку  и выложить сюда то, что печатает строка 33.

2. Запустить код с этой строкой и опять же несколько раз одну кнопку  и выложить сюда то, что печатает строка 33.

Сделайте и посмотрим.

resident82
Offline
Зарегистрирован: 28.04.2016

да, именно так, пробовал и с другими функциями таже проблема, если включена каждый раз при нажатии разный набор сигналов получается с одной кнопки (FFFFFFFF если подольше  подержать)

C937EEA2
FFFFFFFF
5966B68A
AD6D3CBD
FFFFFFFF
33D89741
FFFFFFFF
ED885431
1E7164A7
EDD1732
BEA3ACF4
EDD1732
912E78CF
5966B68A
25A8F03B
50855C
1EE
FFFFFFFF
FE
FFFFFFFF
50855C
25A8F03B
A19134F1
E4A7C09B
D4238799
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
2A774F57
FFFFFFFF
BAF191A8

если закоментить, то более-менее нормально всё.. тоже есть некоторый разброс, но он стабильный и с ним можно работать

F700FF
F700FF
8503705D
F7
FFFFFFFF
8503705D
F700FF
F700FF
F700FF
8503705D
FFFFFFFF
F700FF
8503705D
F7
F700FF
F700FF
F700FF
8503705D
F700FF
F700FF
F700FF
8503705D
F7
FFFFFFFF
F700FF
8503705D
F700FF
F700FF
F700FF
8503705D
8503705D
F700FF
8503705D
F700FF
F700FF

щас проверил еще, если из ф-ии анимации всё убрать кроме delay(del); , то нормально работает, сама анимация:

void meteorShower(){
  // slide all the pixels down one in the array
  memmove8( &leds[0], &leds[1], (LED_COUNT - 1) * 3 );
 
  // increment the meteor display frame
  idex++;
  // make sure we don't drift into space
  if ( idex > meteorLength ) {
    idex = 0;
    // cycle through hues in each successive meteor tail
     // hue += 4;  
  }

  // this switch controls the actual meteor animation, i.e., what gets placed in the
  // first position and then subsequently gets moved down the strip by the memmove above
  switch ( idex ) {
  case 0:
    leds[LED_COUNT-1] = CHSV((hue), 255, 210); // цвет первого пикселя
    break;
  case 1:
    leds[LED_COUNT-1] = CHSV((hue - 20), 255, 210);
    break;
  case 2:
    leds[LED_COUNT-1] = CHSV((hue - 22), 255, 180);
    break;
  case 3:
    leds[LED_COUNT-1] = CHSV((hue - 23), 255, 150);
    break;
  case 4:
    leds[LED_COUNT-1] = CHSV((hue - 24), 255, 110);
    break;
  case 5:
    leds[LED_COUNT-1] = CHSV((hue - 25), 255, 90);
    break;
  case 6:
    leds[LED_COUNT-1] = CHSV((hue - 26), 160, 60);
    break;
  case 7:
    leds[LED_COUNT-1] = CHSV((hue - 27), 140, 40);
    break;
  case 8:
    leds[LED_COUNT-1] = CHSV((hue - 28), 120, 20);
    break;
  case 9:
    leds[LED_COUNT-1] = CHSV((hue - 29), 100, 20);
    break;
  default:
    leds[LED_COUNT-1] = CRGB::Black;
  }

  // show the blinky
  FastLED.show();  
  // control the animation speed/frame rate
  delay(del);
}

вот эта штука всё ломает

FastLED.show(); 

какой-то конфликт с библиотекой FastLED

... нагуглил инфу, типа не может обрабатываться одновременно и сигнал светодиодам и приниматься от ик-пульта, т.е. нужно их как-то разделить

....

ураа! проблема решена)

void loop(){

  if ( irrecv.decode( &results ) )
  {
    irControll();
  }
 
  if ( irrecv.isIdle() )
  {
     meteorShower();
  }

  delay( 16 ); // ~60 fps
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, решена, так решена, с Победой!