You are on page 1of 24

// include the library code:

#include <LiquidCrystal.h>
#include <EEPROM.h>

// initialize the library with the numbers of the interface pins


//LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
//LiquidCrystal lcd(10, 9, 8, 7, 6, 5);
LiquidCrystal lcd(11, 10, 9, 8, 7, 6);

// Pin Config
const int CE = 2; // CE pin
const int DI = 3; // DI pin
const int CL = 4; // CL pin
const int LED = 13; //
const int mode_sw = 5; // mode
const int up_sw = 12; // up
const int down_sw = 13; // down
const int inR = 0;
const int inL = 1;
#define encoder0PinA 2
#define encoder0PinB 4
#define idle 0
#define vol_adj 1
#define bass_adj 3
#define treble_adj 4
#define select_input 5
#define inputgain 6
/****** LCD Custom *******/
byte smiley[8] = {
B00000,
B10001,
B00000,
B00000,
B10001,
B01110,
B00000,
};
byte bar0[8] = {
B00000,
B00000,
B00000,
B00000,
B00000,
B00000,
B00000,
B11111,
};
byte bar1[8] = {
B00000,
B00000,
B00000,
B00000,
B00000,
B00000,
B11111,
B11111,
};
byte bar2[8] = {
B00000,
B00000,
B00000,
B00000,
B00000,
B11111,
B11111,
B11111,
};
byte bar3[8] = {
B00000,
B00000,
B00000,
B00000,
B11111,
B11111,
B11111,
B11111,
};
byte bar4[8] = {
B00000,
B00000,
B00000,
B11111,
B11111,
B11111,
B11111,
B11111,
};
byte bar5[8] = {
B00000,
B00000,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
};
byte bar6[8] = {
B00000,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
};
byte bar7[8] = {
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
};

/******************************/
long dataset[32];
unsigned char addr = 130;
int xy = 0;
int modebuttonState = 0;
int upbuttonState = 0;
int downbuttonState = 0;
int n = LOW;
int encoder0PinALast = LOW;
int debounce_ctr = 0;
int reset_ctr = 0;
int spec1 = 0;
int spec2 = 1;
int spec3 = 3;
int spec4 = 4;
int spec5 = 5;
int spec6 = 6;
int spec7 = 7;
int spec8 = 6;
int spec9 = 5;
int spec10 = 4;
int spec11 = 3;
int spec12 = 2;
int spec13 = 1;
int spec14 = 2;
int spec15 = 3;
int spec16 = 4;
int treble_ctr = 5;
int treble_eq1 = 0;
int treble_eq2 = 0;
int treble_eq3 = 0;

int L_level = 0;
int R_level = 0;

// set
int bass_level = 10; // 0 - 10
int treble_level = 5; //-5 - +5
//treble_ctr = 5;
int input = 1; //1-4
int input_gain = 0;
int RL = 3;
int vol = 0; //0 to 80

int mode = idle;


bool up = false;
bool down = false;

void setup() {
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);

// Print a message to the LCD.


lcd.print("Terry Glenn");
pinMode(CE, OUTPUT);
pinMode(DI, OUTPUT);
pinMode(CL, OUTPUT);
pinMode(LED, OUTPUT);
pinMode(mode_sw, INPUT);
pinMode(up_sw, INPUT);
pinMode(down_sw, INPUT);
pinMode(A0, INPUT);
pinMode(A1, INPUT);
delay(1000);
lcd.createChar(0, bar0);
lcd.createChar(1, bar1);
lcd.createChar(2, bar2);
lcd.createChar(3, bar3);
lcd.createChar(4, bar4);
lcd.createChar(5, bar5);
lcd.createChar(6, bar6);
lcd.createChar(7, bar7);

lcd.setCursor(0, 0);
//lcd.write(byte(0));
//lcd.print("home ");
display_input();
modebuttonState = false;
input_select(input);
SetGain(input_gain);
SetVolume(vol);
SetTreble(treble_level);
SetBass(bass_level);
SelectCh(RL);

