Новогодняя звезда на 10 светодиодах

Простая звезда (используются обычные не адресные светодиоды) с различными эффектами. Может быть кому-то пригодится.

Результат можно посмотреть здесь: NY_star - Wokwi ESP32, STM32, Arduino Simulator

Делал давным-давно, в момент, когда до праздника оставалось пол дня, а под рукой были только провода, светодиоды, палата ардуины и 3d ручка (корпус был сделан ручкой).


  int BigPins[]={7,8,9,10,11};
  int SmallPins[]={2,3,4,5,6};

void setup() {               
  // Инициализируем цифровой вход/выход в режиме выхода.
  // Выход 13 на большинстве плат Arduino подключен к светодиоду на плате.

  
  pinMode(BigPins[0], OUTPUT);   
  pinMode(BigPins[1], OUTPUT);  
  pinMode(BigPins[2], OUTPUT);    
  pinMode(BigPins[3], OUTPUT);    
  pinMode(BigPins[4], OUTPUT);  

  pinMode(SmallPins[0], OUTPUT);   
  pinMode(SmallPins[1], OUTPUT);  
  pinMode(SmallPins[2], OUTPUT);    
  pinMode(SmallPins[3], OUTPUT);    
  pinMode(SmallPins[4], OUTPUT);
    
}
 
void loop() {

  


while (true) {
programm1();
programm2();
programm3();
programm4();
programm5();
programm6();
//programm7();
//programm8();
}

}

void programm1() {

int j;
for (j = 0; j < 10; j = j + 1) {
digitalWrite(SmallPins[0], LOW);  
digitalWrite(SmallPins[1], LOW);  
digitalWrite(SmallPins[2], LOW);  
digitalWrite(SmallPins[3], LOW);  
digitalWrite(SmallPins[4], LOW);  
digitalWrite(BigPins[0], LOW);  
digitalWrite(BigPins[1], LOW);  
digitalWrite(BigPins[2], LOW);  
digitalWrite(BigPins[3], LOW);  
digitalWrite(BigPins[4], LOW);
delay (200);
digitalWrite(SmallPins[0], HIGH);  
digitalWrite(SmallPins[1], HIGH);  
digitalWrite(SmallPins[2], HIGH);  
digitalWrite(SmallPins[3], HIGH);  
digitalWrite(SmallPins[4], HIGH);  
digitalWrite(BigPins[0], LOW);  
digitalWrite(BigPins[1], LOW);  
digitalWrite(BigPins[2], LOW);  
digitalWrite(BigPins[3], LOW);  
digitalWrite(BigPins[4], LOW);
delay (200);
digitalWrite(SmallPins[0], HIGH);  
digitalWrite(SmallPins[1], HIGH);  
digitalWrite(SmallPins[2], HIGH);  
digitalWrite(SmallPins[3], HIGH);  
digitalWrite(SmallPins[4], HIGH);  
digitalWrite(BigPins[0], HIGH);  
digitalWrite(BigPins[1], HIGH);  
digitalWrite(BigPins[2], HIGH);  
digitalWrite(BigPins[3], HIGH);  
digitalWrite(BigPins[4], HIGH);
delay (500);
digitalWrite(SmallPins[0], HIGH);  
digitalWrite(SmallPins[1], HIGH);  
digitalWrite(SmallPins[2], HIGH);  
digitalWrite(SmallPins[3], HIGH);  
digitalWrite(SmallPins[4], HIGH);  
digitalWrite(BigPins[0], LOW);  
digitalWrite(BigPins[1], LOW);  
digitalWrite(BigPins[2], LOW);  
digitalWrite(BigPins[3], LOW);  
digitalWrite(BigPins[4], LOW);
delay (200);
}
}


