RGB контролер для двох світлодіодних стрічок на Arduino NANO

28.01.2025 9 хвилин Автор: Lady Liberty

У цій статті ви дізнаєтесь, як створити RGB контролер для двох світлодіодних стрічок на базі Arduino NANO. Стаття покроково пояснює процес складання, підключення компонентів і налаштування програмного забезпечення.

RGB контролер для 2 світлодіодних стрічок на базі Arduino NANO

Для тих, хто планує створити RGB контролер на два RGB канали, який дозволяє підключати до 110 метрів світлодіодної RGB стрічки на кожен канал із можливістю налаштування індивідуальних алгоритмів роботи.

Для цього знадобляться:

  • Плата Arduino NANO.

  • Дві дванадцяти вольтові стрічки RGB.

  • Кнопка та опір 1-10 кілоом.

  • 6 мосфет транзисторів T40N03G або будь-які інші N-канальні, що підходять по потужності.

  • Для складання пристрою я ще використовую макетну плату та з’єднувальні дроти, ви за бажання можете відразу все спаяти.

//Початок скетчу

#define Red1 3
#define Green1 5
#define Blue1 6
#define Red2 9
#define Green2 10
#define Blue2 11

int r = 0, g = 0, b = 0, sensorVal, x = 8, i = 0, j = 0, SpeedR;
int Speed1 = 5, Speed2 = 5, Speed3 = 5, Speed4 = 5, Speed5 = 5, Speed6 = 5, Speed7 = 5;
int Random1, Random2, Random3, Random4, Random5, Random6;

void setup() {
  pinMode(Red1, OUTPUT); pinMode(Green1, OUTPUT);
  pinMode(Blue1, OUTPUT); pinMode(Red2, OUTPUT);
  pinMode(Green2, OUTPUT); pinMode(Blue2, OUTPUT);
  pinMode(2, INPUT_PULLUP); //подключение кнопки к pin 2
}

void button2() {
  sensorVal = digitalRead(2); if (sensorVal == HIGH) {
    delay(500); i++; if (i > x) {
      i = 0;
    }
  }
}

void offRGB() {
  digitalWrite(Red1, LOW); digitalWrite(Green2, LOW);
  digitalWrite(Blue1, LOW); digitalWrite(Red2, LOW);
  digitalWrite(Green1, LOW); digitalWrite(Blue2, LOW);
  r = 0, g = 0, b = 0;
}

void program1() {
  if (i == 1) {
    while (r < 256) {
      analogWrite(Red1, r); analogWrite(Red2, r); delay(Speed1);
      sensorVal = digitalRead(2); r++; if (sensorVal == HIGH) {
        delay(500); i++; offRGB(); if (i > x) {
          i = 0;
        }
      }
    }
  }
  if (i == 1) {
    while (b > 0) {
      analogWrite(Blue1, b); analogWrite(Blue2, b); delay(Speed1);
      sensorVal = digitalRead(2); if (sensorVal == HIGH) {
        delay(500); i++; offRGB(); if (i > x) {
          i = 0;
        }
      } b--;
    }
  }
  if (i == 1) {
    while (g < 255) {
      analogWrite(Green1, g); analogWrite(Green2, g); delay(Speed1);
      sensorVal = digitalRead(2); if (sensorVal == HIGH) {
        delay(500); i++; offRGB(); if (i > x) {
          i = 0;
        }
      } g++;
    }
  }
  if (i == 1) {
    while (r > 0) {
      analogWrite(Red1, r); analogWrite(Red2, r); delay(Speed1);
      sensorVal = digitalRead(2); if (sensorVal == HIGH) {
        delay(500); i++; offRGB(); if (i > x) {
          i = 0;
        }
      } r--;
    }
  }
  if (i == 1) {
    while (b < 256) {
      analogWrite(Blue1, b); analogWrite(Blue2, b); delay(Speed1);
      sensorVal = digitalRead(2); if (sensorVal == HIGH) {
        delay(500); i++; offRGB(); if (i > x) {
          i = 0;
        }
      } b++;
    }
  }
  if (i == 1) {
    while (g > 0) {
      analogWrite(Green1, g); analogWrite(Green2, g); delay(Speed1);
      sensorVal = digitalRead(2); if (sensorVal == HIGH) {
        delay(500); i++; offRGB(); if (i > x) {
          i = 0;
        }
      } g--;
    }
  }
}

