Управление пиксельной светодиодной лентой ИК пультом
- Войдите на сайт для отправки комментариев
Чт, 28/04/2016 - 18:41
Здравствуйте!
Подскажите пожалуйста в чем дело. Хочу ик-пультом управлять эффектами на ленте. По отдельности ик приемник принимает стабильные значения кнопок, но если включить в 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);
}
У меня та же проблема, только с библиотекой neomatrix. Я пробовал через другую атмегу подключать пульт, а её соеденять по uart, i2c... везде разные "грабли". Осталась идея - через nrf24 )). Я сделал панельку 8х24 и запустил на ней часы, плюс через nrf24 получает температуру за бортом. Так вот, с приёмом проблем нет и температура выводится без проблем, а значит можно принять любой параметр. Понимаю, что глупо звучит, но я уже замучался прикручивать ir пульт к матрице (
По отдельности ик приемник принимает стабильные значения кнопок, но если включить в loop() функцию анимации ленты, то на каждую кнопку пульта при нажатии приходят каждый раз разные значения, что делает невозможным их обработку
Видимо, Вы говорите о строке 28 - если её убрать, то всё тановится нормально?
Можно, сделать следующее:
1. Запустить код без этой строки, нажать несколько раз одну кнопку и выложить сюда то, что печатает строка 33.
2. Запустить код с этой строкой и опять же несколько раз одну кнопку и выложить сюда то, что печатает строка 33.
Сделайте и посмотрим.
да, именно так, пробовал и с другими функциями таже проблема, если включена каждый раз при нажатии разный набор сигналов получается с одной кнопки (FFFFFFFF если подольше подержать)
если закоментить, то более-менее нормально всё.. тоже есть некоторый разброс, но он стабильный и с ним можно работать
щас проверил еще, если из ф-ии анимации всё убрать кроме 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
... нагуглил инфу, типа не может обрабатываться одновременно и сигнал светодиодам и приниматься от ик-пульта, т.е. нужно их как-то разделить
....
ураа! проблема решена)
void loop(){ if ( irrecv.decode( &results ) ) { irControll(); } if ( irrecv.isIdle() ) { meteorShower(); } delay( 16 ); // ~60 fps }Ну, решена, так решена, с Победой!