Заливаем шары к празднику

lilik
Offline
Зарегистрирован: 19.10.2017

/////////////////////////// тест ШАРИК НА WS2812b

#include "Adafruit_NeoPixel.h"
#define LED_COUNT 5
#define LED_PIN 6
Adafruit_NeoPixel strip = Adafruit_NeoPixel(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);// Создаем переменную strip для управления нашей лентой.
int r = 30; int g = 30; int b = 30; //переменные хранения параметров включений пикселей
void setup () {

  strip.begin();

  for (int i = 0; i < LED_COUNT; i++) {
    strip.setPixelColor(i, 0, 0, 0); //
  }
  strip.show();
  /////////////////////////////////////////////////

}
void loop () {
  for (int i = 0; i < LED_COUNT; i++) {
    strip.setPixelColor(i, r, 0, 0); //
    if (i != LED_COUNT - 1) {
      strip.setPixelColor(i + 1, 0, g, 0);
    } else {
      strip.setPixelColor(0, 0, g, 0);
    }
    strip.show(); delay(125);
    for (int i = 0; i < LED_COUNT; i++) {
      strip.setPixelColor(i, 0, 0, 0); //
      strip.show();
    }
  }

}
//////////////////////////////////////////////////



Возникла мысль использовать умные пиксели  в минигирляндах, внутри самодельных шаров. Немного печатных деталек, светорассеиватель от ламп... и шар готов.

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Зачётная идея!

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

Для гаишников пойдет)) Меня пугает немного))))

v258
Offline
Зарегистрирован: 25.05.2020

(глядя на пустую лампу на подоконнике) а что, это идея )))

sadman41
Offline
Зарегистрирован: 19.10.2016

Забавно. Наверное, если ленту порубить, то пайки минимум будет вообще.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Я как-то делал подобное с "бутылкой испад срецтва" - http://arduino.ru/forum/proekty/k-voprosu-utilizatsii-tary-iz-pod-sretstva

sadman41
Offline
Зарегистрирован: 19.10.2016

Для бутылок есть такой вариант: 

https://aliexpress.ru/item/1005001929246313.html

 

v258
Offline
Зарегистрирован: 25.05.2020

Я запихивал такую гирлянду в банку - так себе эффект. Но эпилептики оценят ))

sadman41
Offline
Зарегистрирован: 19.10.2016

Я вот в такое пихал (не для праздника, правда), тоже ничего так:

lilik
Offline
Зарегистрирован: 19.10.2017

Rumata пишет:

Для гаишников пойдет)) Меня пугает немного))))

:-)

Это на камеру выглядит как проблесковый маяк, а на глаз светорассеиватель всё рассеивает. Внутри 5 размытых областей светимости - напоминают дольки.

Оказывается погорелую лампу с отстёгнутым шаром можно починить, если найти сгоревший светодиод. Его частично соскабливаем ножом и капаем припоем (лепим соплю).

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

замыкая один диод, ты увеличиваешь ток через остальные.  Они и так не блещут надёжностью, поэтому через некоторое, достаточно короткое время, опять найдётся слабое звено.  У мня "восстановленные" таким образом ланпы дольше 5 дней не работали 

lilik
Offline
Зарегистрирован: 19.10.2017

:-)

Тогда резисторы можно подбирать, постепенно заменяя светодиоды.

Green
Offline
Зарегистрирован: 01.10.2015

Там где то резисторы есть в токозадающей цепи источника тока. Не знаю как на лампах, а на светильниках стоят впару. Один выкусываешь и ток падает % на 30-40. Падает и яркость, но не существенно, зато режим не насильственный. Всё же лучше чем ничего.)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

lilik пишет:

:-)

Тогда резисторы можно подбирать, постепенно заменяя светодиоды.

Не проще ли новый светодиод впаять?

Только вот является ли такой ремонт экономически целесообразным?

lilik
Offline
Зарегистрирован: 19.10.2017

Оторвать шарики, остальное выкинуть - тоже вроде как жалко. Там же светодиоды... правда, их хрен куда вставишь.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Я дроссели выпаиваю. Им-то много применений. А некоторых ламп (больше у "завитушек") и высоковольтные транзисторы есть.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

lilik пишет:

Там же светодиоды... правда, их хрен куда вставишь.

Ну, как "хрен". Как раз одна лампа может послужить донором для починки трё-пяти других.

lilik
Offline
Зарегистрирован: 19.10.2017

У меня только паяльник, боюсь их аккуратно-целыми перепаять не удастся. 

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Без оборудования специализированного , менять светодиоды в лампах , идея так себе. Там подложка алюминиевая и многие диоды припаяны не только анод/катодом, но и радиатором (который даже видно не всегда)

Logik
Offline
Зарегистрирован: 05.08.2014

DetSimen пишет:

замыкая один диод, ты увеличиваешь ток через остальные.  Они и так не блещут надёжностью, поэтому через некоторое, достаточно короткое время, опять найдётся слабое звено.  У мня "восстановленные" таким образом ланпы дольше 5 дней не работали 

То только в самых паскудных так. Сейчас пошти все идут с стабилизатором тока, ток там считай не меняется. И да , резистор токозадающий надо увеличивать, если их два в паралель - один нахер. Лучше в начале работы, не дожидаясь перегорания, а то выжившие диоды подгореть успеют.

Хотя чудеса китайской схемотехники бесконечны. Недавно светильник ковырял, аккуратный, дорогой, IP67 подложка с теплоотводом, большая. Так два источника тока в параллель поставлены и работает на две параллельных цепи светодиодов. Выгорает один светодиод, его цепь светодиодов разрывается, а вторая цепь быстро дожигается удвоенным током ))) Чтоб быстрей новый покупали?

Green
Offline
Зарегистрирован: 01.10.2015

Logik пишет:

Хотя чудеса китайской схемотехники бесконечны. Недавно светильник ковырял, аккуратный, дорогой, IP67 подложка с теплоотводом, большая. Так два источника тока в параллель поставлены и работает на две параллельных цепи светодиодов. Выгорает один светодиод, его цепь светодиодов разрывается, а вторая цепь быстро дожигается удвоенным током ))) Чтоб быстрей новый покупали?


Сплошь и рядом так. Мало того что 2 источника тока в параллель, так ещё и на 4 параллельных светодиодных цепи, а то и 5 в параллель встречал. Как правило, работают нормально в течение определённого времени (год), затем начинают сыпаться.

Logik
Offline
Зарегистрирован: 05.08.2014

Вот такая схема и гарантирует что посыпется быстро все после выхода из строя одного светодиода.

Green
Offline
Зарегистрирован: 01.10.2015

Да на 100%. Так оно и происходит. И вся эта экономия накрывается медным тазом. А продавцы испаряются вместе со своими многолетними гарантиями.)

lilik
Offline
Зарегистрирован: 19.10.2017

Green пишет:

Да на 100%. Так оно и происходит. И вся эта экономия накрывается медным тазом. А продавцы испаряются вместе со своими многолетними гарантиями.)

Настало время создания умного осветительного светодиода - с самошунтированием при перегорании :-)

Green
Offline
Зарегистрирован: 01.10.2015

На мой взгляд, нужно изменить схемотехнику. Что мешает сделать несколько цепочек светодиодов, например 4, распределив равномерно по светильнику. Тогда, если одна перегорает, яркость упадет на 25%. В лампочках так не получится.( Ну и основное, не выжимать максимум из светодиодов.

Kakmyc
Offline
Зарегистрирован: 15.01.2018

У меня 8 лет лампочкам, сгорела за все время одна , и та от статики.
Просто не нужно брать туфту задешево.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Из 18 ланп от 7 до 23 Ватт  Е27  в первый год службы сгорели все, семиваттные 6 шт выписывал с Али, месяца не продержались, остальные Gauss и близкие к ним.   На 30Вт Е27 здоровые такие, из трёх сгорела одна, две другие светют больше двух лет.  А замена зеркальных галогенок со штырьками (цоколь 5.3 памойму) за четыре года из 14 штук (5-7 Ватт) сгорела одна, и то потому что в нее торцом клюшки попали.  

Green
Offline
Зарегистрирован: 01.10.2015

lilik пишет:

Настало время создания умного осветительного светодиода - с самошунтированием при перегорании :-)


Вы будете смеяться, но такие попадаются.) Перегорают и другим светить дают - сам погибай, других выручай. Но это большая редкость.
Попадаются и такие что держат удар за двоих. До поры - до времени, конечно.

lilik
Offline
Зарегистрирован: 19.10.2017

Green пишет:

lilik пишет:

Настало время создания умного осветительного светодиода - с самошунтированием при перегорании :-)


Вы будете смеяться, но такие попадаются.) Перегорают и другим светить дают - сам погибай, других выручай. Но это большая редкость.
Попадаются и такие что держат удар за двоих. До поры - до времени, конечно.

Схемных вариантов самошунтирования не видел :-)

Оказывается горелый светодиод можно и визуально найти.

Да и сам он явно хлипкий - раз чиркнул ножом.

Восстановил три лампы, буду пробовать живучесть их на гараже. Свет там горит 20-30 минут, 3-4 раза в неделю.

Такой драйвер стоит на всех.

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Брал хвалёные Гауссы, Наносветы... Дохнут равновероятно со всеми. Икеевская только одна заморгала. Наверное от того, что несколько лет висела вверх ногами и прогревала себе конденсаторы.

Green
Offline
Зарегистрирован: 01.10.2015

lilik пишет:

Оказывается горелый светодиод можно и визуально найти.

 