void programm2() {

int j;
digitalWrite(BigPins[0], HIGH);  
digitalWrite(BigPins[1], HIGH);  
digitalWrite(BigPins[2], HIGH);  
digitalWrite(BigPins[3], HIGH);  
digitalWrite(BigPins[4], HIGH);  

digitalWrite(SmallPins[0], HIGH);  
digitalWrite(SmallPins[1], HIGH);  
digitalWrite(SmallPins[2], HIGH);  
digitalWrite(SmallPins[3], HIGH);  
digitalWrite(SmallPins[4], HIGH);  

for (j = 0; j < 10; j = j + 1) {

int i;
for (i = 0; i < 5; i = i + 1) {
digitalWrite(BigPins[i], LOW);
digitalWrite(SmallPins[i], LOW);
delay (200-15*j-3*i);
digitalWrite(BigPins[i], HIGH);
digitalWrite(SmallPins[i], HIGH);
//digitalWrite(SmallPins[i], LOW);
}
}
}

void programm3() {
int j;
digitalWrite(SmallPins[0], LOW);  
digitalWrite(SmallPins[1], LOW);  
digitalWrite(SmallPins[2], LOW);  
digitalWrite(SmallPins[3], LOW);  
digitalWrite(SmallPins[4], LOW);  
digitalWrite(BigPins[0], LOW);  
digitalWrite(BigPins[1], LOW);  
digitalWrite(BigPins[2], LOW);  
digitalWrite(BigPins[3], LOW);  
digitalWrite(BigPins[4], LOW);

for (j = 0; j < 10; j = j + 1) {

int i;

for (i = 0; i < 5; i = i + 1) {
digitalWrite(BigPins[i], HIGH);
digitalWrite(SmallPins[i], HIGH);
delay (43+15*j+3*i);
digitalWrite(BigPins[i], LOW);
digitalWrite(SmallPins[i], LOW);
//digitalWrite(SmallPins[i], LOW);
}
}
}

void programm4() {
int j;
digitalWrite(SmallPins[0], LOW);  
digitalWrite(SmallPins[1], LOW);  
digitalWrite(SmallPins[2], LOW);  
digitalWrite(SmallPins[3], LOW);  
digitalWrite(SmallPins[4], LOW);  
digitalWrite(BigPins[0], LOW);  
digitalWrite(BigPins[1], LOW);  
digitalWrite(BigPins[2], LOW);  
digitalWrite(BigPins[3], LOW);  
digitalWrite(BigPins[4], LOW);

for (j = 0; j < 10; j = j + 1) {

int i;

for (i = 0; i < 5; i = i + 1) {
digitalWrite(BigPins[i], HIGH);
digitalWrite(SmallPins[i], HIGH);
delay (200);

}

for (i = 0; i < 5; i = i + 1) {
digitalWrite(BigPins[i], LOW);
digitalWrite(SmallPins[i], LOW);
delay (200);

}
}
}

//спираль
void programm5() {
int j;
digitalWrite(SmallPins[0], LOW);  
digitalWrite(SmallPins[1], LOW);  
digitalWrite(SmallPins[2], LOW);  
digitalWrite(SmallPins[3], LOW);  
digitalWrite(SmallPins[4], LOW);  
digitalWrite(BigPins[0], LOW);  
digitalWrite(BigPins[1], LOW);  
digitalWrite(BigPins[2], LOW);  
digitalWrite(BigPins[3], LOW);  
digitalWrite(BigPins[4], LOW);

for (j = 0; j < 10; j = j + 1) {

int i;

for (i = 0; i < 5; i = i + 1) {
digitalWrite(SmallPins[i], HIGH);
delay (200);
}

for (i = 0; i < 5; i = i + 1) {
digitalWrite(BigPins[i], HIGH);
delay (200);
}

for (i = 0; i < 5; i = i + 1) {
digitalWrite(SmallPins[i], LOW);
delay (200);
}

for (i = 0; i < 5; i = i + 1) {
digitalWrite(BigPins[i], LOW);
delay (200);
}

}
}