void program2() {
  if (i == 2) {
    while (r < 255) {
      analogWrite(Red1, r); analogWrite(Red2, r); delay(Speed2);
      sensorVal = digitalRead(2); if (sensorVal == HIGH) {
        delay(500); i++; offRGB(); if (i > x) {
          i = 0;
        }
      } r++;
    }
  }
  if (i == 2) {
    while (r > 0) {
      analogWrite(Red1, r); analogWrite(Red2, r); delay(Speed2);
      sensorVal = digitalRead(2); if (sensorVal == HIGH) {
        delay(500); i++; offRGB(); if (i > x) {
          i = 0;
        }
      } r--;
    }
  }
  if (i == 2) {
    while (r < 255) {
      analogWrite(Red1, r); analogWrite(Red2, r);
      analogWrite(Blue1, r); analogWrite(Blue2, r); delay(Speed2);
      sensorVal = digitalRead(2); if (sensorVal == HIGH) {
        delay(500); i++; offRGB(); if (i > x) {
          i = 0;
        }
      } r++;
    }
  }
  if (i == 2) {
    while (r > 0) {
      analogWrite(Red1, r); analogWrite(Red2, r);
      analogWrite(Blue1, r); analogWrite(Blue2, r); delay(Speed2);
      sensorVal = digitalRead(2); if (sensorVal == HIGH) {
        delay(500); i++; offRGB(); if (i > x) {
          i = 0;
        }
      } r--;
    }
  }
  if (i == 2) {
    while (b < 256) {
      analogWrite(Blue1, b); analogWrite(Blue2, b); delay(Speed2);
      sensorVal = digitalRead(2); if (sensorVal == HIGH) {
        delay(500); i++; offRGB(); if (i > x) {
          i = 0;
        }
      } b++;
    }
  }
  if (i == 2) {
    while (b > 0) {
      analogWrite(Blue1, b); analogWrite(Blue2, b); delay(Speed2);
      sensorVal = digitalRead(2); if (sensorVal == HIGH) {
        delay(500); i++; offRGB(); if (i > x) {
          i = 0;
        }
      } b--;
    }
  }
  if (i == 2) {
    while (b < 256) {
      analogWrite(Blue1, b); analogWrite(Blue2, b);
      analogWrite(Green1, b); analogWrite(Green2, b); delay(Speed2);
      sensorVal = digitalRead(2); if (sensorVal == HIGH) {
        delay(500); i++; offRGB(); if (i > x) {
          i = 0;
        }
      } b++;
    }
  }
  if (i == 2) {
    while (b > 0) {
      analogWrite(Blue1, b); analogWrite(Blue2, b);
      analogWrite(Green1, b); analogWrite(Green2, b); delay(Speed2);
      sensorVal = digitalRead(2); if (sensorVal == HIGH) {
        delay(500); i++; offRGB(); if (i > x) {
          i = 0;
        }
      } b--;
    }
  }
  if (i == 2) {
    while (g < 255) {
      analogWrite(Green1, g); analogWrite(Green2, g); delay(Speed2);
      sensorVal = digitalRead(2); if (sensorVal == HIGH) {
        delay(500); i++; offRGB(); if (i > x) {
          i = 0;
        }
      } g++;
    }
  }
  if (i == 2) {
    while (g > 0) {
      analogWrite(Green1, g); analogWrite(Green2, g); delay(Speed2);
      sensorVal = digitalRead(2); if (sensorVal == HIGH) {
        delay(500); i++; offRGB(); if (i > x) {
          i = 0;
        }
      } g--;
    }
  }
  if (i == 2) {
    while (g < 255) {
      analogWrite(Green1, g); analogWrite(Green2, g);
      analogWrite(Red1, g); analogWrite(Red2, g); delay(Speed2);
      sensorVal = digitalRead(2); if (sensorVal == HIGH) {
        delay(500); i++; offRGB(); if (i > x) {
          i = 0;
        }
      } g++;
    }
  }
  if (i == 2) {
    while (g > 0) {
      analogWrite(Green1, g); analogWrite(Green2, g);
      analogWrite(Red1, g); analogWrite(Red2, g); delay(Speed2);
      sensorVal = digitalRead(2); if (sensorVal == HIGH) {
        delay(500); i++; offRGB(); if (i > x) {
          i = 0;
        }
      } g--;
    }
  }
}