Один светодиод - это ни о чём. У меня 5 из 10-ти  бывают закорочены.)

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Качество лампы легко проверить взвесив ее в руке.
Нормальные лампы с алюминиевым/медным радиатором и нормальным драйвером (не из трёх деталей), весят в 2-5раз тяжелее дешёвых китайских поделий.
Гаусс скатился в говно, Филлипс и Экола пока ещё вроде в адеквате. Когда то были в продаже качественные и при этом недорогие лампы Полароид, но уже давно не видел.
В целом сейчас нормальных ламп дешевле 400р не бывает.

lilik
Offline
Зарегистрирован: 19.10.2017

На фотках какие то горизонтальные полосы видны, а глазами их не видно. Странно.

sadman41
Offline
Зарегистрирован: 19.10.2016
Logik
Offline
Зарегистрирован: 05.08.2014

Не... то https://www.youtube.com/watch?v=UPKBB62N3OM

А тут.

 

JPG сжатие выполняется в блоках пикселей. В сильно сжатом JPG-изображении видны края этих блоков: в исходном изображении два пикселя могут быть очень близкими по яркости и цвету, но если они находятся в разных блоках, то после сжатия и распаковки (при просмотре) каждый из их значения могут отличаться от оригинала, поэтому вы потеряете это постепенное смешивание и начнете видеть эту «блочность».

enter image description here

Вот типичный пример в небе - JPG сохранен с качеством 0. 

http://photopedia.su/36011/chto-takoe-artefakty-jpeg-chto-nimi-mozhno-sdelat

lilik
Offline
Зарегистрирован: 19.10.2017

Здесь как то странно, на зелёном видно отчётливо, слабее на красном и фиолетовом. За границами шара нет. Показалось, что это не связано с картинкой. Может камера телефона искажает так своеобразно?

sadman41
Offline
Зарегистрирован: 19.10.2016

Ну, квадратичность и сжатие по шкале шакалов мне известны. Я склонен считать, что это последствия фотографирования ШИМа

lilik
Offline
Зарегистрирован: 19.10.2017

sadman41 пишет:
Забавно. Наверное, если ленту порубить, то пайки минимум будет вообще.

Заказал метр с шагом около 16мм между пикселями. Как придёт попробую автономный шар сделать с питанием от аккумулятора внутри. Придётся искать сферу диаметром более 60мм.

Эксперименты показали :-) , что 16 млн. цветов это миф. Я рассмотрел около 20. Поэтому основную функцию включения пикселя пришлось переделать на другие аргументы - номер пикселя в ленте, номер цвета или его название по русски, условная яркость свечения. Выбрал исходной 64 ступенчатую градацию цвета.

/////////////////////////// тест цветов ШАРИК НА WS2812b
#include "Adafruit_NeoPixel.h"
#define LED_COUNT 5
#define LED_PIN 6
Adafruit_NeoPixel strip = Adafruit_NeoPixel(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);// Создаем переменную strip для управления нашей лентой.
int t=2000;//

void setup () {
strip.begin();
 for (int i = 0; i < LED_COUNT; i++) {
    strip.setPixelColor(i, 0, 0, 0); //
  }
  strip.show();
  /////////////////////////////////////////////////
 }
void loop () {
  //перебор цветов из набора на яркости 25 (МАХ 85)
  for (int i = 0; i < LED_COUNT; i++){ pixel_(i,"красный",25);}strip.show();delay(t);//
  for (int i = 0; i < LED_COUNT; i++){ pixel_(i,"жёлтый",25);}strip.show();delay(t);//
  for (int i = 0; i < LED_COUNT; i++){ pixel_(i,"оранжевый",25);}strip.show();delay(t);//
  for (int i = 0; i < LED_COUNT; i++){ pixel_(i,"зелёный_1",25);}strip.show();delay(t);//
  for (int i = 0; i < LED_COUNT; i++){ pixel_(i,"зелёный_2",25);}strip.show();delay(t);//
  for (int i = 0; i < LED_COUNT; i++){ pixel_(i,"зелёный_3",25);}strip.show();delay(t);//
  for (int i = 0; i < LED_COUNT; i++){ pixel_(i,"мятный",25);}strip.show();delay(t);//
  for (int i = 0; i < LED_COUNT; i++){ pixel_(i,"голубой",25);}strip.show();delay(t);//
  for (int i = 0; i < LED_COUNT; i++){ pixel_(i,"синий_1",25);}strip.show();delay(t);//
  for (int i = 0; i < LED_COUNT; i++){ pixel_(i,"синий_2",25);}strip.show();delay(t);//
  for (int i = 0; i < LED_COUNT; i++){ pixel_(i,"сиреневый",25);}strip.show();delay(t);//
  for (int i = 0; i < LED_COUNT; i++){ pixel_(i,"малиновый",25);}strip.show();delay(t);//
  for (int i = 0; i < LED_COUNT; i++){ pixel_(i,"бирюзовый",25);}strip.show();delay(t);//
  for (int i = 0; i < LED_COUNT; i++){ pixel_(i,"розовый",25);}strip.show();delay(t);//
  for (int i = 0; i < LED_COUNT; i++){ pixel_(i,"бежевый",25);}strip.show();delay(t);//
  for (int i = 0; i < LED_COUNT; i++){ pixel_(i,"белый_1",25);}strip.show();delay(t);// 
  for (int i = 0; i < LED_COUNT; i++){ pixel_(i,"белый_2",25);}strip.show();delay(t);// 
 }
//////////////////////////////////////////////////
// цвет пикселя по номеру
void pixel_(int num, byte cvet ,byte M){
if(num<LED_COUNT&&cvet<63&&M<86){
  int b=cvet/16;int g=(cvet%16)/4;int r=cvet-4*g-16*b;// цвета от 0 до 63
  strip.setPixelColor(num, r*M, g*M, b*M);
 }
}
//////////////////////////////////////////////////
// цвет пикселя по названию
void pixel_(int num, String CVET ,byte M){
byte cvet;
//набор цветов
if(CVET=="жёлтый"||CVET=="желтый"){cvet=11;pixel_( num,cvet,M);}
if(CVET=="зелёный_1"||CVET=="зеленый_1"){cvet=8;pixel_( num,cvet,M);} 
if(CVET=="зелёный_3"||CVET=="зеленый_3"){cvet=9;pixel_( num,cvet,M);}
if(CVET=="малиновый"){cvet=19;pixel_( num,cvet,M);} 
if(CVET=="голубой"){cvet=52;pixel_( num,cvet,M);} 
if(CVET=="розовый"){cvet=23;pixel_( num,cvet,M);} 
if(CVET=="бирюзовый"){cvet=24;pixel_( num,cvet,M);}
if(CVET=="мятный"){cvet=29;pixel_( num,cvet,M);} 
if(CVET=="синий_1"){cvet=37;pixel_( num,cvet,M);} 
if(CVET=="белый_1"){cvet=47;pixel_( num,cvet,M);} 
if(CVET=="синий_2"){cvet=48;pixel_( num,cvet,M);}
if(CVET=="сиреневый"){cvet=49;pixel_( num,cvet,M);} 
if(CVET=="красный"){cvet=3;pixel_( num,cvet,M);} 
if(CVET=="зелёный_2"||CVET=="зеленый_2"){cvet=4;pixel_( num,cvet,M);} 
if(CVET=="белый_2"){cvet=41;pixel_( num,cvet,M);}
if(CVET=="оранжевый"){cvet=7;pixel_( num,cvet,M);} 
if(CVET=="бежевый"){cvet=27;pixel_( num,cvet,M);}    
}
/////////////////////////////////////////////////

 

sadman41
Offline
Зарегистрирован: 19.10.2016

А МК какой?

16 777 216 = 2^24

Так что "количество цветов" - понятие математическое, а не человеческое. Человек дай бог 65к различит. Некоторые даже, типа меня, за 8-битный цвет не вылезают.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

В пределах цветовой плоскости человек различает порядка 4000 оттенков.

Еще - порядка 200 градаций яркости.

Перемножением получаем цифру 800 000. Но при условии, что цветовое пространство - цилиндр. На практике оно ближе к конусу (по мере удаления от "оптимальной" яркости число различаемых оттенков сокращается). Т.е. получаем 250-300 тыс. оттенков.

sadman41
Offline
Зарегистрирован: 19.10.2016

На практике с ШИМ стоит рассчитывать на 300тыщ (18 бит) или все же стоит наполовину прирезать битность? Были ли такие эксперименты? Если на WS2812 эти оттенки не получить, то не стоит на них и выч.ресурс тратить.

Вроде какое-то цветокодирование есть... RGB565 что ли - его не зря выдумали, поди.

lilik
Offline
Зарегистрирован: 19.10.2017

Ну про 16 миллионов вычитал где то давно из соображений авторов - 255 ступеней яркости (без 0) на каждый цвет, следовательно 255*255*255 комбинаций, а с 0 ещё больше :-)

На практике допускаю, что какие то экзотические цвета пропустил, а так в пределах 20 нашёл из 64 комбинаций пропорций rgb. 

vk007
Offline
Зарегистрирован: 16.06.2015

sadman41 пишет:
Вроде какое-то цветокодирование есть... RGB565 что ли - его не зря выдумали, поди.

Его выдумали, чтобы закодировать цвет в двух байтах. Поскольку для ретрокомпов (в т.ч. игровых приставок) на то время одного байта уже было мало, а три ещё много. 5+5+5 = 15. И чтобы 1 бит не пропадал зря, его отдали зеленому каналу, так как к нему наш глаз более чувствителен, чем к красному и синему.

lilik
Offline
Зарегистрирован: 19.10.2017

Подготовил под пробы гирлянды шары. Тест на 3 эффекта для одного шарика сделал.

