Параллельное выполнение

dejzar

✩✩✩✩✩✩✩
6 Ноя 2021
4
1
Здравствуйте, решил сделать подсветку с управлением из приложения. Использовал по большей части код от урока по PyQt. Но вот проблема: есть эффект радуги, для него нужен цикл, если его сделать, то понятное дело, другие задачи выполняться не будут, пока цикл не будет завершен, а мне нужно мониторить serial. О существовании millis я знаю, но не совсем понял как его можно прикрутить. Огромное спасибо тем, кто поможет.

Скрипт:
#include "FastLED.h"
#include "Parser.h"
#include "AsyncStream.h"

#define NUM_LEDS 30
#define PIN 2

CRGB leds[NUM_LEDS];
byte counter;
AsyncStream<50> serial(&Serial, ';');

void setup() {
  Serial.begin(115200);
  FastLED.addLeds<WS2812, PIN, GRB>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
  FastLED.setBrightness(50);
}

void loop() {
  parsing();
}

void parsing() {
  if (serial.available()) {
    Parser data(serial.buf, ',');  // отдаём парсеру
    int ints[10];           // массив для численных данных
    data.parseInts(ints);   // парсим в него

    switch (ints[0]) {
      case 0:
        for (int i = 0; i < NUM_LEDS; i++ ) {         // от 0 до первой трети
          leds[i].setRGB(ints[1], ints[2], ints[3]);
        }
        FastLED.show();
        break;
      case 1:
        FastLED.setBrightness(ints[1]);
        FastLED.show();
        break;
      case 2:
        while(loop){
          for (int i = 0; i < NUM_LEDS; i++ ) {         // от 0 до первой трети
            leds[i] = CHSV(counter + i * 2, 255, 255);
          }
          counter++;        // counter меняется от 0 до 255 (тип данных byte)
          FastLED.show();
          delay(5);         // скорость движения радуги
        }
    }
  }
}
 

dejzar

✩✩✩✩✩✩✩
6 Ноя 2021
4
1
@Сотнег, немного не то, в вашем коде радуга постоянно будет работать, а мне нужно переключать режимы, когда я засунул if в case, в саму радугу, то она просто не работает, проходит 1 круг всего и стопорится(заливается по сути 3 цветами, хотя должна постоянно менять их, уводя в сторону)
 

Сотнег

★★★★★★★
15 Янв 2020
4,268
1,470
@dejzar,
C-like:
void loop() {
  parsing();
  if (currentMode == 2 && millis() - yourTimer >= 15) {
    yourTimer = millis();
    rainbow();
  }
}
 
  • Лойс +1
Реакции: dejzar

dejzar

✩✩✩✩✩✩✩
6 Ноя 2021
4
1
@Сотнег, Спасибо огромное, наконец-то всё заработало.
Для тех кто будет искать, вот код
Финал:
#include "FastLED.h"
#include "Parser.h"
#include "AsyncStream.h"

#define NUM_LEDS 30
#define PIN 2

CRGB leds[NUM_LEDS];
byte counter;
int currentMode;
unsigned long yourTimer;
AsyncStream<50> serial(&Serial, ';');

void setup() {
  Serial.begin(115200);
  FastLED.addLeds<WS2812, PIN, GRB>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
  FastLED.setBrightness(50);
}

void loop() {
  parsing();
  if (currentMode == 2 && millis() - yourTimer >= 5) {
    yourTimer = millis();
    rainbow();
  }
}

void parsing() {
  if (serial.available()) {
    Parser data(serial.buf, ',');  // отдаём парсеру
    int ints[10];           // массив для численных данных
    data.parseInts(ints);   // парсим в него
    switch (ints[0]) {
      case 0:
        for (int i = 0; i < NUM_LEDS; i++ ) {         // от 0 до первой трети
          leds[i].setRGB(ints[1], ints[2], ints[3]);
        }
        FastLED.show();
        currentMode = 3;
        break;
      case 1:
        FastLED.setBrightness(ints[1]);
        FastLED.show();
        currentMode = 1;
        break;
      case 2:
        currentMode = 2;
        break;
    } 
  }
}

void rainbow() {
  for (int i = 0; i < NUM_LEDS; i++ ) {         // от 0 до первой трети
    leds[i] = CHSV(counter + i * 2, 255, 255);
  }
  counter++;        // counter меняется от 0 до 255 (тип данных byte)
  FastLED.show();
  delay(30);
}