dataset_init();
sendcommand();
}
//////////////////////////////////////////////////////////////
void loop() {
if (mode != idle)
{
reset_ctr++;
delay(1);
if(reset_ctr > 3000)
{
reset_ctr = 0;
mode = idle;
lcd.clear();
display_input();
}
}
//modebuttonState = digitalRead(mode_sw);
debounce:
if(digitalRead(mode_sw))
{
delay(1);
reset_ctr = 0;
debounce_ctr++;
if(debounce_ctr > 150)
{
debounce_ctr = 0;
modebuttonState = true;
} else {
goto debounce;
}
}

n = digitalRead(up_sw);
if ((encoder0PinALast == LOW) && (n == HIGH)) {
if (digitalRead(down_sw) == LOW) {
//xy++;
up = true;
reset_ctr = 0;
// delay(1);
} else {
//xy--;
down = true;
reset_ctr = 0;
//delay(1);
}
}
encoder0PinALast = n;
///////////////////////////// STATES
switch (mode) {
case idle: // ********************* HOME
spectrum();
if (modebuttonState || up || down)
{
mode = vol_adj;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Volume: ");
if(vol!=0)
{
lcd.print("-");
}
lcd.print(vol);
lcd.print("dB ");
showlevel((80-vol)/10);
modebuttonState = false;
}

break;
case vol_adj: // ************ Volume adjust
if (modebuttonState)
{
mode = bass_adj;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Bass: ");
//lcd.setCursor(0, 1);
lcd.print(bass_level * 2);
lcd.print("dB ");
display_eq();
modebuttonState = false;
}
if(up)
{
vol--;
if(vol < 1)
{
vol = 0;
}
//lcd.setCursor(0, 1);
// lcd.print(" ");
// lcd.setCursor(0, 1);
lcd.setCursor(0, 0);
lcd.print("Volume: ");
if(vol!=0)
{
lcd.print("-");
}
lcd.print(vol);
lcd.print("dB ");
showlevel((80-vol)/10);
up = false;
SetVolume(vol);
sendcommand();
} else
if(down)
{
vol++;
if(vol > 80)
{
vol = 80;
}
//lcd.setCursor(0, 1);
//lcd.print(" ");
//lcd.setCursor(0, 1);
lcd.setCursor(0, 0);
lcd.print("Volume: ");
if(vol!=0)
{
lcd.print("-");
}
lcd.print(vol);
lcd.print("dB ");
showlevel((80-vol)/10);
down = false;
SetVolume(vol);
sendcommand();
}

break;
case bass_adj: // *********************** BASS
if (modebuttonState)
{
mode = treble_adj;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Treble: ");
//lcd.setCursor(0, 1);
lcd.print(treble_ctr * 2);
lcd.print("dB ");
display_eq();
modebuttonState = false;
}
if(up)
{
bass_level++;
if(bass_level > 10)
{
bass_level = 10;
}
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Bass: ");
//lcd.setCursor(0, 1);
lcd.print(bass_level * 2);
lcd.print("dB ");
display_eq();
//lcd.setCursor(0, 1);
//lcd.print(" ");
//lcd.setCursor(0, 1);
//lcd.print(bass_level * 2);
//lcd.print("dB ");
up = false;
SetBass(bass_level);
sendcommand();
} else
if(down)
{
bass_level--;
if(bass_level < 1)
{
bass_level = 0;
}
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Bass: ");
//lcd.setCursor(0, 1);
lcd.print(bass_level * 2);
lcd.print("dB ");
display_eq();
//lcd.setCursor(0, 1);
//lcd.print(" ");
//lcd.setCursor(0, 1);
//lcd.print(bass_level * 2);
//lcd.print("dB");
down = false;
SetBass(bass_level);
sendcommand();
}

break;
case treble_adj: // *********************** TREBLE
if (modebuttonState)
{
mode = select_input;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Select Mode: ");
//lcd.setCursor(0, 1);
//lcd.print(" ");
lcd.setCursor(0, 1);
display_input();
modebuttonState = false;
convert_treble_level();
SetTreble(treble_level);
//sendcommand();
}
if(up)
{
treble_ctr++;
if(treble_ctr > 5)
{
treble_ctr = 5;
}
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Treble: ");
//lcd.setCursor(0, 1);
lcd.print(treble_ctr * 2);
lcd.print("dB ");
display_eq();
//lcd.setCursor(0, 1);
//lcd.print(" ");
//lcd.setCursor(0, 1);
//lcd.print(treble_ctr * 2);
//lcd.print("dB");
up = false;
convert_treble_level();
SetTreble(treble_level);
sendcommand();
} else
if(down)
{
treble_ctr--;
if(treble_ctr < -5)
{
treble_ctr = -5;
}
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Treble: ");
//lcd.setCursor(0, 1);
lcd.print(treble_ctr * 2);
lcd.print("dB ");
display_eq();
//lcd.setCursor(0, 1);
//lcd.print(" ");
//lcd.setCursor(0, 1);
//lcd.print(treble_ctr * 2);
//lcd.print("dB");
down = false;
convert_treble_level();
SetTreble(treble_level);
sendcommand();
}

break;
case select_input: // *********************** SELECT INPUT
if (modebuttonState)
{
mode = inputgain;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Input Gain: ");
lcd.setCursor(0, 1);
lcd.print(input_gain * 2);
lcd.print("dB");
modebuttonState = false;
}
if(up)
{
input++;
if(input > 4)
{
input = 1;
}
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(0, 1);
display_input();
up = false;
input_select(input);
sendcommand();
} else
if(down)
{
input--;
if(input < 1)
{
input = 4;
}
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(0, 1);
display_input();
down = false;
input_select(input);
sendcommand();
}

break;
case inputgain: // *********************** INPUT GAIN
if (modebuttonState)
{
mode = idle;
lcd.clear();
lcd.setCursor(0, 0);
display_input();
//lcd.setCursor(0, 0);
//lcd.print("Home ");
modebuttonState = false;
}
if(up)
{
input_gain++;
if(input_gain > 15)
{
input_gain = 15;
}
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print(input_gain * 2);
lcd.print("dB");
up = false;
SetGain(input_gain);
sendcommand();
} else
if(down)
{
input_gain--;
if(input_gain < 1)
{
input_gain = 0;
}
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print(input_gain * 2);
lcd.print("dB");
down = false;
SetGain(input_gain);
sendcommand();
}

break;

void read_analog(void)
{
L_level = analogRead(A0);
R_level = analogRead(A1);
}

void display_eq(void)
{
treble_eq1 = treble_ctr+3;
if(treble_eq1 < 0)
{
treble_eq1 = 0;
}
if(treble_eq1 > 7)
{
treble_eq1 = 7;
}

if(treble_eq1 > 6)
{
treble_eq2 = 6;
treble_eq3 = 5;
} else
if(treble_eq1 > 5)
{
treble_eq2 = 5;
treble_eq3 = 4;
}else
if(treble_eq1 < 3)
{
treble_eq2 = 2;
treble_eq3 = 3;
}else
if(treble_eq1 < 2)
{
treble_eq2 = 2;
treble_eq3 = 3;
} else {

treble_eq2 = 3;
treble_eq3 = 3;
}
lcd.setCursor(0, 1);
displaybar(bass_level/7 + 3);
displaybar(bass_level/5 + 3);
displaybar(bass_level/3 + 3);
displaybar(bass_level/5 + 3);
displaybar(bass_level/7 + 3);
displaybar(3);
displaybar(3);
displaybar(3);
displaybar(3);
displaybar(3);
displaybar(treble_eq3);
displaybar(treble_eq2);
displaybar(treble_eq1);
displaybar(treble_eq1);
displaybar(treble_eq1);
displaybar(treble_eq1);

void convert_treble_level(void)
{
if(treble_ctr == 5)
{
dataset[16] = 1;
dataset[17] = 0;
dataset[18] = 1;
dataset[19] = 0;
}
if(treble_ctr == 4)
{
dataset[16] = 0;
dataset[17] = 0;
dataset[18] = 1;
dataset[19] = 0;
}
if(treble_ctr == 3)
{
dataset[16] = 1;
dataset[17] = 1;
dataset[18] = 0;
dataset[19] = 0;
}
if(treble_ctr == 2)
{
dataset[16] = 0;
dataset[17] = 1;
dataset[18] = 0;
dataset[19] = 0;
}
if(treble_ctr == 1)
{
dataset[16] = 1;
dataset[17] = 0;
dataset[18] = 0;
dataset[19] = 0;
}
if(treble_ctr == 0)
{
dataset[16] = 0;
dataset[17] = 0;
dataset[18] = 0;
dataset[19] = 0;
}
if(treble_ctr == -1)
{
dataset[16] = 1;
dataset[17] = 0;
dataset[18] = 0;
dataset[19] = 1;
}
if(treble_ctr == -2)
{
dataset[16] = 0;
dataset[17] = 1;
dataset[18] = 0;
dataset[19] = 1;
}
if(treble_ctr == -3)
{
dataset[16] = 1;
dataset[17] = 1;
dataset[18] = 0;
dataset[19] = 1;
}
if(treble_ctr == -4)
{
dataset[16] = 0;
dataset[17] = 0;
dataset[18] = 1;
dataset[19] = 1;
}
if(treble_ctr == -5)
{
dataset[16] = 1;
dataset[17] = 0;
dataset[18] = 1;
dataset[19] = 1;
}
}

void showlevel(int level)


{
int x = 0;
lcd.setCursor(0, 1);
lcd.print(" ");
for(x=0; x <= level; x++)
{
lcd.setCursor(x, 1);
lcd.write(byte(x));
}
}

void spectrum()
{
static int bar_level1 = 0;
static int bar_level2 = 0;
static int analog_ctr = 0;
static int R_level_ave = 0;
static int L_level_ave = 0;
static int R_level_buff = 0;
static int L_level_buff = 0;

if (analog_ctr < 50)


{
analog_ctr++;
read_analog();
R_level_buff = R_level_buff + R_level;
L_level_buff = L_level_buff + L_level;
} else {
analog_ctr = 0;
R_level_ave = R_level_buff/50;
L_level_ave = L_level_buff/50;
R_level_buff = 0;
L_level_buff = 0;
}
lcd.setCursor(0, 1);
bar_level1 = (500 - R_level_ave);
bar_level2 = (512 - L_level_ave);
if(bar_level1 < 0) // Don't allow negative values
{
bar_level1 = 0;
}
if(bar_level2 < 0)
{
bar_level2 = 0;
}
if(bar_level1 > 7) //limit value to 7
{
bar_level1 = 7;
}
if(bar_level2 > 7)
{
bar_level2 = 7;
}
displaybar(bar_level1);
lcd.print(" ");
displaybar(bar_level2);
lcd.print(" ");
//lcd.print(L_level);
//lcd.print(" ");
//lcd.print(R_level);

/*
lcd.setCursor(0, 1);
displaybar(spec1);
lcd.setCursor(1, 1);
displaybar(spec2);
lcd.setCursor(2, 1);
displaybar(spec3);
lcd.setCursor(3, 1);
displaybar(spec4);
lcd.setCursor(4, 1);
displaybar(spec5);
lcd.setCursor(5, 1);
displaybar(spec6);
lcd.setCursor(6, 1);
displaybar(spec7);
lcd.setCursor(7, 1);
displaybar(spec8);
lcd.setCursor(8, 1);
displaybar(spec9);
lcd.setCursor(9, 1);
displaybar(spec10);
lcd.setCursor(10, 1);
displaybar(spec11);
lcd.setCursor(11, 1);
displaybar(spec12);
lcd.setCursor(12, 1);
displaybar(spec13);
lcd.setCursor(13, 1);
displaybar(spec14);
lcd.setCursor(14, 1);
displaybar(spec15);
lcd.setCursor(15, 1);
displaybar(spec16);
*/
}

void displaybar(int level)


{
lcd.write(byte(level));
}

void display_input(void)
{
if(input == 1)
{
lcd.print("TV ");
}
if(input == 2)
{
lcd.print("Bluetooth ");
}
if(input == 3)
{
lcd.print("CD ");
}
if(input == 4)
{
lcd.print("Aux ");
}
}

void sendcommand()
{
n = 0;
digitalWrite(CE, LOW);
for (n = 0; n < 8; n++)
{
//send address
digitalWrite(DI, bitRead(addr, n));
digitalWrite(CL, LOW);
delayMicroseconds(7);
digitalWrite(CL, HIGH);
delayMicroseconds(1);
}
delayMicroseconds(7);
digitalWrite(CL, LOW);
digitalWrite(CE, HIGH);

for (n = 0; n < 32; n++)


{
//send address
digitalWrite(DI, dataset[n]);
digitalWrite(CL, LOW);
delayMicroseconds(7);
digitalWrite(CL, HIGH);
delayMicroseconds(1);
}
delayMicroseconds(12);
digitalWrite(CL, LOW);
digitalWrite(DI, LOW);
delayMicroseconds(7);
digitalWrite(CE, LOW);
}

void input_select(int InputCh)


{
/*
address = 01000001
D0-D3 input switch control
0000 - LR1
1000 - LR2
0100 - LR3
1100 - LR4
other combinations = all off
*/
unsigned char x = 0;
if(InputCh == 1)
{
x = 0;
} else if(InputCh == 2)
{
x = 2;
} else if(InputCh == 3)
{
x = 1;
} else //ch = 4
{
x = 3;
}
dataset[0] = bitRead(x, 1);
dataset[1] = bitRead(x, 0);
}

void SetGain(int gain)


{
/*
D4 - D7 input Gain
0000 - 0dB
1000 - +2dB
0100 - +4dB
1100 - +6dB
...
1111 - +30dB
*/
if(gain > 15) // set saturation limits
{
gain = 15;
}
dataset[4] = bitRead(gain, 0);
dataset[5] = bitRead(gain, 1);
dataset[6] = bitRead(gain, 2);
dataset[7] = bitRead(gain, 3);
}

void SetVolume(int level)


{
/*
D8 - D15 Volume Control
00000000 - 0dB
10000000 - -1dB
01000000 - -2dB
11000000 - -3dB
...
11110010 - -79dB
00001010 - infinite
*/
if(level > 80)
{
level = 80;
}
dataset[8] = bitRead(level, 0);
dataset[9] = bitRead(level, 1);
dataset[10] = bitRead(level, 2);
dataset[11] = bitRead(level, 3);
dataset[12] = bitRead(level, 4);
dataset[13] = bitRead(level, 5);
dataset[14] = bitRead(level, 6);
dataset[15] = bitRead(level, 7);
}

void SetTreble(int treble)


{
/*
D16 - D19 Treble Control
1010 - +10dB
1100 - +6dB
0100 - +4dB
1000 - +2dB
0000 - 0dB
1001 - -2dB
0101 - -4dB
...
1011 - -10dB
*/
//dataset[16] = bitRead(treble_level, 0);
//dataset[17] = bitRead(treble_level, 1);
//dataset[18] = bitRead(treble_level, 2);
//dataset[19] = bitRead(treble_level, 3);
}

void SetBass(int bass)


{
/*
D20 - D25 Bass Control
000000 - 0dB
101000 - +2dB
010000 - +4dB
110000 - +6dB
001000 - +8dB
...
010100 - +20dB
*/
dataset[20] = bitRead(bass, 0);
dataset[21] = bitRead(bass, 1);
dataset[22] = bitRead(bass, 2);
dataset[23] = bitRead(bass, 3);
dataset[24] = bitRead(bass, 4);
dataset[25] = bitRead(bass, 5);
}

void SelectCh(int ch)


{
/*
D26 - D27 Channel selection
00 -
10 - Rch
01 - Lch
11 - Both
*/
dataset[26] = bitRead(ch, 0);
dataset[27] = bitRead(ch, 1);
}

void dataset_init(void)
{
dataset[0] = 0; // input select
dataset[1] = 0;
dataset[2] = 0;
dataset[3] = 0;
dataset[4] = 0; //input gain
dataset[5] = 0;
dataset[6] = 0;
dataset[7] = 0;
dataset[8] = 0; // Volume
dataset[9] = 0;
dataset[10] = 0;
dataset[11] = 0;
dataset[12] = 0;
dataset[13] = 0;
dataset[14] = 0;
dataset[15] = 0;
dataset[16] = 1; // Treble
dataset[17] = 0;
dataset[18] = 1;
dataset[19] = 0;
dataset[20] = 0; // Bass
dataset[21] = 1;
dataset[22] = 0;
dataset[23] = 1;
dataset[24] = 0;
dataset[25] = 0;
dataset[26] = 1; //Channel LR
dataset[27] = 1;
dataset[28] = 0; //Test Mode
dataset[29] = 0;
dataset[30] = 0;
dataset[31] = 0;

You might also like