/////////////////////////// тест цветов и эффектов - ШАРИК НА WS2812b
#include "Adafruit_NeoPixel.h"
#define LED_COUNT 5
#define LED_PIN 6
Adafruit_NeoPixel strip = Adafruit_NeoPixel(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);// Создаем переменную strip для управления нашей лентой.
void setup () {
strip.begin();
 for (int i = 0; i < LED_COUNT; i++) {
   pixel_(i,0,0);// выключение пикселя 
  }
  strip.show();
  /////////////////////////////////////////////////
 }
void loop () {
FUN_1(25);// исполнение 1 эффекта
FUN_2(40,50);// исполнение 2 эффекта
FUN_3(50,150);//исполнение 3 эффекта
}
//////////////////////////////////////////////////
// цвет пикселя по номеру (1 уровень)
void pixel_(int num, byte cvet ,byte M){
if(num<LED_COUNT&&cvet<63&&M<86){
  int b=cvet/16;int g=(cvet%16)/4;int r=cvet-4*g-16*b;// цвета от 0 до 63
  strip.setPixelColor(num, r*M, g*M, b*M);
 }
}
//////////////////////////////////////////////////
//цвет пикселя по названию (2 уровень)
void pixel_(int num, String CVET ,byte M){
byte cvet;
//набор цветов
if(CVET=="жёлтый"||CVET=="желтый"){cvet=11;pixel_( num,cvet,M);}
if(CVET=="зелёный_1"||CVET=="зеленый_1"){cvet=8;pixel_( num,cvet,M);} 
if(CVET=="зелёный_3"||CVET=="зеленый_3"){cvet=9;pixel_( num,cvet,M);}
if(CVET=="малиновый"){cvet=19;pixel_( num,cvet,M);} 
if(CVET=="голубой"){cvet=52;pixel_( num,cvet,M);} 
if(CVET=="розовый"){cvet=23;pixel_( num,cvet,M);} 
if(CVET=="бирюзовый"){cvet=24;pixel_( num,cvet,M);}
if(CVET=="мятный"){cvet=29;pixel_( num,cvet,M);} 
if(CVET=="синий_1"){cvet=37;pixel_( num,cvet,M);} 
if(CVET=="белый_1"){cvet=47;pixel_( num,cvet,M);} 
if(CVET=="синий_2"){cvet=48;pixel_( num,cvet,M);}
if(CVET=="сиреневый"){cvet=49;pixel_( num,cvet,M);} 
if(CVET=="красный"){cvet=3;pixel_( num,cvet,M);} 
if(CVET=="зелёный_2"||CVET=="зеленый_2"){cvet=4;pixel_( num,cvet,M);} 
if(CVET=="белый_2"){cvet=41;pixel_( num,cvet,M);}
if(CVET=="оранжевый"){cvet=7;pixel_( num,cvet,M);} 
if(CVET=="бежевый"){cvet=27;pixel_( num,cvet,M);} 
if(CVET=="чёрный"||CVET=="черный"){cvet=0;pixel_( num,cvet,M);}       
}
/////////////////////////////////////////////////
// бегущие 2 пикселя разных цветов по фоновому цвету (3 уровень)
void fun_1( String CVET_f ,String CVET_1,String CVET_2,byte M,int T){
 for (int i = 0; i < LED_COUNT; i++) {
  for (int j = 0; j < LED_COUNT; j++) {
     pixel_(j, CVET_f ,M);// фоновые пиксели
    }
    pixel_(i, CVET_2 ,M);// бегущий пиксель 2
    if (i != LED_COUNT - 1) {
      pixel_(i+1, CVET_1 ,M);// бегущий пиксель 1
    } else {
       pixel_(0, CVET_1 ,M);
    }
    strip.show(); delay(T);
     }  
}
//////////////////////////////////////////////////
// вариации разных комбинаций цветов 2 бегущих пикселей (4 уровень)- 1 эффект
void FUN_1(byte M){
int K=1;//
byte k=1;//
byte st_=0;// 
 while(st_<=4){
 if(st_==0){fun_1("мятный","красный","оранжевый",M,35*k);}//
 if(st_==1){fun_1("белый_1","голубой","чёрный",M,35*k);}//
 if(st_==2){fun_1("белый_2","зелёный_1","жёлтый",M,35*k);}//
 if(st_==3){fun_1("малиновый","синий_2","синий_1",M,35*k);}//
 k=k+K;if(k==8){K=-1;}if(k==0){K=1;st_++;}
 }st_=0;  
}
/////////////////////////////////////////////////
// фоновая смена цвета свечения всего шара (3 уровень)
void fun_2( String CVET_f,byte M,int T){
 for (int j = 0; j < LED_COUNT; j++) {
     pixel_(j,"чёрный",M/2);// фоновые пиксели последовательно выключаются
     strip.show(); delay(T); 
     }
    
  for (int j = 0; j < LED_COUNT; j++) {
     pixel_(j, CVET_f ,M/2);// фоновые пиксели последовательно включаются и горят
     strip.show(); delay(T);
     }
    delay(40*T);
    for (int j = 0; j < LED_COUNT; j++) {
     pixel_(j, CVET_f ,M);// фоновые пиксели вспышка краткая
     }
    strip.show(); delay(6*T); 
     for (int j = 0; j < LED_COUNT; j++) {
     pixel_(j, CVET_f ,M/2);// фоновые пиксели горят слабее некоторое время
    }
     strip.show(); delay(40*T);  
  }
//////////////////////////////////////////////////
// смена фоновых цветов(4 уровень)- 2 эффект
void FUN_2(byte M,int T){
fun_2("красный",M,T);//
fun_2("мятный",M,T);//
fun_2("бежевый",M,T);//
fun_2("бирюзовый",M,T);//
fun_2("жёлтый",M,T);//  
fun_2("оранжевый",M,T);//
fun_2("белый_1",M,T);//    
}
//////////////////////////////////////////////////
// фоновая смена цвета свечения всего шара (3 уровень)
void fun_3( String CVET_f,byte M,int T){
 for (int j = 0; j < LED_COUNT; j++) {
     pixel_(j,"чёрный",M/2);// фоновые пиксели последовательно выключаются
      }
      byte d;//
     for (int j = 0; j < LED_COUNT; j++) {
    d=random(1,10);//
    if(d==1){pixel_(j, CVET_f ,M);}// фоновые пиксели псевдослучайно включаются
    if(d==2){pixel_(j, CVET_f ,M);}
    if(d==3){pixel_(j, CVET_f ,M);}
    if(d==4){pixel_(j, CVET_f ,M/5);}
     if(d==5){pixel_(j, CVET_f ,M/5);}
    if(d==6){pixel_(j, CVET_f ,M/5);}
    if(d==7){pixel_(j,CVET_f   ,M/2);}
     if(d==8){pixel_(j,CVET_f  ,M/2);}
    if(d==9){pixel_(j, CVET_f  ,M/2);}
     }
    strip.show(); delay(T/d);   
  }
//////////////////////////////////////////////////
// смена фоновых цветов(4 уровень)- 3 эффект
void FUN_3(byte M,int T){
for (int i = 0; i < 100; i++) {fun_3("красный",M,T);}//
for (int i = 0; i < 200; i++) {fun_3("красный",M/4,T/2);}//
for (int i = 0; i < 100; i++) {fun_3("сиреневый",M,T);}//
for (int i = 0; i < 200; i++) {fun_3("сиреневый",M/4,T/2);}//
for (int i = 0; i < 100; i++) {fun_3("жёлтый",M,T);}//
for (int i = 0; i < 200; i++) {fun_3("жёлтый",M/4,T/2);}//
for (int i = 0; i < 100; i++) {fun_3("розовый",M,T);}//
for (int i = 0; i < 200; i++) {fun_3("розовый",M/4,T/2);}//
for (int i = 0; i < 100; i++) {fun_3("бирюзовый",M,T);}//
for (int i = 0; i < 200; i++) {fun_3("бирюзовый",M/4,T/2);}//
}
//////////////////////////////////////////////////

Получилось 4 уровня функций. Но такой подход оказался недостаточным для гирлянды шаров. Позволяет сделать лишь клон-гирлянду (на всех шарах один и тот же эффект в данный момент её работы).

/////////////////////////// тест цветов и эффектов для гирлянды ШАРИКОВ НА WS2812b
#include "Adafruit_NeoPixel.h"
#define LED_COUNT 5               //число пикселей в шаре
#define LED_COUNT_N 5*LED_COUNT   // число шаров в гирлянде
#define LED_PIN 6
Adafruit_NeoPixel strip = Adafruit_NeoPixel(LED_COUNT_N, LED_PIN, NEO_GRB + NEO_KHZ800);// Создаем переменную strip для управления нашей лентой.
void setup () {
strip.begin();
 for (int i = 0; i < LED_COUNT; i++) {
   pixel_(i,0,0);// выключение пикселя 
  }
  strip.show();
  /////////////////////////////////////////////////
 }
