#include "Arduino.h"
#include <LiquidCrystal.h>
#include <IRremote.h>
#include "AiEsp32RotaryEncoder.h"
#include <Wire.h>
#include <EEPROM.h>
#define PT2322_address 0x44 //0b1000100
#define PT2323_address 0x4A //0b1001010
#define LcdBacklight 32 // Anoda LCD
#define outrelay 33 // out
#define btn_delay 50
#define IR_RECEIVE_PIN 4
/*==========================================
// IR HEX code
#define ir_power 0xFF02FD // IR power ON/OFF
#define ir_mute 0xFF48B7 // IR mute
#define ir_in 0xFFB847 // IR input select
#define ir_vol_u 0xFF30CF // IR vol++
#define ir_vol_d 0xFF18E7 // IR vol--
#define ir_bass 0xFF807F // IR bass
#define ir_mid 0xFF40BF // IR mid
#define ir_treb 0xFFC03F // IR treb
#define ir_fl 0xFF20DF // IR fl
#define ir_fr 0xFFA05F // IR fr
#define ir_cn 0xFF609F // IR cn
#define ir_sl 0xFFE01F // IR sl
#define ir_sr 0xFF10EF // IR sr
#define ir_sub 0xFF906F // IR sub
#define ir_smode 0xFF38C7 // IR speaker mode change
#define ir_equ 0xFF8877 // IR equalizer change
#define ir_tombol 0xFFB24D // IR Menu
#define ir_up 0xFFE21D // IR Up
#define ir_down 0xFFD22D // IR Down
#define ir_left 0xFF12ED // IR Left
#define ir_right 0xFF52AD // IR Right
===========================================*/
/*-----
#define ir_power 162 // IR power ON/OFF
#define ir_mute 34 // IR mute
#define ir_in 0xFFB847 // IR input select
#define ir_vol_u 0xFF30CF // IR vol++
#define ir_vol_d 0xFF18E7 // IR vol--
#define ir_bass 48 // IR bass
#define ir_mid 24 // IR mid
#define ir_treb 122 // IR treb
#define ir_fl 16 // IR fl
#define ir_fr 56 // IR fr
#define ir_cn 90 // IR cn
#define ir_sl 66 // IR sl
#define ir_sr 74 // IR sr
#define ir_sub 82 // IR sub
#define ir_smode 0xFF38C7 // IR speaker mode change
#define ir_equ 0xFF8877 // IR equalizer change
#define ir_tombol 226 // IR Menu
#define ir_up 2 // IR Up
#define ir_down 152 // IR Down
#define ir_left 224 // IR Left
#define ir_right 144 // IR Right
-----*/
//menggunakan remote control WOKWI
#define ir_power 162 //tombol power
#define ir_tombol 226 //tombol menu
#define ir_mute 34 //tombol tes
#define ir_plus 2 //tombol +
#define ir_minus 152 //tombol -
#define ir_input 194 //tombol back
#define ir_ok 168 //tombol play
#define ir_equ 144 //tombol next
#define ir_func 104 //tombol 0
#define ir_smode 176 //tombol c
#define ir_bass 48 //tombol 1
#define ir_middle 24 //tombol 2
#define ir_treble 122 //tombol 3
#define ir_fl 16 //tombol 4
#define ir_fr 56 //tombol 5
#define ir_cen 90 //tombol 6
#define ir_rl 66 //tombol 7
#define ir_rr 74 //tombol 8
#define ir_sub 82 //tombol 9
byte pilih_angka[8][8]={
{0x07,0x0F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F},
{0x1F,0x1F,0x1F,0x00,0x00,0x00,0x00,0x00},
{0x1C,0x1E,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F},
{0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1E,0x1C},
{0x00,0x00,0x00,0x00,0x00,0x1F,0x1F,0x1F},
{0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x0F,0x07},
{0x1F,0x1F,0x1F,0x00,0x00,0x00,0x1F,0x1F},
{0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F}
};
// 0 1 2 3 4 5 6 7 8 9 n f
const char top[12][3]={0,1,2, 1,2,32, 6,6,2, 1,6,2, 5,4,7, 7,6,6, 0,6,6, 1,1,3, 0,6,2, 0,6,2, 7,1,2, 0,6,1};
const char bot[12][3]={5,4,3, 4,7,4, 7,4,4, 4,4,3, 32,32,7, 4,4,3, 5,4,3, 32,0,32, 5,4,3, 4,4,3, 7,32,7, 7,32,32};
LiquidCrystal lcd(23, 19, 18, 5, 17, 16); // RS,E,D4,D5,D6,D7
unsigned long waktu;
/*======================================
int ch_mute,mute_sel,effect_sel,tone_sel;
int ,channel,teschannel;
int ir_menu;
======================================*/
char power,menu,mute,hal,ton,mulai,vol_on;
uint8_t volume,bass,bass_1,middle,mid_1,treble,treb_1,trimvol,fl,fr,cn,rl,rr,sub;
uint8_t surr,mix,flm,frm,cnm,rlm,rrm,subm,equ,smode,inp,func,a,b;
uint8_t return_d,powerflag=0,vmute=0;
char ir_menu,ir_mulai;
//=====================================
// Port Pin IDs for Arduino
constexpr uint8_t PIN_ENCA = 2; //Clk
constexpr uint8_t PIN_ENCB = 15; //Data
constexpr uint8_t PIN_BTN = 0; //SW
constexpr uint8_t ENC_STEPSPERNOTCH = 4;
constexpr bool BTN_ACTIVESTATE = LOW;
AiEsp32RotaryEncoder rotaryEncoder = AiEsp32RotaryEncoder(PIN_ENCA,PIN_ENCB,PIN_BTN,-1,4);
boolean tombol=false,reset=false,up,down;
EEPROMClass evolume("eeprom0");
EEPROMClass ebass("eeprom1");
EEPROMClass emiddle("eeprom2");
EEPROMClass etreble("eeprom3");
EEPROMClass efl("eeprom4");
EEPROMClass efr("eeprom5");
EEPROMClass ecn("eeprom6");
EEPROMClass esub("eeprom7");
EEPROMClass erl("eeprom8");
EEPROMClass err("eeprom9");
EEPROMClass esurr("eeprom10");
EEPROMClass emix("eeprom11");
EEPROMClass einp("eeprom12");
EEPROMClass eequ("eeprom13");
EEPROMClass esmode("eeprom14");
void IRAM_ATTR readEncoderISR();
void updateLCD();
void ir_control();
void btn_cl();
void ir_cl();
void custom_num_shape();
void bigNumer(uint8_t aValue, uint8_t lokasi);
void bigFont(int aValue, int lokasi);
void readRotaryEncoder();
void readbuttonEncoder();
void input(uint8_t x);
void equa(uint8_t x);
void spmode(uint8_t x);
void setEqu(uint8_t x);
void setSmode(uint8_t x);
void setFunc();
void setInput(uint8_t x);
void setMute();
void setMuteTrim(uint8_t vfl, uint8_t vfr, uint8_t vcn, uint8_t vsub, uint8_t vrl, uint8_t vrr, uint8_t all);
void setFeature(uint8_t xsurr, uint8_t xmix);
void PT2323_wireWrite(char ch);
void clearRegister();
void activateInSW();
void setVolTrim(uint8_t x, uint8_t value);
void setFunction(uint8_t amute, uint8_t ddd, uint8_t tone_c);
void setTone(uint8_t x, uint8_t value);
void setVolume();
void PT2322_wireWrite(char a);
void readEEPROM();
void updateEEPROM();
void setup() {
Wire.begin();
Serial.begin(115200);
lcd.begin(16, 2);
//=========setting rotary encoder
rotaryEncoder.begin();
rotaryEncoder.setup(readEncoderISR);
bool circleValues = false;
rotaryEncoder.setBoundaries(0, 80, circleValues); //minValue, maxValue, circleValues true|false (when max go to min and vice versa)
//rotaryEncoder.disableAcceleration(); //acceleration is now enabled by default - disable if you dont need it
rotaryEncoder.setAcceleration(250); //or set the value - larger number = more accelearation; 0 or 1 means disabled acceleration
//===============================
IrReceiver.begin(IR_RECEIVE_PIN);
pinMode(LcdBacklight, OUTPUT); // Anoda LCD
pinMode(outrelay, OUTPUT);
digitalWrite(LcdBacklight, HIGH);
digitalWrite(outrelay, HIGH);
clearRegister();
activateInSW();
power=0;
}
void loop(){
if (millis()-waktu>30000 && power==1 && mute!=1) updateEEPROM();
if (millis()-waktu>60000 && power==1) digitalWrite(LcdBacklight, LOW);
if (millis()-waktu>10000 && return_d==1 && menu!=0 && mute!=1){
menu=0; hal=0; return_d=0; ir_menu=0; lcd.clear();
}
//----------------------------
//if (millis()-time>30000) grafik();
//else
//----------------------------
ir_control();
readRotaryEncoder();
readbuttonEncoder();
updateLCD();
} //end loop
void IRAM_ATTR readEncoderISR() {
rotaryEncoder.readEncoder_ISR();
}
void input(uint8_t x){
lcd.setCursor(0,0);
switch (constrain(x,0,4)){
case 0: lcd.print(F("AUX")); break;
case 1: lcd.print(F("FM ")); break;
case 2: lcd.print(F("USB")); break;
case 3: lcd.print(F("TV ")); break;
case 4: lcd.print(F("6CH")); break;
}
}
void equa(uint8_t x){
lcd.setCursor(13,0);
switch (constrain(x,0,4)){
case 0: lcd.print(F("MAN")); break;
case 1: lcd.print(F("NOR")); break;
case 2: lcd.print(F("POP")); break;
case 3: lcd.print(F("ROC")); break;
case 4: lcd.print(F("CLA")); break;
}
}
void spmode(uint8_t x){
lcd.setCursor(13,1);
switch (constrain(x,0,3)){
case 0: lcd.print(F("2.0")); break;
case 1: lcd.print(F("2.1")); break;
case 2: lcd.print(F("3.1")); break;
case 3: lcd.print(F("5.1")); break;
}
}
void bigNumer(uint8_t aValue, uint8_t lokasi){
uint8_t x;
b=aValue % 10; //satuan
a=(aValue - b) / 10; //puluhan
if(lokasi>10) x=b; else x=a;
lcd.setCursor(lokasi, 0); for(uint8_t i=0; i<3; i++) lcd.write(top[x][i]);
lcd.setCursor(lokasi, 1); for(uint8_t i=0; i<3; i++) lcd.write(bot[x][i]);
if(lokasi<11){
//lokasi volume, trim dan tone
lcd.setCursor(lokasi+3, 0); for(uint8_t i=0; i<3; i++) lcd.write(top[b][i]);
lcd.setCursor(lokasi+3, 1); for(uint8_t i=0; i<3; i++) lcd.write(bot[b][i]);
}
}
void bigFont(int aValue, int lokasi){
lcd.setCursor(lokasi, 0); for(int i=0; i < 3; i++) lcd.write(top[0][i]);
lcd.setCursor(lokasi, 1); for(int i=0; i < 3; i++) lcd.write(bot[0][i]);
if (aValue==0){
lcd.setCursor(lokasi+3, 0); for(int i=0; i < 3; i++) lcd.write(top[10][i]);
lcd.setCursor(lokasi+3, 1); for(int i=0; i < 3; i++) lcd.write(bot[10][i]);
} else {
lcd.setCursor(lokasi+3, 0); for(int i=0; i < 3; i++) lcd.write(top[11][i]);
lcd.setCursor(lokasi+3, 1); for(int i=0; i < 3; i++) lcd.write(bot[11][i]);
}
}
void custom_num_shape(){
for(uint8_t i=0; i<8; i++)
lcd.createChar(i, pilih_angka[i]);
}
boolean trimvolb=true, boll=false;
uint8_t lastvalue;
//uint8_t mod=0;
void readRotaryEncoder(){
uint8_t flv=0,frv=0,cnv=0,rlv=0,rrv=0,subv=0;
uint8_t iValue=0, mod=0;
int16_t value = rotaryEncoder.readEncoder();
if (rotaryEncoder.encoderChanged()) {
if(lastvalue>value) down=true;
if(lastvalue<value) up=true;
lastvalue=value; boll=true;
}
if(power==1){
if(up){up=false; iValue=1;}
if(down){down=false; iValue=-1;}
if(mute==1) iValue=0;
switch (menu){
case 0:
volume+=iValue; volume=constrain(volume,0,79);
//mod=0;
if(mute!=1 && volume%5==0){
mod++;
if(fl!=mod){flv=(fl-mod)+iValue; fl=constrain(mod+flv,0,15);}
if(fr!=mod){frv=(fr-mod)+iValue; fr=constrain(mod+frv,0,15);}
if(cn!=mod){cnv=(cn-mod)+iValue; cn=constrain(mod+cnv,0,15);}
if(sub!=mod){subv=(sub-mod)+iValue; sub=constrain(mod+subv,0,15);}
if(rl!=mod){rlv=(rl-mod)+iValue; rl=constrain(mod+rlv,0,15);}
if(rr!=mod){rrv=(rr-mod)+iValue; rr=constrain(mod+rrv,0,15);}
}
break;
case 1: inp+=iValue; break;
case 2: equ+=iValue; break;
case 3: smode+=iValue; break;
case 4:
if (hal==0){ton+=iValue; ton=constrain(ton,0,3);}
if (hal==1){
switch (ton){
case 0: bass+=iValue; break;
case 1: middle+=iValue; break;
case 2: treble+=iValue; break;
case 3: hal=0; break;
}
}
break;
case 5:
if (hal==0){
trimvol+=iValue; trimvol=constrain(trimvol,0,6);
switch(smode){
case 0: //speaker mode 2.0
if(trimvol==2) trimvol=6;
if(trimvol==5) trimvol=1;
break;
case 1: //speaker mode 2.1
if(trimvol==2){
if(trimvolb==true){trimvolb=false; trimvol=3;}
else {trimvolb=true; trimvol=1;}
}
if(trimvol==4) trimvol=6;
if(trimvol==5) trimvol=3;
break;
case 2: //speaker mode 3.1
if(trimvol==4) trimvol=6;
if(trimvol==5) trimvol=3;
break;
}
}
if (hal==1){
switch (trimvol){
case 0: if (frm==0); fl+=iValue; break;
case 1: if (frm==0); fr+=iValue; break;
case 2: if (cnm==0); cn+=iValue; break;
case 3: if (subm==0); sub+=iValue; break;
case 4: if (rlm==0); rl+=iValue; break;
case 5: if (rrm==0); rr+=iValue; break;
case 6: hal=0; break;
}
}
break;
case 6:
if (hal==0){func+=iValue; func=constrain(func,0,2);}
if (hal==1){
switch (func){
case 0: surr+=iValue; break;
case 1: mix+=iValue; break;
case 2: hal=0; break;
}
}
break;
}
}
}
//paramaters for button
unsigned long shortPressAfterMiliseconds = 50; //how long short press shoud be. Do not set too low to avoid bouncing (false press events).
unsigned long longPressAfterMiliseconds = 1000; //how long čong press shoud be.
void readbuttonEncoder(){
static unsigned long lastTimeButtonDown = 0;
static bool wasButtonDown = false;
bool isEncoderButtonDown = rotaryEncoder.isEncoderButtonDown();
if (isEncoderButtonDown) {
if (!wasButtonDown){lastTimeButtonDown = millis();}
wasButtonDown = true;
return;
}
//button is up
if (wasButtonDown) {
if (millis() - lastTimeButtonDown >= longPressAfterMiliseconds) reset=true;
else if (millis() - lastTimeButtonDown >= shortPressAfterMiliseconds) tombol=true;
}
wasButtonDown = false;
if (tombol){
tombol=false;
switch(power){
case 0: power=1; mulai=0; break;
case 1:
switch(menu){
case 3: ton=0; btn_cl(); break;
case 4:
if(hal==0){if(ton<3){hal=1;}}
else {menu=3; hal=0; trimvol=0;}
btn_cl();
break;
case 5:
if(hal==0){if(trimvol<6){hal=1;}}
else {menu=4; hal=0; func=0;}
btn_cl();
break;
case 6:
if(hal==0){if(func<2){hal=1;}}
else {menu=5; hal=0;}
btn_cl();
break;
}
if (hal==0){menu ++;
if (menu==4 || menu==5 || menu==6) lcd.clear();
if (menu > 6){menu=0; lcd.clear();}
}
break;
}
}
}
void updateLCD(){
if(power==1){
powerflag=power;
if(reset==true){
reset=false;
lcd.clear();
digitalWrite(LcdBacklight, LOW);
delay(2000);
digitalWrite(LcdBacklight, HIGH);
lcd.setCursor(0, 0);
lcd.print(F(" RESET ALL "));
delay(500);
lcd.setCursor(0, 1);
lcd.print(F("Please wait "));
for(uint8_t i=0; i<4; i++){
lcd.print(F(".")); delay(500);
}
delay(2000);
mulai=0;
}
if(mulai==0){
digitalWrite(LcdBacklight, HIGH);
digitalWrite(outrelay, HIGH);
lcd.clear();
delay(500);
lcd.setCursor(0, 0);
lcd.print(F(" A2T TECHNO "));
lcd.setCursor(0, 1);
lcd.print(F("5.1 Audio System"));
delay(2000);
lcd.clear();
flm=1; frm=1; cnm=1; rlm=1; rrm=1; subm=1; mute=1;
setMute();
readEEPROM();
if(volume==0) volume=40;
if(inp!=4) inp=4;
if(smode!=3) smode=3;
setInput(inp);
if(equ==0){
bass_1=7; mid_1=7; treb_1=7;
} else{
bass_1=bass; mid_1=middle; treb_1=treble;
}
setEqu(equ);
setSmode(smode);
setFunc();
hal=0;
ir_mulai=1;
ir_menu=0;
vol_on=1;
mute=0;
setMute();
menu=0;
}
lcd.setCursor(0,0);
switch (menu){
case 0:
//volume --------------------------------------------//
//input ------------
input(inp);
//equalizer---------
equa(equ);
//speaker mode------
spmode(smode);
//volume-----------
lcd.setCursor(0,1);
if(mulai==0){
lcd.print(F("VOL>"));
fl=0; fr=0; cn=0; sub=0; rl=0; rr=0;
uint8_t vol_1=volume;
volume=0;
custom_num_shape();
for (uint8_t i=0; i<vol_1; i++){
volume++;
bigNumer(volume,5);
setVolume();
if(volume%5==0){
fl++; fr++; cn++; sub++; rl++; rr++;
setVolTrim(0,fl);
setVolTrim(1,fr);
setVolTrim(2,cn);
setVolTrim(3,sub);
setVolTrim(4,rl);
setVolTrim(5,rr);
}
delay(100);
}
mulai=1;
}
lcd.setCursor(0,1);
switch (mute){
case 0: lcd.print(F("VOL>")); bigNumer(volume,5); break;
case 1: lcd.print(F("MUT<")); bigNumer(0,5); break;
}
setVolume();
lcd.setCursor(3,0); lcd.print(F(" "));
lcd.setCursor(12,0); lcd.print(F(" "));
lcd.setCursor(12,1); lcd.print(F(" "));
break;
case 1:
//input --------------------------------------------//
input(inp); setInput(inp);
lcd.setCursor(3,0); lcd.print(F("<"));
lcd.setCursor(3,1); lcd.print(F(" "));
lcd.setCursor(12,0); lcd.print(F(" "));
lcd.setCursor(12,1); lcd.print(F(" "));
break;
case 2:
//sound mode --------------------------------------//
equa(equ); setEqu(equ);
lcd.setCursor(3,0); lcd.print(F(" "));
lcd.setCursor(3,1); lcd.print(F(" "));
lcd.setCursor(12,0); lcd.print(F(">"));
lcd.setCursor(12,1); lcd.print(F(" "));
break;
case 3:
//speaker mode -----------------------------------//
spmode(smode); setSmode(smode);
lcd.setCursor(3,0); lcd.print(F(" "));
lcd.setCursor(3,1); lcd.print(F(" "));
lcd.setCursor(12,0); lcd.print(F(" "));
lcd.setCursor(12,1); lcd.print(F(">"));
break;
case 4:
//tone control -------------------------//
lcd.print(F("TONE CTL"));
lcd.setCursor(7,1);
if (hal==1 && ton!=3) lcd.print(F("> "));
else if (ton!=3) lcd.print(F("< "));
lcd.setCursor(0,1);
switch (ton){
case 0: lcd.print(F("Bass ")); setTone(0,bass); bigNumer(bass,9); bass_1=bass; equ=0; break;
case 1: lcd.print(F("Middle ")); setTone(1,middle); bigNumer(middle,9); mid_1=middle; equ=0; break;
case 2: lcd.print(F("Treble ")); setTone(2,treble); bigNumer(treble,9); treb_1=treble; equ=0; break;
case 3:
lcd.print(F("Next "));
lcd.setCursor(9,0);
lcd.print(F(" "));
break;
}
break;
case 5:
//trim volume -------------------------//
lcd.print(F("TRIM VOL"));
lcd.setCursor(8,1);
if (hal==1 && trimvol!=6){
switch (trimvol){
case 0: if (flm==0) lcd.print(F(">")); break;
case 1: if (frm==0) lcd.print(F(">")); break;
case 4: if (rlm==0) lcd.print(F(">")); break;
case 5: if (rrm==0) lcd.print(F(">")); break;
case 2: if (cnm==0) lcd.print(F(">")); break;
case 3: if (subm==0) lcd.print(F(">")); break;
}
} else if (trimvol!=6) lcd.print(F("<"));
lcd.setCursor(0,1);
switch (trimvol){
/*
case 0: if (flm!=0){ lcd.print(F("Front L ")); a=fl; } else { lcd.print(F("FL Mute ")); a=0; } bigNumer(a,9); break;
case 1: if (frm!=0){ lcd.print(F("Front R ")); a=fr; } else { lcd.print(F("FR Mute ")); a=0; } bigNumer(a,9); break;
case 2: if (cnm!=0){ lcd.print(F("Center ")); a=cn; } else { lcd.print(F("Cen Mute ")); a=0; } bigNumer(a,9); break;
case 4: if (rlm!=0){ lcd.print(F("Rear L ")); a=rl; } else { lcd.print(F("RL Mute ")); a=0; } bigNumer(a,9); break;
case 5: if (rrm!=0){ lcd.print(F("Rear R ")); a=rr; } else { lcd.print(F("RR Mute ")); a=0; } bigNumer(a,9); break;
case 3: if (subm!=0){ lcd.print(F("Subwofer")); a=sub; } else { lcd.print(F("Sub Mute ")); a=0; } bigNumer(a,9); break;
*/
case 0: lcd.print(F("Front L ")); setVolTrim(0,fl); bigNumer(fl,10); break;
case 1: lcd.print(F("Front R ")); setVolTrim(1,fr); bigNumer(fr,10); break;
case 2: lcd.print(F("Center ")); setVolTrim(2,cn); bigNumer(cn,10); break;
case 3: lcd.print(F("Subwofer")); setVolTrim(3,sub); bigNumer(sub,10); break;
case 4: lcd.print(F("Rear L ")); setVolTrim(4,rl); bigNumer(rl,10); break;
case 5: lcd.print(F("Rear R ")); setVolTrim(5,rr); bigNumer(rr,10); break;
case 6:
lcd.print(F("Next "));
lcd.setCursor(9,0);
lcd.print(F(" "));
break;
}
break;
case 6:
lcd.print(F("FUNCTION "));
lcd.setCursor(8,1);
if (hal==1 && func!=2) lcd.print(F(">"));
else if(func!=2) lcd.print(F("<"));
lcd.setCursor(0,1);
switch (func){
case 0:
lcd.print(F("Surround"));
lcd.setCursor(10,1);
switch (surr){
//case 0: lcd.print(F("ACTIVE")); break;
//case 1: lcd.print(F("OFF ")); break;
case 0 ... 1: bigFont(surr,10); break;
}
break;
case 1:
lcd.print(F("Mixed "));
lcd.setCursor(10,1);
switch (mix){
//case 0: lcd.print(F(" 0dB ")); break;
//case 1: lcd.print(F(" +6dB ")); break;
case 0: lcd.print(F(" ")); bigNumer(0,11); break;
case 1: lcd.print(F("+")); bigNumer(6,11); break;
}
lcd.setCursor(10,0); lcd.print(F(" "));
lcd.setCursor(14,0); lcd.print(F(" "));
lcd.setCursor(14,1); lcd.print(F("dB"));
break;
case 2:
lcd.print(F("Next "));
lcd.setCursor(9,0);
lcd.print(F(" "));
break;
}
setFunc();
break;
}
} else {
digitalWrite(outrelay, LOW);
mute=1;
setMute();
delay(150);
ir_mulai=0;
lcd.setCursor(0, 0);
lcd.print(F(" "));
lcd.setCursor(0, 1);
lcd.print(F(" STANDBY "));
waktu=millis();
}
}
void btn_cl() {
delay(btn_delay);
waktu=millis();
return_d=1;
}
void ir_cl() {
waktu=millis();
return_d=1;
}
void ir_control() {
if(IrReceiver.decode()){
switch(IrReceiver.decodedIRData.command) {
//power -------------------------------------------------//
case ir_power: //#define ir_power 162 //tombol power
if(powerflag==0) {powerflag=1; mulai=0;} else powerflag=0;
power=powerflag;
break;
case ir_mute: //#define ir_mute 34 //tombol tes
if(mulai==1){
if(mute==0) {vmute=1; vol_on=0; flm=1; frm=1; cnm=1; subm=1; rlm=1; rrm=1;}
else {vmute=0; vol_on=1; flm=0; frm=0; cnm=0; subm=0; rlm=0; rrm=0;}
mute=vmute;
if(menu!=0) {menu=0; ir_menu=0; lcd.clear();}
}
break;
}
IrReceiver.resume();
if (ir_mulai==1 && vol_on==1){
// if (ir_mulai==1) {
switch(IrReceiver.decodedIRData.command){
//menggunakan remote control WOKWI
case ir_tombol: //#define ir_tombol 226 //tombol menu
if (menu>3){
menu++; if (menu>6) menu=-1;
lcd.clear();
}
tombol=true;
break;
//plus & minus -------------------------------------------------//
case ir_plus: //#define ir_plus 2 //tombol +
switch(menu){
case 0 ... 3: menu=0; if(volume>=0 && volume<79) up=true; hal=0; ir_menu=0; break;
case 4:
switch(ton){
case 0: if(bass>=0 && bass<15) up=true; break;
case 1: if(middle>=0 && middle<15) up=true; break;
case 2: if(treble>=0 && treble<15) up=true; break;
}
hal=1; ir_menu=4;
break;
case 5:
switch (trimvol){
case 0: if(fl>=0 && fl<15) up=true; break;
case 1: if(fr>=0 && fr<15) up=true; break;
case 2: if(cn>=0 && cn<15) up=true; break;
case 3: if(sub>=0 && sub<15) up=true; break;
case 4: if(rl>=0 && rl<15) up=true; break;
case 5: if(rr>=0 && rr<15) up=true; break;
}
hal=1; ir_menu=5;
break;
case 6:
switch(func){
case 0: if(surr==0) up=true; break;
case 1: if(mix==0) up=true; break;
}
hal=1; ir_menu=6;
break;
//if (mute==1){mute=0; vol_on=1; setMute(); }
}
break;
case ir_minus: //#define ir_minus 152 //tombol -
switch(menu){
case 0 ... 3: menu=0; if(volume>0 && volume<=79) down=true; hal=0; ir_menu=0; break;
case 4:
switch(ton){
case 0: if(bass>0 && bass<=15) down=true; break;
case 1: if(middle>0 && middle<=15) down=true; break;
case 2: if(treble>0 && treble<=15) down=true; break;
}
hal=1; ir_menu=4;
break;
case 5:
switch (trimvol){
case 0: if(fl>0 && fl<=15) down=true; break;
case 1: if(fr>0 && fr<=15) down=true; break;
case 2: if(cn>0 && cn<=15) down=true; break;
case 3: if(sub>0 && sub<=15) down=true; break;
case 4: if(rl>0 && rl<=15) down=true; break;
case 5: if(rr>0 && rr<=15) down=true; break;
}
hal=1; ir_menu=5;
break;
case 6:
switch(func){
case 0: if(surr==1) down=true; break;
case 1: if(mix==1) down=true; break;
}
hal=1; ir_menu=6;
break;
//if (mute==1){ mute=0; vol_on=1; setMute(); }
}
break;
//select input -------------------------------------------------//
case ir_input: //#define ir_input 194 //tombol back
if(menu>=4){lcd.clear(); menu=0; updateLCD();}
if(menu==1){inp++; if(inp>3) inp=0;}
menu=1; hal=0; ir_menu=1;
break;
//select equ -------------------------------------------------//
case ir_equ: //#define ir_equ 144 //tombol forward
if(menu>=4){lcd.clear(); menu=0; updateLCD();}
if(menu==2){equ++; if(equ>4) equ=0;}
menu=2; hal=0; ir_menu=2;
break;
//select smode -------------------------------------------------//
case ir_smode: //#define ir_smode 176 //tombol c
if(menu>=4){lcd.clear(); menu=0; updateLCD();}
if(menu==3){smode++; if(smode>3) smode=0;}
menu=3; hal=0; ir_menu=3;
break;
//select bass -------------------------------------------------//
case ir_bass: //#define ir_bass 48 //tombol 1
if(menu!=4) lcd.clear();
menu=4; ton=0; hal=1; ir_menu=4;
break;
//select middle -------------------------------------------------//
case ir_middle: //#define ir_middle 24 //tombol 2
if(menu!=4) lcd.clear();
menu=4; ton=1; hal=1; ir_menu=4;
break;
//select treble -------------------------------------------------//
case ir_treble: //#define ir_treble 122 //tombol 3
if(menu!=4) lcd.clear();
menu=4; ton=2; hal=1; ir_menu=4;
break;
//select Front L -----------------------------------------------//
case ir_fl: //#define ir_fl 16 //tombol 4
if(menu!=5) lcd.clear();
menu=5; trimvol=0; hal=1; ir_menu=5;
break;
//select Front R -----------------------------------------------//
case ir_fr: //#define ir_fr 56 //tombol 5
if(menu!=5) lcd.clear();
menu=5; trimvol=1; hal=1; ir_menu=5;
break;
//select Center ------------------------------------------------//
case ir_cen: //#define ir_cen 90 //tombol 6
if(menu!=5) lcd.clear();
menu=5; trimvol=2; hal=1; ir_menu=5;
break;
//select Subwoofer ---------------------------------------------//
case ir_sub: //#define ir_sub 82 //tombol 9
if(menu!=5) lcd.clear();
menu=5; trimvol=3; hal=1; ir_menu=5;
break;
//select Rear L ------------------------------------------------//
case ir_rl: //#define ir_rl 66 //tombol 7
if(menu!=5) lcd.clear();
menu=5; trimvol=4; hal=1; ir_menu=5;
break;
//select Rear R ------------------------------------------------//
case ir_rr: //#define ir_rr 74 //tombol 8
if(menu!=5) lcd.clear();
menu=5; trimvol=5; hal=1; ir_menu=5;
break;
//select Function ---------------------------------------------//
case ir_func: //#define ir_func 104 //tombol 0
if(menu!=6) lcd.clear();
if(menu==6){func++; if(func>1) func=0;}
menu=6; hal=1; ir_menu=6;
break;
}
IrReceiver.resume();
ir_cl();
}
}
}
/*......................................
#define ir_ok 168 //tombol play
......................................*/
void setEqu(uint8_t x){
switch(constrain(x,0,4)){
case 0: bass=bass_1; middle=mid_1; treble=treb_1; break; // manual
case 1: bass=7; middle=7; treble=7; break; // Normal
case 2: bass=4; middle=10; treble=5; break; // Pop
case 3: bass=11; middle=5; treble=12; break; // Rock
case 4: bass=7; middle=7; treble=5; break; // Classic
}
setTone(0,bass);
setTone(1,middle);
setTone(2,treble);
}
void setSmode(uint8_t x){
switch(constrain(x,0,3)){
// 2.0 (fl,fr=on, rl,rr,sub,cn=off)
case 0: flm=0; frm=0; rlm=1; rrm=1; cnm=1; subm=1; break;
// 2.1 (fl,fr,sub=on, cn,rl,rr=off)
case 1: flm=0; frm=0; rlm=1; rrm=1; cnm=1; subm=0; break;
// 3.1 (fl,fr,cn,sub=on, rl,rr=off)
case 2: flm=0; frm=0; rlm=1; rrm=1; cnm=0; subm=0; break;
// 5.1 (fl,fr,cn,rl,rr,sub=on)
case 3: flm=0; frm=0; rlm=0; rrm=0; cnm=0; subm=0; break;
}
setMuteTrim(flm,frm,cnm,subm,rlm,rrm,0);
}
void setMute(){
mute=constrain(mute,0,1);
setMuteTrim(0,0,0,0,0,0,mute);
setFunction(mute,0,0);
}
void setFunc(){
surr=constrain(surr,0,1);
mix=constrain(mix,0,1);
setFeature(surr,mix);
}
//----------------- PT2322 ------------------
void setVolTrim(uint8_t x, uint8_t value){
uint8_t isValue=constrain(value,0,15);
switch(x){
case 0: PT2322_wireWrite(0b00010000 + (15 - isValue)); break; //fl
case 1: PT2322_wireWrite(0b00100000 + (15 - isValue)); break; //fr
case 2: PT2322_wireWrite(0b00110000 + (15 - isValue)); break; //cn
case 4: PT2322_wireWrite(0b01000000 + (15 - isValue)); break; //rl
case 5: PT2322_wireWrite(0b01010000 + (15 - isValue)); break; //rr
case 3: PT2322_wireWrite(0b01100000 + (15 - isValue)); break; //sub
}
}
void setFunction(uint8_t amute, uint8_t ddd, uint8_t tone_c){
uint8_t a,b,c;
if (amute==1) a = 0b00001000; else a = 0x00; //mute on
if (ddd==1) b = 0b00000100; else b = 0x00; //3D off
if (tone_c==1) c = 0b00000010; else c = 0x00; //tone defeat
PT2322_wireWrite(0b01110000 + a + b + c);
}
void setTone(uint8_t x, uint8_t value){
uint8_t xvalue = constrain(value,0,15);
uint8_t isValue = xvalue;
if (xvalue > 7) isValue = 23 - xvalue;
switch(x){
case 0: PT2322_wireWrite(0b10010000 + isValue); break; //bass
case 1: PT2322_wireWrite(0b10100000 + isValue); break; //middle
case 2: PT2322_wireWrite(0b10110000 + isValue); break; //treble
}
}
void setVolume(){
uint8_t isValue=constrain(volume,0,79);
uint8_t vm=mute;
setFunction(vm,0,0);
int8_t a = 79 - isValue;
int8_t vol_10 = a / 10;
int8_t vol_1 = a - vol_10 * 10;
Wire.beginTransmission(PT2322_address);
Wire.write(0b11100000 + vol_10);
Wire.write(0b11010000 + vol_1);
Wire.endTransmission();
}
void clearRegister(){
Wire.beginTransmission(PT2322_address);
Wire.write(0b11111111);
Wire.endTransmission();
}
void activateInSW(){
Wire.beginTransmission(PT2322_address);
Wire.write(0b11000111);
Wire.endTransmission();
}
void PT2322_wireWrite(char y){
Wire.beginTransmission(PT2322_address);
Wire.write(y);
Wire.endTransmission();
}
//-------------- end PT2322 -----------------
//----------------- PT2323 ------------------
void setInput(uint8_t x){
uint8_t in;
switch (constrain(x,0,4)){
case 0: in=0b11001011; break; // 1 input
case 1: in=0b11001010; break; // 2 input
case 2: in=0b11001001; break; // 3 input
case 3: in=0b11001000; break; // 4 input
case 4: in=0b11000111; break; // 6 CH input
}
PT2323_wireWrite(in);
}
void setMuteTrim(uint8_t vfl, uint8_t vfr, uint8_t vcn, uint8_t vsub, uint8_t vrl, uint8_t vrr, uint8_t all){
PT2323_wireWrite(0b11110000 + vfl);
PT2323_wireWrite(0b11110010 + vfr);
PT2323_wireWrite(0b11110100 + vcn);
PT2323_wireWrite(0b11110110 + vsub);
PT2323_wireWrite(0b11111000 + vrl);
PT2323_wireWrite(0b11111010 + vrr);
PT2323_wireWrite(0b11111110 + all);
}
void setFeature(uint8_t xsurr, uint8_t xmix){
PT2323_wireWrite(0b11010000 + xsurr);
PT2323_wireWrite(0b10010000 + xmix);
}
void PT2323_wireWrite(char y){
Wire.beginTransmission(PT2323_address);
Wire.write(y);
Wire.endTransmission();
}
// ----------------- end PT2323 ----------------------
// ---------- EEPROM -----------
void readEEPROM(){
evolume.get(0, volume);
ebass.get(0, bass);
emiddle.get(0, middle);
etreble.get(0, treble);
efl.get(0, fl);
efr.get(0, fr);
ecn.get(0, cn);
esub.get(0, sub);
erl.get(0, rl);
err.get(0, rr);
esurr.get(0, surr);
emix.get(0, mix);
einp.get(0, inp);
eequ.get(0, equ);
esmode.get(0, smode);
}
void updateEEPROM(){
evolume.put(0, volume);
ebass.put(0, bass);
emiddle.put(0, middle);
etreble.put(0, treble);
efl.put(0, fl);
efr.put(0, fr);
ecn.put(0, cn);
esub.put(0, sub);
erl.put(0, rl);
err.put(0, rr);
esurr.put(0, surr);
emix.put(0, mix);
einp.put(0, inp);
eequ.put(0, equ);
esmode.put(0, smode);
}
// -------- end EEPROM ---------
//end program