Модуль создает эффект радужного переливания на адресной светодиодной ленте
C++
void rainbow()
{
for (long firstPixelHue = 0; firstPixelHue < 3 * 65536; firstPixelHue += 256)
{
for (int i = 0; i < strip.numPixels(); i++)
{ // For each pixel in strip...
int pixelHue = firstPixelHue + (i * 65536L / strip.numPixels());
strip.setPixelColor(i, strip.gamma32(strip.ColorHSV(pixelHue)));
}
strip.show(); // Update strip with new contents
delay(5); // Pause for a moment
repeat_led_rainbow = false;
}
repeat_led_rainbow = false;
if (!loop_led_rainbow)
{
for (int i = 0; i < strip.numPixels(); i++)
{
strip.setPixelColor(i, 0); // Выключение светодиодов
}
strip.show();
}
}
void rainbowTask(void *pvParameters)
{
// uint32_t color = *(uint32_t *)pvParameters;
while (true)
{
if (loop_led_rainbow && repeat_led_rainbow) // Если repeat_led_rainbow изменился с false на true
{
rainbow(); // Выполняем rainbow
while (!repeat_led_rainbow) // Ожидаем, пока repeat_led_rainbow не станет false
{
vTaskDelay(10 / portTICK_PERIOD_MS);
}
repeat_led_rainbow = true; // Устанавливаем флаг предыдущего состояния
}
else
{
repeat_led_rainbow = false; // Обновляем флаг предыдущего состояния
vTaskDelay(10 / portTICK_PERIOD_MS); // Задержка между проверками состояния loop_led_rainbow
}
}
vTaskDelete(NULL);
}