void loop () {
FUN_1(25);// исполнение 1 эффекта
FUN_2(40,50);// исполнение 2 эффекта
FUN_3(50,150);//исполнение 3 эффекта
}
//////////////////////////////////////////////////
// цвет пикселя по номеру (1 уровень)
void pixel_(int num, byte cvet ,byte M){
if(num<LED_COUNT&&cvet<63&&M<86){
  int b=cvet/16;int g=(cvet%16)/4;int r=cvet-4*g-16*b;// цвета от 0 до 63
   for (int i = 0; i < LED_COUNT_N/LED_COUNT; i++) {
  strip.setPixelColor(num+i*LED_COUNT_N/LED_COUNT, r*M, g*M, b*M);
   }
 }
}
//////////////////////////////////////////////////
//цвет пикселя по названию (2 уровень)
void pixel_(int num, String CVET ,byte M){
byte cvet;
//набор цветов
if(CVET=="жёлтый"||CVET=="желтый"){cvet=11;pixel_( num,cvet,M);}
if(CVET=="зелёный_1"||CVET=="зеленый_1"){cvet=8;pixel_( num,cvet,M);} 
if(CVET=="зелёный_3"||CVET=="зеленый_3"){cvet=9;pixel_( num,cvet,M);}
if(CVET=="малиновый"){cvet=19;pixel_( num,cvet,M);} 
if(CVET=="голубой"){cvet=52;pixel_( num,cvet,M);} 
if(CVET=="розовый"){cvet=23;pixel_( num,cvet,M);} 
if(CVET=="бирюзовый"){cvet=24;pixel_( num,cvet,M);}
if(CVET=="мятный"){cvet=29;pixel_( num,cvet,M);} 
if(CVET=="синий_1"){cvet=37;pixel_( num,cvet,M);} 
if(CVET=="белый_1"){cvet=47;pixel_( num,cvet,M);} 
if(CVET=="синий_2"){cvet=48;pixel_( num,cvet,M);}
if(CVET=="сиреневый"){cvet=49;pixel_( num,cvet,M);} 
if(CVET=="красный"){cvet=3;pixel_( num,cvet,M);} 
if(CVET=="зелёный_2"||CVET=="зеленый_2"){cvet=4;pixel_( num,cvet,M);} 
if(CVET=="белый_2"){cvet=41;pixel_( num,cvet,M);}
if(CVET=="оранжевый"){cvet=7;pixel_( num,cvet,M);} 
if(CVET=="бежевый"){cvet=27;pixel_( num,cvet,M);} 
if(CVET=="чёрный"||CVET=="черный"){cvet=0;pixel_( num,cvet,M);}       
}
/////////////////////////////////////////////////
// бегущие 2 пикселя разных цветов по фоновому цвету (3 уровень)
void fun_1( String CVET_f ,String CVET_1,String CVET_2,byte M,int T){
 for (int i = 0; i < LED_COUNT; i++) {
  for (int j = 0; j < LED_COUNT; j++) {
     pixel_(j, CVET_f ,M);// фоновые пиксели
    }
    pixel_(i, CVET_2 ,M);// бегущий пиксель 2
    if (i != LED_COUNT - 1) {
      pixel_(i+1, CVET_1 ,M);// бегущий пиксель 1
    } else {
       pixel_(0, CVET_1 ,M);
    }
    strip.show(); delay(T);
     }  
}
//////////////////////////////////////////////////
// вариации разных комбинаций цветов 2 бегущих пикселей (4 уровень)- 1 эффект
void FUN_1(byte M){
int K=1;//
byte k=1;//
byte st_=0;// 
 while(st_<=4){
 if(st_==0){fun_1("мятный","красный","оранжевый",M,35*k);}//
 if(st_==1){fun_1("белый_1","голубой","чёрный",M,35*k);}//
 if(st_==2){fun_1("белый_2","зелёный_1","жёлтый",M,35*k);}//
 if(st_==3){fun_1("малиновый","синий_2","синий_1",M,35*k);}//
 k=k+K;if(k==8){K=-1;}if(k==0){K=1;st_++;}
 }st_=0;  
}
/////////////////////////////////////////////////
// фоновая смена цвета свечения всего шара (3 уровень)
void fun_2( String CVET_f,byte M,int T){
 for (int j = 0; j < LED_COUNT; j++) {
     pixel_(j,"чёрный",M/2);// фоновые пиксели последовательно выключаются
     strip.show(); delay(T); 
     }
    
  for (int j = 0; j < LED_COUNT; j++) {
     pixel_(j, CVET_f ,M/2);// фоновые пиксели последовательно включаются и горят
     strip.show(); delay(T);
     }
    delay(40*T);
    for (int j = 0; j < LED_COUNT; j++) {
     pixel_(j, CVET_f ,M);// фоновые пиксели вспышка краткая
     }
    strip.show(); delay(6*T); 
     for (int j = 0; j < LED_COUNT; j++) {
     pixel_(j, CVET_f ,M/2);// фоновые пиксели горят слабее некоторое время
    }
     strip.show(); delay(40*T);  
  }
//////////////////////////////////////////////////
// смена фоновых цветов(4 уровень)- 2 эффект
void FUN_2(byte M,int T){
fun_2("красный",M,T);//
fun_2("мятный",M,T);//
fun_2("бежевый",M,T);//
fun_2("бирюзовый",M,T);//
fun_2("жёлтый",M,T);//  
fun_2("оранжевый",M,T);//
fun_2("белый_1",M,T);//    
}
//////////////////////////////////////////////////
// фоновая смена цвета свечения всего шара (3 уровень)
void fun_3( String CVET_f,byte M,int T){
 for (int j = 0; j < LED_COUNT; j++) {
     pixel_(j,"чёрный",M/2);// фоновые пиксели последовательно выключаются
      }
      byte d;//
     for (int j = 0; j < LED_COUNT; j++) {
    d=random(1,10);//
    if(d==1){pixel_(j, CVET_f ,M);}// фоновые пиксели псевдослучайно включаются
    if(d==2){pixel_(j, CVET_f ,M);}
    if(d==3){pixel_(j, CVET_f ,M);}
    if(d==4){pixel_(j, CVET_f ,M/5);}
     if(d==5){pixel_(j, CVET_f ,M/5);}
    if(d==6){pixel_(j, CVET_f ,M/5);}
    if(d==7){pixel_(j,CVET_f   ,M/2);}
     if(d==8){pixel_(j,CVET_f  ,M/2);}
    if(d==9){pixel_(j, CVET_f  ,M/2);}
     }
    strip.show(); delay(T/d);   
  }
//////////////////////////////////////////////////
// смена фоновых цветов(4 уровень)- 3 эффект
void FUN_3(byte M,int T){
for (int i = 0; i < 100; i++) {fun_3("красный",M,T);}//
for (int i = 0; i < 200; i++) {fun_3("красный",M/6,T/2);}//
for (int i = 0; i < 100; i++) {fun_3("сиреневый",M,T);}//
for (int i = 0; i < 200; i++) {fun_3("сиреневый",M/6,T/2);}//
for (int i = 0; i < 100; i++) {fun_3("жёлтый",M,T);}//
for (int i = 0; i < 200; i++) {fun_3("жёлтый",M/6,T/2);}//
for (int i = 0; i < 100; i++) {fun_3("розовый",M,T);}//
for (int i = 0; i < 200; i++) {fun_3("розовый",M/6,T/2);}//
for (int i = 0; i < 100; i++) {fun_3("бирюзовый",M,T);}//
for (int i = 0; i < 200; i++) {fun_3("бирюзовый",M/6,T/2);}//
}
//////////////////////////////////////////////////

Стратегию построения функций как то надо изменить, через "миллис :-)"

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Не проще ли просто начинать со случайного эффекта в каждом шаре (или в первом - с первого, во втором - со второго и т.п.)?

lilik
Offline
Зарегистрирован: 19.10.2017

ЕвгенийП пишет:

(или в первом - с первого, во втором - со второго и т.п.)?

В том то и загвоздка, что с таким построением скетча вести анимацию разных эффектов на разных шарах параллельно  не получится. Как то надо логику изменить. Функции надо перестроить на псевдопараллельную работу, не нарушив их структуры восприятия .   

sadman41
Offline
Зарегистрирован: 19.10.2016

Для псевдопараллельной работы нужна синхронизация, иначе все без толку.

lilik
Offline
Зарегистрирован: 19.10.2017

sadman41 пишет:
Для псевдопараллельной работы нужна синхронизация, иначе все без толку.

Да, такой вариант думался - определить общий наименьший "делей" через который идёт обновление всего массива пикселей даже если в нём значение поменял только один. Это подобие светодиодных кубов, алгоритм: кадр,пауза,кадр,пауза... Но там есть смысл - в кадре, а здесь нет.

Как бы провести аналогию...

Вот праздничный стол: салат, пюре,котлетки,водочка - красота для глаз. Однако желудку это полная хрень. Ему: кусочек салатика,пюре,котлетки,водочки;повтор;повтор;повтор... красота. Но для глаз это полная блевонтина.

lilik
Offline
Зарегистрирован: 19.10.2017

Придумался довольно простой ход, без переделки кода для создания "роевого поведения шаров". Теперь можно набирать любую группу-комбинацию шаров для эффекта, остальные отдыхают (статично светят). Ниже пример блинка для гирлянды и вариант с 3 эффектами.

/////////////////////////// БЛИНК для гирлянды ШАРИКОВ НА WS2812b
#include "Adafruit_NeoPixel.h"
#define LED_COUNT 5               //число пикселей в шаре
#define LED_COUNT_N 5*LED_COUNT   // число шаров в гирлянде
#define LED_PIN 6
Adafruit_NeoPixel strip = Adafruit_NeoPixel(LED_COUNT_N, LED_PIN, NEO_GRB + NEO_KHZ800);// Создаем переменную strip для управления нашей лентой.
String gir="";// переменная задающая участие шара в текущем эффекте
void setup () {
strip.begin();
 for (int i = 0; i < LED_COUNT; i++) {
   pixel_(i,0,0);// выключение пикселя 
  }
  strip.show();
  /////////////////////////////////////////////////
 }