// путешествие
void programm6() {
int j;



int PaintPins[]={BigPins[0],SmallPins[0],SmallPins[3],BigPins[3],SmallPins[3],SmallPins[1],BigPins[1],SmallPins[1],SmallPins[4],BigPins[4],SmallPins[4],SmallPins[2],BigPins[2],SmallPins[2],SmallPins[0],BigPins[0]};

digitalWrite(SmallPins[0], LOW);  
digitalWrite(SmallPins[1], LOW);  
digitalWrite(SmallPins[2], LOW);  
digitalWrite(SmallPins[3], LOW);  
digitalWrite(SmallPins[4], LOW);  
digitalWrite(BigPins[0], LOW);  
digitalWrite(BigPins[1], LOW);  
digitalWrite(BigPins[2], LOW);  
digitalWrite(BigPins[3], LOW);  
digitalWrite(BigPins[4], LOW);
for (j = 0; j < 10; j = j + 1) {

int i;

for (i = 0; i < 15; i = i + 1) {

int my_case=digitalRead(PaintPins[i]);
switch (my_case){
case HIGH:
  digitalWrite(PaintPins[i], LOW);
  delay (200);
  digitalWrite(PaintPins[i], HIGH);
case LOW:
  digitalWrite(PaintPins[i], HIGH);
  delay (200);
  digitalWrite(PaintPins[i], LOW);
}
}

//delay (200);

}
}


// как бы вращение всей звезды
void programm7() {

int j;
digitalWrite(BigPins[0], HIGH);  
digitalWrite(BigPins[1], HIGH);  
digitalWrite(BigPins[2], HIGH);  
digitalWrite(BigPins[3], HIGH);  
digitalWrite(BigPins[4], HIGH);  
digitalWrite(SmallPins[0], HIGH);  
digitalWrite(SmallPins[1], HIGH);  
digitalWrite(SmallPins[2], HIGH);  
digitalWrite(SmallPins[3], HIGH);  
digitalWrite(SmallPins[4], HIGH);  

for (j = 0; j < 10; j = j + 1) {

int i;
for (i = 0; i < 5; i = i + 1) {
digitalWrite(BigPins[0], LOW);  
digitalWrite(BigPins[1], LOW);  
digitalWrite(BigPins[2], LOW);  
digitalWrite(BigPins[3], LOW);  
digitalWrite(BigPins[4], LOW);  
digitalWrite(SmallPins[0], LOW);  
digitalWrite(SmallPins[1], LOW);  
digitalWrite(SmallPins[2], LOW);  
digitalWrite(SmallPins[3], LOW);  
digitalWrite(SmallPins[4], LOW); 
delay (200);
digitalWrite(BigPins[i], HIGH);
digitalWrite(SmallPins[i], HIGH);
delay (200);
digitalWrite(BigPins[0], HIGH);  
digitalWrite(BigPins[1], HIGH);  
digitalWrite(BigPins[2], HIGH);  
digitalWrite(BigPins[3], HIGH);  
digitalWrite(BigPins[4], HIGH);  
digitalWrite(SmallPins[0], HIGH);  
digitalWrite(SmallPins[1], HIGH);  
digitalWrite(SmallPins[2], HIGH);  
digitalWrite(SmallPins[3], HIGH);  
digitalWrite(SmallPins[4], HIGH);  
delay (200);
}
}
}

