Arduino Tone Control - Ino
Arduino Tone Control - Ino
#include <LiquidCrystal.h>
#include <EEPROM.h>
// 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
void setup() {
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
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 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;
/*
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 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);
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;