void loop () {
gir="**A**";//центральный шар
pixel_(2,"мятный" ,25);//центральный пиксель в шаре из 5 на яркости 25
strip.show();delay(1000);//пауза
pixel_(2,"чёрный" ,25);//
strip.show();delay(1000);
}
//////////////////////////////////////////////////
// цвет пикселя по номеру (1 уровень)
void pixel_(int num, byte cvet ,byte M){
if(num<LED_COUNT&&cvet<63&&M<86){
  int b=cvet/16;int g=(cvet%16)/4;int r=cvet-4*g-16*b;// цвета от 0 до 63
   for (int i = 0; i < LED_COUNT_N/LED_COUNT; i++) {
 if( gir.substring(i, i+1)=="A"){
  strip.setPixelColor(num+i*LED_COUNT_N/LED_COUNT, r*M, g*M, b*M);
   }
   }
 }
}
//////////////////////////////////////////////////
//цвет пикселя по названию (2 уровень)
void pixel_(int num, String CVET ,byte M){
byte cvet;
//набор цветов
if(CVET=="жёлтый"||CVET=="желтый"){cvet=11;pixel_( num,cvet,M);}
if(CVET=="зелёный_1"||CVET=="зеленый_1"){cvet=8;pixel_( num,cvet,M);} 
if(CVET=="зелёный_3"||CVET=="зеленый_3"){cvet=9;pixel_( num,cvet,M);}
if(CVET=="малиновый"){cvet=19;pixel_( num,cvet,M);} 
if(CVET=="голубой"){cvet=52;pixel_( num,cvet,M);} 
if(CVET=="розовый"){cvet=23;pixel_( num,cvet,M);} 
if(CVET=="бирюзовый"){cvet=24;pixel_( num,cvet,M);}
if(CVET=="мятный"){cvet=29;pixel_( num,cvet,M);} 
if(CVET=="синий_1"){cvet=37;pixel_( num,cvet,M);} 
if(CVET=="белый_1"){cvet=47;pixel_( num,cvet,M);} 
if(CVET=="синий_2"){cvet=48;pixel_( num,cvet,M);}
if(CVET=="сиреневый"){cvet=49;pixel_( num,cvet,M);} 
if(CVET=="красный"){cvet=3;pixel_( num,cvet,M);} 
if(CVET=="зелёный_2"||CVET=="зеленый_2"){cvet=4;pixel_( num,cvet,M);} 
if(CVET=="белый_2"){cvet=41;pixel_( num,cvet,M);}
if(CVET=="оранжевый"){cvet=7;pixel_( num,cvet,M);} 
if(CVET=="бежевый"){cvet=27;pixel_( num,cvet,M);} 
if(CVET=="чёрный"||CVET=="черный"){cvet=0;pixel_( num,cvet,M);}       
}
/////////////////////////////////////////////////
/////////////////////////// тест цветов и эффектов для гирлянды ШАРИКОВ НА WS2812b
#include "Adafruit_NeoPixel.h"
#define LED_COUNT 5               //число пикселей в шаре
#define LED_COUNT_N 5*LED_COUNT   // число шаров в гирлянде
#define LED_PIN 6
Adafruit_NeoPixel strip = Adafruit_NeoPixel(LED_COUNT_N, LED_PIN, NEO_GRB + NEO_KHZ800);// Создаем переменную strip для управления нашей лентой.
String gir="";// переменная задающая участие шара в текущем эффекте
void setup () {
strip.begin();
 for (int i = 0; i < LED_COUNT; i++) {
   pixel_(i,0,0);// выключение пикселя 
  }
  strip.show();
  /////////////////////////////////////////////////
 }
void loop () {
gir="AAAAA";FUN_1(25);// исполнение 1 эффекта на всех шарах
gir="**A**";FUN_2(40,50);// исполнение 2 эффекта только на центральном шаре,остальные статичны
gir="A***A";FUN_3(50,150);//исполнение 3 эффекта только на крайних шарах,остальные статичны
}
//////////////////////////////////////////////////
// цвет пикселя по номеру (1 уровень)
void pixel_(int num, byte cvet ,byte M){
if(num<LED_COUNT&&cvet<63&&M<86){
  int b=cvet/16;int g=(cvet%16)/4;int r=cvet-4*g-16*b;// цвета от 0 до 63
   for (int i = 0; i < LED_COUNT_N/LED_COUNT; i++) {
 if( gir.substring(i, i+1)=="A"){
  strip.setPixelColor(num+i*LED_COUNT_N/LED_COUNT, r*M, g*M, b*M);
   }
   }
 }
}
//////////////////////////////////////////////////
//цвет пикселя по названию (2 уровень)
void pixel_(int num, String CVET ,byte M){
byte cvet;
//набор цветов
if(CVET=="жёлтый"||CVET=="желтый"){cvet=11;pixel_( num,cvet,M);}
if(CVET=="зелёный_1"||CVET=="зеленый_1"){cvet=8;pixel_( num,cvet,M);} 
if(CVET=="зелёный_3"||CVET=="зеленый_3"){cvet=9;pixel_( num,cvet,M);}
if(CVET=="малиновый"){cvet=19;pixel_( num,cvet,M);} 
if(CVET=="голубой"){cvet=52;pixel_( num,cvet,M);} 
if(CVET=="розовый"){cvet=23;pixel_( num,cvet,M);} 
if(CVET=="бирюзовый"){cvet=24;pixel_( num,cvet,M);}
if(CVET=="мятный"){cvet=29;pixel_( num,cvet,M);} 
if(CVET=="синий_1"){cvet=37;pixel_( num,cvet,M);} 
if(CVET=="белый_1"){cvet=47;pixel_( num,cvet,M);} 
if(CVET=="синий_2"){cvet=48;pixel_( num,cvet,M);}
if(CVET=="сиреневый"){cvet=49;pixel_( num,cvet,M);} 
if(CVET=="красный"){cvet=3;pixel_( num,cvet,M);} 
if(CVET=="зелёный_2"||CVET=="зеленый_2"){cvet=4;pixel_( num,cvet,M);} 
if(CVET=="белый_2"){cvet=41;pixel_( num,cvet,M);}
if(CVET=="оранжевый"){cvet=7;pixel_( num,cvet,M);} 
if(CVET=="бежевый"){cvet=27;pixel_( num,cvet,M);} 
if(CVET=="чёрный"||CVET=="черный"){cvet=0;pixel_( num,cvet,M);}       
}
/////////////////////////////////////////////////
// бегущие 2 пикселя разных цветов по фоновому цвету (3 уровень)
void fun_1( String CVET_f ,String CVET_1,String CVET_2,byte M,int T){
 for (int i = 0; i < LED_COUNT; i++) {
  for (int j = 0; j < LED_COUNT; j++) {
     pixel_(j, CVET_f ,M);// фоновые пиксели
    }
    pixel_(i, CVET_2 ,M);// бегущий пиксель 2
    if (i != LED_COUNT - 1) {
      pixel_(i+1, CVET_1 ,M);// бегущий пиксель 1
    } else {
       pixel_(0, CVET_1 ,M);
    }
    strip.show(); delay(T);
     }  
}
//////////////////////////////////////////////////
// вариации разных комбинаций цветов 2 бегущих пикселей (4 уровень)- 1 эффект
void FUN_1(byte M){
int K=1;//
byte k=1;//
byte st_=0;// 
 while(st_<=4){
 if(st_==0){fun_1("мятный","красный","оранжевый",M,35*k);}//
 if(st_==1){fun_1("белый_1","голубой","чёрный",M,35*k);}//
 if(st_==2){fun_1("белый_2","зелёный_1","жёлтый",M,35*k);}//
 if(st_==3){fun_1("малиновый","синий_2","синий_1",M,35*k);}//
 k=k+K;if(k==8){K=-1;}if(k==0){K=1;st_++;}
 }st_=0;  
}
/////////////////////////////////////////////////
// фоновая смена цвета свечения всего шара (3 уровень)
void fun_2( String CVET_f,byte M,int T){
 for (int j = 0; j < LED_COUNT; j++) {
     pixel_(j,"чёрный",M/2);// фоновые пиксели последовательно выключаются
     strip.show(); delay(T); 
     }
    
  for (int j = 0; j < LED_COUNT; j++) {
     pixel_(j, CVET_f ,M/2);// фоновые пиксели последовательно включаются и горят
     strip.show(); delay(T);
     }
    delay(40*T);
    for (int j = 0; j < LED_COUNT; j++) {
     pixel_(j, CVET_f ,M);// фоновые пиксели вспышка краткая
     }
    strip.show(); delay(6*T); 
     for (int j = 0; j < LED_COUNT; j++) {
     pixel_(j, CVET_f ,M/2);// фоновые пиксели горят слабее некоторое время
    }
     strip.show(); delay(40*T);  
  }
//////////////////////////////////////////////////
// смена фоновых цветов(4 уровень)- 2 эффект
void FUN_2(byte M,int T){
fun_2("красный",M,T);//
fun_2("мятный",M,T);//
fun_2("бежевый",M,T);//
fun_2("бирюзовый",M,T);//
fun_2("жёлтый",M,T);//  
fun_2("оранжевый",M,T);//
fun_2("белый_1",M,T);//    
}
//////////////////////////////////////////////////
// фоновая смена цвета свечения всего шара (3 уровень)
void fun_3( String CVET_f,byte M,int T){
 for (int j = 0; j < LED_COUNT; j++) {
     pixel_(j,"чёрный",M/2);// фоновые пиксели последовательно выключаются
      }
      byte d;//
     for (int j = 0; j < LED_COUNT; j++) {
    d=random(1,10);//
    if(d==1){pixel_(j, CVET_f ,M);}// фоновые пиксели псевдослучайно включаются
    if(d==2){pixel_(j, CVET_f ,M);}
    if(d==3){pixel_(j, CVET_f ,M);}
    if(d==4){pixel_(j, CVET_f ,M/5);}
     if(d==5){pixel_(j, CVET_f ,M/5);}
    if(d==6){pixel_(j, CVET_f ,M/5);}
    if(d==7){pixel_(j,CVET_f   ,M/2);}
     if(d==8){pixel_(j,CVET_f  ,M/2);}
    if(d==9){pixel_(j, CVET_f  ,M/2);}
     }
    strip.show(); delay(T/d);   
  }
