Нужна помощь в написании скетча для камина

dron-elektronik

✩✩✩✩✩✩✩
3 Дек 2019
6
0
При изготовлении подсветки дров камина на адресной ленте, столкнулся с проблемой написания скетча, потому как только начал изучать данное направление.
Задумка такая: в дровах вырезанных из пенопласта, имеются пустотелости в районе углей. Туда помещаются диоды (около 20 шт.) которые будут подсвечивать их.
Максимум что у меня получилось это зажигать диоды по порядку слева на право с рандомной скоростью.
20191125_194510.jpg20191127_230954.jpg
Нужно чтобы:
-Светодиоды загорались не по порядку, а рандомно
-Присутствовала фоновое свечение малой яркости, угли то не затухают полностью (яркость подсветки регулируется)
-загорание и потухание плавное с рандомной скоростью (пределы максимума и минимума скорости регулируются)
-Цвет от красного к желтому, при увеличении яркости цвет плавно переходит в желтый (Пределы цветов регулируются с верху и с низу)
-Яркость загорания диодов так же рандомная (регулируется верхний предел яркости)

На первый взгляд может показаться что у меня большие запросы, но с такими параметрами скетч будет универсальным и легко применим для других людей в похожих проектах. Просто я в просторах интернета нашел либо свечу, либо пламя за ширмой из нескольких лент.
Буду очень благодарен за помощь! По завершении проекта могу выложить фото и видео если надо.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
Скорость, яркость, регулируется в определенных пределах рандомом. Пределы конечно можно изменить. Скорость и яркость одиночных вспышек зависят от скорости и яркости фона
Основа - библиотека FadtLED, единственное у моего кольца перепутаны местами красный и зеленый каналы, так что если вместо красно-оранжевого свечение будет зеленое, то надо поменять местами 2 канал в CRGB. От использования синего вообще отказался.
Код "не причесан" , но он маленький и не сложный, думаю разобраться где что не составит труда
C++:
#include <FastLED.h>

#define CHIPSET     WS2812B
#define NUM_LEDS    12
#define BRIGHTNESS  50
#define DATA_PIN 4
#define koef 3

CRGB leds[NUM_LEDS];


void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  FastLED.addLeds<CHIPSET, DATA_PIN, RGB>(leds, NUM_LEDS);
  for (int i = 0; i < 12; i++) {
    leds[i] = CRGB::Black;
  };
  FastLED.setBrightness(BRIGHTNESS);
  FastLED.show();
  randomSeed(analogRead(A0));
}
byte Red_Color = 0, Green_Color = 0, Blue_Color = 0;
byte Red_Color1 = 0;
int8_t delta_color = 1;
static byte Num;
byte MaxR=90;
uint16_t time_step=10;

void loop() {
  // put your main code here, to run repeatedly:
 
  Red_Color += delta_color;
  Red_Color1+=koef*delta_color;
    
  if (Red_Color > MaxR)
  {
    delta_color = -1;
  }

  if (Red_Color < 2)
  {
    delta_color = 1;
    Red_Color1=0;       
    Num = random(12);
    MaxR=random (20,80);
    time_step=random (2,10);
  }
 // Serial.println(Red_Color);
  for (int i = 0; i < NUM_LEDS; i++) {
    leds[i] =  CRGB(constrain(Red_Color*0.6,0,(Red_Color-Red_Color/2)*0.6), Red_Color, 0);
  };
  leds[Num] =  CRGB(constrain(Red_Color1,0,Red_Color1*0.8), Red_Color1, 0);
  FastLED.show();
  delay(time_step);
}
 
  • Лойс +1
Реакции: dron-elektronik

Маэстро

★✩✩✩✩✩✩
31 Июл 2018
21
10
Можете в разделе проекты участников описать то, как получилось сделать имитацию огня? Сам бьюсь над камином очень долго, но получается так себе
 

dron-elektronik

✩✩✩✩✩✩✩
3 Дек 2019
6
0
Огромное СПАСИБО Вам!!!
Вечером после работы дозакрепляю диоды внутри дров, выложу как получилось!
Как камин доделаю, все подробно опишу в статье
 
Изменено:

dron-elektronik

✩✩✩✩✩✩✩
3 Дек 2019
6
0
Скорость, яркость, регулируется в определенных пределах рандомом. Пределы конечно можно изменить. Скорость и яркость одиночных вспышек зависят от скорости и яркости фона.

Закрепил я все диоды, запустил, и вот как это выглядит
https://yadi.sk/i/mtHUsDWnc43Wmg

А это голые диоды без оболочки
https://yadi.sk/i/-F93DT0hP6vQFw