void program3() {
  if (i == 3) {
    while (g < 255) {
      analogWrite(Green1, g); analogWrite(Red2, g);
      analogWrite(Blue1, g); analogWrite(Green2, g);
      analogWrite(Red1, g); analogWrite(Blue2, g); delay(Speed3);
      sensorVal = digitalRead(2); g++; if (sensorVal == HIGH) {
        delay(500); i++; offRGB(); if (i > x) {
          i = 0;
        }
      }
    }
  }
  if (i == 3) {
    while (g > 0) {
      analogWrite(Green1, g); analogWrite(Red2, g);
      analogWrite(Blue1, g); analogWrite(Green2, g);
      analogWrite(Red1, g); analogWrite(Blue2, g); delay(Speed3);
      sensorVal = digitalRead(2); g--; if (sensorVal == HIGH) {
        delay(500); i++; offRGB(); if (i > x) {
          i = 0;
        }
      }
    }
  }
}

void program4() {
  b = 255; analogWrite(Blue1, b); analogWrite(Red2, b);
  while (j < 1) {
    if (i == 4 && j < 1) {
      while (r < 256) {
        analogWrite(Red1, r); analogWrite(Green2, r); delay(Speed4);
        sensorVal = digitalRead(2); r++; if (sensorVal == HIGH) {
          delay(500); i++; j++; offRGB(); if (i > x) {
            i = 0;
          }
        }
      }
    }
    if (i == 4 && j < 1) {
      while (b > 0) {
        analogWrite(Blue1, b); analogWrite(Red2, b); delay(Speed4);
        sensorVal = digitalRead(2); b--; if (sensorVal == HIGH) {
          delay(500); i++; j++; offRGB(); if (i > x) {
            i = 0;
          }
        }
      }
    }
    if (i == 4 && j < 1) {
      while (g < 255) {
        analogWrite(Green1, g); analogWrite(Blue2, g); delay(Speed4);
        sensorVal = digitalRead(2); g++; if (sensorVal == HIGH) {
          delay(500); i++; j++; offRGB(); if (i > x) {
            i = 0;
          }
        }
      }
    }
    if (i == 4 && j < 1) {
      while (r > 0) {
        analogWrite(Red1, r); analogWrite(Green2, r); delay(Speed4);
        sensorVal = digitalRead(2); r--; if (sensorVal == HIGH) {
          delay(500); i++; j++; offRGB(); if (i > x) {
            i = 0;
          }
        }
      }
    }
    if (i == 4 && j < 1) {
      while (b < 256) {
        analogWrite(Blue1, b); analogWrite(Red2, b); delay(Speed4);
        sensorVal = digitalRead(2); b++; if (sensorVal == HIGH) {
          delay(500); i++; j++; offRGB(); if (i > x) {
            i = 0;
          }
        }
      }
    }
    if (i == 4 && j < 1) {
      while (g > 0) {
        analogWrite(Green1, g); analogWrite(Blue2, g); delay(Speed4);
        sensorVal = digitalRead(2); g--; if (sensorVal == HIGH) {
          delay(500); i++; j++; offRGB(); if (i > x) {
            i = 0;
          }
        }
      }
    }
  } j = 0;
}