//////////////////////////////////////////////////
// смена фоновых цветов(4 уровень)- 3 эффект
void FUN_3(byte M,int T){
for (int i = 0; i < 100; i++) {fun_3("красный",M,T);}//
for (int i = 0; i < 200; i++) {fun_3("красный",M/6,T/2);}//
for (int i = 0; i < 100; i++) {fun_3("сиреневый",M,T);}//
for (int i = 0; i < 200; i++) {fun_3("сиреневый",M/6,T/2);}//
for (int i = 0; i < 100; i++) {fun_3("жёлтый",M,T);}//
for (int i = 0; i < 200; i++) {fun_3("жёлтый",M/6,T/2);}//
for (int i = 0; i < 100; i++) {fun_3("розовый",M,T);}//
for (int i = 0; i < 200; i++) {fun_3("розовый",M/6,T/2);}//
for (int i = 0; i < 100; i++) {fun_3("бирюзовый",M,T);}//
for (int i = 0; i < 200; i++) {fun_3("бирюзовый",M/6,T/2);}//
}
//////////////////////////////////////////////////

 

lilik
Offline
Зарегистрирован: 19.10.2017

Пришла лента, с отрезками её - легче монтировать. Подправил код, была неточность.

/////////////////////////// тест цветов и эффектов для гирлянды ШАРИКОВ НА WS2812b
#include "Adafruit_NeoPixel.h"
#define LED_COUNT 5               //число пикселей в шаре
#define N 3                      // число шаров в гирлянде 
#define LED_COUNT_N  N*LED_COUNT   // число пикселей в ленте
#define LED_PIN 6
Adafruit_NeoPixel strip = Adafruit_NeoPixel(LED_COUNT_N, LED_PIN, NEO_GRB + NEO_KHZ800);// Создаем переменную strip для управления нашей лентой.
String gir="";// переменная задающая участие шара в текущем эффекте
void setup () {
strip.begin();
 for (int i = 0; i < LED_COUNT_N; i++) {
   pixel_(i,0,0);// выключение пикселя 
  }
  strip.show();
  /////////////////////////////////////////////////
 }
void loop () {
gir="AAA";FUN_1(25);// исполнение 1 эффекта на всех шарах
gir="*A*";FUN_2(40,50);// исполнение 2 эффекта только на центральном шаре,остальные статичны
gir="A*A";FUN_3(50,150);//исполнение 3 эффекта только на крайних шарах,остальные статичны
}
//////////////////////////////////////////////////
// цвет пикселя по номеру (1 уровень)
void pixel_(int num, byte cvet ,byte M){
if(num<LED_COUNT&&cvet<63&&M<86){
  int b=cvet/16;int g=(cvet%16)/4;int r=cvet-4*g-16*b;// цвета от 0 до 63
   for (int i = 0; i < N; i++) {
 if( gir.substring(i, i+1)=="A"){
  strip.setPixelColor(num+i*LED_COUNT, r*M, g*M, b*M);
   }
   }
 }
}
//////////////////////////////////////////////////
//цвет пикселя по названию (2 уровень)
void pixel_(int num, String CVET ,byte M){
byte cvet;
//набор цветов
if(CVET=="жёлтый"||CVET=="желтый"){cvet=11;pixel_( num,cvet,M);}
if(CVET=="зелёный_1"||CVET=="зеленый_1"){cvet=8;pixel_( num,cvet,M);} 
if(CVET=="зелёный_3"||CVET=="зеленый_3"){cvet=9;pixel_( num,cvet,M);}
if(CVET=="малиновый"){cvet=19;pixel_( num,cvet,M);} 
if(CVET=="голубой"){cvet=52;pixel_( num,cvet,M);} 
if(CVET=="розовый"){cvet=23;pixel_( num,cvet,M);} 
if(CVET=="бирюзовый"){cvet=24;pixel_( num,cvet,M);}
if(CVET=="мятный"){cvet=29;pixel_( num,cvet,M);} 
if(CVET=="синий_1"){cvet=37;pixel_( num,cvet,M);} 
if(CVET=="белый_1"){cvet=47;pixel_( num,cvet,M);} 
if(CVET=="синий_2"){cvet=48;pixel_( num,cvet,M);}
if(CVET=="сиреневый"){cvet=49;pixel_( num,cvet,M);} 
if(CVET=="красный"){cvet=3;pixel_( num,cvet,M);} 
if(CVET=="зелёный_2"||CVET=="зеленый_2"){cvet=4;pixel_( num,cvet,M);} 
if(CVET=="белый_2"){cvet=41;pixel_( num,cvet,M);}
if(CVET=="оранжевый"){cvet=7;pixel_( num,cvet,M);} 
if(CVET=="бежевый"){cvet=27;pixel_( num,cvet,M);} 
if(CVET=="чёрный"||CVET=="черный"){cvet=0;pixel_( num,cvet,M);}       
}
/////////////////////////////////////////////////
// бегущие 2 пикселя разных цветов по фоновому цвету (3 уровень)
void fun_1( String CVET_f ,String CVET_1,String CVET_2,byte M,int T){
 for (int i = 0; i < LED_COUNT; i++) {
  for (int j = 0; j < LED_COUNT; j++) {
     pixel_(j, CVET_f ,M);// фоновые пиксели
    }
    pixel_(i, CVET_2 ,M);// бегущий пиксель 2
    if (i != LED_COUNT - 1) {
      pixel_(i+1, CVET_1 ,M);// бегущий пиксель 1
    } else {
       pixel_(0, CVET_1 ,M);
    }
    strip.show(); delay(T);
     }  
}
//////////////////////////////////////////////////
// вариации разных комбинаций цветов 2 бегущих пикселей (4 уровень)- 1 эффект
void FUN_1(byte M){
int K=1;//
byte k=1;//
byte st_=0;// 
 while(st_<=4){
 if(st_==0){fun_1("мятный","красный","оранжевый",M,35*k);}//
 if(st_==1){fun_1("белый_1","голубой","чёрный",M,35*k);}//
 if(st_==2){fun_1("белый_2","зелёный_1","жёлтый",M,35*k);}//
 if(st_==3){fun_1("малиновый","синий_2","синий_1",M,35*k);}//
 k=k+K;if(k==8){K=-1;}if(k==0){K=1;st_++;}
 }st_=0;  
}
/////////////////////////////////////////////////
// фоновая смена цвета свечения всего шара (3 уровень)
void fun_2( String CVET_f,byte M,int T){
 for (int j = 0; j < LED_COUNT; j++) {
     pixel_(j,"чёрный",M/2);// фоновые пиксели последовательно выключаются
     strip.show(); delay(T); 
     }
    
  for (int j = 0; j < LED_COUNT; j++) {
     pixel_(j, CVET_f ,M/2);// фоновые пиксели последовательно включаются и горят
     strip.show(); delay(T);
     }
    delay(40*T);
    for (int j = 0; j < LED_COUNT; j++) {
     pixel_(j, CVET_f ,M);// фоновые пиксели вспышка краткая
     }
    strip.show(); delay(6*T); 
     for (int j = 0; j < LED_COUNT; j++) {
     pixel_(j, CVET_f ,M/2);// фоновые пиксели горят слабее некоторое время
    }
     strip.show(); delay(40*T);  
  }
//////////////////////////////////////////////////
// смена фоновых цветов(4 уровень)- 2 эффект
void FUN_2(byte M,int T){
fun_2("красный",M,T);//
fun_2("мятный",M,T);//
fun_2("бежевый",M,T);//
fun_2("бирюзовый",M,T);//
fun_2("жёлтый",M,T);//  
fun_2("оранжевый",M,T);//
fun_2("белый_1",M,T);//    
}
//////////////////////////////////////////////////
// фоновая смена цвета свечения всего шара (3 уровень)
void fun_3( String CVET_f,byte M,int T){
 for (int j = 0; j < LED_COUNT; j++) {
     pixel_(j,"чёрный",M/2);// фоновые пиксели последовательно выключаются
      }
      byte d;//
     for (int j = 0; j < LED_COUNT; j++) {
    d=random(1,10);//
    if(d==1){pixel_(j, CVET_f ,M);}// фоновые пиксели псевдослучайно включаются
    if(d==2){pixel_(j, CVET_f ,M);}
    if(d==3){pixel_(j, CVET_f ,M);}
    if(d==4){pixel_(j, CVET_f ,M/5);}
     if(d==5){pixel_(j, CVET_f ,M/5);}
    if(d==6){pixel_(j, CVET_f ,M/5);}
    if(d==7){pixel_(j,CVET_f   ,M/2);}
     if(d==8){pixel_(j,CVET_f  ,M/2);}
    if(d==9){pixel_(j, CVET_f  ,M/2);}
     }
    strip.show(); delay(T/d);   
  }