// угол
void programm8() {


int j;
 

for (j = 0; j < 10; j = j + 1) {

int i;
for (i = 0; i < 5; i = i + 1) {
digitalWrite(BigPins[0], HIGH);  
digitalWrite(BigPins[1], LOW);  
digitalWrite(BigPins[2], HIGH);  
digitalWrite(BigPins[3], HIGH);  
digitalWrite(BigPins[4], LOW);  
digitalWrite(SmallPins[0], HIGH);  
digitalWrite(SmallPins[1], LOW);  
digitalWrite(SmallPins[2], HIGH);  
digitalWrite(SmallPins[3], HIGH);  
digitalWrite(SmallPins[4], LOW);  
delay (500);
digitalWrite(BigPins[0], LOW);  
digitalWrite(BigPins[1], HIGH);  
digitalWrite(BigPins[2], LOW);  
digitalWrite(BigPins[3], HIGH);  
digitalWrite(BigPins[4], HIGH);  
digitalWrite(SmallPins[0], LOW);  
digitalWrite(SmallPins[1], HIGH);  
digitalWrite(SmallPins[2], LOW);  
digitalWrite(SmallPins[3], HIGH);  
digitalWrite(SmallPins[4], HIGH); 
delay (500);
digitalWrite(BigPins[0], HIGH);  
digitalWrite(BigPins[1], LOW);  
digitalWrite(BigPins[2], HIGH);  
digitalWrite(BigPins[3], LOW);  
digitalWrite(BigPins[4], HIGH);  
digitalWrite(SmallPins[0], HIGH);  
digitalWrite(SmallPins[1], LOW);  
digitalWrite(SmallPins[2], HIGH);  
digitalWrite(SmallPins[3], LOW);  
digitalWrite(SmallPins[4], HIGH);  
delay (500);
digitalWrite(BigPins[0], HIGH);  
digitalWrite(BigPins[1], HIGH);  
digitalWrite(BigPins[2], LOW);  
digitalWrite(BigPins[3], HIGH);  
digitalWrite(BigPins[4], LOW);  
digitalWrite(SmallPins[0], HIGH);  
digitalWrite(SmallPins[1], HIGH);  
digitalWrite(SmallPins[2], LOW);  
digitalWrite(SmallPins[3], HIGH);  
digitalWrite(SmallPins[4], LOW);  
delay (500);
digitalWrite(BigPins[0], LOW);  
digitalWrite(BigPins[1], HIGH);  
digitalWrite(BigPins[2], HIGH);  
digitalWrite(BigPins[3], LOW);  
digitalWrite(BigPins[4], HIGH);  
digitalWrite(SmallPins[0], LOW);  
digitalWrite(SmallPins[1], HIGH);  
digitalWrite(SmallPins[2], HIGH);  
digitalWrite(SmallPins[3], LOW);  
digitalWrite(SmallPins[4], HIGH); 
delay (500);
}
}
}
1 лайк

шыдэвр.

5 лайков

это называется “угадал все буквы, но не смог назвать слово”

@krysha , если вы уже положили пины в массив, то почему циклы-то не используете?

Знаете, не возникало такой необходимости - написать академически правильный код для звезды. Он был написан и отлажен “на коленке” за пару часов почти 10 лет назад. И с тех пор работает. И смотрится результат (не код) неплохо. Отладка тогда заключалась только в подборе удачных последовательностей и времени переключения. А дети и тогда и сейчас на ёлку и звезду смотрят, а не на код.

Думаете стоит оптимизировать то что стабильно работает много лет? Светить-то заезда от этого лучше не станет )

Но код-то выложили на общее обозрение )

Тут не поспоришь. Было дело. Грешен. И вероятно, оскорбил чувства :slight_smile: А ведь хотел лишь помочь создать новогоднее настроение, когда под рукой практически ничего не оказалось :slight_smile:

С чего вдруг? Выставили себя чайником и вызвали насмешки в свой адрес. Только и всего :wink:

да ладно, код написан в канонах ардуино, работает, а есть правило - работает, не трожь

Кстати, уверены, что после 266 строки не нужен break; ?

Вот смотрите, ваш код занимает:

