Код (C++): /* Крутейшая свето-цветомузыка на Arduino и адресной светодиодной ленте WS2812b Управление: - Однократное нажатие кнопки: смена режима - Удержание кнопки: калибровка нижнего порога шума Режимы работы (переключаются кнопкой): - VU meter (столбик громкости): от зелёного к красному - VU meter (столбик громкости): плавно бегущая радуга - Светомузыка по частотам: 5 полос симметрично - Светомузыка по частотам: 3 полосы - Светомузыка по частотам: 1 полоса Особенности: - Плавная анимация (можно настроить) - Автонастройка по громкости (можно настроить) - Фильтр нижнего шума (можно настроить) - Автокалибровка шума при запуске (можно настроить) - Поддержка стерео и моно звука (можно настроить) НАСТРОЙКА НИЖНЕГО ПОРОГА ШУМА (строки 65-71) - Ручная: выключаем AUTO_LOW_PASS и EEPROM_LOW_PASS, настраиваем LOW_PASS и SPEKTR_LOW_PASS вручную - При запуске: включаем AUTO_LOW_PASS. При подаче питания музыка должна стоять на паузе! - По кнопке: при удерживании кнопки 1 секунду настраивается нижний порог шума (музыку на паузу!) - Из памяти (ЛУЧШИЙ ВАРИАНТ): выключаем AUTO_LOW_PASS и включаем EEPROM_LOW_PASS - Включаем систему - Ставим музыку на паузу - Удерживаем кнопку 1 секунду Значения шумов будут записаны в память и САМИ загружаться при последующем запуске! Всё! ************************************************** Разработано: AlexGyver Страница проекта: http://alexgyver.ru/colormusic/ GitHub: https://github.com/AlexGyver/ColorMusic */ // --------------------------- НАСТРОЙКИ --------------------------- // лента #define NUM_LEDS 60 // количество светодиодов #define BRIGHTNESS 200 // яркость (0 - 255) // пины #define SOUND_R A2 // аналоговый пин вход аудио, правый канал #define SOUND_L A1 // аналоговый пин вход аудио, левый канал #define SOUND_R_FREQ A3 // аналоговый пин вход аудио для режима с частотами (через кондер) #define BTN_PIN 3 // кнопка переключения режимов (PIN --- КНОПКА --- GND) #define LED_PIN 12 // пин DI светодиодной ленты #define POT_GND A0 // пин земля для потенциометра // настройки радуги #define RAINBOW_SPEED 6 // скорость движения радуги (чем меньше число, тем быстрее радуга) #define RAINBOW_STEP 6 // шаг изменения цвета радуги // отрисовка #define MODE 0 // режим при запуске #define MAIN_LOOP 5 // период основного цикла отрисовки (по умолчанию 5) #define SMOOTH 0.5 // коэффициент плавности анимации VU (по умолчанию 0.5) #define SMOOTH_FREQ 0.8 // коэффициент плавности анимации частот (по умолчанию 0.8) #define MAX_COEF 1.8 // коэффициент громкости (максимальное равно срднему * этот коэф) (по умолчанию 1.8) #define MAX_COEF_FREQ 1.2 // коэффициент порога для "вспышки" цветомузыки (по умолчанию 1.5) // сигнал #define MONO 1 // 1 - только один канал (ПРАВЫЙ!!!!! SOUND_R!!!!!), 0 - два канала #define EXP 1.4 // степень усиления сигнала (для более "резкой" работы) (по умолчанию 1.4) #define POTENT 1 // 1 - используем потенциометр, 0 - используется внутренний источник опорного напряжения 1.1 В // нижний порог шумов int LOW_PASS = 100; // нижний порог шумов режим VU, ручная настройка int SPEKTR_LOW_PASS = 40; // нижний порог шумов режим спектра, ручная настройка #define AUTO_LOW_PASS 0 // разрешить настройку нижнего порога шумов при запуске (по умолч. 0) #define EEPROM_LOW_PASS 1 // порог шумов хранится в энергонезависимой памяти (по умолч. 1) #define LOW_PASS_ADD 13 // "добавочная" величина к нижнему порогу, для надёжности (режим VU) #define LOW_PASS_FREQ_ADD 3 // "добавочная" величина к нижнему порогу, для надёжности (режим частот) // режим цветомузыки #define SMOOTH_STEP 20 // шаг уменьшения яркости в режиме цветомузыки (чем больше, тем быстрее гаснет) #define LOW_COLOR HUE_RED // цвет низких частот #define MID_COLOR HUE_GREEN // цвет средних #define HIGH_COLOR HUE_YELLOW // цвет высоких // режим стробоскопа #define STROBE_PERIOD 100 // период вспышек, миллисекунды #define STROBE_DUTY 30 // скважность вспышек (1 - 99) - отношение времени вспышки ко времени темноты #define STROBE_COLOR HUE_YELLOW // цвет стробоскопа #define STROBE_SAT 0 // насыщенность. Если 0 - цвет будет БЕЛЫЙ при любом цвете (0 - 255) #define STROBE_SMOOTH 100 // скорость нарастания/угасания вспышки (0 - 255) /* Цвета для HSV HUE_RED HUE_ORANGE HUE_YELLOW HUE_GREEN HUE_AQUA HUE_BLUE HUE_PURPLE HUE_PINK */ // --------------------------- НАСТРОЙКИ --------------------------- // --------------------- ДЛЯ РАЗРАБОТЧИКОВ --------------------- #define MODE_AMOUNT 6 // количество режимов // цвета (устаревшие) #define BLUE 0x0000FF #define RED 0xFF0000 #define GREEN 0x00ff00 #define CYAN 0x00FFFF #define MAGENTA 0xFF00FF #define YELLOW 0xFFFF00 #define WHITE 0xFFFFFF #define BLACK 0x000000 #define STRIPE NUM_LEDS / 5 #define FHT_N 64 // ширина спектра х2 #define LOG_OUT 1 #include <FHT.h> // преобразование Хартли #include <EEPROMex.h> #include "FastLED.h" CRGB leds[NUM_LEDS]; #include "GyverButton.h" GButton butt1(BTN_PIN); // градиент-палитра от зелёного к красному DEFINE_GRADIENT_PALETTE(soundlevel_gp) { 0, 0, 255, 0, // green 100, 255, 255, 0, // yellow 150, 255, 100, 0, // orange 200, 255, 50, 0, // red 255, 255, 0, 0 // red }; CRGBPalette32 myPal = soundlevel_gp; byte Rlenght, Llenght; float RsoundLevel, RsoundLevel_f; float LsoundLevel, LsoundLevel_f; float averageLevel = 50; int maxLevel = 100; byte MAX_CH = NUM_LEDS / 2; int hue; unsigned long main_timer, hue_timer, strobe_timer; float averK = 0.006, k = SMOOTH, k_freq = SMOOTH_FREQ; byte count; float index = (float)255 / MAX_CH; // коэффициент перевода для палитры boolean lowFlag; byte low_pass; int RcurrentLevel, LcurrentLevel; int colorMusic[3]; float colorMusic_f[3], colorMusic_aver[3]; boolean colorMusicFlash[3], strobeUp_flag, strobeDwn_flag; byte this_mode = MODE; int thisBright[3], strobe_bright = 0; unsigned int light_time = STROBE_PERIOD * STROBE_DUTY / 100; #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) // --------------------- ДЛЯ РАЗРАБОТЧИКОВ --------------------- void setup() { Serial.begin(9600); FastLED.addLeds<WS2811, LED_PIN, GRB>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip ); FastLED.setBrightness(BRIGHTNESS); pinMode(13, OUTPUT); digitalWrite(13, LOW); pinMode(POT_GND, OUTPUT); digitalWrite(POT_GND, LOW); butt1.setTimeout(900); // для увеличения точности уменьшаем опорное напряжение, // выставив EXTERNAL и подключив Aref к выходу 3.3V на плате через делитель // GND ---[10-20 кОм] --- REF --- [10 кОм] --- 3V3 // в данной схеме GND берётся из А0 для удобства подключения if (POTENT) analogReference(EXTERNAL); else analogReference(INTERNAL); // жуткая магия, меняем частоту оцифровки до 18 кГц // команды на ебучем ассемблере, даже не спрашивайте, как это работает sbi(ADCSRA, ADPS2); cbi(ADCSRA, ADPS1); sbi(ADCSRA, ADPS0); ... код указан не полностью