void program5() {
  if (i == 5) {
    while (r < 255) {
      analogWrite(Red1, r); analogWrite(Green2, r); delay(Speed5);
      sensorVal = digitalRead(2); r++; if (sensorVal == HIGH) {
        delay(500); i++; offRGB(); if (i > x) {
          i = 0;
        }
      }
    }
  }
  if (i == 5) {
    while (r > 0) {
      analogWrite(Red1, r); analogWrite(Green2, r); delay(Speed5);
      sensorVal = digitalRead(2); r--; if (sensorVal == HIGH) {
        delay(500); i++; offRGB(); if (i > x) {
          i = 0;
        }
      }
    }
  }
  if (i == 5) {
    while (r < 255) {
      analogWrite(Red1, r); analogWrite(Green2, r);
      analogWrite(Green1, r); analogWrite(Blue2, r); delay(Speed5);
      sensorVal = digitalRead(2); r++; if (sensorVal == HIGH) {
        delay(500); i++; offRGB(); if (i > x) {
          i = 0;
        }
      }
    }
  }
  if (i == 5) {
    while (r > 0) {
      analogWrite(Red1, r); analogWrite(Green2, r);
      analogWrite(Green1, r); analogWrite(Blue2, r); delay(Speed5);
      sensorVal = digitalRead(2); r--; if (sensorVal == HIGH) {
        delay(500); i++; offRGB(); if (i > x) {
          i = 0;
        }
      }
    }
  }
  if (i == 5) {
    while (b < 256) {
      analogWrite(Green1, b); analogWrite(Blue2, b); delay(Speed5);
      sensorVal = digitalRead(2); b++; if (sensorVal == HIGH) {
        delay(500); i++; offRGB(); if (i > x) {
          i = 0;
        }
      }
    }
  }
  if (i == 5) {
    while (b > 0) {
      analogWrite(Green1, b); analogWrite(Blue2, b); delay(Speed5);
      sensorVal = digitalRead(2); b--; if (sensorVal == HIGH) {
        delay(500); i++; offRGB(); if (i > x) {
          i = 0;
        }
      }
    }
  }
  if (i == 5) {
    while (b < 256) {
      analogWrite(Green1, b); analogWrite(Blue2, b);
      analogWrite(Blue1, b); analogWrite(Red2, b); delay(Speed5);
      sensorVal = digitalRead(2); b++; if (sensorVal == HIGH) {
        delay(500); i++; offRGB(); if (i > x) {
          i = 0;
        }
      }
    }
  }
  if (i == 5) {
    while (b > 0) {
      analogWrite(Green1, b); analogWrite(Blue2, b);
      analogWrite(Blue1, b); analogWrite(Red2, b); delay(Speed5);
      sensorVal = digitalRead(2); b--; if (sensorVal == HIGH) {
        delay(500); i++; offRGB(); if (i > x) {
          i = 0;
        }
      }
    }
  }
  if (i == 5) {
    while (g < 255) {
      analogWrite(Blue1, g); analogWrite(Red2, g); delay(Speed5);
      sensorVal = digitalRead(2); g++; if (sensorVal == HIGH) {
        delay(500); i++; offRGB(); if (i > x) {
          i = 0;
        }
      }
    }
  }
  if (i == 5) {
    while (g > 0) {
      analogWrite(Blue1, g); analogWrite(Red2, g); delay(Speed5);
      sensorVal = digitalRead(2); g--; if (sensorVal == HIGH) {
        delay(500); i++; offRGB(); if (i > x) {
          i = 0;
        }
      }
    }
  }
  if (i == 5) {
    while (g < 255) {
      analogWrite(Blue1, g); analogWrite(Red2, g);
      analogWrite(Red1, g); analogWrite(Green2, g); delay(Speed5);
      sensorVal = digitalRead(2); g++; if (sensorVal == HIGH) {
        delay(500); i++; offRGB(); if (i > x) {
          i = 0;
        }
      }
    }
  }
  if (i == 5) {
    while (g > 0) {
      analogWrite(Blue1, g); analogWrite(Red2, g);
      analogWrite(Red1, g); analogWrite(Green2, g); delay(Speed5);
      sensorVal = digitalRead(2); g--; if (sensorVal == HIGH) {
        delay(500); i++; offRGB(); if (i > x) {
          i = 0;
        }
      }
    }
  }
}

