Нам понадобится для реализации данного проекта:
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; //число светодиодов в одном луче
их нужно изменять в зависимости от количества отрезков светодиодной ленты и количества светодиодов на одном отрезке.
Демонстрация работы данной снежинки находится в видео: