// бегущие частицы 1D, версия с FastLED
#define STRIP_PIN 2 // пин ленты
#define SOUND_PIN A0 // пин звука
#define COLOR_STEP 151 // шаг цвета, интересные 151, 129
#define COLOR_STEP2 129 // шаг цвета, интересные 151, 129
#define LEDS_AM 120 // количество светодиодов
#define P_SPEED 2 // скорость движения
#include <FastLED.h>
CRGB leds[LEDS_AM];
#include <VolAnalyzer.h>
VolAnalyzer sound(SOUND_PIN);
byte curColor = 0; // текущий цвет
int buttonPin = 3; //Пин кнопки
bool btnClick = false;
uint32_t btnTimer = 0;
byte modeCount = 3; //количество режимов указаного юзером отсчет от 0
// Массив цветов
int RGBarr[] = {CRGB::AliceBlue, CRGB::SeaGreen,
CRGB::Blue, CRGB::Amethyst, CRGB::Red,
CRGB::Yellow
};
//Переменная для рамера массива
int count;
// переменная для рандома
long randNum ;
void setup() {
Serial.begin(115200);
FastLED.addLeds<WS2812, STRIP_PIN, GRB>(leds, LEDS_AM);
FastLED.setBrightness(255);
// настройки анализатора звука
sound.setVolK(15); // снизим фильтрацию громкости (макс. 31)
sound.setVolMax(255); // выход громкости 0-255
sound.setPulseMax(200); // сигнал пульса
sound.setPulseMin(10); // перезагрузка пульса
pinMode(buttonPin, INPUT); //режим ввода для кнопки
//Определение размера массива
count = sizeof(RGBarr) / sizeof(RGBarr[0]);
}
void func(int size, byte *arr);
void loop() {
bool state = !digitalRead(buttonPin);
static byte mode = 0; //Переменая для выбранного режима
//обработка нажатия на кнопку для смены режима
if (state && !btnClick && millis() - btnTimer > 100) {
btnClick = true;
btnTimer = millis();
Serial.println("btn click");
if (++mode >= modeCount) mode = 0; //
Serial.print("mode "); Serial.println(mode);
}
if (!state && btnClick && millis() - btnTimer > 100) {
btnClick = false;
btnTimer = millis();
}
if (sound.tick()) { // если анализ звука завершён (~10мс)
switch (mode) {
//режим пробега по матрице с шагом цвета 151
case 0: {
// перематываем массив светодиодов на P_SPEED вправо
for (int k = 0; k < P_SPEED; k++) {
for (int i = LEDS_AM - 1; i > 0; i--) leds[i] = leds[i - 1];
}
// резкий звук - меняем цвет
if (sound.pulse()) curColor += COLOR_STEP;
// берём текущий цвет с яркостью по громкости (0-255)
CRGB color = CHSV(curColor, 255, sound.getVol());
// красим P_SPEED первых светодиодов
for (int i = 0; i < P_SPEED; i++) leds[i] = color;
// выводим
// FastLED.show();
break;
}
//режим пробега по матрице с шагом цвета 129
case 1: {
// перематываем массив светодиодов на P_SPEED вправо
for (int k = 0; k < P_SPEED; k++) {
for (int i = LEDS_AM - 1; i > 0; i--) leds[i] = leds[i - 1];
}
// резкий звук - меняем цвет
if (sound.pulse()) curColor += COLOR_STEP2;
// берём текущий цвет с яркостью по громкости (0-255)
CRGB color = CHSV(curColor, 255, sound.getVol());
// красим P_SPEED первых светодиодов
for (int i = 0; i < P_SPEED; i++) leds[i] = color;
// выводим
// FastLED.show();
break;
}
//Режим смены цветов по всей ленте
case 2: {
int row = sound.getRaw();
randNum = random(count);
FastLED.setBrightness(255);
for (int k = 0; k < LEDS_AM; k++) {
for (int i = LEDS_AM - 1; i > 0; i--) leds[i] = leds[i - 1];
}
if (row > 255) {
row = 255;
}
if (sound.pulse())
{
curColor = RGBarr[randNum];
Serial.println("Change color");
}
if (row > 10)
{
//Serial.println(row);
CRGB color = CHSV(curColor, row, sound.getVol());
for (int i = 0; i < LEDS_AM; i++)
{ leds[i] = color;
if (i == LEDS_AM) { // выходим из цикла если есть сигнал с датчика
break;
}
}
}
//else if (row<10){FastLED.clear();}
break;
}
}
FastLED.show();
}
}