Hello Everyone,
The vision for my project is for python to read my body's position from a webcam, send the coordinate data from my laptop to an Elegoo Uno R3 serial port, which controls the characteristics of my SK9882 light strip using fastLED library.
Problem: Everything works great by itself, but the serial communication and light strip freeze when I run them at the same time. After a few seconds of running the program, the serial monitor stops displaying new data (often cutting off with a backwards question mark) and the LED strip will shut off or stop responding
I thought my problem was interrupts, and switched from the WS2812b to the SK9882 because this blog post said that might be the problem. However, I am still getting the same behavior.
My goal is for serial communication and fastLED can operate smooth and fast so that I can record dances that change the lights in my room. Here is my Arduino Code:
#include <FastLED.h>
#define DATA_PIN 6
#define CLK_PIN 5
#define LED_TYPE SK9822
#define COLOR_ORDER BGR
#define NUM_LEDS 150
#define BRIGHTNESS 5
CRGB leds[NUM_LEDS];
static boolean recvInProgress = false;
const byte numChars = 32;
char receivedChars[numChars];
char tempChars[numChars]; // temporary array for use when parsing
// variables to hold the parsed data
int x = 0;
int y = 0;
int z = 0;
const int rows = 6;
const int cols = 2;
int data[rows][cols] = { { 1, 2}, { 3, 4}, { 5, 6}, { 7, 8}, { 9, 10}, { 11, 12}};
boolean newData = false;
void setup() {
// put your setup code here, to run once:
Serial.begin(38400);
FastLED.addLeds<LED_TYPE, DATA_PIN, CLK_PIN, COLOR_ORDER>(leds, NUM_LEDS);
FastLED.setBrightness(BRIGHTNESS);
FastLED.clear();
FastLED.show();
}
void loop() {
runLights();
recvWithStartEndMarkers();
if (newData == true) {
strcpy(tempChars, receivedChars);
// this temporary copy is necessary to protect the original data
// because strtok() used in parseData() replaces the commas with \0
parseData();
showParsedData();
newData = false;
}
FastLED.show();
}
//============
void runLights() {
for (int j = 0; j < 6; j++) {
Serial.print(j);
Serial.print("/");
Serial.print(data[j][0]);
Serial.print("/");
Serial.println(data[j][1]);
}
int hue1 = map(data[0][0], 0, 640, 0, 255);
int hue2 = map(data[1][0], 0, 640, 0, 255);
int hue3 = map(data[2][0], 0, 640, 0, 255);
int hue4 = map(data[3][0], 0, 640, 0, 255);
int hue5 = map(data[4][0], 0, 640, 0, 255);
int hue6 = map(data[5][0], 0, 640, 0, 255);
int val = map(data[3][1], 0, 360, 255, 0);
leds[0] = CHSV(hue1, 255, 255);
leds[1] = CHSV(hue1, 255, 255);
leds[2] = CHSV(hue1, 255, 255);
leds[3] = CHSV(hue1, 255, 255);
leds[4] = CHSV(hue1, 255, 255);
leds[5] = CHSV(hue1, 255, 255);
leds[6] = CHSV(hue1, 255, 255);
leds[7] = CHSV(hue1, 255, 255);
leds[8] = CHSV(hue1, 255, 255);
leds[9] = CHSV(hue1, 255, 255);
leds[10] = CHSV(hue1, 255, 255);
leds[11] = CHSV(hue1, 255, 255);
leds[12] = CHSV(hue1, 255, 255);
leds[13] = CHSV(hue1, 255, 255);
leds[14] = CHSV(hue1, 255, 255);
}
void recvWithStartEndMarkers() {
static boolean recvInProgress = false;
static byte ndx = 0;
char startMarker = '<';
char endMarker = '>';
char rc;
while (Serial.available() > 0 && newData == false) {
rc = Serial.read();
if (recvInProgress == true) {
if (rc != endMarker) {
receivedChars[ndx] = rc;
ndx++;
if (ndx >= numChars) {
ndx = numChars - 1;
}
}
else {
receivedChars[ndx] = '\0'; // terminate the string
recvInProgress = false;
ndx = 0;
newData = true;
}
}
else if (rc == startMarker) {
recvInProgress = true;
}
}
}
//============
void parseData() { // split the data into its parts
char * strtokIndx; // this is used by strtok() as an index
strtokIndx = strtok(tempChars, ","); // get the first part - the string
z = atoi(strtokIndx); // copy it to messageFromPC
strtokIndx = strtok(NULL, ","); // this continues where the previous call left off
x = atoi(strtokIndx); // convert this part to an integer
strtokIndx = strtok(NULL, ",");
y = atoi(strtokIndx); // convert this part to a float
data[z][0] = x;
data[z][1] = y;
}
//============
void showParsedData() {
Serial.print("x: ");
Serial.println(x);
Serial.print("y: ");
Serial.println(y);
Serial.print("z: ");
Serial.println(z);
}