void program6() {
  if (i == 6) {
    while (g < 255) {
      analogWrite(Green1, g); analogWrite(Red2, g);
      analogWrite(Blue1, g); analogWrite(Green2, g);; delay(Speed6);
      sensorVal = digitalRead(2); if (sensorVal == HIGH) {
        delay(500); i++; offRGB(); if (i > x) {
          i = 0;
        }
      } g++;
    }
  }
  if (i == 6) {
    while (g > 0) {
      analogWrite(Green1, g); analogWrite(Red2, g);
      analogWrite(Blue1, g); analogWrite(Green2, g); delay(Speed6);
      sensorVal = digitalRead(2); if (sensorVal == HIGH) {
        delay(500); i++; offRGB(); if (i > x) {
          i = 0;
        }
      } g--;
    }
  }
  if (i == 6) {
    while (g < 255) {
      analogWrite(Green1, g); analogWrite(Red2, g);
      analogWrite(Red1, g); analogWrite(Blue2, g); delay(Speed6);
      sensorVal = digitalRead(2); if (sensorVal == HIGH) {
        delay(500); i++; offRGB(); if (i > x) {
          i = 0;
        }
      } g++;
    }
  }
  if (i == 6) {
    while (g > 0) {
      analogWrite(Green1, g); analogWrite(Red2, g);
      analogWrite(Red1, g); analogWrite(Blue2, g); delay(Speed6);
      sensorVal = digitalRead(2); if (sensorVal == HIGH) {
        delay(500); i++; offRGB(); if (i > x) {
          i = 0;
        }
      } g--;
    }
  }
  if (i == 6) {
    while (g < 255) {
      analogWrite(Blue1, g); analogWrite(Green2, g);
      analogWrite(Red1, g); analogWrite(Blue2, g); delay(Speed6);
      sensorVal = digitalRead(2); if (sensorVal == HIGH) {
        delay(500); i++; offRGB(); if (i > x) {
          i = 0;
        }
      } g++;
    }
  }
  if (i == 6) {
    while (g > 0) {
      analogWrite(Blue1, g); analogWrite(Green2, g);
      analogWrite(Red1, g); analogWrite(Blue2, g); delay(Speed6);
      sensorVal = digitalRead(2); if (sensorVal == HIGH) {
        delay(500); i++; offRGB(); if (i > x) {
          i = 0;
        }
      } g--;
    }
  }
}

void program7() {
  while (j < 1) {
    Random1 = random (3, 7); Random4 = random (8, 12);
    Random2 = random (3, 7); Random5 = random (8, 12);
    Random3 = random (3, 7); Random6 = random (8, 12);
    if (i == 7) {
      while (g < 255 && j < 1) {
        analogWrite(Random1, g); analogWrite(Random4, g);
        analogWrite(Random2, g); analogWrite(Random5, g);
        analogWrite(Random3, g); analogWrite(Random6, g); delay(Speed7);
        sensorVal = digitalRead(2); if (sensorVal == HIGH) {
          delay(500); i++; j++; offRGB(); if (i > x) {
            i = 0;
          }
        } g++;
      }
    }
    if (i == 7 && j < 1) {
      while (g > 0) {
        analogWrite(Random1, g); analogWrite(Random4, g);
        analogWrite(Random2, g); analogWrite(Random5, g);
        analogWrite(Random3, g); analogWrite(Random6, g); delay(Speed7);
        sensorVal = digitalRead(2); if (sensorVal == HIGH) {
          delay(500); i++; j++; offRGB(); if (i > x) {
            i = 0;
          }
        } g--;
      }
    }
  } j = 0;
}