Скетч использует 2700 байт (8%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 29 байт (1%) динамической памяти, оставляя 2019 байт для локальных переменных. Максимум: 2048 байт.

После десятиминутной оптимизации:

uint8_t BigPins[] = {7, 8, 9, 10, 11};
uint8_t SmallPins[] = {2, 3, 4, 5, 6};

// зажигаем или гасим все светодиоды сразу
void setAllLeds(uint8_t _stateSp, uint8_t _stateBp)
{
  for (uint8_t i = 0; i < 5; i++)
  {
    digitalWrite(SmallPins[i], _stateSp);
    digitalWrite(BigPins[i], _stateBp);
  }
}

void setup()
{
  // Инициализируем цифровой вход/выход в режиме выхода.
  // Выход 13 на большинстве плат Arduino подключен к светодиоду на плате.

  for (uint8_t i = 0; i < 5; i++)
  {
    pinMode(BigPins[i], OUTPUT);
    pinMode(SmallPins[i], OUTPUT);
  }
}

void loop()
{

  while (true)
  {
    programm1();
    programm2();
    programm3();
    programm4();
    programm5();
    programm6();
    // programm7();
    // programm8();
  }
}

void programm1()
{
  for (uint8_t j = 0; j < 10; j++)
  {
    setAllLeds(LOW, LOW);
    delay(200);
    setAllLeds(HIGH, LOW);
    delay(200);
    setAllLeds(HIGH, HIGH);
    delay(500);
    setAllLeds(HIGH, LOW);
    delay(200);
  }
}

void programm2()
{
  setAllLeds(HIGH, HIGH);

  for (uint8_t j = 0; j < 10; j++)
  {
    for (uint8_t i = 0; i < 5; i++)
    {
      digitalWrite(BigPins[i], LOW);
      digitalWrite(SmallPins[i], LOW);
      delay(200 - 15 * j - 3 * i);
      digitalWrite(BigPins[i], HIGH);
      digitalWrite(SmallPins[i], HIGH);
      // digitalWrite(SmallPins[i], LOW);
    }
  }
}

void programm3()
{
  setAllLeds(LOW, LOW);

  for (uint8_t j = 0; j < 10; j++)
  {
    for (uint8_t i = 0; i < 5; i++)
    {
      digitalWrite(BigPins[i], HIGH);
      digitalWrite(SmallPins[i], HIGH);
      delay(43 + 15 * j + 3 * i);
      digitalWrite(BigPins[i], LOW);
      digitalWrite(SmallPins[i], LOW);
      // digitalWrite(SmallPins[i], LOW);
    }
  }
}

void programm4()
{
  setAllLeds(LOW, LOW);

  for (uint8_t j = 0; j < 10; j++)
  {
    for (uint8_t i = 0; i < 5; i++)
    {
      digitalWrite(BigPins[i], HIGH);
      digitalWrite(SmallPins[i], HIGH);
      delay(200);
      digitalWrite(BigPins[i], LOW);
      digitalWrite(SmallPins[i], LOW);
      delay(200);
    }
  }
}

// спираль
void programm5()
{
  setAllLeds(LOW, LOW);

  for (uint8_t j = 0; j < 10; j++)
  {
    for (uint8_t i = 0; i < 5; i++)
    {
      digitalWrite(SmallPins[i], HIGH);
      delay(200);
      digitalWrite(BigPins[i], HIGH);
      delay(200);
      digitalWrite(SmallPins[i], LOW);
      delay(200);
      digitalWrite(BigPins[i], LOW);
      delay(200);
    }
  }
}

// путешествие
void programm6()
{
  uint8_t PaintPins[] = {BigPins[0], SmallPins[0], SmallPins[3], BigPins[3], SmallPins[3], SmallPins[1], BigPins[1], SmallPins[1], SmallPins[4], BigPins[4], SmallPins[4], SmallPins[2], BigPins[2], SmallPins[2], SmallPins[0], BigPins[0]};

  setAllLeds(LOW, LOW);

  for (uint8_t j = 0; j < 10; j++)
  {
    for (uint8_t i = 0; i < 15; i++)
    {

      uint8_t my_case = digitalRead(PaintPins[i]);
      switch (my_case)
      {
      case HIGH:
        digitalWrite(PaintPins[i], LOW);
        delay(200);
        digitalWrite(PaintPins[i], HIGH);
      case LOW:
        digitalWrite(PaintPins[i], HIGH);
        delay(200);
        digitalWrite(PaintPins[i], LOW);
      }
    }

    // delay (200);
  }
}

// как бы вращение всей звезды
void programm7()
{
  setAllLeds(HIGH, HIGH);

  for (uint8_t j = 0; j < 10; j++)
  {

    uint8_t i;
    for (i = 0; i < 5; i = i + 1)
    {
      setAllLeds(LOW, LOW);
      delay(200);
      digitalWrite(BigPins[i], HIGH);
      digitalWrite(SmallPins[i], HIGH);
      delay(200);
      setAllLeds(HIGH, HIGH);
      delay(200);
    }
  }
}

// угол
void programm8()
{
  for (uint8_t j = 0; j < 10; j++)
  {
    for (uint8_t i = 0; i < 5; i++)
    {
      digitalWrite(BigPins[0], HIGH);
      digitalWrite(BigPins[1], LOW);
      digitalWrite(BigPins[2], HIGH);
      digitalWrite(BigPins[3], HIGH);
      digitalWrite(BigPins[4], LOW);
      digitalWrite(SmallPins[0], HIGH);
      digitalWrite(SmallPins[1], LOW);
      digitalWrite(SmallPins[2], HIGH);
      digitalWrite(SmallPins[3], HIGH);
      digitalWrite(SmallPins[4], LOW);
      delay(500);
      digitalWrite(BigPins[0], LOW);
      digitalWrite(BigPins[1], HIGH);
      digitalWrite(BigPins[2], LOW);
      digitalWrite(BigPins[3], HIGH);
      digitalWrite(BigPins[4], HIGH);
      digitalWrite(SmallPins[0], LOW);
      digitalWrite(SmallPins[1], HIGH);
      digitalWrite(SmallPins[2], LOW);
      digitalWrite(SmallPins[3], HIGH);
      digitalWrite(SmallPins[4], HIGH);
      delay(500);
      digitalWrite(BigPins[0], HIGH);
      digitalWrite(BigPins[1], LOW);
      digitalWrite(BigPins[2], HIGH);
      digitalWrite(BigPins[3], LOW);
      digitalWrite(BigPins[4], HIGH);
      digitalWrite(SmallPins[0], HIGH);
      digitalWrite(SmallPins[1], LOW);
      digitalWrite(SmallPins[2], HIGH);
      digitalWrite(SmallPins[3], LOW);
      digitalWrite(SmallPins[4], HIGH);
      delay(500);
      digitalWrite(BigPins[0], HIGH);
      digitalWrite(BigPins[1], HIGH);
      digitalWrite(BigPins[2], LOW);
      digitalWrite(BigPins[3], HIGH);
      digitalWrite(BigPins[4], LOW);
      digitalWrite(SmallPins[0], HIGH);
      digitalWrite(SmallPins[1], HIGH);
      digitalWrite(SmallPins[2], LOW);
      digitalWrite(SmallPins[3], HIGH);
      digitalWrite(SmallPins[4], LOW);
      delay(500);
      digitalWrite(BigPins[0], LOW);
      digitalWrite(BigPins[1], HIGH);
      digitalWrite(BigPins[2], HIGH);
      digitalWrite(BigPins[3], LOW);
      digitalWrite(BigPins[4], HIGH);
      digitalWrite(SmallPins[0], LOW);
      digitalWrite(SmallPins[1], HIGH);
      digitalWrite(SmallPins[2], HIGH);
      digitalWrite(SmallPins[3], LOW);
      digitalWrite(SmallPins[4], HIGH);
      delay(500);
    }
  }
}

Скетч использует 1886 байт (6%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 19 байт (0%) динамической памяти, оставляя 2029 байт для локальных переменных. Максимум: 2048 байт.

Что было сделано? Первое: все int заменены на uint8_t, ибо для номера пина два байта - слишком жирно, да и отрицательным он быть не может. Уже это уменьшило код на 142 байта и сэкономило 10 байт динамической памяти. Ну а дальше - использование циклов, где это возможно, и мелочи, типа замены j = j + 1 на j++

Понятно, что для этого скетча такая оптимизация ничего не изменит, но а) где-то в другом скетче вы таким образом сможете неплохо сэкономить и впихнуть в код то, что до этого никак не помещалось и б) код стал более читаемым, да и более коротким - 248 строк вместо 383. А вы его все-таки на всеобщий обзор выложили…

