Несколько led колец, должны работать параллельно.

swdsdll
Offline
Зарегистрирован: 23.03.2022

Есть 2 кольца, каждое из них имеет свои параметры:

1) размер (количество диодов)

2) начало направления движения (по часовой/против)

в дальнейшем будет 4 кольца. 2 больших 2 маленьких и все в разные стороны будут работать.

#include <Thread.h>
#include <FastLED.h>

Thread smallThread = Thread();
Thread bigThread = Thread();

#define NUM_LEDS_BIG_RINGS 39
CRGB big_leds[0][NUM_LEDS_BIG_RINGS];

#define NUM_LEDS_SMALL_RINGS 30
CRGB small_leds[0][NUM_LEDS_SMALL_RINGS];

void setup() {
  
  FastLED.addLeds<NEOPIXEL, D1>(big_leds[0], NUM_LEDS_BIG_RINGS);
  FastLED.addLeds<NEOPIXEL, D2>(small_leds[0], NUM_LEDS_SMALL_RINGS);

  smallThread.onRun(smallRings);
  smallThread.setInterval(20);
    
  bigThread.onRun(bigRings);
  bigThread.setInterval(20);
}

void fadeall() { 
  for(int i = 0; i < NUM_LEDS_SMALL_RINGS; i++) {
    small_leds[0][i].nscale8(250); 
  } 
  for(int i = 0; i < NUM_LEDS_BIG_RINGS; i++) {
    big_leds[0][i].nscale8(250); 
  } 
}


void loop() { 
    if (smallThread.shouldRun()){
        smallThread.run(); 
    }

    if (bigThread.shouldRun()){
        bigThread.run();
    }
}

void bigRings (){
  static uint8_t hue = 0;
  for(int i = (NUM_LEDS_BIG_RINGS)-1; i >= 0; i--) {
    big_leds[0][i] = CHSV(hue++, 255, 255);
    FastLED.show();
    fadeall();
    delay(10);
  }
  for(int i = 0; i < NUM_LEDS_BIG_RINGS; i++) {
    big_leds[0][i] = CHSV(hue++, 255, 255);
    FastLED.show();
    fadeall();
    delay(10);
  }
}

void smallRings (){
  static uint8_t hue = 0;
  for(int i = 0; i < NUM_LEDS_SMALL_RINGS; i++) {
    small_leds[0][i] = CHSV(hue++, 255, 255);
    FastLED.show();
    fadeall();
    delay(15);
  }
  
  for(int i = (NUM_LEDS_SMALL_RINGS)-1; i >= 0; i--) {
    small_leds[0][i] = CHSV(hue++, 255, 255);
    FastLED.show();
    fadeall();
    delay(15);
  }
}

пытался сделать через потоки, но все равно for - идет последовательно

 

b707
Offline
Зарегистрирован: 26.05.2017

swdsdll пишет:

пытался сделать через потоки, но все равно for - идет последовательно

а где тут потоки?

И это не фор виноват, что "for - идет последовательно", а это вы его последовательно запускаете!  Если вы, как в процедуре ниже - сначала пробегаете полностью одно кольцо, а потом другое - то как оно, по вашему, параллельно может быть??

void fadeall() { 
  for(int i = 0; i < NUM_LEDS_SMALL_RINGS; i++) {
    small_leds[0][i].nscale8(250); 
  } 
  for(int i = 0; i < NUM_LEDS_BIG_RINGS; i++) {
    big_leds[0][i].nscale8(250); 
  } 
}

Попробуйте зажигать диоды ПАРАЛЛЕЛЬНО в обоих кольцах... зажгли первый диод в одном кольце, потом первый во втором. Далее второй в первом кольце, второй во втором... и так далее. И никакие потоки не нужны для этого, только чуть мозгами подумать

swdsdll
Offline
Зарегистрирован: 23.03.2022
#include <FastLED.h>

#define BIG_RINGS 2
#define NUM_LEDS_BIG_RINGS 39
CRGB big_leds[BIG_RINGS][NUM_LEDS_BIG_RINGS];

#define SMALL_RINGS 2
#define NUM_LEDS_SMALL_RINGS 30
CRGB small_leds[SMALL_RINGS][NUM_LEDS_SMALL_RINGS];

void setup() {
  
  FastLED.addLeds<NEOPIXEL, D1>(big_leds[0], NUM_LEDS_BIG_RINGS);
  FastLED.addLeds<NEOPIXEL, D2>(small_leds[0], NUM_LEDS_SMALL_RINGS);
}

void fadeall() { 
  for(int i = 0; i < NUM_LEDS_BIG_RINGS; i++) {
    if(i < NUM_LEDS_SMALL_RINGS){
      small_leds[0][i].nscale8(250); 
    }
    big_leds[0][i].nscale8(250); 
  } 
}


void loop() { 
  rings();
}

void rings (){
  static uint8_t hue = 0;
  for(int i = (NUM_LEDS_BIG_RINGS)-1; i >= 0; i--) {
    if(i <= NUM_LEDS_SMALL_RINGS){
      small_leds[0][NUM_LEDS_SMALL_RINGS - i] = CHSV(hue++, 255, 255);
    }
    big_leds[0][i] = CHSV(hue++, 255, 255);
    FastLED.show();
    fadeall();
    delay(10);
  }
  
  for(int i = 0; i < NUM_LEDS_BIG_RINGS; i++) {
    if(i <= NUM_LEDS_SMALL_RINGS){
      small_leds[0][NUM_LEDS_SMALL_RINGS - i] = CHSV(hue++, 255, 255);
    }
    big_leds[0][i] = CHSV(hue++, 255, 255);
    FastLED.show();
    fadeall();
    delay(10);
  }
}

 

Сделал в одном цикле, мелкое кольцо зажигается только в случае если I <= колличеству диодов. [NUM_LEDS_SMALL_RINGS - i] - задается направление

спасибо за наводку)