// Подключаем библиотеку FFT.
#include "fix_fft.h"
// Подключаем библиотеку FastLED.
#include "FastLED.h"
#define DEBUG_MODE 1 //Режим отладки 1 (вкл) 0 (выкл)
#define LED_TYPE WS2812B /* I assume you have WS2812B leds, if not just change it to whatever you have */
#define BRIGHTNESS 255 /* Control the brightness of your leds */
#define SATURATION 255 /* Control the saturation of your leds */
// Указываем, какое количество пикселей у нашей ленты.
#define NUM_LEDS 60 // Параметр 1 - Количество пикселей в ленте.
// Указываем, к какому порту подключен вход ленты DIN.
#define PIN_NUM 12 // Параметр 2 - Порт, к которому подключена лента.
// Параметр 3 - Дополнительные флаги (по мере необходимости):
// - NEO_KHZ800 – Передача данных на частоте 800 кГц (для продуктов и лент на светодиодах WS2812).
// - NEO_KHZ400 – Передача данных на частоте 400 кГц (для продуктов и лент на светодиодах WS2811)
// - NEO_GRB – Последовательность цветов при передаче данных (Зеленый, Красный, Синий).
// - NEO_RGB – Последовательность цветов при передаче данных (Красный, Зеленый, Синий).
// - и т.д.
// Создаём массив цветов, он имеет тип данных CRGB
CRGB leds[NUM_LEDS];
/*
Цвета для | CHSV | HSV
Red | 0 | HUE_RED
Orange | 32 | HUE_ORANGE
Yellow | 64 | HUE_YELLOW
Green | 96 | HUE_GREEN
Aqua | 128 | HUE_AQUA
Blue | 160 | HUE_BLUE
Purple | 192 | HUE_PURPLE
Pink | 224 | HUE_PINK
*/
//has to be uint8_t so it starts at 0 after it reached 256
uint8_t hue = 0;
// display set up, bar, line position L & R
#define LINEY 50
#define LINEXL 0
#define LINEXR 128
#define SAMPLES 128
#define AUDIO A0
int8_t im[SAMPLES];
int8_t data[SAMPLES];
int barht[SAMPLES];
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
void setup()
{
sbi(ADCSRA, ADPS2); //Биту ADPS2 присваиваем единицу
cbi(ADCSRA, ADPS1); //Битам ADPS1 и ADPS0 присваиваем нули
cbi(ADCSRA, ADPS0);
FastLED.addLeds<LED_TYPE, PIN_NUM, GRB>(leds, NUM_LEDS);
FastLED.setBrightness(BRIGHTNESS);
Serial.begin(9600);
pinMode(11, OUTPUT);
}
void loop()
{
static int i, j;
int audio_sample;
// get audio data
for(i = 0; i < SAMPLES; i++)
{
audio_sample = analogRead(AUDIO); // 0-1023
Serial.println(audio_sample);
data[i] = abs(audio_sample/4 - 128); // store as char
im[i] = 0; // init all as 0
}
// run FFT
fix_fft(data, im, 7, 0);
// extract absolute value of data only, for 64 results
for(i = 0; i < SAMPLES/2; i++)
{
barht[i] = (int)sqrt(data[i] * data[i] + im[i] * im[i]);
//Serial.print(F("barht[i] : ")); Serial.println(barht[i]);
}
for(i = 0, j = 0; i < SAMPLES/2; i++, j += 2)
{
barht[i] = barht[j] + barht[j + 1];
//Serial.print(F("barht[i] : ")); Serial.println(barht[i]);
}
// display barchart
barchart(SAMPLES/4, barht); // plot SAMPLES / 4 = 32 as barchart gen cannot handle 128 bars
//FastLED.show();
}
// plot line and bar at position and height
void barchart(int n, int bh[])
{
int i, s, w; // bars, spacing and width
s = (LINEXR - LINEXL) / n;
w = s / 2;
/*Serial.print(F("s : "));
Serial.print(s);
Serial.print(F("| w : "));
Serial.print(w);
Serial.print(F("| n : "));
Serial.println(n);*/
/*
lcd.drawStr(20, 10, "FFT Audio Spectrum");
lcd.drawLine(LINEXL, LINEY, LINEXR, LINEY);
lcd.drawStr(0, LINEY + 10, "0");
lcd.drawStr(29, LINEY + 10, "1k");
lcd.drawStr(59, LINEY + 10, "2k");
lcd.drawStr(91, LINEY + 10, "3k");
lcd.drawStr(115, LINEY + 10, "Hz");
*/
for(i = 0; i < n; i++)
{
if(bh[i]>2)
{
leds[i] = CHSV(194, 0, 255);
}
else
{
leds[i] = CHSV(194, 0, 0);
}
/*Serial.print(F(" | i : "));
Serial.print(i);*/
/*Serial.print(F(" | LINEXL + s * i : "));
Serial.print(LINEXL + s * i);
Serial.print(F(" | LINEY - bh[i] : "));
Serial.print(LINEY - bh[i]);
Serial.print(F(" | w : "));
Serial.print(w); */
/*Serial.print(F(" | bh[i] + 1 : "));
Serial.println(bh[i] + 1);*/
//lcd.drawBox(LINEXL + s * i, LINEY - bh[i], w, bh[i] + 1);
// x и y – координаты левого верхнего угла
// w – ширина (по х) прямоугольника
// h – высота (по у) прямоугольника
}
}