• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Błędnie odczytywane kody [FastLED & IRremote]
#1
Witam, mam problem ze swoim kodem, chciałbym mieć kod który włącza różne funkcje ledów (na obecny moment mam 3 funkcje, w przyszłości jeśli ten problem by się rozwiązał chciałbym tych funkcji mieć więcej) po naciśnięciu przycisków na pilocie IR. Jeśli puszczę trzymanie przycisku to funkcja będzie się wykonywała dopóki nie nacisnę kolejnego przycisku. Problemem są otrzymywane wartości 0, jeśli jednak zacznę naciskać przyciski na pilocie szybko to kody zaczynają być odczytywane. Kod:
Kod:
#include <FastLED.h>
#include <IRremote.h>

#define NUM_LEDS 60
#define DATA_PIN 7
#define BRIGHTNESS 100
#define RECV_PIN 6

CRGB leds[NUM_LEDS];

uint8_t hue = 0;
int huechange = 3;
int dir = 1;
int i = 0;
int currFunct = 0;

void setup() {
  Serial.begin(9600);
  IrReceiver.begin(RECV_PIN);
  pinMode(2, OUTPUT);

  FastLED.setBrightness(BRIGHTNESS);
  FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS);
  FastLED.clear();
  FastLED.show();
}

void red() {
  fill_solid(leds, NUM_LEDS, CRGB::Red);
  FastLED.show();
}

void green() {
  fill_solid(leds, NUM_LEDS, CRGB::Green);
  FastLED.show();
}

void rainbowEffect() {
  EVERY_N_MILLISECONDS(25) {
    if (i < NUM_LEDS && i >= 0) {
      leds[i] = CHSV(hue, 255, 255);
      FastLED.show();
      i += dir;
    } else {
      dir *= -1;
      i += dir;
    }
    hue += huechange;
    blur1d(leds, NUM_LEDS, 172);
  }
}

void black() {
  fill_solid(leds, NUM_LEDS, CRGB::Black);
  FastLED.show();
}

void checkFunct() {
  switch (IrReceiver.decodedIRData.command) {
      case 69:
        red();
        break;

      case 70:
        green();
        break;

      case 71:
        rainbowEffect();
        break;

      default:
        black();
    }
    delay(100);
}

void loop() {
  if (IrReceiver.decode()) {
    IrReceiver.resume();
    Serial.println(IrReceiver.decodedIRData.command);
    digitalWrite(2, HIGH);
  } else {
    digitalWrite(2, LOW);
    checkFunct();
  }
}

Problemem w tym kodzie jest także delay(100) które blokuje efekt tęczy w rainbowEffect() sprawiając że efekt zamiast zmieniać ledę co 25ms zmienia ją co 125ms. Jestem prawie pewien że jest możliwość usunięcia delay i jednocześnie braku otrzymywanych błędnych sygnałów. Będę bardzo wdzięczny jeśli ktoś pomoże Smile
 
Odpowiedź
  


Wiadomości w tym wątku
Błędnie odczytywane kody [FastLED & IRremote] - przez swordwastaken - 19-11-2023, 23:58

Skocz do:


Przeglądający: 1 gości