Так что посерьезнее нужно быть, посерьезнее :wink:

ага
и Вам того же :slight_smile:

ничего не замечаете? :slight_smile:

1 лайк

Действительно. Поправил ))

Как сказал бы Деда, если бы не спал - шыдевр :slight_smile:

1 лайк

Не плагиатствуйте ))

ну да, теперь сэкономленную память можно передать по наследству )))

Не возражаю :wink:

У меня на старом форуме была тема с использованием ШИМ выходов для светодиодов.

Вот более расширенный рабочий код.

Спойлер
/*
Использует порты с поддержкой ШИМ для управления светодиодами. 
leds[] - массив светодиодов (объекты класса)
Функцию leds[0].goLed() необходимо использовать в цикле с задержкой 125 миллисекунд.
value - яркость светодиода от 0 до 255
stepValue - изменение яркости за цикл от 1 до 255
timeStep - время таймера от 0 до 4 294 967 295 с шагом 125 миллисекунд (указанных в цикле).
Примеры использования на одном светодиоде (объекте класса):
1. leds[0].GetValue(); // считывание текущей яркости
2. leds[0].SetValue(100); // установка яркости на 100 (яркость от 0 до 255)
3. led[0].GetTimeStop; // флаг окончания заданного ранее интервала времени
4. leds[0].goLed(0,0,0); // рандомный режим
5. leds[0].goLed(1,3,0); // растущая яркость c шагом 3 (шаг от 1 до 255)
6. leds[0].goLed(2,3,0); // убывающая яркость c шагом 3 (шаг от 1 до 255)
7. leds[0].goLed(3,0,900); // устанавливает таймер на гашение светодиода через 900 миллисекунд.
8. leds[0].goLed(4,0,900); // устанавливает таймер на зажигание светодиода через 900 миллисекунд.
*/

