Неопиксель Arduino исчезает из цвета в цвет, используя Sparkcore

Этот вопрос является следствием другого вопроса, который я задавал здесь, который был ответил.

У меня есть следующая функция:

MotiColor startColor;
MotiColor endColor;

void setup()
{
// Begin strip.
strip.begin();

// Initialize all pixels to 'off'.
strip.show();

Serial1.begin(9600);

startColor = MotiColor(0, 0, 0);
endColor = MotiColor(0, 0, 0);
}

void loop () {
}

int tinkerSetColour(String command)
{
strip.show();

int commaIndex = command.indexOf(',');
int secondCommaIndex = command.indexOf(',', commaIndex+1);
int lastCommaIndex = command.lastIndexOf(',');

String red = command.substring(0, commaIndex);
String grn = command.substring(commaIndex+1, secondCommaIndex);
String blu = command.substring(lastCommaIndex+1);

startColor = MotiColor(red.toInt(), grn.toInt(), blu.toInt());

int16_t redDiff = endColor.getR() - startColor.getR();
int16_t greenDiff = endColor.getG() - startColor.getG();
int16_t blueDiff = endColor.getB() - startColor.getB();

int16_t _delay = 500;
int16_t duration = 3500;
int16_t steps = duration / _delay;

int16_t redValue, greenValue, blueValue;

for (int16_t i = steps; i >= 0; i--) {
redValue = (int16_t)startColor.getR() + (redDiff * i / steps);
greenValue = (int16_t)startColor.getG() + (greenDiff * i / steps);
blueValue = (int16_t)startColor.getB() + (blueDiff * i / steps);

sprintf(rgbString, "%i,%i,%i", redValue, greenValue, blueValue);
Spark.publish("rgb", rgbString);

for (uint16_t i = 0; i < strip.numPixels(); i++) {
strip.setPixelColor(i, strip.Color(redValue, greenValue, blueValue));
}

delay(_delay);
}

delay(_delay);

for (uint16_t i = 0; i < strip.numPixels(); i++) {
strip.setPixelColor(i, strip.Color(endColor.getR(), endColor.getG(), endColor.getB()));
}

delay(_delay);

endColor = MotiColor(startColor.getR(), startColor.getG(), startColor.getB());

return 1;
}

Я правильно вижу опубликованные результаты:

Это от OFF (0,0,0) -> RED (255,0,0) -> GREEN (0,255,0).

введите описание изображения здесь

Он отлично работает, когда я публикую результаты обратно в веб-консоль через Spark.publish() событие, однако фактические светодиоды Neopixel не исчезают от цвета к цвету, как ожидалось. Они просто меняются от цвета к цвету вместо того, чтобы красиво исчезать между собой.

Мне просто интересно, где я ошибаюсь или как я могу улучшить свой код, чтобы я действительно видел исчезновение в реальном времени.

0

Решение

Вы должны вызвать strip.show () в вашем цикле for, вот так:

for (int16_t i = steps; i >= 0; i--) {
redValue = (int16_t)startColor.getR() + (redDiff * i / steps);
greenValue = (int16_t)startColor.getG() + (greenDiff * i / steps);
blueValue = (int16_t)startColor.getB() + (blueDiff * i / steps);

sprintf(rgbString, "%i,%i,%i", redValue, greenValue, blueValue);
Spark.publish("rgb", rgbString);

for (uint16_t i = 0; i < strip.numPixels(); i++) {
strip.setPixelColor(i, strip.Color(redValue, greenValue, blueValue));
}// !!! Without this, you'll only see the result the next time you call
// tinkerSetColor() !!!
strip.show();delay(_delay);
}

Чтобы понять, что происходит, вы можете взглянуть на исходный код библиотеки NeoPixel. Вы увидите, что strip.setPixelColor() только сохраняет значение RGB в памяти (думайте о нем как о буфере рисования, чтобы вы могли обновить всю полосу сразу, что имеет смысл, если вы посмотрите, как работают микросхемы контроллера). призвание strip.show() вызывает выполнение подпрограммы, которая будет выдавать значения каждому пикселю в последовательном соединении.

2

Другие решения


По вопросам рекламы [email protected]