0% found this document useful (0 votes)
94 views24 pages

Arduino Tone Control - Ino

This document contains code for an audio equalizer interface using an LCD display and encoder buttons. It initializes the LCD and defines custom characters for the display. Variables are declared to track the equalizer settings and modes. The setup function configures the LCD and pins. The main loop handles button inputs to adjust settings like volume, bass, treble, input selection and gain in different modes. Settings are sent to an EEPROM and displayed on the LCD.

Uploaded by

lejo
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
Download as pdf or txt
0% found this document useful (0 votes)
94 views24 pages

Arduino Tone Control - Ino

This document contains code for an audio equalizer interface using an LCD display and encoder buttons. It initializes the LCD and defines custom characters for the display. Variables are declared to track the equalizer settings and modes. The setup function configures the LCD and pins. The main loop handles button inputs to adjust settings like volume, bass, treble, input selection and gain in different modes. Settings are sent to an EEPROM and displayed on the LCD.

Uploaded by

lejo
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
Download as pdf or txt
Download as pdf or txt
You are on page 1/ 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