class LedBlink {
  bool timeStop=1;
  uint8_t pin, value=0, mode=0;
  int16_t stepValue=0;
  uint32_t timeStep=0, ms=0;

public:
  LedBlink(uint8_t valPin) {
    pin = valPin;
    pinMode(pin, OUTPUT);
    analogWrite(pin, value);
  }

  uint8_t GetValue() {return value;}
  void SetValue(uint8_t value) {this -> value = value;}
  bool GetTimeStop() {return timeStop;}

  void goLed() {
     analogWrite(pin, value);
  }
  
  void goLed(uint8_t mode, int16_t stepValue, uint32_t timeStep) {
    this -> mode = mode;
    this -> stepValue = stepValue;
    if (timeStop) this -> timeStep = timeStep;
    switch (mode) {
      case 0: {
        if (( millis() - ms) >= timeStep){
          ms = millis();
          timeStep = random(1000,3000);
          stepValue = random(-10, 10);
        }
        if (((value + stepValue) >= 0) && ((value + stepValue) <= 255)) value = value + stepValue;
        break;
      }
      case 1: {
        if ((value + stepValue) <= 255) value = value + stepValue; else value = 0;
        break;
      }
      case 2: { 
        if ((value - stepValue) >= 0) value = value - stepValue; else value = 255;
        break;
      }
      case 3: { 
        if (( millis() - ms) >= timeStep){
           ms = millis();
           value = 20;
           timeStop = 1;
        } else timeStop=0;
        break;
      }
      case 4: { 
        if (( millis() - ms) >= timeStep){
           ms = millis();
           value = 255;
           timeStop = 1;
        } else timeStop=0;
        break;
      }
    
    }
    goLed();
  }  
};

