19-11-2023, 23:58
(Ten post był ostatnio modyfikowany: 20-11-2023, 21:55 przez swordwastaken.)
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:
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
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