A segítségeteket szeretném kérni. Egy audio spektrum analizátor építésébe fogtam egy 20x4-es lcd-vel, a kódot nem magamtól írtam mert annyira nem látom át a működését
include <fix_fft.h>
#define AUDIOPIN 1
#include <LiquidCrystal.h>
LiquidCrystal lcd(2, 4, 9, 10, 11, 12);
char im[128], data[128];
char data_avgs[14];
int i=0,val;
byte level0[8] = { 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b11111};
byte level1[8] = { 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b11111, 0b11111};
byte level2[8] = { 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b11111, 0b11111, 0b11111};
byte level3[8] = { 0b00000, 0b00000, 0b00000, 0b00000, 0b11111, 0b11111, 0b11111, 0b11111};
byte level4[8] = { 0b00000, 0b00000, 0b00000, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111};
byte level5[8] = { 0b00000, 0b00000, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111};
byte level6[8] = { 0b00000, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111};
byte level7[8] = { 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111};
void setup() {
lcd.begin(20, 4);
lcd.clear();
lcd.createChar(0,level0);
lcd.createChar(1,level1);
lcd.createChar(2,level2);
lcd.createChar(3,level3);
lcd.createChar(4,level4);
lcd.createChar(5,level5);
lcd.createChar(6,level6);
lcd.createChar(7,level7);
}
void loop() {
for (i=0; i < 128; i++){
val = 5000 * analogRead(AUDIOPIN); //shin: analog sig not detected from laptop audio out. scale to 5000
data = val;
im = 0;
};
fix_fft(data,im,7,0);
for (i=0; i< 64;i++){
data = sqrt(data * data + im * im); // this gets the absolute value of the values in the array, so we're only dealing with positive numbers
};
// average bars together
for (i=0; i<14; i++) {
data_avgs = data[i*4] + data[i*4 + 1] + data[i*4 + 2] + data[i*4 + 3]; // average together
data_avgs = map(data_avgs, 0, 30, 0, 7); // remap values for LoL
}
for (int x=0; x < 14; x++) {
for (int y=0; y < 7; y++) {
if (y < data_avgs[13-x]) { // 13-x reverses the bars so low to high frequences are represented from left to right.
lcd.setCursor(x,0);
lcd.write(y);
}
}
}}