//////////////////////////////////////////////////
// смена фоновых цветов(4 уровень)- 3 эффект
void FUN_3(byte M,int T){
for (int i = 0; i < 100; i++) {fun_3("красный",M,T);}//
for (int i = 0; i < 200; i++) {fun_3("красный",M/6,T/2);}//
for (int i = 0; i < 100; i++) {fun_3("сиреневый",M,T);}//
for (int i = 0; i < 200; i++) {fun_3("сиреневый",M/6,T/2);}//
for (int i = 0; i < 100; i++) {fun_3("жёлтый",M,T);}//
for (int i = 0; i < 200; i++) {fun_3("жёлтый",M/6,T/2);}//
for (int i = 0; i < 100; i++) {fun_3("розовый",M,T);}//
for (int i = 0; i < 200; i++) {fun_3("розовый",M/6,T/2);}//
for (int i = 0; i < 100; i++) {fun_3("бирюзовый",M,T);}//
for (int i = 0; i < 200; i++) {fun_3("бирюзовый",M/6,T/2);}//
}
//////////////////////////////////////////////////

 

lilik
Offline
Зарегистрирован: 19.10.2017

:-)

Интересное явление, явно неземного происхождения мне приходиться наблюдать.

/////////////////////////// тест цветов и эффектов для гирлянды ШАРИКОВ НА WS2812b с дистанционной заливкой скетчей на pro mini 168
#include "Adafruit_NeoPixel.h"
#define LED_COUNT 5               //число пикселей в шаре
#define N 3                      // число шаров в гирлянде 
#define LED_COUNT_N  N*LED_COUNT   // число пикселей в ленте
#define LED_PIN 6
Adafruit_NeoPixel strip = Adafruit_NeoPixel(LED_COUNT_N, LED_PIN, NEO_GRB + NEO_KHZ800);// Создаем переменную strip для управления нашей лентой.
String gir="";// переменная задающая участие шара в текущем эффекте
int t=3000;// переменная задающая паузу между эффектами

long Y=0;//пременная хранения моментов времени
int komanda=400;// переменная хранения 

void setup()
{
  Serial.begin(19200);  // скорость 19200 для Arduino pro mini , 
                         // может быть разная для разных моделей плат
 strip.begin();
 for (int i = 0; i < LED_COUNT_N; i++) {
   pixel_(i,0,0);// выключение пикселя 
  }
  strip.show();
  /////////////////////////////////////////////////
 
}

void loop()
{
//сценарий переключения шаров
gir="AAA";FUN_1("мятный","красный","оранжевый",25);//
gir="A*A";FUN_1("малиновый","синий_2","синий_1",25);//
gir="*A*";FUN_1("белый_1","голубой","чёрный",25);//
gir="A*A";FUN_1("белый_2","зелёный_1","жёлтый",25);//
delay_(t);
gir="AAA";fun_2("мятный",40,50);//
fun_2("жёлтый",40,50);//  
fun_2("оранжевый",40,50);//
fun_2("сиреневый",40,50);// 
delay_(t);
gir="A**";FUN_3("синий_2",50,150);//
gir="*A*";FUN_3("сиреневый",50,150);//
gir="**A";FUN_3("жёлтый",50,150);//
delay_(t);
gir="AAA";FUN_3("зелёный_1",50,150);//
delay_(t);
//
gir="AAA";FUN_1("белый_1","красный","синий_2",25);//
gir="A*A";FUN_1("сиреневый","синий_2","синий_2",25);//
gir="*A*";FUN_1("белый_1","белый_2","чёрный",25);//
gir="A*A";FUN_1("розовый","зелёный_1","сиреневый",25);// 
delay_(t);
gir="AAA";fun_2("сиреневый",40,50);//
fun_2("белый_1",40,50);//  
fun_2("синий_2",40,50);//
fun_2("красный",40,50);// 
delay_(t);
gir="A**";FUN_3("бежевый",50,150);//
gir="*A*";FUN_3("сиреневый",50,150);//
gir="**A";FUN_3("красный",50,150);//
delay_(t);
gir="AAA";FUN_3("голубой",50,150);//
delay_(t);
}
//////////////////////////////////////////////////
// цвет пикселя по номеру (1 уровень)
void pixel_(int num, byte cvet ,byte M){
if(num<LED_COUNT&&cvet<63&&M<86){
  int b=cvet/16;int g=(cvet%16)/4;int r=cvet-4*g-16*b;// цвета от 0 до 63
   for (int i = 0; i < N; i++) {
 if( gir.substring(i, i+1)=="A"){
  strip.setPixelColor(num+i*LED_COUNT, r*M, g*M, b*M);
   }
   }
 }
}
//////////////////////////////////////////////////
//цвет пикселя по названию (2 уровень)
void pixel_(int num, String CVET ,byte M){
byte cvet;
//набор цветов
if(CVET=="жёлтый"||CVET=="желтый"){cvet=11;pixel_( num,cvet,M);}
if(CVET=="зелёный_1"||CVET=="зеленый_1"){cvet=8;pixel_( num,cvet,M);} 
if(CVET=="зелёный_3"||CVET=="зеленый_3"){cvet=9;pixel_( num,cvet,M);}
if(CVET=="малиновый"){cvet=19;pixel_( num,cvet,M);} 
if(CVET=="голубой"){cvet=52;pixel_( num,cvet,M);} 
if(CVET=="розовый"){cvet=23;pixel_( num,cvet,M);} 
if(CVET=="бирюзовый"){cvet=24;pixel_( num,cvet,M);}
if(CVET=="мятный"){cvet=29;pixel_( num,cvet,M);} 
if(CVET=="синий_1"){cvet=37;pixel_( num,cvet,M);} 
if(CVET=="белый_1"){cvet=47;pixel_( num,cvet,M);} 
if(CVET=="синий_2"){cvet=48;pixel_( num,cvet,M);}
if(CVET=="сиреневый"){cvet=49;pixel_( num,cvet,M);} 
if(CVET=="красный"){cvet=3;pixel_( num,cvet,M);} 
if(CVET=="зелёный_2"||CVET=="зеленый_2"){cvet=4;pixel_( num,cvet,M);} 
if(CVET=="белый_2"){cvet=41;pixel_( num,cvet,M);}
if(CVET=="оранжевый"){cvet=7;pixel_( num,cvet,M);} 
if(CVET=="бежевый"){cvet=27;pixel_( num,cvet,M);} 
if(CVET=="чёрный"||CVET=="черный"){cvet=0;pixel_( num,cvet,M);}       
}
/////////////////////////////////////////////////
// бегущие 2 пикселя разных цветов по фоновому цвету (3 уровень)
void fun_1( String CVET_f ,String CVET_1,String CVET_2,byte M,int T){
 for (int i = 0; i < LED_COUNT; i++) {
  for (int j = 0; j < LED_COUNT; j++) {
     pixel_(j, CVET_f ,M);// фоновые пиксели
    }
    pixel_(i, CVET_2 ,M);// бегущий пиксель 2
    if (i != LED_COUNT - 1) {
      pixel_(i+1, CVET_1 ,M);// бегущий пиксель 1
    } else {
       pixel_(0, CVET_1 ,M);
    }
    strip.show(); delay_(T);
     }  
}
//////////////////////////////////////////////////
// вариации разных комбинаций цветов 2 бегущих пикселей (4 уровень)- 1 эффект
void FUN_1(String CVET_f ,String CVET_1,String CVET_2,byte M){
int K=1;//
byte k=1;//
byte st_=0;// 
 while(st_<=4){
 if(st_==0){fun_1(CVET_f,CVET_1,CVET_2,M,35*k);}//
 k=k+K;if(k==8){K=-1;}if(k==0){K=1;st_++;}
 }st_=0;  
}
/////////////////////////////////////////////////
// фоновая смена цвета свечения всего шара (3 уровень)
void fun_2( String CVET_f,byte M,int T){
 for (int j = 0; j < LED_COUNT; j++) {
     pixel_(j,"чёрный",M/2);// фоновые пиксели последовательно выключаются
     strip.show(); delay_(T); 
     }
    
  for (int j = 0; j < LED_COUNT; j++) {
     pixel_(j, CVET_f ,M/2);// фоновые пиксели последовательно включаются и горят
     strip.show(); delay_(T);
     }
    delay_(40*T);
    for (int j = 0; j < LED_COUNT; j++) {
     pixel_(j, CVET_f ,M);// фоновые пиксели вспышка краткая
     }
    strip.show(); delay_(6*T); 
     for (int j = 0; j < LED_COUNT; j++) {
     pixel_(j, CVET_f ,M/2);// фоновые пиксели горят слабее некоторое время
    }
     strip.show(); delay_(40*T);  
  }
//////////////////////////////////////////////////
// смена фоновых цветов(4 уровень)- 2 эффект
void FUN_2(byte M,int T){
fun_2("красный",M,T);//
fun_2("мятный",M,T);//
fun_2("бежевый",M,T);//
fun_2("бирюзовый",M,T);//
fun_2("жёлтый",M,T);//  
fun_2("оранжевый",M,T);//
fun_2("белый_1",M,T);//    
}
//////////////////////////////////////////////////
// фоновая смена цвета свечения всего шара (3 уровень)
void fun_3( String CVET_f,byte M,int T){
 for (int j = 0; j < LED_COUNT; j++) {
     pixel_(j,"чёрный",M/2);// фоновые пиксели последовательно выключаются
      }
      byte d;//
     for (int j = 0; j < LED_COUNT; j++) {
    d=random(1,10);//
    if(d==1){pixel_(j, CVET_f ,M);}// фоновые пиксели псевдослучайно включаются
    if(d==2){pixel_(j, CVET_f ,M);}
    if(d==3){pixel_(j, CVET_f ,M);}
    if(d==4){pixel_(j, CVET_f ,M/5);}
     if(d==5){pixel_(j, CVET_f ,M/5);}
    if(d==6){pixel_(j, CVET_f ,M/5);}
    if(d==7){pixel_(j,CVET_f   ,M/2);}
     if(d==8){pixel_(j,CVET_f  ,M/2);}
    if(d==9){pixel_(j, CVET_f  ,M/2);}
     }
    strip.show(); delay_(T/d);   
  }
