
Нам понадобится для реализации данного проекта:
Arduino nano: http://ali.pub/1x1jri
Светодиодная лента ws2812b: http://ali.pub/2wm1h4
Прежде чем приступить к материалу, я Вас попрошу, если нравится то, что я делаю и хотите следить за моей деятельностью, то рекомендую подписаться на мой телеграмм канал: https://t.me/ypavla
Там я публикую новости о вышедших видео, статьях и разные устройства для умного дома и не только показываю.
Спасибо за внимание, теперь продолжим.
Для начала нужно скачать чертеж снежинки распечатать на принтере и вырезать ее. Ну по крайней мере я сделал так, чтоб использовать вырезанную снежинку как шаблон.
Сам шаблон можно скачать отсюда:

Материал для снежинки я использовал пену, которой упаковывают например посылки из китая, данный материал я показываю в видео.
Так я взял светодиодную ленту разрезал ее на 6 частей по 7 светодиодов. и наклеил их на двухсторонний скотч на снежинку таким образом:

Проводами от витой пары соединил концы ленты последовательно по схеме:

Питания на 41 светодиод с данными эффектами хватает от самой ардуино, не знаю правда на долго ли, но поработав 30 минут ни какие элементы в ардуино не начали греться.
Сама программа с эфектами представлена ниже, лучше скачивать скетч по ссылке с яндекс диска.
#include <Adafruit_NeoPixel.h>
uint32_t buff[48];
uint8_t mode[] { 0,1,2,3,4,5,0,1,6,7,2,3,8,9 };
#define PIN 2 // Пин на который цепляются светодиоды
int ray_number = 6; // Число лучей
int ray_pixel = 7; //число светодиодов в одном луче
int max_br = ray_pixel*2;
int step_br = 256/ray_pixel;
int TM = 50, DX = 2;
Adafruit_NeoPixel strip = Adafruit_NeoPixel(ray_pixel*ray_number, PIN, NEO_GRB + NEO_KHZ800);
void setup() {
// Скорость и глубина эффекта исходя из числа пикселей в луче
if( ray_pixel >= 8 ){
TM = 50;
DX = 2;
}
else if( ray_pixel > 6 ){
TM = 60;
DX = 2;
}
else {
TM = 70;
DX = 3;
}
strip.begin();
strip.show();
}
void loop() {
for( int i=0; i<14; i++ ){
for( int j=0; j<6; j++){
Mode1(TM,j,i);
delay(200);
// Mode1(70,j,i);
// delay(300);
}
}
}
/*
* Эффект от центра
*/
void Mode1(uint16_t wait, uint8_t pair, uint8_t dir){
for( int i1=0; i1<ray_pixel; i1++ ){
for( int i2=0; i2<ray_pixel; i2++ ){
SetStarColor1(ray_pixel-i2, 0, pair, dir);
}
SetStarColor1(ray_pixel-i1,15, pair, dir);
for( int i2=0; i2<i1; i2++ ){
SetStarColor1(ray_pixel-i2, 16-(i1-i2)*DX, pair, dir);
}
strip.show();
delay(wait);
}
for( int i1=0; i1<ray_pixel; i1++ ){
for( int i2=0; i2<ray_pixel; i2++ ){
int c = 16-(i1-(i2-8))*2;
if( c < 0 )c = 0;
SetStarColor1(ray_pixel-i2,c, pair, dir);
}
strip.show();
delay(wait);
}
}
/**
* Разгорание одного пиксела на каждом луче
*/
void SetStarColor1( uint8_t n, uint8_t br, uint8_t pair, uint8_t dir ){
if( n > ray_pixel )return;
if( br > 15 )br=15;
uint8_t r=0, g=0, b=0;
if( br < 8 ){
switch( pair ){
case 0 :
case 3 :
r = br*32;
break;
case 1 :
case 4 :
g = br*32;
break;
case 2 :
case 5 :
b = br*32;
break;
}
}
else {
switch( pair ){
case 0 :
r = 255;
g = (br-8)*32;
break;
case 1 :
g = 255;
b = (br-8)*32;
break;
case 2 :
b = 255;
r = (br-8)*32;
break;
case 3 :
r = 255;
b = (br-8)*32;
break;
case 4 :
g = 255;
r = (br-8)*32;
break;
case 5 :
b = 255;
g = (br-8)*32;
break;
}
}
switch( dir ){
case 1:
for( int i=0; i<6; i++ )strip.setPixelColor((ray_pixel-n)+i*ray_pixel, strip.Color(r,g,b));
break;
case 2:
for( int i=0; i<6; i++ )
if( i%2 )strip.setPixelColor(n-1+i*ray_pixel, strip.Color(r,g,b));
else strip.setPixelColor((ray_pixel-n)+i*ray_pixel, strip.Color(r,g,b));
break;
case 3:
for( int i=0; i<6; i++ )
if( i%2 )strip.setPixelColor((ray_pixel-n)+i*ray_pixel, strip.Color(r,g,b));
else strip.setPixelColor(n-1+i*ray_pixel, strip.Color(r,g,b));
break;
case 4:
for( int i=0; i<3; i++ )strip.setPixelColor(n-1+i*ray_pixel, strip.Color(r,g,b));
for( int i=3; i<6; i++ )strip.setPixelColor((ray_pixel-n)+i*ray_pixel, strip.Color(r,g,b));
break;
case 5:
for( int i=0; i<1; i++ )strip.setPixelColor((ray_pixel-n)+i*ray_pixel, strip.Color(r,g,b));
for( int i=1; i<4; i++ )strip.setPixelColor(n-1+i*ray_pixel, strip.Color(r,g,b));
for( int i=4; i<6; i++ )strip.setPixelColor((ray_pixel-n)+i*ray_pixel, strip.Color(r,g,b));
break;
case 6:
for( int i=0; i<2; i++ )strip.setPixelColor((ray_pixel-n)+i*ray_pixel, strip.Color(r,g,b));
for( int i=2; i<5; i++ )strip.setPixelColor(n-1+i*ray_pixel, strip.Color(r,g,b));
for( int i=5; i<6; i++ )strip.setPixelColor((ray_pixel-n)+i*ray_pixel, strip.Color(r,g,b));
break;
case 7:
for( int i=0; i<3; i++ )strip.setPixelColor((ray_pixel-n)+i*ray_pixel, strip.Color(r,g,b));
for( int i=3; i<6; i++ )strip.setPixelColor(n-1+i*ray_pixel, strip.Color(r,g,b));
break;
case 8:
for( int i=0; i<1; i++ )strip.setPixelColor(n-1+i*ray_pixel, strip.Color(r,g,b));
for( int i=1; i<4; i++ )strip.setPixelColor((ray_pixel-n)+i*ray_pixel, strip.Color(r,g,b));
for( int i=4; i<6; i++ )strip.setPixelColor(n-1+i*ray_pixel, strip.Color(r,g,b));
break;
case 9:
for( int i=0; i<2; i++ )strip.setPixelColor(n-1+i*ray_pixel, strip.Color(r,g,b));
for( int i=2; i<5; i++ )strip.setPixelColor((ray_pixel-n)+i*ray_pixel, strip.Color(r,g,b));
for( int i=5; i<6; i++ )strip.setPixelColor(n-1+i*ray_pixel, strip.Color(r,g,b));
break;
default:
for( int i=0; i<6; i++ )strip.setPixelColor(n-1+i*ray_pixel, strip.Color(r,g,b));
}
}
скачать скетч можно здесь: https://yadi.sk/d/cd6L-oyuGQYhFA
в этом скетче главные две строчки:
int ray_number = 6; // Число лучей
int ray_pixel = 7; //число светодиодов в одном луче
их нужно изменять в зависимости от количества отрезков светодиодной ленты и количества светодиодов на одном отрезке.
Демонстрация работы данной снежинки находится в видео: