Цветомузыка на ардуинке за 15 минут
- Войдите на сайт для отправки комментариев
Сб, 29/12/2018 - 19:38
Товарищ показал мне видео цветомузыки. Цветомузыка понравилась своей простотой и прекрасной работой. Решил повторить.
Товарищ показал мне видео цветомузыки. Цветомузыка понравилась своей простотой и прекрасной работой. Решил повторить.
К счастью автор цветомузыки выложил на своей страничке все что требуется для изготовления той прелесной штуки (скетчи, схемы).
Вот видео, что у меня получилось. Это вторая цветомузыка, первую отдал товарищу https://www.youtube.com/watch?v=ZRpLGe5Y7oU&feature=youtu.be
В описании к ролику ссылки на страничку автора и на видео автора. Мое видео можете не смотреть, автор лучше расскажет, что она из себя представляет.
Автору спасибо, что выложил не сраный hex, а открытый исходник. И вообще спасибо, что выложил, спасибо за его труд!
P.S. Если баян, то прошу прощения....Может что-то подобное уже было....
Молодец. Но вопрос: судя по видео это просто отслеживание уровня сигнала, без быстрого преобразования фурье или хартли?
у меня есть 2 годичный проект, который нигде не выкладывал, потому что недостаточно хорошо обрабатывал отдельные писки при почти полной тишине вот в этой песне: Beyond The Senses Astrix
Насколько я помню код этого гиверовского прожекта - там fft.h подключалась.
.....Но вопрос: судя по видео это просто отслеживание уровня сигнала, без быстрого преобразования фурье или хартли?.....................
Хотел сначала сделать классическую аналоговую цветомузыку. К цифровым вообще относился безразлично. А на этой цветомузыке понял, что есть простор для творчества... Правда пока совсем не разобрался как это работает.
А где код, схема? На посторонние сайты гоните? Нихарашо!
Насколько я помню код этого гиверовского прожекта - там fft.h подключалась.
На самом деле #include <FHT.h>
А где код, схема? На посторонние сайты гоните? Нихарашо!
001
/*
002
Скетч к проекту "Светомузыка на Arduino"
003
Версия 2.8
004
Страница проекта (схемы, описания): <a href="https://alexgyver.ru/colormusic/" rel="nofollow">https://alexgyver.ru/colormusic/</a>
005
Исходники на GitHub: <a href="https://github.com/AlexGyver/ColorMusic" rel="nofollow">https://github.com/AlexGyver/ColorMusic</a>
006
Нравится, как написан код? Поддержи автора! <a href="https://alexgyver.ru/support_alex/" rel="nofollow">https://alexgyver.ru/support_alex/</a>
007
Автор: AlexGyver Technologies, 2018
008
<a href="https://AlexGyver.ru/" rel="nofollow">https://AlexGyver.ru/</a>
009
010
Как откалибровать уровень шума и как пользоваться пультом
011
расписано на странице проекта! <a href="https://alexgyver.ru/colormusic/" rel="nofollow">https://alexgyver.ru/colormusic/</a>
012
*/
013
014
// ***************************** НАСТРОЙКИ *****************************
015
016
// ----- настройка ИК пульта
017
#define REMOTE_TYPE 0 // 0 - без пульта, 1 - пульт от WAVGAT, 2 - пульт от KEYES, 3 - кастомный пульт
018
// система может работать С ЛЮБЫМ ИК ПУЛЬТОМ (практически). Коды для своего пульта можно задать начиная со строки 160 в прошивке. Коды пультов определяются скетчем IRtest_2.0, читай инструкцию
019
020
// ----- настройки параметров
021
#define KEEP_SETTINGS 1 // хранить ВСЕ настройки в энергонезависимой памяти
022
#define KEEP_STATE 0 // сохранять в памяти состояние вкл/выкл системы (с пульта)
023
#define RESET_SETTINGS 0 // сброс настроек в EEPROM памяти (поставить 1, прошиться, поставить обратно 0, прошиться. Всё)
024
025
// ----- настройки ленты
026
#define NUM_LEDS 32 // количество светодиодов (данная версия поддерживает до 410 штук)
027
#define CURRENT_LIMIT 2000 // лимит по току в МИЛЛИАМПЕРАХ, автоматически управляет яркостью (пожалей свой блок питания!) 0 - выключить лимит
028
byte
BRIGHTNESS = 200;
// яркость по умолчанию (0 - 255)
029
030
// ----- пины подключения
031
#define SOUND_R A2 // аналоговый пин вход аудио, правый канал
032
#define SOUND_L A1 // аналоговый пин вход аудио, левый канал
033
#define SOUND_R_FREQ A3 // аналоговый пин вход аудио для режима с частотами (через кондер)
034
#define BTN_PIN 3 // кнопка переключения режимов (PIN --- КНОПКА --- GND)
035
036
#if defined(__AVR_ATmega32U4__) // Пины для Arduino Pro Micro (смотри схему для Pro Micro на странице проекта!!!)
037
#define MLED_PIN 17 // пин светодиода режимов на ProMicro, т.к. обычный не выведен.
038
#define MLED_ON LOW
039
#define LED_PIN 9 // пин DI светодиодной ленты на ProMicro, т.к. обычный не выведен.
040
#else // Пины для других плат Arduino (по умолчанию)
041
#define MLED_PIN 13 // пин светодиода режимов
042
#define MLED_ON HIGH
043
#define LED_PIN 12 // пин DI светодиодной ленты
044
#endif
045
046
#define POT_GND A0 // пин земля для потенциометра
047
#define IR_PIN 2 // пин ИК приёмника
048
049
// ----- настройки радуги
050
float
RAINBOW_STEP = 3.5;
// шаг изменения цвета радуги
051
052
// ----- отрисовка
053
#define MODE 0 // режим при запуске
054
#define MAIN_LOOP 3 // период основного цикла отрисовки (по умолчанию 5)
055
056
// ----- сигнал
057
#define MONO 0 // 1 - только один канал (ПРАВЫЙ!!!!! SOUND_R!!!!!), 0 - два канала
058
#define EXP 1.4 // степень усиления сигнала (для более "резкой" работы) (по умолчанию 1.4)
059
#define POTENT 1 // 1 - используем потенциометр, 0 - используется внутренний источник опорного напряжения 1.1 В
060
byte
EMPTY_BRIGHT = 30;
// яркость "не горящих" светодиодов (0 - 255)
061
#define EMPTY_COLOR HUE_PURPLE // цвет "не горящих" светодиодов. Будет чёрный, если яркость 0
062
063
// ----- нижний порог шумов
064
uint16_t LOW_PASS = 100;
// нижний порог шумов режим VU, ручная настройка
065
uint16_t SPEKTR_LOW_PASS = 40;
// нижний порог шумов режим спектра, ручная настройка
066
#define AUTO_LOW_PASS 0 // разрешить настройку нижнего порога шумов при запуске (по умолч. 0)
067
#define EEPROM_LOW_PASS 1 // порог шумов хранится в энергонезависимой памяти (по умолч. 1)
068
#define LOW_PASS_ADD 13 // "добавочная" величина к нижнему порогу, для надёжности (режим VU)
069
#define LOW_PASS_FREQ_ADD 3 // "добавочная" величина к нижнему порогу, для надёжности (режим частот)
070
071
// ----- режим шкала громкости
072
float
SMOOTH = 0.5;
// коэффициент плавности анимации VU (по умолчанию 0.5)
073
#define MAX_COEF 1.8 // коэффициент громкости (максимальное равно срднему * этот коэф) (по умолчанию 1.8)
074
075
// ----- режим цветомузыки
076
float
SMOOTH_FREQ = 0.8;
// коэффициент плавности анимации частот (по умолчанию 0.8)
077
float
MAX_COEF_FREQ = 1.2;
// коэффициент порога для "вспышки" цветомузыки (по умолчанию 1.5)
078
#define SMOOTH_STEP 20 // шаг уменьшения яркости в режиме цветомузыки (чем больше, тем быстрее гаснет)
079
#define LOW_COLOR HUE_RED // цвет низких частот
080
#define MID_COLOR HUE_GREEN // цвет средних
081
#define HIGH_COLOR HUE_YELLOW // цвет высоких
082
083
// ----- режим стробоскопа
084
uint16_t STROBE_PERIOD = 100;
// период вспышек, миллисекунды
085
#define STROBE_DUTY 20 // скважность вспышек (1 - 99) - отношение времени вспышки ко времени темноты
086
#define STROBE_COLOR HUE_YELLOW // цвет стробоскопа
087
#define STROBE_SAT 0 // насыщенность. Если 0 - цвет будет БЕЛЫЙ при любом цвете (0 - 255)
088
byte
STROBE_SMOOTH = 100;
// скорость нарастания/угасания вспышки (0 - 255)
089
090
// ----- режим подсветки
091
byte
LIGHT_COLOR = 0;
// начальный цвет подсветки
092
byte
LIGHT_SAT = 200;
// начальная насыщенность подсветки
093
byte
COLOR_SPEED = 100;
094
int
RAINBOW_PERIOD = 3;
095
float
RAINBOW_STEP_2 = 5.5;
096
097
// ----- режим бегущих частот
098
byte
RUNNING_SPEED = 60;
099
100
// ----- режим анализатора спектра
101
byte
HUE_START = 0;
102
byte
HUE_STEP = 5;
103
#define LIGHT_SMOOTH 2
104
105
/*
106
Цвета для HSV
107
HUE_RED
108
HUE_ORANGE
109
HUE_YELLOW
110
HUE_GREEN
111
HUE_AQUA
112
HUE_BLUE
113
HUE_PURPLE
114
HUE_PINK
115
*/
116
117
// ----- КНОПКИ ПУЛЬТА WAVGAT -----
118
#if REMOTE_TYPE == 1
119
#define BUTT_UP 0xF39EEBAD
120
#define BUTT_DOWN 0xC089F6AD
121
#define BUTT_LEFT 0xE25410AD
122
#define BUTT_RIGHT 0x14CE54AD
123
#define BUTT_OK 0x297C76AD
124
#define BUTT_1 0x4E5BA3AD
125
#define BUTT_2 0xE51CA6AD
126
#define BUTT_3 0xE207E1AD
127
#define BUTT_4 0x517068AD
128
#define BUTT_5 0x1B92DDAD
129
#define BUTT_6 0xAC2A56AD
130
#define BUTT_7 0x5484B6AD
131
#define BUTT_8 0xD22353AD
132
#define BUTT_9 0xDF3F4BAD
133
#define BUTT_0 0xF08A26AD
134
#define BUTT_STAR 0x68E456AD
135
#define BUTT_HASH 0x151CD6AD
136
#endif
137
138
// ----- КНОПКИ ПУЛЬТА KEYES -----
139
#if REMOTE_TYPE == 2
140
#define BUTT_UP 0xE51CA6AD
141
#define BUTT_DOWN 0xD22353AD
142
#define BUTT_LEFT 0x517068AD
143
#define BUTT_RIGHT 0xAC2A56AD
144
#define BUTT_OK 0x1B92DDAD
145
#define BUTT_1 0x68E456AD
146
#define BUTT_2 0xF08A26AD
147
#define BUTT_3 0x151CD6AD
148
#define BUTT_4 0x18319BAD
149
#define BUTT_5 0xF39EEBAD
150
#define BUTT_6 0x4AABDFAD
151
#define BUTT_7 0xE25410AD
152
#define BUTT_8 0x297C76AD
153
#define BUTT_9 0x14CE54AD
154
#define BUTT_0 0xC089F6AD
155
#define BUTT_STAR 0xAF3F1BAD
156
#define BUTT_HASH 0x38379AD
157
#endif
158
159
// ----- КНОПКИ СВОЕГО ПУЛЬТА -----
160
#if REMOTE_TYPE == 3
161
#define BUTT_UP 0xE51CA6AD
162
#define BUTT_DOWN 0xD22353AD
163
#define BUTT_LEFT 0x517068AD
164
#define BUTT_RIGHT 0xAC2A56AD
165
#define BUTT_OK 0x1B92DDAD
166
#define BUTT_1 0x68E456AD
167
#define BUTT_2 0xF08A26AD
168
#define BUTT_3 0x151CD6AD
169
#define BUTT_4 0x18319BAD
170
#define BUTT_5 0xF39EEBAD
171
#define BUTT_6 0x4AABDFAD
172
#define BUTT_7 0xE25410AD
173
#define BUTT_8 0x297C76AD
174
#define BUTT_9 0x14CE54AD
175
#define BUTT_0 0xC089F6AD
176
#define BUTT_STAR 0xAF3F1BAD // *
177
#define BUTT_HASH 0x38379AD // #
178
#endif
179
180
181
// ------------------------------ ДЛЯ РАЗРАБОТЧИКОВ --------------------------------
182
#define MODE_AMOUNT 9 // количество режимов
183
184
#define STRIPE NUM_LEDS / 5
185
float
freq_to_stripe = NUM_LEDS / 40;
// /2 так как симметрия, и /20 так как 20 частот
186
187
#define FHT_N 64 // ширина спектра х2
188
#define LOG_OUT 1
189
#include <FHT.h> // преобразование Хартли
190
191
#include <EEPROMex.h>
192
193
#define FASTLED_ALLOW_INTERRUPTS 1
194
#include "FastLED.h"
195
CRGB leds[NUM_LEDS];
196
197
#include "GyverButton.h"
198
GButton butt1(BTN_PIN);
199
200
#include "IRLremote.h"
201
CHashIR IRLremote;
202
uint32_t IRdata;
203
204
// градиент-палитра от зелёного к красному
205
DEFINE_GRADIENT_PALETTE(soundlevel_gp) {
206
0, 0, 255, 0,
// green
207
100, 255, 255, 0,
// yellow
208
150, 255, 100, 0,
// orange
209
200, 255, 50, 0,
// red
210
255, 255, 0, 0
// red
211
};
212
CRGBPalette32 myPal = soundlevel_gp;
213
214
byte
Rlenght, Llenght;
215
float
RsoundLevel, RsoundLevel_f;
216
float
LsoundLevel, LsoundLevel_f;
217
218
float
averageLevel = 50;
219
int
maxLevel = 100;
220
byte
MAX_CH = NUM_LEDS / 2;
221
int
hue;
222
unsigned
long
main_timer, hue_timer, strobe_timer, running_timer, color_timer, rainbow_timer, eeprom_timer;
223
float
averK = 0.006;
224
byte
count;
225
float
index = (
float
)255 / MAX_CH;
// коэффициент перевода для палитры
226
boolean lowFlag;
227
byte
low_pass;
228
int
RcurrentLevel, LcurrentLevel;
229
int
colorMusic[3];
230
float
colorMusic_f[3], colorMusic_aver[3];
231
boolean colorMusicFlash[3], strobeUp_flag, strobeDwn_flag;
232
byte
this_mode = MODE;
233
int
thisBright[3], strobe_bright = 0;
234
unsigned
int
light_time = STROBE_PERIOD * STROBE_DUTY / 100;
235
volatile boolean ir_flag;
236
boolean settings_mode, ONstate =
true
;
237
int8_t freq_strobe_mode, light_mode;
238
int
freq_max;
239
float
freq_max_f, rainbow_steps;
240
int
freq_f[32];
241
int
this_color;
242
boolean running_flag[3], eeprom_flag;
243
244
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
245
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
246
// ------------------------------ ДЛЯ РАЗРАБОТЧИКОВ --------------------------------
247
248
void
setup
() {
249
Serial
.begin(9600);
250
FastLED.addLeds<WS2811, LED_PIN, GRB>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
251
if
(CURRENT_LIMIT > 0) FastLED.setMaxPowerInVoltsAndMilliamps(5, CURRENT_LIMIT);
252
FastLED.setBrightness(BRIGHTNESS);
253
254
#if defined(__AVR_ATmega32U4__) //Выключение светодиодов на Pro Micro
255
TXLED1;
//на ProMicro выключим и TXLED
256
delay (1000);
//При питании по usb от компьютера нужна задержка перед выключением RXLED. Если питать от БП, то можно убрать эту строку.
257
#endif
258
pinMode(MLED_PIN, OUTPUT);
//Режим пина для светодиода режима на выход
259
digitalWrite(MLED_PIN, !MLED_ON);
//Выключение светодиода режима
260
261
pinMode(POT_GND, OUTPUT);
262
digitalWrite(POT_GND, LOW);
263
butt1.setTimeout(900);
264
265
IRLremote.begin(IR_PIN);
266
267
// для увеличения точности уменьшаем опорное напряжение,
268
// выставив EXTERNAL и подключив Aref к выходу 3.3V на плате через делитель
269
// GND ---[10-20 кОм] --- REF --- [10 кОм] --- 3V3
270
// в данной схеме GND берётся из А0 для удобства подключения
271
if
(POTENT) analogReference(EXTERNAL);
272
else
273
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
274
analogReference(INTERNAL1V1);
275
#else
276
analogReference(INTERNAL);
277
#endif
278
279
// жуткая магия, меняем частоту оцифровки до 18 кГц
280
// команды на ебучем ассемблере, даже не спрашивайте, как это работает
281
// поднимаем частоту опроса аналогового порта до 38.4 кГц, по теореме
282
// Котельникова (Найквиста) частота дискретизации будет 19.2 кГц
283
// <a href="http://yaab-arduino.blogspot.ru/2015/02/fast-sampling-from-analog-input.html" rel="nofollow">http://yaab-arduino.blogspot.ru/2015/02/fast-sampling-from-analog-input.html</a>
284
sbi(ADCSRA, ADPS2);
285
cbi(ADCSRA, ADPS1);
286
sbi(ADCSRA, ADPS0);
287
288
if
(RESET_SETTINGS) EEPROM.write(100, 0);
// сброс флага настроек
289
290
if
(AUTO_LOW_PASS && !EEPROM_LOW_PASS) {
// если разрешена автонастройка нижнего порога шумов
291
autoLowPass();
292
}
293
if
(EEPROM_LOW_PASS) {
// восстановить значения шумов из памяти
294
LOW_PASS = EEPROM.readInt(70);
295
SPEKTR_LOW_PASS = EEPROM.readInt(72);
296
}
297
298
// в 100 ячейке хранится число 100. Если нет - значит это первый запуск системы
299
if
(KEEP_SETTINGS) {
300
if
(EEPROM.read(100) != 100) {
301
//Serial.println(F("First start"));
302
EEPROM.write(100, 100);
303
updateEEPROM();
304
}
else
{
305
readEEPROM();
306
}
307
}
308
}
309
310
void
loop
() {
311
buttonTick();
// опрос и обработка кнопки
312
#if REMOTE_TYPE != 0
313
remoteTick();
// опрос ИК пульта
314
#endif
315
mainLoop();
// главный цикл обработки и отрисовки
316
eepromTick();
// проверка не пора ли сохранить настройки
317
}
318
319
void
mainLoop() {
320
// главный цикл отрисовки
321
if
(ONstate) {
322
if
(millis() - main_timer > MAIN_LOOP) {
323
// сбрасываем значения
324
RsoundLevel = 0;
325
LsoundLevel = 0;
326
327
// перваые два режима - громкость (VU meter)
328
if
(this_mode == 0 || this_mode == 1) {
329
for
(
byte
i = 0; i < 100; i ++) {
// делаем 100 измерений
330
RcurrentLevel = analogRead(SOUND_R);
// с правого
331
if
(!MONO) LcurrentLevel = analogRead(SOUND_L);
// и левого каналов
332
333
if
(RsoundLevel < RcurrentLevel) RsoundLevel = RcurrentLevel;
// ищем максимальное
334
if
(!MONO)
if
(LsoundLevel < LcurrentLevel) LsoundLevel = LcurrentLevel;
// ищем максимальное
335
}
336
337
// фильтруем по нижнему порогу шумов
338
RsoundLevel = map(RsoundLevel, LOW_PASS, 1023, 0, 500);
339
if
(!MONO)LsoundLevel = map(LsoundLevel, LOW_PASS, 1023, 0, 500);
340
341
// ограничиваем диапазон
342
RsoundLevel = constrain(RsoundLevel, 0, 500);
343
if
(!MONO)LsoundLevel = constrain(LsoundLevel, 0, 500);
344
345
// возводим в степень (для большей чёткости работы)
346
RsoundLevel = pow(RsoundLevel, EXP);
347
if
(!MONO)LsoundLevel = pow(LsoundLevel, EXP);
348
349
// фильтр
350
RsoundLevel_f = RsoundLevel * SMOOTH + RsoundLevel_f * (1 - SMOOTH);
351
if
(!MONO)LsoundLevel_f = LsoundLevel * SMOOTH + LsoundLevel_f * (1 - SMOOTH);
352
353
if
(MONO) LsoundLevel_f = RsoundLevel_f;
// если моно, то левый = правому
354
355
// заливаем "подложку", если яркость достаточная
356
if
(EMPTY_BRIGHT > 5) {
357
for
(
int
i = 0; i < NUM_LEDS; i++)
358
leds[i] = CHSV(EMPTY_COLOR, 255, EMPTY_BRIGHT);
359
}
360
361
// если значение выше порога - начинаем самое интересное
362
if
(RsoundLevel_f > 15 && LsoundLevel_f > 15) {
363
364
// расчёт общей средней громкости с обоих каналов, фильтрация.
365
// Фильтр очень медленный, сделано специально для автогромкости
366
averageLevel = (
float
)(RsoundLevel_f + LsoundLevel_f) / 2 * averK + averageLevel * (1 - averK);
367
368
// принимаем максимальную громкость шкалы как среднюю, умноженную на некоторый коэффициент MAX_COEF
369
maxLevel = (
float
)averageLevel * MAX_COEF;
370
371
// преобразуем сигнал в длину ленты (где MAX_CH это половина количества светодиодов)
372
Rlenght = map(RsoundLevel_f, 0, maxLevel, 0, MAX_CH);
373
Llenght = map(LsoundLevel_f, 0, maxLevel, 0, MAX_CH);
374
375
// ограничиваем до макс. числа светодиодов
376
Rlenght = constrain(Rlenght, 0, MAX_CH);
377
Llenght = constrain(Llenght, 0, MAX_CH);
378
379
animation();
// отрисовать
380
}
381
}
382
383
// 3-5 режим - цветомузыка
384
if
(this_mode == 2 || this_mode == 3 || this_mode == 4 || this_mode == 7 || this_mode == 8) {
385
analyzeAudio();
386
colorMusic[0] = 0;
387
colorMusic[1] = 0;
388
colorMusic[2] = 0;
389
for
(
int
i = 0 ; i < 32 ; i++) {
390
if
(fht_log_out[i] < SPEKTR_LOW_PASS) fht_log_out[i] = 0;
391
}
392
// низкие частоты, выборка со 2 по 5 тон (0 и 1 зашумленные!)
393
for
(
byte
i = 2; i < 6; i++) {
394
if
(fht_log_out[i] > colorMusic[0]) colorMusic[0] = fht_log_out[i];
395
}
396
// средние частоты, выборка с 6 по 10 тон
397
for
(
byte
i = 6; i < 11; i++) {
398
if
(fht_log_out[i] > colorMusic[1]) colorMusic[1] = fht_log_out[i];
399
}
400
// высокие частоты, выборка с 11 по 31 тон
401
for
(
byte
i = 11; i < 32; i++) {
402
if
(fht_log_out[i] > colorMusic[2]) colorMusic[2] = fht_log_out[i];
403
}
404
freq_max = 0;
405
for
(
byte
i = 0; i < 30; i++) {
406
if
(fht_log_out[i + 2] > freq_max) freq_max = fht_log_out[i + 2];
407
if
(freq_max < 5) freq_max = 5;
408
409
if
(freq_f[i] < fht_log_out[i + 2]) freq_f[i] = fht_log_out[i + 2];
410
if
(freq_f[i] > 0) freq_f[i] -= LIGHT_SMOOTH;
411
else
freq_f[i] = 0;
412
}
413
freq_max_f = freq_max * averK + freq_max_f * (1 - averK);
414
for
(
byte
i = 0; i < 3; i++) {
415
colorMusic_aver[i] = colorMusic[i] * averK + colorMusic_aver[i] * (1 - averK);
// общая фильтрация
416
colorMusic_f[i] = colorMusic[i] * SMOOTH_FREQ + colorMusic_f[i] * (1 - SMOOTH_FREQ);
// локальная
417
if
(colorMusic_f[i] > ((
float
)colorMusic_aver[i] * MAX_COEF_FREQ)) {
418
thisBright[i] = 255;
419
colorMusicFlash[i] =
true
;
420
running_flag[i] =
true
;
421
}
else
colorMusicFlash[i] =
false
;
422
if
(thisBright[i] >= 0) thisBright[i] -= SMOOTH_STEP;
423
if
(thisBright[i] < EMPTY_BRIGHT) {
424
thisBright[i] = EMPTY_BRIGHT;
425
running_flag[i] =
false
;
426
}
427
}
428
animation();
429
}
430
if
(this_mode == 5) {
431
if
((
long
)millis() - strobe_timer > STROBE_PERIOD) {
432
strobe_timer = millis();
433
strobeUp_flag =
true
;
434
strobeDwn_flag =
false
;
435
}
436
if
((
long
)millis() - strobe_timer > light_time) {
437
strobeDwn_flag =
true
;
438
}
439
if
(strobeUp_flag) {
// если настало время пыхнуть
440
if
(strobe_bright < 255)
// если яркость не максимальная
441
strobe_bright += STROBE_SMOOTH;
// увелчить
442
if
(strobe_bright > 255) {
// если пробили макс. яркость
443
strobe_bright = 255;
// оставить максимум
444
strobeUp_flag =
false
;
// флаг опустить
445
}
446
}
447
448
if
(strobeDwn_flag) {
// гаснем
449
if
(strobe_bright > 0)
// если яркость не минимальная
450
strobe_bright -= STROBE_SMOOTH;
// уменьшить
451
if
(strobe_bright < 0) {
// если пробили мин. яркость
452
strobeDwn_flag =
false
;
453
strobe_bright = 0;
// оставить 0
454
}
455
}
456
animation();
457
}
458
if
(this_mode == 6) animation();
459
460
if
(!IRLremote.receiving())
// если на ИК приёмник не приходит сигнал (без этого НЕ РАБОТАЕТ!)
461
FastLED.show();
// отправить значения на ленту
462
463
if
(this_mode != 7)
// 7 режиму не нужна очистка!!!
464
FastLED.clear();
// очистить массив пикселей
465
main_timer = millis();
// сбросить таймер
466
}
467
}
468
}
469
470
void
animation() {
471
// согласно режиму
472
switch
(this_mode) {
473
case
0:
474
count = 0;
475
for
(
int
i = (MAX_CH - 1); i > ((MAX_CH - 1) - Rlenght); i--) {
476
leds[i] = ColorFromPalette(myPal, (count * index));
// заливка по палитре " от зелёного к красному"
477
count++;
478
}
479
count = 0;
480
for
(
int
i = (MAX_CH); i < (MAX_CH + Llenght); i++ ) {
481
leds[i] = ColorFromPalette(myPal, (count * index));
// заливка по палитре " от зелёного к красному"
482
count++;
483
}
484
if
(EMPTY_BRIGHT > 0) {
485
CHSV this_dark = CHSV(EMPTY_COLOR, 255, EMPTY_BRIGHT);
486
for
(
int
i = ((MAX_CH - 1) - Rlenght); i > 0; i--)
487
leds[i] = this_dark;
488
for
(
int
i = MAX_CH + Llenght; i < NUM_LEDS; i++)
489
leds[i] = this_dark;
490
}
491
break
;
492
case
1:
493
if
(millis() - rainbow_timer > 30) {
494
rainbow_timer = millis();
495
hue = floor((
float
)hue + RAINBOW_STEP);
496
}
497
count = 0;
498
for
(
int
i = (MAX_CH - 1); i > ((MAX_CH - 1) - Rlenght); i--) {
499
leds[i] = ColorFromPalette(RainbowColors_p, (count * index) / 2 - hue);
// заливка по палитре радуга
500
count++;
501
}
502
count = 0;
503
for
(
int
i = (MAX_CH); i < (MAX_CH + Llenght); i++ ) {
504
leds[i] = ColorFromPalette(RainbowColors_p, (count * index) / 2 - hue);
// заливка по палитре радуга
505
count++;
506
}
507
if
(EMPTY_BRIGHT > 0) {
508
CHSV this_dark = CHSV(EMPTY_COLOR, 255, EMPTY_BRIGHT);
509
for
(
int
i = ((MAX_CH - 1) - Rlenght); i > 0; i--)
510
leds[i] = this_dark;
511
for
(
int
i = MAX_CH + Llenght; i < NUM_LEDS; i++)
512
leds[i] = this_dark;
513
}
514
break
;
515
case
2:
516
for
(
int
i = 0; i < NUM_LEDS; i++) {
517
if
(i < STRIPE) leds[i] = CHSV(HIGH_COLOR, 255, thisBright[2]);
518
else
if
(i < STRIPE * 2) leds[i] = CHSV(MID_COLOR, 255, thisBright[1]);
519
else
if
(i < STRIPE * 3) leds[i] = CHSV(LOW_COLOR, 255, thisBright[0]);
520
else
if
(i < STRIPE * 4) leds[i] = CHSV(MID_COLOR, 255, thisBright[1]);
521
else
if
(i < STRIPE * 5) leds[i] = CHSV(HIGH_COLOR, 255, thisBright[2]);
522
}
523
break
;
524
case
3:
525
for
(
int
i = 0; i < NUM_LEDS; i++) {
526
if
(i < NUM_LEDS / 3) leds[i] = CHSV(HIGH_COLOR, 255, thisBright[2]);
527
else
if
(i < NUM_LEDS * 2 / 3) leds[i] = CHSV(MID_COLOR, 255, thisBright[1]);
528
else
if
(i < NUM_LEDS) leds[i] = CHSV(LOW_COLOR, 255, thisBright[0]);
529
}
530
break
;
531
case
4:
532
switch
(freq_strobe_mode) {
533
case
0:
534
if
(colorMusicFlash[2]) HIGHS();
535
else
if
(colorMusicFlash[1]) MIDS();
536
else
if
(colorMusicFlash[0]) LOWS();
537
else
SILENCE();
538
break
;
539
case
1:
540
if
(colorMusicFlash[2]) HIGHS();
541
else
SILENCE();
542
break
;
543
case
2:
544
if
(colorMusicFlash[1]) MIDS();
545
else
SILENCE();
546
break
;
547
case
3:
548
if
(colorMusicFlash[0]) LOWS();
549
else
SILENCE();
550
break
;
551
}
552
break
;
553
case
5:
554
if
(strobe_bright > 0)
555
for
(
int
i = 0; i < NUM_LEDS; i++) leds[i] = CHSV(STROBE_COLOR, STROBE_SAT, strobe_bright);
556
else
557
for
(
int
i = 0; i < NUM_LEDS; i++) leds[i] = CHSV(EMPTY_COLOR, 255, EMPTY_BRIGHT);
558
break
;
559
case
6:
560
switch
(light_mode) {
561
case
0:
for
(
int
i = 0; i < NUM_LEDS; i++) leds[i] = CHSV(LIGHT_COLOR, LIGHT_SAT, 255);
562
break
;
563
case
1:
564
if
(millis() - color_timer > COLOR_SPEED) {
565
color_timer = millis();
566
if
(++this_color > 255) this_color = 0;
567
}
568
for
(
int
i = 0; i < NUM_LEDS; i++) leds[i] = CHSV(this_color, LIGHT_SAT, 255);
569
break
;
570
case
2:
571
if
(millis() - rainbow_timer > 30) {
572
rainbow_timer = millis();
573
this_color += RAINBOW_PERIOD;
574
if
(this_color > 255) this_color = 0;
575
if
(this_color < 0) this_color = 255;
576
}
577
rainbow_steps = this_color;
578
for
(
int
i = 0; i < NUM_LEDS; i++) {
579
leds[i] = CHSV((
int
)floor(rainbow_steps), 255, 255);
580
rainbow_steps += RAINBOW_STEP_2;
581
if
(rainbow_steps > 255) rainbow_steps = 0;
582
if
(rainbow_steps < 0) rainbow_steps = 255;
583
}
584
break
;
585
}
586
break
;
587
case
7:
588
switch
(freq_strobe_mode) {
589
case
0:
590
if
(running_flag[2]) leds[NUM_LEDS / 2] = CHSV(HIGH_COLOR, 255, thisBright[2]);
591
else
if
(running_flag[1]) leds[NUM_LEDS / 2] = CHSV(MID_COLOR, 255, thisBright[1]);
592
else
if
(running_flag[0]) leds[NUM_LEDS / 2] = CHSV(LOW_COLOR, 255, thisBright[0]);
593
else
leds[NUM_LEDS / 2] = CHSV(EMPTY_COLOR, 255, EMPTY_BRIGHT);
594
break
;
595
case
1:
596
if
(running_flag[2]) leds[NUM_LEDS / 2] = CHSV(HIGH_COLOR, 255, thisBright[2]);
597
else
leds[NUM_LEDS / 2] = CHSV(EMPTY_COLOR, 255, EMPTY_BRIGHT);
598
break
;
599
case
2:
600
if
(running_flag[1]) leds[NUM_LEDS / 2] = CHSV(MID_COLOR, 255, thisBright[1]);
601
else
leds[NUM_LEDS / 2] = CHSV(EMPTY_COLOR, 255, EMPTY_BRIGHT);
602
break
;
603
case
3:
604
if
(running_flag[0]) leds[NUM_LEDS / 2] = CHSV(LOW_COLOR, 255, thisBright[0]);
605
else
leds[NUM_LEDS / 2] = CHSV(EMPTY_COLOR, 255, EMPTY_BRIGHT);
606
break
;
607
}
608
leds[(NUM_LEDS / 2) - 1] = leds[NUM_LEDS / 2];
609
if
(millis() - running_timer > RUNNING_SPEED) {
610
running_timer = millis();
611
for
(
byte
i = 0; i < NUM_LEDS / 2 - 1; i++) {
612
leds[i] = leds[i + 1];
613
leds[NUM_LEDS - i - 1] = leds[i];
614
}
615
}
616
break
;
617
case
8:
618
byte
HUEindex = HUE_START;
619
for
(
byte
i = 0; i < NUM_LEDS / 2; i++) {
620
byte
this_bright = map(freq_f[(
int
)floor((NUM_LEDS / 2 - i) / freq_to_stripe)], 0, freq_max_f, 0, 255);
621
this_bright = constrain(this_bright, 0, 255);
622
leds[i] = CHSV(HUEindex, 255, this_bright);
623
leds[NUM_LEDS - i - 1] = leds[i];
624
HUEindex += HUE_STEP;
625
if
(HUEindex > 255) HUEindex = 0;
626
}
627
break
;
628
}
629
}
630
631
void
HIGHS() {
632
for
(
int
i = 0; i < NUM_LEDS; i++) leds[i] = CHSV(HIGH_COLOR, 255, thisBright[2]);
633
}
634
void
MIDS() {
635
for
(
int
i = 0; i < NUM_LEDS; i++) leds[i] = CHSV(MID_COLOR, 255, thisBright[1]);
636
}
637
void
LOWS() {
638
for
(
int
i = 0; i < NUM_LEDS; i++) leds[i] = CHSV(LOW_COLOR, 255, thisBright[0]);
639
}
640
void
SILENCE() {
641
for
(
int
i = 0; i < NUM_LEDS; i++) leds[i] = CHSV(EMPTY_COLOR, 255, EMPTY_BRIGHT);
642
}
643
644
// вспомогательная функция, изменяет величину value на шаг incr в пределах minimum.. maximum
645
int
smartIncr(
int
value,
int
incr_step,
int
mininmum,
int
maximum) {
646
int
val_buf = value + incr_step;
647
val_buf = constrain(val_buf, mininmum, maximum);
648
return
val_buf;
649
}
650
651
float
smartIncrFloat(
float
value,
float
incr_step,
float
mininmum,
float
maximum) {
652
float
val_buf = value + incr_step;
653
val_buf = constrain(val_buf, mininmum, maximum);
654
return
val_buf;
655
}
656
657
#if REMOTE_TYPE != 0
658
void
remoteTick() {
659
if
(IRLremote.available()) {
660
auto data = IRLremote.read();
661
IRdata = data.command;
662
ir_flag =
true
;
663
}
664
if
(ir_flag) {
// если данные пришли
665
eeprom_timer = millis();
666
eeprom_flag =
true
;
667
switch
(IRdata) {
668
// режимы
669
case
BUTT_1: this_mode = 0;
670
break
;
671
case
BUTT_2: this_mode = 1;
672
break
;
673
case
BUTT_3: this_mode = 2;
674
break
;
675
case
BUTT_4: this_mode = 3;
676
break
;
677
case
BUTT_5: this_mode = 4;
678
break
;
679
case
BUTT_6: this_mode = 5;
680
break
;
681
case
BUTT_7: this_mode = 6;
682
break
;
683
case
BUTT_8: this_mode = 7;
684
break
;
685
case
BUTT_9: this_mode = 8;
686
break
;
687
case
BUTT_0: fullLowPass();
688
break
;
689
case
BUTT_STAR: ONstate = !ONstate; FastLED.clear(); FastLED.show(); updateEEPROM();
690
break
;
691
case
BUTT_HASH:
692
switch
(this_mode) {
693
case
4:
694
case
7:
if
(++freq_strobe_mode > 3) freq_strobe_mode = 0;
695
break
;
696
case
6:
if
(++light_mode > 2) light_mode = 0;
697
break
;
698
}
699
break
;
700
case
BUTT_OK: digitalWrite(MLED_PIN, settings_mode ^ MLED_ON); settings_mode = !settings_mode;
701
break
;
702
case
BUTT_UP:
703
if
(settings_mode) {
704
// ВВЕРХ общие настройки
705
EMPTY_BRIGHT = smartIncr(EMPTY_BRIGHT, 5, 0, 255);
706
}
else
{
707
switch
(this_mode) {
708
case
0:
709
break
;
710
case
1: RAINBOW_STEP = smartIncrFloat(RAINBOW_STEP, 0.5, 0.5, 20);
711
break
;
712
case
2:
713
case
3:
714
case
4: MAX_COEF_FREQ = smartIncrFloat(MAX_COEF_FREQ, 0.1, 0, 5);
715
break
;
716
case
5: STROBE_PERIOD = smartIncr(STROBE_PERIOD, 20, 1, 1000);
717
break
;
718
case
6:
719
switch
(light_mode) {
720
case
0: LIGHT_SAT = smartIncr(LIGHT_SAT, 20, 0, 255);
721
break
;
722
case
1: LIGHT_SAT = smartIncr(LIGHT_SAT, 20, 0, 255);
723
break
;
724
case
2: RAINBOW_STEP_2 = smartIncrFloat(RAINBOW_STEP_2, 0.5, 0.5, 10);
725
break
;
726
}
727
break
;
728
case
7: MAX_COEF_FREQ = smartIncrFloat(MAX_COEF_FREQ, 0.1, 0.0, 10);
729
break
;
730
case
8: HUE_START = smartIncr(HUE_START, 10, 0, 255);
731
break
;
732
}
733
}
734
break
;
735
case
BUTT_DOWN:
736
if
(settings_mode) {
737
// ВНИЗ общие настройки
738
EMPTY_BRIGHT = smartIncr(EMPTY_BRIGHT, -5, 0, 255);
739
}
else
{
740
switch
(this_mode) {
741
case
0:
742
break
;
743
case
1: RAINBOW_STEP = smartIncrFloat(RAINBOW_STEP, -0.5, 0.5, 20);
744
break
;
745
case
2:
746
case
3:
747
case
4: MAX_COEF_FREQ = smartIncrFloat(MAX_COEF_FREQ, -0.1, 0, 5);
748
break
;
749
case
5: STROBE_PERIOD = smartIncr(STROBE_PERIOD, -20, 1, 1000);
750
break
;
751
case
6:
752
switch
(light_mode) {
753
case
0: LIGHT_SAT = smartIncr(LIGHT_SAT, -20, 0, 255);
754
break
;
755
case
1: LIGHT_SAT = smartIncr(LIGHT_SAT, -20, 0, 255);
756
break
;
757
case
2: RAINBOW_STEP_2 = smartIncrFloat(RAINBOW_STEP_2, -0.5, 0.5, 10);
758
break
;
759
}
760
break
;
761
case
7: MAX_COEF_FREQ = smartIncrFloat(MAX_COEF_FREQ, -0.1, 0.0, 10);
762
break
;
763
case
8: HUE_START = smartIncr(HUE_START, -10, 0, 255);
764
break
;
765
}
766
}
767
break
;
768
case
BUTT_LEFT:
769
if
(settings_mode) {
770
// ВЛЕВО общие настройки
771
BRIGHTNESS = smartIncr(BRIGHTNESS, -20, 0, 255);
772
FastLED.setBrightness(BRIGHTNESS);
773
}
else
{
774
switch
(this_mode) {
775
case
0:
776
case
1: SMOOTH = smartIncrFloat(SMOOTH, -0.05, 0.05, 1);
777
break
;
778
case
2:
779
case
3:
780
case
4: SMOOTH_FREQ = smartIncrFloat(SMOOTH_FREQ, -0.05, 0.05, 1);
781
break
;
782
case
5: STROBE_SMOOTH = smartIncr(STROBE_SMOOTH, -20, 0, 255);
783
break
;
784
case
6:
785
switch
(light_mode) {
786
case
0: LIGHT_COLOR = smartIncr(LIGHT_COLOR, -10, 0, 255);
787
break
;
788
case
1: COLOR_SPEED = smartIncr(COLOR_SPEED, -10, 0, 255);
789
break
;
790
case
2: RAINBOW_PERIOD = smartIncr(RAINBOW_PERIOD, -1, -20, 20);
791
break
;
792
}
793
break
;
794
case
7: RUNNING_SPEED = smartIncr(RUNNING_SPEED, -10, 1, 255);
795
break
;
796
case
8: HUE_STEP = smartIncr(HUE_STEP, -1, 1, 255);
797
break
;
798
}
799
}
800
break
;
801
case
BUTT_RIGHT:
802
if
(settings_mode) {
803
// ВПРАВО общие настройки
804
BRIGHTNESS = smartIncr(BRIGHTNESS, 20, 0, 255);
805
FastLED.setBrightness(BRIGHTNESS);
806
}
else
{
807
switch
(this_mode) {
808
case
0:
809
case
1: SMOOTH = smartIncrFloat(SMOOTH, 0.05, 0.05, 1);
810
break
;
811
case
2:
812
case
3:
813
case
4: SMOOTH_FREQ = smartIncrFloat(SMOOTH_FREQ, 0.05, 0.05, 1);
814
break
;
815
case
5: STROBE_SMOOTH = smartIncr(STROBE_SMOOTH, 20, 0, 255);
816
break
;
817
case
6:
818
switch
(light_mode) {
819
case
0: LIGHT_COLOR = smartIncr(LIGHT_COLOR, 10, 0, 255);
820
break
;
821
case
1: COLOR_SPEED = smartIncr(COLOR_SPEED, 10, 0, 255);
822
break
;
823
case
2: RAINBOW_PERIOD = smartIncr(RAINBOW_PERIOD, 1, -20, 20);
824
break
;
825
}
826
break
;
827
case
7: RUNNING_SPEED = smartIncr(RUNNING_SPEED, 10, 1, 255);
828
break
;
829
case
8: HUE_STEP = smartIncr(HUE_STEP, 1, 1, 255);
830
break
;
831
}
832
}
833
break
;
834
default
: eeprom_flag =
false
;
// если не распознали кнопку, не обновляем настройки!
835
break
;
836
}
837
ir_flag =
false
;
838
}
839
}
840
#endif
841
842
void
autoLowPass() {
843
// для режима VU
844
delay(10);
// ждём инициализации АЦП
845
int
thisMax = 0;
// максимум
846
int
thisLevel;
847
for
(
byte
i = 0; i < 200; i++) {
848
thisLevel = analogRead(SOUND_R);
// делаем 200 измерений
849
if
(thisLevel > thisMax)
// ищем максимумы
850
thisMax = thisLevel;
// запоминаем
851
delay(4);
// ждём 4мс
852
}
853
LOW_PASS = thisMax + LOW_PASS_ADD;
// нижний порог как максимум тишины + некая величина
854
855
// для режима спектра
856
thisMax = 0;
857
for
(
byte
i = 0; i < 100; i++) {
// делаем 100 измерений
858
analyzeAudio();
// разбить в спектр
859
for
(
byte
j = 2; j < 32; j++) {
// первые 2 канала - хлам
860
thisLevel = fht_log_out[j];
861
if
(thisLevel > thisMax)
// ищем максимумы
862
thisMax = thisLevel;
// запоминаем
863
}
864
delay(4);
// ждём 4мс
865
}
866
SPEKTR_LOW_PASS = thisMax + LOW_PASS_FREQ_ADD;
// нижний порог как максимум тишины
867
if
(EEPROM_LOW_PASS && !AUTO_LOW_PASS) {
868
EEPROM.updateInt(70, LOW_PASS);
869
EEPROM.updateInt(72, SPEKTR_LOW_PASS);
870
}
871
}
872
873
void
analyzeAudio() {
874
for
(
int
i = 0 ; i < FHT_N ; i++) {
875
int
sample = analogRead(SOUND_R_FREQ);
876
fht_input[i] = sample;
// put real data into bins
877
}
878
fht_window();
// window the data for better frequency response
879
fht_reorder();
// reorder the data before doing the fht
880
fht_run();
// process the data in the fht
881
fht_mag_log();
// take the output of the fht
882
}
883
884
void
buttonTick() {
885
butt1.tick();
// обязательная функция отработки. Должна постоянно опрашиваться
886
if
(butt1.isSingle())
// если единичное нажатие
887
if
(++this_mode >= MODE_AMOUNT) this_mode = 0;
// изменить режим
888
889
if
(butt1.isHolded()) {
// кнопка удержана
890
fullLowPass();
891
}
892
}
893
void
fullLowPass() {
894
digitalWrite(MLED_PIN, MLED_ON);
// включить светодиод
895
FastLED.setBrightness(0);
// погасить ленту
896
FastLED.clear();
// очистить массив пикселей
897
FastLED.show();
// отправить значения на ленту
898
delay(500);
// подождать чутка
899
autoLowPass();
// измерить шумы
900
delay(500);
// подождать
901
FastLED.setBrightness(BRIGHTNESS);
// вернуть яркость
902
digitalWrite(MLED_PIN, !MLED_ON);
// выключить светодиод
903
}
904
void
updateEEPROM() {
905
EEPROM.updateByte(1, this_mode);
906
EEPROM.updateByte(2, freq_strobe_mode);
907
EEPROM.updateByte(3, light_mode);
908
EEPROM.updateInt(4, RAINBOW_STEP);
909
EEPROM.updateFloat(8, MAX_COEF_FREQ);
910
EEPROM.updateInt(12, STROBE_PERIOD);
911
EEPROM.updateInt(16, LIGHT_SAT);
912
EEPROM.updateFloat(20, RAINBOW_STEP_2);
913
EEPROM.updateInt(24, HUE_START);
914
EEPROM.updateFloat(28, SMOOTH);
915
EEPROM.updateFloat(32, SMOOTH_FREQ);
916
EEPROM.updateInt(36, STROBE_SMOOTH);
917
EEPROM.updateInt(40, LIGHT_COLOR);
918
EEPROM.updateInt(44, COLOR_SPEED);
919
EEPROM.updateInt(48, RAINBOW_PERIOD);
920
EEPROM.updateInt(52, RUNNING_SPEED);
921
EEPROM.updateInt(56, HUE_STEP);
922
EEPROM.updateInt(60, EMPTY_BRIGHT);
923
if
(KEEP_STATE) EEPROM.updateByte(64, ONstate);
924
}
925
void
readEEPROM() {
926
this_mode = EEPROM.readByte(1);
927
freq_strobe_mode = EEPROM.readByte(2);
928
light_mode = EEPROM.readByte(3);
929
RAINBOW_STEP = EEPROM.readInt(4);
930
MAX_COEF_FREQ = EEPROM.readFloat(8);
931
STROBE_PERIOD = EEPROM.readInt(12);
932
LIGHT_SAT = EEPROM.readInt(16);
933
RAINBOW_STEP_2 = EEPROM.readFloat(20);
934
HUE_START = EEPROM.readInt(24);
935
SMOOTH = EEPROM.readFloat(28);
936
SMOOTH_FREQ = EEPROM.readFloat(32);
937
STROBE_SMOOTH = EEPROM.readInt(36);
938
LIGHT_COLOR = EEPROM.readInt(40);
939
COLOR_SPEED = EEPROM.readInt(44);
940
RAINBOW_PERIOD = EEPROM.readInt(48);
941
RUNNING_SPEED = EEPROM.readInt(52);
942
HUE_STEP = EEPROM.readInt(56);
943
EMPTY_BRIGHT = EEPROM.readInt(60);
944
if
(KEEP_STATE) ONstate = EEPROM.readByte(64);
945
}
946
void
eepromTick() {
947
if
(eeprom_flag)
948
if
(millis() - eeprom_timer > 30000) {
// 30 секунд после последнего нажатия с пульта
949
eeprom_flag =
false
;
950
eeprom_timer = millis();
951
updateEEPROM();
952
}
953
}
В скетче поправил под себя количество светодиодов и включил стерео.
Схему собрал эту, только у меня плата про мини
я б такой код выложивать пастиснялса бы.
я б такой код выложивать пастиснялса бы.
А здесь тебе дана основа,..... фундамент, так сказать. Дерзай! Отсеки лишнее, отдели зерна от плевел, создай свой шедевр. А потом не жадничай и подари людям. И скажут люди тебе "СПАСИБО", а может и не скажут..... но возможно потом зачтется всевышним :)
Схему собрал эту, только у меня плата про мини
А ничего, что у Pro Mini:
- нет выхода 3,3V
- нет выхода ARef на пин, как у Nano (20-й вывод Atmega328).
Как вы по вышеприведённой схеме собирали? Надо бы уже свою нарисовать? Сказал "А"...
А ничего, что у Pro Mini:
- нет выхода 3,3V
- нет выхода ARef на пин, как у Nano (20-й вывод Atmega328).
Как вы по вышеприведённой схеме собирали? Надо бы уже свою нарисовать? Сказал "А"...
Сейчас уже не помню как делал. Нашел мекетку с цветомузыкой. На фото через отверстие A0 проходит проводок, который припаян к конденсатору на плате. Это, видимо, и есть присоединение к ARef. А еще снизу платы распаян линейный стабилизатор AM (на 3.3 в). Здесь, видимо снимал 3.3 вольта. Макет цветомузыки в рабочем состоянии. Цветомузит за милую душу. Правда со времени изготовления совсем не использовал. Попробовал подключить к ней микрофон с микрофонным усилителем..., чтобы без проводов. Получилось. Но забросил в дальний ящик и забыл.
Резистор переменный, зачетный, лет двадцать таких не встречал.))))
Joiner, я прекрасно понял как вы сделали, по-этому и написал, что "схема" не та... да и вообще это не схема.

Сам делал по рисункам из того же источника, только ещё и с пультом. Самое "трудное" - корпус и алюминиевый профиль :)
Профиль обязательно, по скольку она может работать ещё и как лампа освещения (цвет произвольно настраивается с пульта)
Круто! Лайк!
А я свою так и не доделал до конца.
У меня все на макетах :)