#include <FastLED.h>
#include "FFT.h"
#define WIDTH 32 //Ширина матрицы
#define HEIGHT 16 //Высота матрицы
#define LED_PIN 13 //Пин подключения матрицы на ардуино
#define BUTTON_PIN 3 //Пин подключения кнопки на ардуино
#define MIC_PIN A4 //Пин подключения микрофона на ардуино
#define BRT_PIN A0 //Пин подключения потенциометра на ардуино
#define NUM_LEDS (WIDTH * HEIGHT) //Общее количество светодиодов
char ALGORITHM = 1; //1 - Интерполяция
char MODE = 1; //Режим
char lenPush = 0; //Длина нажатия
CRGB leds[NUM_LEDS]; //Массив для светодиодов
unsigned char old_brightness = 0; //Яркость
long int coeff = 0; //Коэффициент выравнивания осцилограммы на матрице
void setup() {
FastLED.addLeds<WS2811, LED_PIN, GRB>(leds, NUM_LEDS);
FastLED.setBrightness(analogRead(BRT_PIN) * 0.25);
for (char i = 0; i < HEIGHT; i++) { //Очистка матрицы
for (char j = 0; j < WIDTH; j++) {
leds[XY(i, j)] = CRGB(0, 0, 0);
}
}
FastLED.show();
pinMode(BUTTON_PIN, INPUT_PULLUP);
pinMode(MIC_PIN, INPUT);
Serial.begin(9600);
for (char i = 0; i < 100; i++) { //Находим сумму первых 100 показаний
coeff += analogRead(MIC_PIN);
}
coeff = coeff / 100; //Определяем среднее значение
coeff = coeff / (1024 / HEIGHT); //Масштабируем среднее значение к высоте матрицы
coeff = HEIGHT / 2 - coeff; //Находим остаток до половины высоты матрицы
}
void Interpolation() {
char rise = round(analogRead(MIC_PIN) * (HEIGHT / 1024.0) + coeff);
if (rise > 15)
rise = 15;
char old_rise = -1;
for (char i = 0; i < HEIGHT; i++) {
if (leds[XY(i, 1)] == CRGB(0, 255, 0)) {
old_rise = i;
break;
}
}
if (old_rise = -1)
old_rise = rise;
char new_rise = 0;
if (rise < old_rise) {
if (abs(rise - old_rise) < HEIGHT / 6)
new_rise = old_rise - 1;
else if (abs(rise - old_rise) < HEIGHT / 3)
new_rise = old_rise - 2;
else
new_rise = old_rise - 3;
}
else if (rise == old_rise)
new_rise = old_rise;
else {
if (abs(rise - old_rise) < HEIGHT / 6)
new_rise = old_rise + 1;
else if (abs(rise - old_rise) < HEIGHT / 3)
new_rise = old_rise + 2;
else
new_rise = old_rise + 3;
}
leds[XY(new_rise, 0)] = CRGB(0, 255, 0);
if (MODE == 2) {
for (char i = 0; i < new_rise; i++)
leds[XY(i, 0)] = CRGB(0, 255, 0);
}
}
void FFT() {
FFT(data, 64, 100);
for (char i = 0; i < 5; i++)
Serial.println(f_peaks[i]);
//leds[XY(f_peaks[i], i)] = CRGB(0, 255, 0);
}
int XY(char x, char y) { //Функция преобразования координат
//Для wokwi
if (y < 16)
return ((16 - x) * 16 - (16 - y));
else
return ((16 - x) * 16 - (16 - y)) + 16 * 15;
//Для реальной матрицы
/*if (y % 2 == 0)
return (y * HEIGHT + (HEIGHT - x - 1));
return (y * HEIGHT + x);*/
}
void NewBrightness() { //Изменение яркости
unsigned char new_brightness = analogRead(BRT_PIN) * 0.25;
if (abs(new_brightness - old_brightness) > 3) {
FastLED.setBrightness(new_brightness);
old_brightness = new_brightness;
FastLED.show();
}
}
void SetNextAlgorithm() { //Смена алгоритма
for (char i = 0; i < HEIGHT; i++) {
for (char j = 0; j < WIDTH; j++) {
leds[XY(i, j)] = CRGB::Black;
}
}
if (ALGORITHM == 1)
ALGORITHM = 2;
else if (ALGORITHM == 2)
ALGORITHM = 3;
else if (ALGORITHM == 3) {
ALGORITHM = 1;
}
}
void SetNextMode() { //Смена режима
for (char i = 0; i < HEIGHT; i++) {
for (char j = 0; j < WIDTH; j++) {
leds[XY(i, j)] = CRGB::Black;
}
}
if (MODE == 1) {
MODE = 2;
}
else if (MODE == 2) {
MODE = 1;
}
}
void loop() {
if (digitalRead(BUTTON_PIN) == LOW)
lenPush += 1;
else if (digitalRead(BUTTON_PIN) != LOW && lenPush != 0) {
if (lenPush < 10)
SetNextMode();
else
SetNextAlgorithm();
lenPush = 0;
}
NewBrightness();
for (char i = 0; i < HEIGHT; i++) { //Сдвиг матрицы вправо
for (char j = WIDTH - 1; j != 0; j--) {
leds[XY(i, j)] = leds[XY(i, j - 1)];
leds[XY(i, j - 1)] = CRGB(0, 0, 0);
}
}
if (ALGORITHM == 1)
Interpolation();
else if (ALGORITHM == 1)
FFT();
//leds[XY(rise, 0)] = CRGB(0, 255, 0);
FastLED.show();
//delay(10);
}