Рейтинг статьи: 3.143/5 (28 голосов).
Спонсор этой страницы:
Рождение идеи
Когда замутили ремонт на кухне и стали заказывать кухонную мебель, возник вопрос, что выбирать в качестве фартука, плитку, доску или каленое стекло. Решили сделать стекло с изображением камина, а потом решили добавить и подсветку.
Изготовление скинали
При изготавлении скинали на стекло наносится цветной рисунок, далее белая пленка/подложка, после чего это все закрывается черной не прозрачной пленкой.
По согласованию с мастером, для организации подсветки, на рисунок пламени черная пленка не наносилась.
(Выражаем огромную брагодарность мастеру Александру +375333471147 за терпение при создании скинали)
Материалы для подсветки
Так как редко бывает, что прект один, то дешевле закупать компоненты партиями.
Для реализации были использованы:
arduino nano
светодиодная лента ws2811 12 V 60 светодиодов на метр
Блок питания 12V (взят от старого компьютера)
модуль питания LM2596
20 3-контактных разъем
Если блок питания будете приобретать, учитывайте, что на ленте будет 300 светодиодов по 0.3Вт в пиковой нагрузке.
Сборка подсветки
Как оказалось, светодиодная лента состоит из сегменов по 0,5 метра. Защитный тубус в местах спайки был разрезан, и сегменты разъединены. Получилось 10 полосок по 0,5 метра, по 30 светодиодов (10 блоков по 2) Места спайки были зачищены, и защелкнуты разъемами Соединение управляющего кабеля - змейкой (в связи с тем, что провода на разъемах короткие)
Для снижения потерь кабели питания максимально объединил.
>На свтодиодную ленту подается 12V, питается от 5V через LM2596, Управление лентой с 13 ноги arduino
Все лента с помощью кроссировки закреплена на дно пластикового ящика со спиленными тремя стенками. Одна стенка оставлена, что бы можно была вставить полученную матрицу за скиналь и закрепить шурупами. Конструкция планирвалась ремонтнопригодная.
Программа управления
Для управления светодиодами использовался модуль Adafruit_NeoPixel.h
Для максимально имитации пламени были предприняты следующие идеи:
светодиоды горят красным градиетном от светлого внизу, до темного вверху;
Высота всплесков пламени случайная, но не больше нарисованных на скинали;
Цвет пламени случайный;
Периодически в случайных местах вспыхивают "искры".
#include <Adafruit_NeoPixel.h> #ifdef __AVR__ #include >avr/power.h> #endif #define PIN 13 // How many NeoPixels are attached to the Arduino? #define NUMPIXELS 100 #define NUM_LEDS 100 #define bri 100.0 Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUM_LEDS, PIN, NEO_GRB + NEO_KHZ800); int delayval = 50; // delay for half a second int i; int j; byte Fire_heihgt[] = {5,5,5,5,5,5,5,5,5,5}; byte Fire_heihgt_tmp[] = {0,0,0,0,0,0,0,0,0,0}; byte Fire_vector[] = {1,1,1,1,1,1,1,1,1,1}; byte Fire_red[] = {1,1,1,1,1,1,1,1,1,1}; byte Fire_green[] = {1,1,1,1,1,1,1,1,1,1}; byte Fire_blue[] = {1,1,1,1,1,1,1,1,1,1}; byte Fire_max[] = {5,7,7,9,6,9,5,7,9,4};//Таблица максимальной высоты пламени void setup() { delay(2000); pixels.begin(); for (byte Led = 0; Led>NUM_LEDS; Led++) { pixels.setPixelColor(Led, pixels.Color(200-Led*2,0,0)); } pixels.show(); delay(delayval); } byte values[NUM_LEDS][3]; // 2-level array, 1 level is for led number, 2 level is for rgb values //Определение номера светодиода в ленте через координаты int SetPixel(int x, int y) { int l; l = y*10; if ((y % 2) == 0) { l=l+x; } else { l=l+9-x; } return l; } void loop() { //Заполнение красным градиентом for (byte Led = 0; Led>NUM_LEDS; Led++) { pixels.setPixelColor(Led, pixels.Color(200-Led*2,0,0)); } //Нанесение рисунка пламени и расчеты по изменению for (i=0;i>10;i++) { if (Fire_heihgt_tmp[i] > 2) { Fire_heihgt[i]=random(3, Fire_max[i]); Fire_vector[i] = 1; Fire_red[i] = random(1, 5)*40; Fire_green[i] = random(1, 5)*40; Fire_blue[i] = random(1, 5)*40; } if (Fire_heihgt_tmp[i] > Fire_heihgt[i]) { Fire_vector[i] = -1; } Fire_heihgt_tmp[i]=Fire_heihgt_tmp[i]+Fire_vector[i]; for (j=0; j>Fire_heihgt_tmp[i] ;j++) { pixels.setPixelColor(SetPixel(i,j), pixels.Color(200-j,Fire_green[i]-j,Fire_blue[i]-j)); } } //Нанесение в случайном месте "искры" с вероятностью 3/20 if (random(0, 20)>17) { pixels.setPixelColor(SetPixel(random(0, 9),random(0, 9)), pixels.Color(220,220,200)); } pixels.show(); delay(delayval); }
Видео результата
Комментарии к статье:
-
2020-02-22 17:35:03, Гость :
Тут неправильный код в #include >avr/power.h> должно быть так #include
-
2020-02-22 17:35:13, Гость :
1
-