Skocz do zawartości

Przełączanie pomiędzy trybami świecenia led WS2812b


FreliSKY

Pomocna odpowiedź

Witam,

realizuje w swoim pokoju projekt złożony z taśm led ws2812b, podzielonych na dwa niezależne paski ze względu na to że są różnej długości, a chce żeby efekty wyglądały na nich dobrze (jeden ma 640 diod, drugi 54 diod, aby efekt tęczy na obydwu miał pełne spektrum mam dwa oddzielne kody nadające paskom ten sam efekt). Mój problem pojawia się przy próbie sterowania tym, chcę aby wszystko było sterowane za pomocą pilota na podczerwień. Nie rozumiem kompletnie biblioteki IRemote, chciałbym aby wyglądało to tak, że po włączeniu włącza się efekt 1 (jakby animacja włączania), który jak się zakończy wyłącza się i  włącza się efekt 2 (tęcza), który trwa cały czas, dopiero po przełączeniu pilotem na efekt 3  i tak samo z powrotem, pilotem na efekt 2. Efekt 4 (jeżel jest takie coś możliwe) po naciśnięciu przycisku na pilocie kolor zmienia sie powiedzmy z czerwonego na pomarańczowy, po ponownym nacisnieciu na żółty, dalej na zielony itd. Tak samo z jasnością efektu jeden przycisk na jasniej, drugi na ciemniej. I efekt 5 tak aby reagowało na muzykę, mam czujnik dzwieku ( https://allegro.pl/oferta/czujnik-dzwieku-8244890546 ) jeżeli się przyda, aby go wykorzystać do tego, bo podłączenie przez kabel jack odpada.  Więc prosiłbym o pomoc z połączeniem tego wszystkiego, tak aby dało się to sterowac pilotem i napisanie tych 2 ostatnich efektów.

dziękuję za wszystkie odpowiedzi

Efekt 1 pasek 1

#include <Adafruit_NeoPixel.h>
 
Adafruit_NeoPixel pasek1 = Adafruit_NeoPixel(640, 6, NEO_GRB + NEO_KHZ800);
 
void setup() {
  pasek1.begin();
  pasek1.show(); 
}
 
void loop() {
 int i = 0;
  for (i = 0; i < 640; i++) {
    if (i < 640 ) {
      pasek1.setPixelColor(i, pasek1.Color(255, 0, 0));
      }
    
    pasek1.show(); 
    delay(10);
  }
  pasek1.clear();
}

 

Efekt 1 pasek 2

#include <Adafruit_NeoPixel.h>
 
Adafruit_NeoPixel pasek1 = Adafruit_NeoPixel(54, 6, NEO_GRB + NEO_KHZ800);
 
void setup() {
  pasek1.begin();
  pasek1.show(); 
}
 
void loop() {
 int i = 0;
  for (i = 0; i < 54; i++) {
    if (i < 54 ) {
      pasek1.setPixelColor(i, pasek1.Color(255, 0, 0));
      }
    
    pasek1.show(); 
    delay(185);
  }
  pasek1.clear();
}

 

efekt 2 pasek 1

#include <Adafruit_NeoPixel.h>

class Strip
{
public:
  uint8_t   effect;
  uint8_t   effects;
  uint16_t  effStep;
  unsigned long effStart;
  Adafruit_NeoPixel strip;
  Strip(uint16_t leds, uint8_t pin, uint8_t toteffects, uint16_t striptype) : strip(leds, pin, striptype) {
    effect = -1;
    effects = toteffects;
    Reset();
  }
  void Reset(){
    effStep = 0;
    effect = (effect + 1) % effects;
    effStart = millis();
  }
};

struct Loop
{
  uint8_t currentChild;
  uint8_t childs;
  bool timeBased;
  uint16_t cycles;
  uint16_t currentTime;
  Loop(uint8_t totchilds, bool timebased, uint16_t tottime) {currentTime=0;currentChild=0;childs=totchilds;timeBased=timebased;cycles=tottime;}
};

Strip strip_0(640, 6, 640, NEO_GRB + NEO_KHZ800);
struct Loop strip0loop0(1, false, 1);

//[GLOBAL_VARIABLES]

void setup() {

  //Your setup here:

  strip_0.strip.begin();
}

void loop() {

  //Your code here:

  strips_loop();
}

void strips_loop() {
  if(strip0_loop0() & 0x01)
    strip_0.strip.show();
}

uint8_t strip0_loop0() {
  uint8_t ret = 0x00;
  switch(strip0loop0.currentChild) {
    case 0: 
           ret = strip0_loop0_eff0();break;
  }
  if(ret & 0x02) {
    ret &= 0xfd;
    if(strip0loop0.currentChild + 1 >= strip0loop0.childs) {
      strip0loop0.currentChild = 0;
      if(++strip0loop0.currentTime >= strip0loop0.cycles) {strip0loop0.currentTime = 0; ret |= 0x02;}
    }
    else {
      strip0loop0.currentChild++;
    }
  };
  return ret;
}

uint8_t strip0_loop0_eff0() {
    // Strip ID: 0 - Effect: Rainbow - LEDS: 640
    // Steps: 640 - Delay: 20
    // Colors: 3 (255.0.0, 0.255.0, 0.0.255)
    // Options: rainbowlen=640, toLeft=true, 
  if(millis() - strip_0.effStart < 20 * (strip_0.effStep)) return 0x00;
  float factor1, factor2;
  uint16_t ind;
  for(uint16_t j=0;j<640;j++) {
    ind = strip_0.effStep + j * 1;
    switch((int)((ind % 640) / 18)) {
      case 0: factor1 = 1.0 - ((float)(ind % 640 - 0 * 18) / 18);
              factor2 = (float)((int)(ind - 0) % 640) / 18;
              strip_0.strip.setPixelColor(j, 255 * factor1 + 0 * factor2, 0 * factor1 + 255 * factor2, 0 * factor1 + 0 * factor2);
              break;
      case 1: factor1 = 1.0 - ((float)(ind % 640 - 1 * 18) / 18);
              factor2 = (float)((int)(ind - 18) % 640) / 18;
              strip_0.strip.setPixelColor(j, 0 * factor1 + 0 * factor2, 255 * factor1 + 0 * factor2, 0 * factor1 + 255 * factor2);
              break;
      case 2: factor1 = 1.0 - ((float)(ind % 640 - 2 * 18) / 18);
              factor2 = (float)((int)(ind - 36) % 640) / 18;
              strip_0.strip.setPixelColor(j, 0 * factor1 + 255 * factor2, 0 * factor1 + 0 * factor2, 255 * factor1 + 0 * factor2);
              break;
    }
  }
  if(strip_0.effStep >= 640) {strip_0.Reset(); return 0x03; }
  else strip_0.effStep++;
  return 0x01;
}

efekt 2 pasek 2

#include <Adafruit_NeoPixel.h>

class Strip
{
public:
  uint8_t   effect;
  uint8_t   effects;
  uint16_t  effStep;
  unsigned long effStart;
  Adafruit_NeoPixel strip;
  Strip(uint16_t leds, uint8_t pin, uint8_t toteffects, uint16_t striptype) : strip(leds, pin, striptype) {
    effect = -1;
    effects = toteffects;
    Reset();
  }
  void Reset(){
    effStep = 0;
    effect = (effect + 1) % effects;
    effStart = millis();
  }
};

struct Loop
{
  uint8_t currentChild;
  uint8_t childs;
  bool timeBased;
  uint16_t cycles;
  uint16_t currentTime;
  Loop(uint8_t totchilds, bool timebased, uint16_t tottime) {currentTime=0;currentChild=0;childs=totchilds;timeBased=timebased;cycles=tottime;}
};

Strip strip_0(54, 6, 54, NEO_GRB + NEO_KHZ800);
struct Loop strip0loop0(1, false, 1);

//[GLOBAL_VARIABLES]

void setup() {

  //Your setup here:

  strip_0.strip.begin();
}

void loop() {

  //Your code here:

  strips_loop();
}

void strips_loop() {
  if(strip0_loop0() & 0x01)
    strip_0.strip.show();
}

uint8_t strip0_loop0() {
  uint8_t ret = 0x00;
  switch(strip0loop0.currentChild) {
    case 0: 
           ret = strip0_loop0_eff0();break;
  }
  if(ret & 0x02) {
    ret &= 0xfd;
    if(strip0loop0.currentChild + 1 >= strip0loop0.childs) {
      strip0loop0.currentChild = 0;
      if(++strip0loop0.currentTime >= strip0loop0.cycles) {strip0loop0.currentTime = 0; ret |= 0x02;}
    }
    else {
      strip0loop0.currentChild++;
    }
  };
  return ret;
}

uint8_t strip0_loop0_eff0() {
    // Strip ID: 0 - Effect: Rainbow - LEDS: 54
    // Steps: 54 - Delay: 20
    // Colors: 3 (255.0.0, 0.255.0, 0.0.255)
    // Options: rainbowlen=54, toLeft=true, 
  if(millis() - strip_0.effStart < 20 * (strip_0.effStep)) return 0x00;
  float factor1, factor2;
  uint16_t ind;
  for(uint16_t j=0;j<54;j++) {
    ind = strip_0.effStep + j * 1;
    switch((int)((ind % 54) / 18)) {
      case 0: factor1 = 1.0 - ((float)(ind % 54 - 0 * 18) / 18);
              factor2 = (float)((int)(ind - 0) % 54) / 18;
              strip_0.strip.setPixelColor(j, 255 * factor1 + 0 * factor2, 0 * factor1 + 255 * factor2, 0 * factor1 + 0 * factor2);
              break;
      case 1: factor1 = 1.0 - ((float)(ind % 54 - 1 * 18) / 18);
              factor2 = (float)((int)(ind - 18) % 54) / 18;
              strip_0.strip.setPixelColor(j, 0 * factor1 + 0 * factor2, 255 * factor1 + 0 * factor2, 0 * factor1 + 255 * factor2);
              break;
      case 2: factor1 = 1.0 - ((float)(ind % 54 - 2 * 18) / 18);
              factor2 = (float)((int)(ind - 36) % 54) / 18;
              strip_0.strip.setPixelColor(j, 0 * factor1 + 255 * factor2, 0 * factor1 + 0 * factor2, 255 * factor1 + 0 * factor2);
              break;
    }
  }
  if(strip_0.effStep >= 54) {strip_0.Reset(); return 0x03; }
  else strip_0.effStep++;
  return 0x01;
}

 

efekt 3 pasek 1

#include <Adafruit_NeoPixel.h>

class Strip
{
public:
  uint8_t   effect;
  uint8_t   effects;
  uint16_t  effStep;
  unsigned long effStart;
  Adafruit_NeoPixel strip;
  Strip(uint16_t leds, uint8_t pin, uint8_t toteffects, uint16_t striptype) : strip(leds, pin, striptype) {
    effect = -1;
    effects = toteffects;
    Reset();
  }
  void Reset(){
    effStep = 0;
    effect = (effect + 1) % effects;
    effStart = millis();
  }
};

struct Loop
{
  uint8_t currentChild;
  uint8_t childs;
  bool timeBased;
  uint16_t cycles;
  uint16_t currentTime;
  Loop(uint8_t totchilds, bool timebased, uint16_t tottime) {currentTime=0;currentChild=0;childs=totchilds;timeBased=timebased;cycles=tottime;}
};

Strip strip_0(640, 6, 640, NEO_GRB + NEO_KHZ800);
struct Loop strip0loop0(1, false, 1);

//[GLOBAL_VARIABLES]

void setup() {

  //Your setup here:

  strip_0.strip.begin();
}

void loop() {

  //Your code here:

  strips_loop();
}

void strips_loop() {
  if(strip0_loop0() & 0x01)
    strip_0.strip.show();
}

uint8_t strip0_loop0() {
  uint8_t ret = 0x00;
  switch(strip0loop0.currentChild) {
    case 0: 
           ret = strip0_loop0_eff0();break;
  }
  if(ret & 0x02) {
    ret &= 0xfd;
    if(strip0loop0.currentChild + 1 >= strip0loop0.childs) {
      strip0loop0.currentChild = 0;
      if(++strip0loop0.currentTime >= strip0loop0.cycles) {strip0loop0.currentTime = 0; ret |= 0x02;}
    }
    else {
      strip0loop0.currentChild++;
    }
  };
  return ret;
}

uint8_t strip0_loop0_eff0() {
    // Strip ID: 0 - Effect: Fade - LEDS: 640
    // Steps: 5000 - Delay: 1
    // Colors: 2 (0.0.0, 255.255.255)
    // Options: duration=5000, every=1, 
  if(millis() - strip_0.effStart < 1 * (strip_0.effStep)) return 0x00;
  uint8_t r,g,b;
  double e;
  e = (strip_0.effStep * 1) / 5000;
  r = ( e ) * 255 + 0 * ( 1.0 - e );
  g = ( e ) * 255 + 0 * ( 1.0 - e );
  b = ( e ) * 255 + 0 * ( 1.0 - e );
  for(uint16_t j=0;j<640;j++) {
    if((j % 1) == 0)
      strip_0.strip.setPixelColor(j, r, g, b);
    else
      strip_0.strip.setPixelColor(j, 0, 0, 0);
  }
  if(strip_0.effStep >= 5000) {strip_0.Reset(); return 0x03; }
  else strip_0.effStep++;
  return 0x01;
}

 

efekt 3 pasek 2 

#include <Adafruit_NeoPixel.h>

class Strip
{
public:
  uint8_t   effect;
  uint8_t   effects;
  uint16_t  effStep;
  unsigned long effStart;
  Adafruit_NeoPixel strip;
  Strip(uint16_t leds, uint8_t pin, uint8_t toteffects, uint16_t striptype) : strip(leds, pin, striptype) {
    effect = -1;
    effects = toteffects;
    Reset();
  }
  void Reset(){
    effStep = 0;
    effect = (effect + 1) % effects;
    effStart = millis();
  }
};

struct Loop
{
  uint8_t currentChild;
  uint8_t childs;
  bool timeBased;
  uint16_t cycles;
  uint16_t currentTime;
  Loop(uint8_t totchilds, bool timebased, uint16_t tottime) {currentTime=0;currentChild=0;childs=totchilds;timeBased=timebased;cycles=tottime;}
};

Strip strip_0(54, 6, 54, NEO_GRB + NEO_KHZ800);
struct Loop strip0loop0(1, false, 1);

//[GLOBAL_VARIABLES]

void setup() {

  //Your setup here:

  strip_0.strip.begin();
}

void loop() {

  //Your code here:

  strips_loop();
}

void strips_loop() {
  if(strip0_loop0() & 0x01)
    strip_0.strip.show();
}

uint8_t strip0_loop0() {
  uint8_t ret = 0x00;
  switch(strip0loop0.currentChild) {
    case 0: 
           ret = strip0_loop0_eff0();break;
  }
  if(ret & 0x02) {
    ret &= 0xfd;
    if(strip0loop0.currentChild + 1 >= strip0loop0.childs) {
      strip0loop0.currentChild = 0;
      if(++strip0loop0.currentTime >= strip0loop0.cycles) {strip0loop0.currentTime = 0; ret |= 0x02;}
    }
    else {
      strip0loop0.currentChild++;
    }
  };
  return ret;
}

uint8_t strip0_loop0_eff0() {
    // Strip ID: 0 - Effect: Fade - LEDS: 54
    // Steps: 5000 - Delay: 1
    // Colors: 2 (0.0.0, 255.255.255)
    // Options: duration=5000, every=1, 
  if(millis() - strip_0.effStart < 1 * (strip_0.effStep)) return 0x00;
  uint8_t r,g,b;
  double e;
  e = (strip_0.effStep * 1) / 5000;
  r = ( e ) * 255 + 0 * ( 1.0 - e );
  g = ( e ) * 255 + 0 * ( 1.0 - e );
  b = ( e ) * 255 + 0 * ( 1.0 - e );
  for(uint16_t j=0;j<54;j++) {
    if((j % 1) == 0)
      strip_0.strip.setPixelColor(j, r, g, b);
    else
      strip_0.strip.setPixelColor(j, 0, 0, 0);
  }
  if(strip_0.effStep >= 5000) {strip_0.Reset(); return 0x03; }
  else strip_0.effStep++;
  return 0x01;
}

 

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.