Добрый день!
Меня зовут Андрей, прошу помощи в поиске ошибки в программе.
Скетч с набором эффектов создан для гирлянды ws2811 состоит из кучи циклов, написанных мной или позаимствованных из разных источников, управление через Ардуино микро.
Программирование - хобби, поэтому скетч не оптимальный, конечно.
Все работает, за исключением одной проблемы, решение которой я не смог найти своими силами. Дело в следующем:
Циклы в диапазонах строк 133-143 и 164-174 вызывают переход в начало программы после строки 257.
При этом сами они (133-143 и 164-174 ) работают корректно и следующие за ними - тоже.
При удалении их из общей программы (закомментировании) скетч отрабатывает до конца, как и требуется.
Меня зовут Андрей, прошу помощи в поиске ошибки в программе.
Скетч с набором эффектов создан для гирлянды ws2811 состоит из кучи циклов, написанных мной или позаимствованных из разных источников, управление через Ардуино микро.
Программирование - хобби, поэтому скетч не оптимальный, конечно.
Все работает, за исключением одной проблемы, решение которой я не смог найти своими силами. Дело в следующем:
Циклы в диапазонах строк 133-143 и 164-174 вызывают переход в начало программы после строки 257.
При этом сами они (133-143 и 164-174 ) работают корректно и следующие за ними - тоже.
При удалении их из общей программы (закомментировании) скетч отрабатывает до конца, как и требуется.
C++:
// FastLED
// куча эффектов нон-стоп по кругу
#define NUM_LEDS 100
#include "FastLED.h"
#define PIN 6
CRGB leds[NUM_LEDS];
byte counter;
void setup() {
//Serial.begin(57600);
FastLED.addLeds<WS2811, PIN, RGB>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
FastLED.setBrightness(200);
pinMode(13, OUTPUT);
}
void fadeall()
{
for (int i = 0; i < NUM_LEDS; i++)
{
leds[i].nscale8(250);
}
}
void loop()
{
// эффект Cylon
static uint8_t hue = 0;
//Serial.print("x");
// First slide the led in one direction
for (int i = 0; i < NUM_LEDS; i++) {
// Set the i'th led to red
leds[i] = CHSV(hue++, 255, 255);
// Show the leds
FastLED.show();
// now that we've shown the leds, reset the i'th led to black
// leds[i] = CRGB::Black;
fadeall();
// Wait a little bit before we loop around and do it again
delay(50);
}
// Serial.print("x");
// Now go in the other direction.
for (int i = (NUM_LEDS) - 1; i >= 0; i--) {
// Set the i'th led to red
leds[i] = CHSV(hue++, 255, 255);
// Show the leds
FastLED.show();
// now that we've shown the leds, reset the i'th led to black
// leds[i] = CRGB::Black;
fadeall();
// Wait a little bit before we loop around and do it again
delay(50);
}
fill_solid( leds, NUM_LEDS, CRGB::Black);
// случайное включение и гашение LED
uint32_t x = millis();
while (millis () - x < 15000)
{
leds [random8 ( NUM_LEDS)] = CRGB(random8( ), random8(), random8()); // полностью случайные цвета
leds [random8( NUM_LEDS)] = CRGB(0, 0, 0); // случайное гашение
FastLED.show();
delay( 50 );
}
// переливы цвета
int dk = 0;
int dl = 1000;
for ( int i = 0; i <= 255; i ++ )
{
fill_solid( leds, NUM_LEDS, CRGB(255 - i, 0, i)); // красный - синий
FastLED.show();
delay (dk);
}
delay (dl);
for ( int i = 0; i <= 255; i ++ )
{
fill_solid( leds, NUM_LEDS, CRGB(0, i, 255 - i)); // синий - зеленый
FastLED.show();
delay (dk);
}
delay (dl);
for ( int i = 0; i <= 255; i ++ )
{
fill_solid( leds, NUM_LEDS, CRGB(0, 255 , i)); // зеленый - голубой
FastLED.show();
delay (dk);
}
delay (dl);
for ( int i = 0; i <= 255; i ++ )
{
fill_solid( leds, NUM_LEDS, CRGB(i, 255 - i, 255)); // голубой - фиолетовый
FastLED.show();
delay (dk);
}
delay (dl);
for ( int i = 0; i <= 255; i ++ )
{
fill_solid( leds, NUM_LEDS, CRGB(255, i, 255 - i)); // фиолетовый - желтый
FastLED.show();
delay (dk);
}
delay (dl);
for ( int i = 0; i <= 255; i ++ )
{
fill_solid( leds, NUM_LEDS, CRGB(255, 255 - i, 0)); // желтый - красный
FastLED.show();
delay (dk);
}
delay (dl);
// случайные оттенки красного альтернативный
int i = 0;
while (i < 5000)
{
leds [random (0 - NUM_LEDS)] = CRGB( 255, random(0 - 75), random(0 - 75));
leds [random (0 - NUM_LEDS)] = CRGB(0, 0, 0); // случайное гашение
FastLED.show();
delay( 2 );
i++;
}
// сплошное заполнение цветом
for ( int i = 0; i < NUM_LEDS; i ++ )
{
leds[i] = CRGB( 0, 255, 0);
FastLED.show();
delay (50);
}
// случайные оттенки зеленого
// если раскомментирован этот цикл, то после прохождения одного цикла вместо пяти в пределах
// строк скетча №№ 204-257 происходит возврат в начало всего скетча
// x = millis();
// while (millis () - x < 10000)
// {
// leds [random (0 - NUM_LEDS)] = CRGB(random(0-75), 255, random(0 - 75));
// leds [random (0 - NUM_LEDS)] = CRGB(0, 0, 0); // случайное гашение
// FastLED.show();
// delay( 30 );
// }
for (int i = 0; i < NUM_LEDS; i ++ )
{
leds[i] = CRGB( 0, 255, 255);
FastLED.show();
delay (50);
}
for ( int i = 0; i < NUM_LEDS; i ++ )
{
leds[i] = CRGB( 255, 0, 0);
FastLED.show();
delay (50);
}
for ( int i = 0; i < NUM_LEDS; i ++ )
{
leds[i] = CRGB( 0, 0, 255);
FastLED.show();
delay (50);
}
// случайные оттенки синего
// если раскомментирован этот цикл, то после прохождения одного цикла вместо пяти в пределах
// строк скетча №№ 204-257 происходит возврат в начало всего скетча
// x = millis();
// while ( millis () - x < 20000)
// {
// leds [random (0 - NUM_LEDS)] = CRGB(random(0 - 100), random(0 - 100), 255);
// leds [random (0 - NUM_LEDS)] = CRGB(0, 0, 0); // случайное гашение
// FastLED.show();
// delay( 5 );
// }
// случайные оттенки синего альтернативный ( зависает после 1 цикла на
// строках скетча №№ 204-257
// uint32_t now = millis();
// while (millis () - now < 15000)
// {
// // тут в течение 15000 миллисекунд вертится код
// leds [random (0 - NUM_LEDS)] = CRGB(random(0 - 100), random(0 - 100), 255);
// leds [random (0 - NUM_LEDS)] = CRGB(0, 0, 0); // случайное гашение
// FastLED.show();
// delay( 5 );
//
// }
// now = millis();
for ( int i = 0; i < NUM_LEDS; i ++ )
{
leds[i] = CRGB( 255, 255, 0);
FastLED.show();
delay (50);
}
for ( int i = 0; i < NUM_LEDS; i ++ )
{
leds[i] = CRGB( 255, 0, 255);
FastLED.show();
delay (50);
}
// бегущие тройки разных цветов
int l = 0;
int j = 0;
int k = 0;
int d = 0;
int de = 5; // здесь установлена задержка бегущего LED
do
{
for (int i = 0; i <= NUM_LEDS + 2; i ++ )
{
j = i - 1;
k = i - 2;
l = i - 3;
if (d < 1)
{
leds[i] = CRGB( 0, 255, 0);
leds[j] = CRGB( 0, 255, 0);
leds[k] = CRGB( 0, 255, 0);
leds [l] = CRGB ( 0, 0, 0);
}
else if (d < 2)
{
leds[i] = CRGB( 0, 0, 255);
leds[j] = CRGB( 0, 0, 255);
leds[k] = CRGB( 0, 0, 255);
leds [l] = CRGB ( 0, 0, 0);
}
else if (d < 3)
{
leds[i] = CRGB( 255, 255, 0);
leds[j] = CRGB( 255, 255, 0);
leds[k] = CRGB( 255, 255, 0);
leds [l] = CRGB ( 0, 0, 0);
}
else if (d < 4)
{
leds[i] = CRGB( 255, 0, 255);
leds[j] = CRGB( 255, 0, 255);
leds[k] = CRGB( 255, 0, 255);
leds [l] = CRGB ( 0, 0, 0);
}
else
{
leds[i] = CRGB( 255, 0, 0);
leds[j] = CRGB( 255, 0, 0);
leds[k] = CRGB( 255, 0, 0);
leds [l] = CRGB ( 0, 0, 0);
}
FastLED.show();
delay( 50 );
}
d++;
}
while (d < 5);
// здесь происходит непредусмотренный переход в начало всей программы
int y = 0;
do
{
// две бегущие навстречу тройки
for (int i = 0; i <= NUM_LEDS; i ++ )
{
j = NUM_LEDS - i;
leds[i + 2] = CRGB( 255, 255, 255);
leds[i + 1 ] = CRGB( 0, 255, 0);
leds[i] = CRGB( 255, 0, 0);
leds[i - 1] = CRGB( 0, 0, 0);
leds[j - 3] = CRGB( 255, 0, 255);
leds[j - 2] = CRGB( 255, 255, 0);
leds[j - 1] = CRGB( 0, 0, 255);
leds[j ] = CRGB( 0, 0, 0);
FastLED.show();
delay(100 );
}
y++;
}
while ( y < 5);
k = 0; // заполнение одним бегущим LED
do
{
for (int i = 0; i < NUM_LEDS - k; i ++ )
{
leds[i] = CRGB( 255, 0, 0); // красный
leds[i - 1] = CRGB( 0, 0, 0);
FastLED.show();
delay( de );
}
k++;
}
while (k < NUM_LEDS);
k = 0;
// радуга от alexgyver
do
{
for (int i = 0; i < NUM_LEDS; i++ ) {
leds[i] = CHSV(counter + i * 8, 255, 255); // HSV. Увеличивать HUE (цвет) (оттенок, насыщенность , уровень)
// умножение i уменьшает шаг радуги
}
counter++; // counter меняется от 0 до 255 (тип данных byte)
FastLED.show();
delay(2 ); // скорость движения радуги
k++;
}
while (k < NUM_LEDS * 50);
k = 0;
// заполнение одним бегущим LED
do
{
for (int i = 0; i < NUM_LEDS - k; i ++ )
{
leds[i] = CRGB( 0, 255, 0); // зеленый
leds[i - 1] = CRGB( 0, 0, 0);
FastLED.show();
delay( de );
}
k++;
}
while (k < NUM_LEDS);
k = 0;
// радуга от alexgyver
do
{
for (int i = 0; i < NUM_LEDS; i++ ) {
leds[i] = CHSV(counter + i * 8, 255, 255); // HSV. Увеличивать HUE (цвет) (оттенок, насыщенность , уровень)
// умножение i уменьшает шаг радуги
}
counter++; // counter меняется от 0 до 255 (тип данных byte)
FastLED.show();
delay(2 ); // скорость движения радуги
k++;
}
while (k < NUM_LEDS * 50);
k = 0;
// заполнение одним бегущим LED
do
{
for (int i = 0; i < NUM_LEDS - k; i ++ )
{
leds[i] = CRGB( 0, 0, 255); // синий
leds[i - 1] = CRGB( 0, 0, 0);
FastLED.show();
delay( de );
}
k++;
}
while (k < NUM_LEDS);
k = 0;
// радуга от alexgyver
do
{
for (int i = 0; i < NUM_LEDS; i++ ) {
leds[i] = CHSV(counter + i * 8, 255, 255); // HSV. Увеличивать HUE (цвет) (оттенок, насыщенность , уровень)
// умножение i уменьшает шаг радуги
}
counter++; // counter меняется от 0 до 255 (тип данных byte)
FastLED.show();
delay(2 ); // скорость движения радуги
k++;
}
while (k < NUM_LEDS * 50);
k = 0;
// заполнение одним бегущим LED
do
{
for (int i = 0; i < NUM_LEDS - k; i ++ )
{
leds[i] = CRGB( 0, 255, 255); // голубой
leds[i - 1] = CRGB( 0, 0, 0);
FastLED.show();
delay( de );
}
k++;
}
while (k < NUM_LEDS);
k = 0;
// радуга от alexgyver
do
{
for (int i = 0; i < NUM_LEDS; i++ ) {
leds[i] = CHSV(counter + i * 8, 255, 255); // HSV. Увеличивать HUE (цвет) (оттенок, насыщенность , уровень)
// умножение i уменьшает шаг радуги
}
counter++; // counter меняется от 0 до 255 (тип данных byte)
FastLED.show();
delay(2 ); // скорость движения радуги
k++;
}
while (k < NUM_LEDS * 50);
k = 0;
// заполнение одним бегущим LED
do
{
for (int i = 0; i < NUM_LEDS - k; i ++ )
{
leds[i] = CRGB( 255, 0, 255); // фиолетовый
leds[i - 1] = CRGB( 0, 0, 0);
FastLED.show();
delay( de );
}
k++;
}
while (k < NUM_LEDS);
k = 0;
// радуга от alexgyver
do
{
for (int i = 0; i < NUM_LEDS; i++ ) {
leds[i] = CHSV(counter + i * 8, 255, 255); // HSV. Увеличивать HUE (цвет) (оттенок, насыщенность , уровень)
// умножение i уменьшает шаг радуги
}
counter++; // counter меняется от 0 до 255 (тип данных byte)
FastLED.show();
delay(2 ); // скорость движения радуги
k++;
}
while (k < NUM_LEDS * 50);
k = 0;
// заполнение одним бегущим LED
do
{
for (int i = 0; i < NUM_LEDS - k; i ++ )
{
leds[i] = CRGB( 255, 255, 0); //желтый
leds[i - 1] = CRGB( 0, 0, 0);
FastLED.show();
delay( de );
}
k++;
}
while (k < NUM_LEDS);
k = 0;
// радуга от alexgyver
do
{
for (int i = 0; i < NUM_LEDS; i++ ) {
leds[i] = CHSV(counter + i * 8, 255, 255); // HSV. Увеличивать HUE (цвет) (оттенок, насыщенность , уровень)
// умножение i уменьшает шаг радуги
}
counter++; // counter меняется от 0 до 255 (тип данных byte)
FastLED.show();
delay(2 ); // скорость движения радуги
k++;
}
while (k < NUM_LEDS * 50);
k = 0;
}