#include <PT2258.h>
#include <Wire.h>
#include <IRremote.hpp>
#include <LiquidCrystal_I2C.h>
#include <EEPROM.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
PT2258 pt2258(0x88); // PT2258 Object
#define IR_RECEIVE_PIN 7
unsigned long results;
#define relay 5
int mode = 0;
int mute_state = 0;
int power_state = 0;
int cycle = 0;
int cyc_value = 1;
bool on = false;
int vol_treb; // Treble volume
int vol_bass;
// IR HEX code
#define power 0x5DA2FF00
#define mode_chng 0x1DE2FF00
#define vol_up 0xFD02FF00
#define vol_down 0x6798FF00
#define mute_menu 0x57A8FF00
#define cycle_val 0x4FB0FF00
byte mute_1[] = {
B00010,
B00110,
B11110,
B11110,
B11110,
B11110,
B00110,
B00010
};
byte mute_2[] = {
B00000,
B00000,
B10001,
B01010,
B00100,
B01010,
B10001,
B00000
};
byte x1[] = {
B00000,
B00000,
B00000,
B00000,
B00000,
B00000,
B01100,
B00000
};
byte x2[] = {
B00000,
B00000,
B00000,
B00000,
B01100,
B00000,
B01100,
B00000
};
byte x5[] = {
B00000,
B01100,
B01100,
B00000,
B01100,
B00000,
B01100,
B00000
};
void setup() {
Serial.begin(9600); //UART begin
pinMode(relay, OUTPUT);
lcd.begin(16, 2);
IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK); // Start the receiver
Wire.begin(); // setting the I2C clock to 100KHz
/* checking if the MCU can talk with the PT or not*/
if (!pt2258.begin())
Serial.println("PT2258 Successfully Initiated");
else
Serial.println("Failed to Initiate PT2258");
vol_treb = EEPROM.read(0);
vol_bass = EEPROM.read(1);
/* Initiating PT with default channel and volume*/
pt2258.volume(1, vol_treb); // (channel, volume) treble
pt2258.volume(2, vol_treb); // (channel, volume) treble
pt2258.volume(5, vol_bass); // bass
pt2258.volume(6, vol_bass); // bass
lcd.createChar(0, mute_1);
lcd.createChar(1, mute_2);
lcd.createChar(2, x1);
lcd.createChar(3, x2);
lcd.createChar(4, x5);
}
void loop() {
if (power_state == 1) {
if (!on) {
digitalWrite(relay, HIGH);
lcd.backlight();
lcd.setCursor(4, 0);
lcd.print("Power On");
delay(1000);
lcd.clear();
on = true;
}
lcd.setCursor(0, 0);
lcd.print("TREBLE :");
lcd.setCursor(9, 0);
lcd.print(vol_treb);
lcd.setCursor(0, 1);
lcd.print("BASS");
lcd.setCursor(7, 1);
lcd.print(":");
lcd.setCursor(9, 1);
lcd.print(vol_bass);
} else if (power_state == 0) {
if (on) {
digitalWrite(relay, LOW);
lcd.clear();
lcd.setCursor(3, 0);
lcd.print("Power Off");
EEPROM.write(0, vol_treb);
EEPROM.write(1, vol_bass);
delay(1000);
lcd.noBacklight();
on = false;
lcd.clear();
}
}
if (IrReceiver.decode()) {
Serial.println(IrReceiver.decodedIRData.decodedRawData, HEX);
results = IrReceiver.decodedIRData.decodedRawData;
switch (results) {
case power:
power_state++;
if (power_state >= 2) {
power_state = 0;
}
break;
case mode_chng:
mode++;
if (mute_state == 0) {
lcd.setCursor(14, 0);
lcd.print(" ");
lcd.setCursor(14, 1);
lcd.print(" ");
if (mode == 1) {
lcd.setCursor(14, 0);
lcd.print("<<");
} else if (mode == 2) {
lcd.setCursor(14, 1);
lcd.print("<<");
}
}
if (mode > 2) {
mode = 0;
}
break;
case mute_menu:
mute_state++;
lcd.setCursor(13, 0);
lcd.print(" ");
lcd.setCursor(13, 1);
lcd.print(" ");
if (mute_state >= 2) {
mute_state = 0;
}
if (mute_state == 0) {
pt2258.mute(false);
if (mode == 1) {
lcd.setCursor(14, 0);
lcd.print("<<");
} else if (mode == 2) {
lcd.setCursor(14, 1);
lcd.print("<<");
}
} else if (mute_state == 1) {
pt2258.mute(true);
lcd.setCursor(13, 0);
lcd.write(0);
lcd.write(1);
lcd.setCursor(13, 1);
lcd.write(0);
lcd.write(1);
}
break;
case cycle_val:
cycle++;
if (cycle >= 3) {
cycle = 0;
}
if (cycle == 0) {
cyc_value = 1;
lcd.setCursor(5, 1);
lcd.write(2);
} else if (cycle == 1) {
cyc_value = 2;
lcd.setCursor(5, 1);
lcd.write(3);
} else if (cycle == 2) {
cyc_value = 5;
lcd.setCursor(5, 1);
lcd.write(4);
}
break;
}
if (mode == 0) { // mode All (bass & trebble)
switch (results) {
case vol_up:
Serial.println("VOL+");
if (vol_treb >= 100) {
vol_treb = 100;
} else if (vol_bass >= 100) {
vol_bass = 100;
} else {
vol_treb = vol_treb + cyc_value;
vol_bass = vol_bass + cyc_value;
}
delay(50);
pt2258.volume(1, vol_treb); // treble
pt2258.volume(2, vol_treb); // treble
pt2258.volume(5, vol_bass); // bass
pt2258.volume(6, vol_bass); // bass
break;
case vol_down:
Serial.println("VOL-");
if (vol_treb <= 0) {
vol_treb = 0;
} else if (vol_bass <= 0) {
vol_bass = 0;
} else {
vol_treb = vol_treb - cyc_value;
vol_bass = vol_bass - cyc_value;
}
if (vol_treb < 10 || vol_bass < 10) {
lcd.setCursor(10, 0);
lcd.print(" ");
lcd.setCursor(10, 1);
lcd.print(" ");
}
if (vol_treb < 100 || vol_bass < 100) {
lcd.setCursor(11, 0);
lcd.print(" ");
lcd.setCursor(11, 1);
lcd.print(" ");
}
delay(50);
pt2258.volume(1, vol_treb); // treble
pt2258.volume(2, vol_treb); // treble
pt2258.volume(5, vol_bass); // bass
pt2258.volume(6, vol_bass); // bass
break;
}
}
if (mode == 1) { // mode treble
switch (results) {
case vol_up:
Serial.println("VOL+");
vol_treb = vol_treb + cyc_value;
if (vol_treb >= 100) {
vol_treb = 100;
}
pt2258.volume(1, vol_treb); // bass
pt2258.volume(2, vol_treb); // bass
break;
case vol_down:
Serial.println("VOL-");
vol_treb = vol_treb - cyc_value;
if (vol_treb <= 0) {
vol_treb = 0;
}
if (vol_treb < 10) {
lcd.setCursor(10, 0);
lcd.print(" ");
}
if (vol_treb < 100) {
lcd.setCursor(11, 0);
lcd.print(" ");
}
pt2258.volume(1, vol_treb);
pt2258.volume(2, vol_treb);
break;
}
}
if (mode == 2) { // mode Bass
switch (results) {
case vol_up:
Serial.println("VOL+");
vol_bass = vol_bass + cyc_value;
if (vol_bass >= 100) {
vol_bass = 100;
}
pt2258.volume(5, vol_bass); // bass
pt2258.volume(6, vol_bass); // bass
break;
case vol_down:
Serial.println("VOL-");
vol_bass = vol_bass - cyc_value;
if (vol_bass <= 0) {
vol_bass = 0;
}
if (vol_bass < 10) {
lcd.setCursor(10, 1);
lcd.print(" ");
}
if (vol_bass < 100) {
lcd.setCursor(11, 1);
lcd.print(" ");
}
pt2258.volume(5, vol_bass); // bass
pt2258.volume(6, vol_bass); // bass
break;
}
}
IrReceiver.resume();
}
}