#1 2018-02-04 21:54:40

Blaze
Участник
Зарегистрирован: 2018-01-31
Сообщений: 13

Разные сигналы с ИК пульта с одной кнопки

Всем привет. Нужна помощь и совет с кодом для ИК приемника.. Я долго мучаюсь, пытаюсь сделать прогу в которой можно будет переключать режимы освещения диодной ленты. Соответственно я использовал прерывание, так как в любой момент захочу переключить режим. Почитал как работает приемник ИК. В общем суть в том что если сделать код который просто выводит коды кнопок то все ок. Но как только включается лента то сигнал с кнопки рассчитывается крайне не правильно. Подскажите есть вариант что надо поправить чтоб сигнал приходил правильно? В итоге хотелось бы сделать лампу и если так влияет свет, то получается у меня безвыходная ситуация?

#2 2018-02-04 23:09:09

Blaze
Участник
Зарегистрирован: 2018-01-31
Сообщений: 13

Re: Разные сигналы с ИК пульта с одной кнопки

У программы забавное поведение. Вот моя программа.

#include <Adafruit_NeoPixel.h>
#include <IRremote.h>
#define PIN 11
int Leds = 160;

int RECV_PIN = 2;
IRrecv irrecv(RECV_PIN);
decode_results results;

// Parameter 1 = number of pixels in strip
// Parameter 2 = pin number (most are valid)
// Parameter 3 = pixel type flags, add together as needed:
//   NEO_KHZ800  800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
//   NEO_KHZ400  400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
//   NEO_GRB     Pixels are wired for GRB bitstream (most NeoPixel products)
//   NEO_RGB     Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
Adafruit_NeoPixel strip = Adafruit_NeoPixel(Leds, PIN, NEO_RGBW + NEO_KHZ800);

unsigned long previousMillis = 0;
unsigned long currentMillis = 0;
int mode = 1;

int fade_g = 0;
int fade_r = 0;
int fade_b = 255;
int dir_g = 1;
int dir_r = 1;
int dir_b = 1;

int color[] = {0, 0, 0, 0};



void recievesignal() {

  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    irrecv.resume(); // Receive the next value
//    if (results.value == 0xFF1AE5 or results.value == 0xFF9A65 or results.value == 0xFFA25D or results.value == 0xFF02FD)
//      mode = results.value;
  }
}

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  strip.begin();
  strip.show();
  irrecv.enableIRIn(); // Start the receiver
  attachInterrupt (0, recievesignal, CHANGE);
}

void loop() {
//calmmode(); // светодиоды медленно меняют яркость от большего к меньшему и наоборот

  //Serial.println(results.value, HEX);
//  switch (mode) {
//    case 0xFF1AE5:
//      calmmode();
//      break;
//    case 0xFF9A65:
//      thunderburst();
//      break;
//    case 0xFFA25D:
//      colour_fade();
//      break;
//    case 0xFF02FD:
//      reset();
//      break;
//  }

}

Конечно я не добавлял сами режимы светодиодов, они работают нормально. В данном виде программа работает отлично и коды считываются шикарно. НО больше ничего не происходит. Если просто включить режим свечения calmmode(); то код приходит не правильный именно в моменты когда свет становится ярким.

И второй вариант если в цикле loop ничего не добавлять но раскомментировать две строки:
//    if (results.value == 0xFF1AE5 or results.value == 0xFF9A65 or results.value == 0xFFA25D or results.value == 0xFF02FD)
//      mode = results.value;

То с этими строками коды считываются опять очень очень плохо.
Как можно уловить помехи от светодиодов? Это от напряжения подаваемого на ленту? Питание идет от 5В и на светодиоды и на приемник.

Редактировался Blaze (2018-02-04 23:09:59)

#3 2018-02-04 23:55:59

Blaze
Участник
Зарегистрирован: 2018-01-31
Сообщений: 13

Re: Разные сигналы с ИК пульта с одной кнопки

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

#4 2018-02-05 00:16:46

Blaze
Участник
Зарегистрирован: 2018-01-31
Сообщений: 13

Re: Разные сигналы с ИК пульта с одной кнопки

Целый день искал ответ на свой вопрос.. И вот наконецто нашел.

The timing protocol for WS2812 leds requires disabling interrupts while writing out led data, and the IR library relies on interrupts to read the IR data, which means that if you're using the remote while the library is writing out led data, then it is going to miss part of the ir signal and misinterpret it.

There isn't really any way around this - switch to 4-wire leds (like the APA102 (adafruit sells them as Dotstars) or the LPD8806 or WS2801) or, alternatively, use the teensy 3/3.1 as your controller, where I have a solution that allows interrupts to run, even while using WS2812 leds.


Судя по всему это аппаратно не совсем возможно. sad Мои диоды типа WS2812 не работают с IR приемником. А я так надеялся sad

Редактировался Blaze (2018-02-05 13:48:14)

#5 2018-02-05 10:21:34

NoName
Customer
Из Київ
Зарегистрирован: 2014-07-08
Сообщений: 1,396

Re: Разные сигналы с ИК пульта с одной кнопки

teensy

add  ) не сделал вычитку текста
можете использовать все то есть - поддерживающее DMA + i2S/SPI/PWM

Редактировался NoName (2018-02-05 10:25:02)

Быстрое сообщение

Введите сообщение и нажмите Отправить

Подвал раздела