// Equalizer teszt program
#include < TimerOne.h > // Timer konyvtar
int dataPin = 11; //74HC595 Data 11-re kotve
int clockPin = 12; //74HC595 Clock Pin 12-re kotve
int latchPin = 13; //74HC595 Latch Pin 13-ra kotve
byte led[8]; // // a megjelenitendo adatokat tarolo tomb
int strobe = 4; //STROBE lab Pin4-re kotve
int res = 5; // RESET lab Pin5-re kotve
int audioAnalog = 5; // MSGEQ7 analog 5 pin-re kotve (A5)
int spektrum[7]; // a mert audiospektrumot eltarolo tomb
int jelMax[7];
int hatarertek[7];
int csatorna;
void setup()
{
pinMode(res, OUTPUT); // RESET lab kimenet
pinMode(strobe, OUTPUT); // STROBE lab kimenet
digitalWrite(res,LOW);
digitalWrite(strobe,HIGH);
pinMode(latchPin, OUTPUT); // Latch lab kimenet
pinMode(clockPin, OUTPUT); // Clock lab kimenet
pinMode(dataPin, OUTPUT); // Data lab kimenet
led[7] = B00000000;
jelMax[0] = 0;
jelMax[1] = 0;
jelMax[2] = 0;
jelMax[3] = 0;
jelMax[4] = 0;
jelMax[5] = 0;
jelMax[6] = 0;
hatarertek[0] = 50;
hatarertek[1] = 60;
hatarertek[2] = 60;
hatarertek[3] = 65;
hatarertek[4] = 70;
hatarertek[5] = 70;
hatarertek[6] = 80;
// 10000 microszekundum (1/100-ad masodperc) hosszusagu Timer interrupt
Timer1.initialize(10000);
// interrupt eseten a kijelzo frissito fuggveny meghivasa
Timer1.attachInterrupt(kijelzoFrissites);
}
void loop()
{
MSGEQ7meres();
for (csatorna = 0; csatorna < 7; csatorna++)
{
if (spektrum[csatorna] - hatarertek[csatorna] < (jelMax[csatorna]-hatarertek[csatorna])/8)
{
led[csatorna] = B10000000;
}
else if (spektrum[csatorna] - hatarertek[csatorna] < ((jelMax[csatorna]-hatarertek[csatorna])*2/8))
{
led[csatorna] = B11000000;
}
else if (spektrum[csatorna] - hatarertek[csatorna] < ((jelMax[csatorna]-hatarertek[csatorna])*3/8))
{
led[csatorna] = B11100000;
}
else if (spektrum[csatorna] - hatarertek[csatorna] < ((jelMax[csatorna]-hatarertek[csatorna])*4/8))
{
led[csatorna] = B11110000;
}
else if (spektrum[csatorna] - hatarertek[csatorna] < ((jelMax[csatorna]-hatarertek[csatorna])*5/8))
{
led[csatorna] = B11111000;
}
else if (spektrum[csatorna] - hatarertek[csatorna] < ((jelMax[csatorna]-hatarertek[csatorna])*6/8))
{
led[csatorna] = B11111100;
}
else if (spektrum[csatorna] - hatarertek[csatorna] < ((jelMax[csatorna]-hatarertek[csatorna])*7/8))
{
led[csatorna] = B11111110;
}
else led[csatorna] = B11111111;
}
delay(25);
}
void kijelzoFrissites()
{
byte row = B00000001; // kezdes az elso sorral
for (byte k = 0; k < 9; k++)
{
digitalWrite(latchPin, LOW);
shiftIt(led[k] ); // oszlopokra meno jel kikuldese
shiftIt(row ); // sorokra meno jel kikuldese
digitalWrite(latchPin, HIGH); // latch jel kikuldese
row = row << 1; // kovetkezo sorra ugras
}
}
//szoftveres SPI (8 bit kuldese, LSB eloszor)
void shiftIt(byte dataOut)
{
boolean pinState;
digitalWrite(dataPin, LOW);
for (int i=0; i < 8; i++)
{
digitalWrite(clockPin, LOW);
if ( dataOut & (1 << i) )
{
pinState = HIGH;
}
else
{
pinState = LOW;
}
digitalWrite(dataPin, pinState);
digitalWrite(clockPin, HIGH);
digitalWrite(dataPin, LOW);
}
digitalWrite(clockPin, LOW);
}
void MSGEQ7meres()
{
digitalWrite(res, HIGH);
digitalWrite(res, LOW);
for(csatorna=0; csatorna < 7; csatorna++)
{
digitalWrite(strobe,LOW); // strobe pin alacsony-kovetkezo frekv.savra valtas
delayMicroseconds(30);
spektrum[csatorna] = analogRead(audioAnalog); // mert ertek eltarolasa a tombbe
digitalWrite(strobe,HIGH);
if (spektrum[csatorna] < hatarertek[csatorna])
{
spektrum[csatorna] = 0;
}
if (spektrum[csatorna] > jelMax[csatorna])
{
jelMax[csatorna] = spektrum[csatorna];
}
}
}