Честно говоря на вашем колечке смотрелось совсем по другому)
На втором видео видно и понятно что половину времени вспышки происходят сзади дров, и они почти не заметны в общей картине.
А можно как то сделать чтобы фоновая подсветка стояла на месте (не мигала), а вспышек было не одна в единицу времени, а 5-6?
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
Я не все вынес вверх программы
#define koef 3 это коэфф. во сколько раз отдельная вспышка может быть ярче фона. надо помнить что максимум 255, соотв. яркость фона =255/koef
byte MaxR=90; - это макс. яркость фона. Можно и нужно уменьшить. я у себя на кольцо ставил пузырек с перекисью, он беломутный, хорошо передает подсветку и уже поменял параметры. можно byte MaxR=40, а koef сделать 5 или даже 6, посмотреть как будет

Что бы подсветка не мигала, достаточно в сетапе вместо этого leds = CRGB::Black; вписать нужный цвет. Я просто гашу лампу в начале. Вот эту часть
for (int i = 0; i < NUM_LEDS; i++) {

leds = CRGB(constrain(Red_Color*0.6,0,(Red_Color-Red_Color/2)*0.6), Red_Color, 0);
};
убрать в комментарий. и изменений не будет.

Можно и несколько светодиодов делать, да вообще можно сделать все что угодно )

time_step=random (2,10); время задержки, уменьшив можно увеличить скорость мерцания. можно попробовать. В любом случае для каждого отдельного (разного) случая придется вносить изменения. формы разные, прозрачность разная

Видео с флаконом
 
Изменено:

Старик Похабыч

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
Да ясный пфенинг что придумано, но свою то голову куда деть ? Если я хочу, то могу! И мне написать код куда интереснее чем взять и скопировать что то готовое.. поэтому я и не повторяю чужие проекты. В крайнем случае могу переписать под себя
 

dron-elektronik

✩✩✩✩✩✩✩
3 Дек 2019
6
0
Все уже придумано до нас. )
Так то ведь пламя! А у меня угли тлеющие с переливами, как будто там внутри пламя пытается вырваться наружу! В перспективе можно поставить парогенератор или на крайний случай на заднем фоне такое пламя как вы пказали.
 

dron-elektronik

✩✩✩✩✩✩✩
3 Дек 2019
6
0
Что бы подсветка не мигала, достаточно в сетапе вместо этого leds = CRGB::Black; вписать нужный цвет. Я просто гашу лампу в начале. Вот эту часть
for (int i = 0; i < NUM_LEDS; i++) {

leds = CRGB(constrain(Red_Color*0.6,0,(Red_Color-Red_Color/2)*0.6), Red_Color, 0);
};
С этим разобрался, leds = CRGB::Red;
Вторую часть не убирал в комментарий а сделал так
for (int i = 0; i < NUM_LEDS; i++) {
leds = CRGB::Red;
};

Так как диоды горели пока не происходило на их вспышки, которые вспыхивали потом гасли.
Так подсветка горит постоянно. С остальными настройками скорости и значений вроде разобрался, только не могу разобраться как менять цвет (вспышки зеленоватые) и как увеличить количество вспышек.
И вообще хотел у вас спросить, правильная ли у меня логика мышления по вспышкам?:
-запускаем вспышки в количестве N-штук
-промежуток между вспышками задаем рандомный, для каждой вспышки он независимый
-время горения задаем рандомное
Или то что я написал вообще непойми что?!)
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
Вот строки
C#:
for (int i = 0; i < NUM_LEDS; i++) {
    leds[i] =  CRGB(constrain(Red_Color*0.5,0,(Red_Color-Red_Color/2)*0.5), Red_Color, 0);
  };
  leds[Num] =  CRGB(constrain( Red_Color1,0,Red_Color1*0.6), Red_Color1, 0);
Там где Red_Color окружен запятыми, там он в чистом виде. Остальное - преобразования зеленого в зависимости от красного. если его много. то его можно уменьшить коэффициентом *0.5 или *0.6 как в примере

С несколькими вспышкам немного сложнее. Тут нужно продумать логику. Вспышки не должны быть на противофазе фону, это не логично. Т.е. должны работать в унисон.
Для начала можно вместо 1-го NUM взять 2-3, Num, Num1, Num2. И добавить на каждую свою строку
leds[Num1] = CRGB(constrain( Red_Color1,0,Red_Color1*0.6), Red_Color1, 0);
что бы яркость была разной нужно так же RedColor1 сделать для каждого свой.


Ну а если все же хочется сделать что бы вспышки были совсем рандомными, то тут надо огород городить. Типа смотрим эта вспышка работатет ? если да. то отрабатывать. если нет, то инициировать случайный запуск с каким то шансом..