Несколько led колец, должны работать параллельно.
- Войдите на сайт для отправки комментариев
Ср, 23/03/2022 - 10:30
Есть 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 - идет последовательно
пытался сделать через потоки, но все равно 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); } }Попробуйте зажигать диоды ПАРАЛЛЕЛЬНО в обоих кольцах... зажгли первый диод в одном кольце, потом первый во втором. Далее второй в первом кольце, второй во втором... и так далее. И никакие потоки не нужны для этого, только чуть мозгами подумать
#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] - задается направление
спасибо за наводку)