//////////////////////////////////////////////////
// смена фоновых цветов(4 уровень)- 3 эффект
void FUN_3(String CVET_f,byte M,int T){
for (int i = 0; i < 100; i++) {fun_3( CVET_f,M,T);}//
for (int i = 0; i < 200; i++) {fun_3(CVET_f,M/8,T/2);}//
}
//////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
// функция временной задержки с проверкой поступающих данных
void delay_(int T1)
{
Y=millis();  
while(millis()-Y<T1){komanda=CheckSerial();}//по поступившей команде выполняем действие

}
 

К про мини 168 подключён блютуз модуль и идёт заливка скетча по воздуху. После заливки таинственно исчезает исполнение строк 30,31,50. Шары на время исполнение переключений пикселей в этих строках просто замирают на предыдущих цветах, как бы берут паузу.

Первое, что подумал - кривой вариант скетча. Перезалил его на уно, потом на нано -  исполнение всех строк вернулось. Второе, что подумал - часть строк испаряется в воздухе, пока заливается. Залил скетч по шнуру прямо в платку и вернул её в схему - строки потерялись.

Третье: подумал, что виноват блютуз модуль и соединения лишние (провод с вывода на ресет) - убрал лишнее, только шары, аккумулятор и платка. Строки теряются на исполнении. 

Четвёртое: про мини не может воспроизводить конкретно эти строки кода. Собрал исходную схему и по воздуху залил такой вариант , со строкой 30. Он работает как надо.

/////////////////////////// тест цветов и эффектов для гирлянды ШАРИКОВ НА WS2812b с дистанционной заливкой скетчей на pro mini 168
#include "Adafruit_NeoPixel.h"
#define LED_COUNT 5               //число пикселей в шаре
#define N 3                      // число шаров в гирлянде 
#define LED_COUNT_N  N*LED_COUNT   // число пикселей в ленте
#define LED_PIN 6
Adafruit_NeoPixel strip = Adafruit_NeoPixel(LED_COUNT_N, LED_PIN, NEO_GRB + NEO_KHZ800);// Создаем переменную strip для управления нашей лентой.
String gir="";// переменная задающая участие шара в текущем эффекте
int t=3000;// переменная задающая паузу между эффектами

long Y=0;//пременная хранения моментов времени
int komanda=400;// переменная хранения 

void setup()
{
  Serial.begin(19200);  // скорость 19200 для Arduino pro mini , 
                         // может быть разная для разных моделей плат
 strip.begin();
 for (int i = 0; i < LED_COUNT_N; i++) {
   pixel_(i,0,0);// выключение пикселя 
  }
  strip.show();
  /////////////////////////////////////////////////
 
}

void loop()
{
//сценарий переключения шаров
gir="AAA";FUN_1("мятный","красный","оранжевый",25);//
delay_(2*t);

}
//////////////////////////////////////////////////
// цвет пикселя по номеру (1 уровень)
void pixel_(int num, byte cvet ,byte M){
if(num<LED_COUNT&&cvet<63&&M<86){
  int b=cvet/16;int g=(cvet%16)/4;int r=cvet-4*g-16*b;// цвета от 0 до 63
   for (int i = 0; i < N; i++) {
 if( gir.substring(i, i+1)=="A"){
  strip.setPixelColor(num+i*LED_COUNT, r*M, g*M, b*M);
   }
   }
 }
}
//////////////////////////////////////////////////
//цвет пикселя по названию (2 уровень)
void pixel_(int num, String CVET ,byte M){
byte cvet;
//набор цветов
if(CVET=="жёлтый"||CVET=="желтый"){cvet=11;pixel_( num,cvet,M);}
if(CVET=="зелёный_1"||CVET=="зеленый_1"){cvet=8;pixel_( num,cvet,M);} 
if(CVET=="зелёный_3"||CVET=="зеленый_3"){cvet=9;pixel_( num,cvet,M);}
if(CVET=="малиновый"){cvet=19;pixel_( num,cvet,M);} 
if(CVET=="голубой"){cvet=52;pixel_( num,cvet,M);} 
if(CVET=="розовый"){cvet=23;pixel_( num,cvet,M);} 
if(CVET=="бирюзовый"){cvet=24;pixel_( num,cvet,M);}
if(CVET=="мятный"){cvet=29;pixel_( num,cvet,M);} 
if(CVET=="синий_1"){cvet=37;pixel_( num,cvet,M);} 
if(CVET=="белый_1"){cvet=47;pixel_( num,cvet,M);} 
if(CVET=="синий_2"){cvet=48;pixel_( num,cvet,M);}
if(CVET=="сиреневый"){cvet=49;pixel_( num,cvet,M);} 
if(CVET=="красный"){cvet=3;pixel_( num,cvet,M);} 
if(CVET=="зелёный_2"||CVET=="зеленый_2"){cvet=4;pixel_( num,cvet,M);} 
if(CVET=="белый_2"){cvet=41;pixel_( num,cvet,M);}
if(CVET=="оранжевый"){cvet=7;pixel_( num,cvet,M);} 
if(CVET=="бежевый"){cvet=27;pixel_( num,cvet,M);} 
if(CVET=="чёрный"||CVET=="черный"){cvet=0;pixel_( num,cvet,M);}       
}
/////////////////////////////////////////////////
// бегущие 2 пикселя разных цветов по фоновому цвету (3 уровень)
void fun_1( String CVET_f ,String CVET_1,String CVET_2,byte M,int T){
 for (int i = 0; i < LED_COUNT; i++) {
  for (int j = 0; j < LED_COUNT; j++) {
     pixel_(j, CVET_f ,M);// фоновые пиксели
    }
    pixel_(i, CVET_2 ,M);// бегущий пиксель 2
    if (i != LED_COUNT - 1) {
      pixel_(i+1, CVET_1 ,M);// бегущий пиксель 1
    } else {
       pixel_(0, CVET_1 ,M);
    }
    strip.show(); delay_(T);
     }  
}
//////////////////////////////////////////////////
// вариации разных комбинаций цветов 2 бегущих пикселей (4 уровень)- 1 эффект
void FUN_1(String CVET_f ,String CVET_1,String CVET_2,byte M){
int K=1;//
byte k=1;//
byte st_=0;// 
 while(st_<=4){
 if(st_==0){fun_1(CVET_f,CVET_1,CVET_2,M,35*k);}//
 k=k+K;if(k==8){K=-1;}if(k==0){K=1;st_++;}
 }st_=0;  
}
/////////////////////////////////////////////////
// фоновая смена цвета свечения всего шара (3 уровень)
void fun_2( String CVET_f,byte M,int T){
 for (int j = 0; j < LED_COUNT; j++) {
     pixel_(j,"чёрный",M/2);// фоновые пиксели последовательно выключаются
     strip.show(); delay_(T); 
     }
    
  for (int j = 0; j < LED_COUNT; j++) {
     pixel_(j, CVET_f ,M/2);// фоновые пиксели последовательно включаются и горят
     strip.show(); delay_(T);
     }
    delay_(40*T);
    for (int j = 0; j < LED_COUNT; j++) {
     pixel_(j, CVET_f ,M);// фоновые пиксели вспышка краткая
     }
    strip.show(); delay_(6*T); 
     for (int j = 0; j < LED_COUNT; j++) {
     pixel_(j, CVET_f ,M/2);// фоновые пиксели горят слабее некоторое время
    }
     strip.show(); delay_(40*T);  
  }
//////////////////////////////////////////////////
// смена фоновых цветов(4 уровень)- 2 эффект
void FUN_2(byte M,int T){
fun_2("красный",M,T);//
fun_2("мятный",M,T);//
fun_2("бежевый",M,T);//
fun_2("бирюзовый",M,T);//
fun_2("жёлтый",M,T);//  
fun_2("оранжевый",M,T);//
fun_2("белый_1",M,T);//    
}
//////////////////////////////////////////////////
// фоновая смена цвета свечения всего шара (3 уровень)
void fun_3( String CVET_f,byte M,int T){
 for (int j = 0; j < LED_COUNT; j++) {
     pixel_(j,"чёрный",M/2);// фоновые пиксели последовательно выключаются
      }
      byte d;//
     for (int j = 0; j < LED_COUNT; j++) {
    d=random(1,10);//
    if(d==1){pixel_(j, CVET_f ,M);}// фоновые пиксели псевдослучайно включаются
    if(d==2){pixel_(j, CVET_f ,M);}
    if(d==3){pixel_(j, CVET_f ,M);}
    if(d==4){pixel_(j, CVET_f ,M/5);}
     if(d==5){pixel_(j, CVET_f ,M/5);}
    if(d==6){pixel_(j, CVET_f ,M/5);}
    if(d==7){pixel_(j,CVET_f   ,M/2);}
     if(d==8){pixel_(j,CVET_f  ,M/2);}
    if(d==9){pixel_(j, CVET_f  ,M/2);}
     }
    strip.show(); delay_(T/d);   
  }
//////////////////////////////////////////////////
// смена фоновых цветов(4 уровень)- 3 эффект
void FUN_3(String CVET_f,byte M,int T){
for (int i = 0; i < 100; i++) {fun_3( CVET_f,M,T);}//
for (int i = 0; i < 200; i++) {fun_3(CVET_f,M/8,T/2);}//
}
//////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
// функция временной задержки с проверкой поступающих данных
void delay_(int T1)
{
Y=millis();  
while(millis()-Y<T1){komanda=CheckSerial();}//по поступившей команде выполняем действие

}
 

Вопрос... где секрет явления?