Hi!
I have found this code, and i test it. It works great. http://fritzing.org/media/fritzing-repo/projects/a/arduino-psychedelic-light-organ/code/OrganoLuces.ino
I want to modify that to 6 channels, so i modified it.
#include <fix_fft.h>
#define MUESTRAS 128
#define LOGM 7
#define BAJOS_MEDIOSA 7
#define MEDIOSA_MEDIOS 18
#define MEDIOS_AGUDOS 25
#define AGUDOS_AGUDOSA 30
#define AGUDOSA_AGUDOSAA 35
#define BPIN 3
#define BPINA 5
#define MPIN 6
#define MPINA 11
#define APIN 10
#define APINA 9
#define MAX_PASADAS 10
char data[MUESTRAS];
char im[MUESTRAS];
unsigned char salida[MUESTRAS/2];
unsigned char bajos, bajosa,medios, mediosa, agudos , agudosa;
byte pasada,
acumBajos, acumBajosa,acumMedios,acumMediosa,acumAgudos,acumAgudosa,
limBajos, limBajosa,limMedios,limMediosa,limAgudos,limAgudosa;
void aplicaVentana (char *vData) {
double muestrasMenosUno = (double(MUESTRAS) - 1.0);
for (uint8_t i = 0; i < MUESTRAS/2 ; i++) {
double indiceMenosUno = double(i);
double ratio = (indiceMenosUno / muestrasMenosUno);
double factorPeso = 0.5 * (1.0 - cos(6.28 * ratio));
vData[i] *= factorPeso;
vData[MUESTRAS - (i + 1)] *= factorPeso;
}
}
void setup() {
bitWrite(ADCSRA,ADPS2,1);
bitWrite(ADCSRA,ADPS1,0);
bitWrite(ADCSRA,ADPS0,1);
analogReference(INTERNAL);
pinMode(BPIN,OUTPUT);
pinMode(BPINA,OUTPUT);
pinMode(MPIN,OUTPUT);
pinMode(MPINA,OUTPUT);
pinMode(APIN,OUTPUT);
pinMode(APINA,OUTPUT);
pasada = 0;
acumBajos = acumBajosa = acumMedios = acumMediosa = acumAgudos = acumAgudosa = 0;
limBajos = limBajosa = limMedios = limMediosa = limAgudos = limAgudosa = 50;
}
void loop() {
for( int i=0; i < MUESTRAS; i++) {
data[i] = analogRead(0)/4 -128;
im[i] = 0;
}
aplicaVentana (data);
fix_fft(data,im,LOGM,0);
for (int i=0; i < MUESTRAS/2; i++){
salida[i] = data[i] * data[i] + im[i] * im[i];
}
bajos = 0;
for (int i=2; i < BAJOS_MEDIOSA; i++){
bajos += salida[i];
}
bajos = bajos/2;
bajosa = 0;
for (int i=BAJOS_MEDIOSA; i<MEDIOSA_MEDIOS; i++){
bajosa += salida[i];
}
bajosa = bajosa/2;
medios = 0;
for (int i=MEDIOSA_MEDIOS ; i < MEDIOS_AGUDOS; i++){
medios += salida[i];
}
medios = medios/2;
mediosa = 0;
for(int i=MEDIOS_AGUDOS; i < AGUDOS_AGUDOSA;i++){
mediosa += salida[i];
}
mediosa = mediosa/2;
agudos = 0;
for (int i=AGUDOS_AGUDOSA; i < AGUDOSA_AGUDOSAA;i++){
agudos += salida[i];
}
agudos = agudos/2;
agudosa =0;
for(int i = AGUDOSA_AGUDOSAA; i<i < MUESTRAS/2; i++){
agudosa += salida[i];
}
agudosa = agudosa/2;
int siBajos = bajos > limBajos;
int siBajosa = bajosa > limBajosa;
int siMedios = medios > limMedios;
int siMediosa = mediosa > limMediosa;
int siAgudos = agudos > limAgudos;
int siAgudosa = agudosa > limAgudosa;
digitalWrite(BPIN,siBajos ? HIGH : LOW);
digitalWrite(BPINA,siBajosa ? HIGH : LOW);
digitalWrite(MPIN,siMedios? HIGH : LOW);
digitalWrite(MPINA,siMediosa? HIGH : LOW);
digitalWrite(APIN,siAgudos? HIGH : LOW);
digitalWrite(APINA,siAgudosa? HIGH : LOW);
acumBajos += siBajos;
acumBajosa += siBajosa;
acumMedios += siMedios;
acumMediosa += siMediosa;
acumAgudos += siAgudos;
acumAgudosa += siAgudosa;
if ( ++pasada > MAX_PASADAS ) {
pasada = 0;
limBajos = 20 + acumBajos*5;
limBajosa = 20 + acumBajosa*5;
limMedios = 20 + acumMedios*5;
limMediosa = 20 + acumMediosa*5;
limAgudos = 20 + acumAgudos*5;
limAgudosa = 20 + acumAgudosa*5;
acumBajos = 0;
acumBajosa = 0;
acumMedios = 0;
acumMediosa = 0;
acumAgudos = 0;
acumAgudosa = 0;
}
}
No erros, but circuit do not work. Where is the mistake?
Thank you.