void program8() {
  while (j < 1) {
    Random1 = random (3, 7); Random4 = random (8, 12);
    Random2 = random (3, 7); Random5 = random (8, 12);
    Random3 = random (3, 7); Random6 = random (8, 12);
    SpeedR = random (2, 10);
    if (i == 8 && j < 1) {
      while (g < 255) {
        analogWrite(Random1, g); analogWrite(Random4, g);
        analogWrite(Random2, g); analogWrite(Random5, g);
        analogWrite(Random3, g); analogWrite(Random6, g); delay(SpeedR);
        sensorVal = digitalRead(2); if (sensorVal == HIGH) {
          delay(500); i++; j++; offRGB(); if (i > x) {
            i = 0;
          }
        } g++;
      }
    }
    if (i == 8 && j < 1) {
      while (g > 0) {
        analogWrite(Random1, g); analogWrite(Random4, g);
        analogWrite(Random2, g); analogWrite(Random5, g);
        analogWrite(Random3, g); analogWrite(Random6, g); delay(SpeedR);
        sensorVal = digitalRead(2);
        if (sensorVal == HIGH) {
          delay(500); i++; j++; offRGB(); if (i > x) {
            i = 0;
          }
        } g--;
      }
    }
  } j = 0;
}

void loop() {
  button2(); if (i == 0) {
    offRGB();
  }
  
  if (i == 1) {
    program1();
  }
  
  if (i == 2) {
    program2();
  }
  
  if (i == 3) {
    program3();
  }
  
  if (i == 4) {
    program4();
  }
  
  if (i == 5) {
    program5();
  }

  if (i == 6) {
    program6();
  }
  
  if (i == 7) {
    program7();
  }

  if (i == 8) {
    program8();
  }
}

//Кінець скетчу

У скетчі реалізовані такі функції:

  • “button2” – функція для обробки натискання кнопки. Якщо кнопка натиснута, здійснюється перехід до наступної функції.

  • “offRGB” – функція, яка відключає RGB канали та обнуляє змінні r, g, b.

  • “program1, program2, program3, program4, program5, program6, program7, program8” – функції, які містять алгоритми для RGB каналів.

Опис змінних:

  • Speed1, Speed2, Speed3, Speed4, Speed5, Speed6, Speed7 – змінні, що мають значення 5, яке визначає затримку. Чим більше це значення, тим повільніше виконуються алгоритми, і навпаки.

  • SpeedR = random(2, 10) – рандомна затримка для функції “program8”, де мінімальне значення становить 2, а максимальне – 10.

  • x – змінна, яка визначає кількість режимів для RGB. Значення 8 відповідає 9 програмам (0, 1, 2, 3, 4, 5, 6, 7, 8), що включають: offRGB, program1, program2, program3, program4, program5, program6, program7, program8. Для коректної роботи при зміні кількості програм необхідно також змінити значення змінної x.

Чи можете налаштувати цей скетч, як вам подобається. Або просто як є, завантажте на плату, і зберіть все, як показано на цій схемі.

Після збирання пристрою подається живлення 12 вольт. При запуску автоматично активується нульова програма з функцією “offRGB”, при цьому стрічка не світитиметься. Коротке натискання кнопки переводить цикл до наступної програми: перше натискання – до “program1”, друге – до “program2”, і так далі. Після восьмого натискання, яке активує “program8”, цикл повертається до “offRGB”.

У цій схемі використовуються мосфет-транзистори T40N03G, які витримують до 24 вольт і струм до 45 ампер. Ці характеристики дозволяють підключати до 220 метрів RGB стрічки, аналогічної до тієї, що використовується у схемі. У разі заміни транзисторів на інші N-канальні мосфети, важливо врахувати їх потужність та уважно дотримуватись розпинування, яке може відрізнятися від розпинування T40N03G.

Підписатися
Сповістити про
0 Коментарі
Найстаріші
Найновіше Найбільше голосів
Знайшли помилку?
Якщо ви знайшли помилку, зробіть скріншот і надішліть його боту.