// Массив с портами с поддержкой ШИМ
static LedBlink leds[] = {3, 5, 6, 9, 10};
// Размер массива с портами поддерживающими ШИМ, т.е. количество светодиодов
static constexpr uint8_t totalLeds = sizeof(leds) / sizeof(leds[0]);

void setup() {
  uint32_t seed = 0;
    for (uint8_t i = 0; i < 16; i++) {
       seed *= 4UL;
       seed += analogRead(A0) & 3;
    }
    randomSeed(seed);
}

// Далее пример использования класса
uint8_t loopMode=0, lLoopMode=0, loopValue=0, loopI=0;
int16_t loopStep=0;
uint32_t loopMs=0, loopTimeStep=0, loopStop=0;

void loop() {
  if (( millis() - loopMs) >= loopTimeStep){
    loopMs = millis();
    lLoopMode = loopMode;
    while (lLoopMode == loopMode) loopMode = random(0,7);
    loopTimeStep = random(20000,60000);
    if (loopMode == 1) {for (uint8_t i = 0; i < totalLeds; i++) leds[i].SetValue(0); loopStep = random(3,15);}
    if (loopMode == 2) {for (uint8_t i = 0; i < totalLeds; i++) leds[i].SetValue(255); loopStep = random(3,15);}
    if (loopMode == 3) {loopValue = random(100,255); loopStop = random(125,2000);}
    if (loopMode == 4) for (uint8_t i = 0; i < totalLeds; i++) leds[i].SetValue(20);
    if (loopMode == 5) {loopValue = random(0,20); loopStop = random(125,2000);}
    if (loopMode == 6) for (uint8_t i = 0; i < totalLeds; i++) leds[i].SetValue(255);
  }
  
  switch (loopMode) {
      case 0: {
        for (uint8_t i = 0; i < totalLeds; i++) leds[i].goLed(0,0,0);
        break;
      }
      case 1: {
        for (uint8_t i = 0; i < totalLeds; i++) leds[i].goLed(1,loopStep,0);
        break;
      }
      case 2: {
        for (uint8_t i = 0; i < totalLeds; i++) leds[i].goLed(2,loopStep,0);
        break;
      }
      case 3: {
        for (uint8_t i = 0; i < totalLeds; i++) {
          leds[i].goLed(3,0,loopStop);
          if (leds[i].GetTimeStop()) leds[i].SetValue(loopValue);
        }
        break;
     }
     case 4: {
        if (loopI < totalLeds) loopI++; else loopI = 0;
        leds[loopI].SetValue(200); leds[loopI].goLed();
        if (loopI > 0) {leds[loopI - 1].SetValue(20); leds[loopI - 1].goLed();}
        else {leds[totalLeds - 1].SetValue(20); leds[totalLeds - 1].goLed();}
        break;
    }
    case 5: {
        for (uint8_t i = 0; i < totalLeds; i++) {
          leds[i].goLed(4,0,loopStop);
          if (leds[i].GetTimeStop()) leds[i].SetValue(loopValue);
        }
        break;
   }
   case 6: {
        if (loopI < totalLeds) loopI++; else loopI = 0;
        leds[loopI].SetValue(20); leds[loopI].goLed();
        if (loopI > 0) {leds[loopI - 1].SetValue(255); leds[loopI - 1].goLed();}
        else {leds[totalLeds - 1].SetValue(255); leds[totalLeds - 1].goLed();}
        break;
   }
     
  }
  
  delay(125);
}

А так в эмуляции выглядит - ссылка.

sizeof (а лучше array_size) что бы не ошибаться и без этих вот циферок.

А проснется еще один и скажет, что оставшиеся байты надо на Привозе продать ))

это да не надо считать себя умнее придумавших delay()…