diff --git a/firmware/GyverLamp2/GyverLamp2.ino b/firmware/GyverLamp2/GyverLamp2.ino index 0cacdc6..a61e714 100644 --- a/firmware/GyverLamp2/GyverLamp2.ino +++ b/firmware/GyverLamp2/GyverLamp2.ino @@ -1,7 +1,10 @@ /* + Версия 0.13b + Улучшена стабильность + Версия 0.12b Мелкие исправления - + Версия 0.11b Добавлен редактор палитр Исправлены мелкие баги в эффектах @@ -15,13 +18,12 @@ Добавлен рассвет TODO: - плавная смена режимов - Аккуратнее со светомузыкой! - 4 клика вкл выкл смену? + плавная смена режимов + 4 клика вкл выкл смену? Mqtt? - Базовый пак + Базовый пак Предложения Серёги крутского - Убрать аплод? + Убрать аплод? Огонь 2018/2020? Взять огонь отсюда https://community.alexgyver.ru/threads/wifi-lampa-budilnik-obsuzhdenie-proshivki-ot-gunner47.2418/page-72#post-33652 Вернуть искры @@ -68,7 +70,7 @@ const char AP_NameChar[] = "GyverLamp2"; const char WiFiPassword[] = "12345678"; // ------------ Прочее ------------- -#define GL_VERSION 012 // код версии прошивки +#define GL_VERSION 013 // код версии прошивки #define EE_TOUT 30000 // таймаут сохранения епром после изменения, мс //#define DEBUG_SERIAL // закомментируй чтобы выключить отладку (скорость 115200) #define EE_KEY 51 // ключ сброса WiFi (измени для сброса всех настроек) @@ -97,6 +99,7 @@ const char WiFiPassword[] = "12345678"; #include "timerMillis.h" // таймер миллис #include "VolAnalyzer.h" // анализатор громкости #include "FFT_C.h" // фурье +#define FASTLED_ALLOW_INTERRUPTS 0 #include // лента #include // базовая либа есп #include // общение по UDP diff --git a/firmware/GyverLamp2/analog.ino b/firmware/GyverLamp2/analog.ino index b7e7454..1b42358 100644 --- a/firmware/GyverLamp2/analog.ino +++ b/firmware/GyverLamp2/analog.ino @@ -25,6 +25,9 @@ void setupADC() { phot.setDt(80); phot.setK(31); + + if (cfg.adcMode == GL_ADC_BRI) switchToPhot(); + else if (cfg.adcMode == GL_ADC_MIC) switchToMic(); } @@ -52,23 +55,21 @@ void checkAnalog() { } void checkMusic() { - if (CUR_PRES.soundMode > 1) { - if (CUR_PRES.soundMode == GL_MUS_VOL) { // громкость - vol.tick(); - } else { // частоты - int raw[FFT_SIZE], spectr[FFT_SIZE]; - for (int i = 0; i < FFT_SIZE; i++) raw[i] = analogRead(A0); - FFT(raw, spectr); - int low_raw = 0; - int high_raw = 0; - for (int i = 0; i < FFT_SIZE / 2; i++) { - spectr[i] = (spectr[i] * (i + 2)) >> 1; - if (i < 2) low_raw += spectr[i]; - else high_raw += spectr[i]; - } - low.tick(low_raw); - high.tick(high_raw); + if (CUR_PRES.advMode == GL_ADV_VOL) { // громкость + vol.tick(); + } else if (CUR_PRES.advMode == GL_ADV_LOW || CUR_PRES.advMode == GL_ADV_HIGH) { // частоты + int raw[FFT_SIZE], spectr[FFT_SIZE]; + for (int i = 0; i < FFT_SIZE; i++) raw[i] = analogRead(A0); + FFT(raw, spectr); + int low_raw = 0; + int high_raw = 0; + for (int i = 0; i < FFT_SIZE / 2; i++) { + spectr[i] = (spectr[i] * (i + 2)) >> 1; + if (i < 2) low_raw += spectr[i]; + else high_raw += spectr[i]; } + low.tick(low_raw); + high.tick(high_raw); } } @@ -79,10 +80,10 @@ void checkPhot() { } byte getSoundVol() { - switch (CUR_PRES.soundMode) { - case GL_MUS_VOL: return vol.getVol(); - case GL_MUS_LOW: return low.getVol(); - case GL_MUS_HIGH: return high.getVol(); + switch (CUR_PRES.advMode) { + case GL_ADV_VOL: return vol.getVol(); + case GL_ADV_LOW: return low.getVol(); + case GL_ADV_HIGH: return high.getVol(); } return 0; } diff --git a/firmware/GyverLamp2/data.h b/firmware/GyverLamp2/data.h index a9638d2..77647db 100644 --- a/firmware/GyverLamp2/data.h +++ b/firmware/GyverLamp2/data.h @@ -6,10 +6,11 @@ #define GL_TYPE_STRIP 1 #define GL_TYPE_ZIG 2 #define GL_TYPE_PARAL 3 -#define GL_MUS_NONE 1 -#define GL_MUS_VOL 2 -#define GL_MUS_LOW 3 -#define GL_MUS_HIGH 4 +#define GL_ADV_NONE 1 +#define GL_ADV_VOL 2 +#define GL_ADV_LOW 3 +#define GL_ADV_HIGH 4 +#define GL_ADV_CLOCK 5 #define GL_REACT_BRI 1 #define GL_REACT_SCL 2 #define GL_REACT_LEN 3 @@ -100,7 +101,7 @@ struct Preset { byte effect = 1; // тип эффекта (1,2...) ВЫЧЕСТЬ 1 byte fadeBright = 0; // флаг на свою яркость (0/1) byte bright = 100; // своя яркость (0.. 255) - byte soundMode = 1; // тип звука (1,2...) ВЫЧЕСТЬ 1 + byte advMode = 1; // дополнительно (1,2...) ВЫЧЕСТЬ 1 byte soundReact = 1; // реакция на звук (1,2...) ВЫЧЕСТЬ 1 byte min = 0; // мин сигнал светомузыки (0.. 255) byte max = 0; // макс сигнал светомузыки (0.. 255) diff --git a/firmware/GyverLamp2/effects.ino b/firmware/GyverLamp2/effects.ino index b6b18f8..3091fd5 100644 --- a/firmware/GyverLamp2/effects.ino +++ b/firmware/GyverLamp2/effects.ino @@ -1,7 +1,7 @@ void effectsRoutine() { static timerMillis effTmr(30, true); static byte prevEff = 255; - + if (dawnTmr.running()) { if (effTmr.isReady()) { fill_solid(leds, MAX_LEDS, ColorFromPalette(HeatColors_p, dawnTmr.getLength8(), scaleFF(dawnTmr.getLength8(), dawn.bright), LINEARBLEND)); @@ -9,7 +9,7 @@ void effectsRoutine() { } if (dawnTmr.isReady()) dawnTmr.stop(); return; - } + } if (cfg.state && effTmr.isReady()) { int thisLength = getLength(); @@ -209,34 +209,37 @@ void effectsRoutine() { } } +bool musicMode() { + return ((cfg.adcMode == GL_ADC_MIC || cfg.adcMode == GL_ADC_BOTH) && (CUR_PRES.advMode > 1 && CUR_PRES.advMode <= 4)); +} + byte getBright() { - int maxBr = cfg.bright; + int maxBr = cfg.bright; // макс яркость из конфига byte fadeBr = 255; if (CUR_PRES.fadeBright) fadeBr = CUR_PRES.bright; // ограничен вручную - if (cfg.adcMode == GL_ADC_BRI || cfg.adcMode == GL_ADC_BOTH) { // ----> датчик света + if (cfg.adcMode == GL_ADC_BRI || cfg.adcMode == GL_ADC_BOTH) { // ----> датчик света или оба maxBr = constrain(phot.getFil(), cfg.minLight, cfg.maxLight); - maxBr = map(maxBr, cfg.minLight, cfg.maxLight, cfg.minBright, cfg.maxBright); - } else if (cfg.adcMode > 2 && // ----> ацп мик - CUR_PRES.soundMode > 1 && // светомузыка вкл - CUR_PRES.soundReact == GL_REACT_BRI) { // режим яркости - fadeBr = mapFF(getSoundVol(), CUR_PRES.min, CUR_PRES.max); + if (cfg.minLight != cfg.maxLight) + maxBr = map(maxBr, cfg.minLight, cfg.maxLight, cfg.minBright, cfg.maxBright); + } + if (musicMode() && // светомузыка вкл + CUR_PRES.soundReact == GL_REACT_BRI) { // режим яркости + fadeBr = mapFF(getSoundVol(), CUR_PRES.min, CUR_PRES.max); // громкость в 0-255 } return scaleFF(maxBr, fadeBr); } int getLength() { - if (cfg.adcMode > 2 // ацп мик - && CUR_PRES.soundMode > 1 // светомузыка вкл - && CUR_PRES.soundReact == GL_REACT_LEN // режим длины + if (musicMode() // светомузыка вкл + && CUR_PRES.soundReact == GL_REACT_LEN // режим длины ) return mapFF(getSoundVol(), 0, cfg.length); else return cfg.length; } byte getScale() { - if (cfg.adcMode > 2 // ацп мик - && CUR_PRES.soundMode > 1 // светомузыка вкл - && CUR_PRES.soundReact == GL_REACT_SCL // режим масштаба + if (musicMode() // светомузыка вкл + && CUR_PRES.soundReact == GL_REACT_SCL // режим масштаба ) return mapFF(getSoundVol(), CUR_PRES.min, CUR_PRES.max); else return CUR_PRES.scale; }