Тестирование кнопки INPUT, регулировка громкости при помощи энкодера, переключение 2.0IN 5.1IN (должна меняться индикация), при регулировке громкости индикатор должен показывать от 0 до 79.
Тестирование EEPROM - запоминание уровня громкости и выбора входа.
#define MUTE_OUT 0
#define GND5 13
#define SEG_G 2 // in51
#define DP 3 // in20
#define SEG_A 4 // out51
#define SEG_F 5 // out20
#define SEG_D 6
#define SEG_E 7
#define SEG_B 8 // stby
#define SEG_C 9 // mute
#define ENC_CLK 10 // энкодер контакт 1
#define ENC_DT 11 // энкодер контакт 2
#define PIN_IR 12 // вход IR
#define PIN_IN 1 // кнопка INPUT
#define GND1 A0
#define GND2 A1
#define GND3 A2
#define GND4 A3
// SDA A4
// SCL A5
#include <Encoder.h> // http://rcl-radio.ru/wp-content/uploads/2019/05/Encoder.zip
#include <MsTimer2.h> // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip
#include <Wire.h>
#include <PT2323.h> // http://rcl-radio.ru/wp-content/uploads/2019/06/PT2323-2.zip
#include <TDA7448.h> // http://rcl-radio.ru/wp-content/uploads/2019/08/TDA7448-1.zip
#include <EEPROM.h>
Encoder myEnc(ENC_DT, ENC_CLK);// DT, CLK
PT2323 pt;
TDA7448 tda;
int an, segm,i,menu,input,in,vol_reg;
byte a[4];
long oldPosition = -999,newPosition,times;
bool mute_led=0,power_led=0,in5_1_led=0,aux_led=0,out5_1_led=0,out2_1_led=0;
bool w,w1,dp_led;
void setup(){
Wire.begin();
MsTimer2::set(2, to_Timer);MsTimer2::start();
pinMode(PIN_IN,INPUT); // кнопка INPUT
pinMode(SEG_A,OUTPUT);
pinMode(SEG_B,OUTPUT);
pinMode(SEG_C,OUTPUT);
pinMode(SEG_D,OUTPUT);
pinMode(SEG_E,OUTPUT);
pinMode(SEG_F,OUTPUT);
pinMode(SEG_G,OUTPUT);
pinMode(DP,OUTPUT);
pinMode(GND1,OUTPUT);
pinMode(GND2,OUTPUT);
pinMode(GND3,OUTPUT);
pinMode(GND4,OUTPUT);
pinMode(GND5,OUTPUT);
pinMode(MUTE_OUT,OUTPUT);
// digitalWrite(MUTE_OUT,LOW);
digitalWrite(MUTE_OUT,HIGH);
input = EEPROM.read(0);vol_reg = EEPROM.read(1)-79;
if(input==0){in=0;}if(input==1){in=4;}
audio_pt();
audio_tda();
}
void loop(){
//// BUTTON + IR ////////////////////////////////////////////////
if(digitalRead(PIN_IN)==LOW && input==1){input=0;in=0;audio_pt;w=1;w1=1;times=millis();delay(200);}
if(digitalRead(PIN_IN)==LOW && input==0){input=1;in=4;audio_pt;w=1;w1=1;times=millis();delay(200);}
//// VOLUME ////////////////////////////////////////////////
if(menu==0){
if(input==0){aux_led=1;a[0]=2;a[1]=0;in5_1_led=0;dp_led=1;}
if(input==1){in5_1_led=1;a[0]=5;a[1]=1;aux_led=0;dp_led=1;}
if(newPosition != oldPosition){oldPosition = newPosition;enc_err();vol_reg=vol_reg+newPosition;w=1;w1=1;times=millis();vol_func();audio_tda();}
a[2]=(79+vol_reg)/10%10;
a[3]=(79+vol_reg)%10;
}
///////////////////////////////////////////////////////////
mute_led=0;power_led=0;out5_1_led=0;out2_1_led=0;
delay(50);
////////////////// EEPROM //////////////////////////////////////////////////////////////
if(millis()-times>5000 && w1==1){
EEPROM.update(0,in);EEPROM.update(1,vol_reg+79);
menu=0;w1=0;w=1;}
}// loop
void vol_func(){if(vol_reg>0){vol_reg=0;}if(vol_reg<-79){vol_reg=-79;}}
void enc_err(){if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}}
void to_Timer(){newPosition = myEnc.read()/4;
switch(i){
case 0: segm = 10; segment();segm=a[0];ch(DP,dp_led); an=0; anod(); segment();break;
case 1: segm = 10; segment();segm=a[1]; an=1; anod(); segment();break;
case 2: segm = 10; segment();segm=a[2]; an=2; anod(); segment();break;
case 3: segm = 10; segment();segm=a[3]; an=3; anod(); segment();break;
case 4: segm = 10; segment();
ch(SEG_C,mute_led);
ch(SEG_B,power_led);
ch(SEG_G,in5_1_led);
ch(DP,aux_led);
ch(SEG_A,out5_1_led);
ch(SEG_F,out2_1_led);
an=4; anod();break;
}
i++;if(i>4){i=0;}
}
void segment(){
switch(segm){
// A B C D E F G
case 0: ch(SEG_A,1);ch(SEG_B,1);ch(SEG_C,1);ch(SEG_D,1);ch(SEG_E,1);ch(SEG_F,1);ch(SEG_G,0);break;// 0
case 1: ch(SEG_A,0);ch(SEG_B,1);ch(SEG_C,1);ch(SEG_D,0);ch(SEG_E,0);ch(SEG_F,0);ch(SEG_G,0);break;// 1
case 2: ch(SEG_A,1);ch(SEG_B,1);ch(SEG_C,0);ch(SEG_D,1);ch(SEG_E,1);ch(SEG_F,0);ch(SEG_G,1);break;// 2
case 3: ch(SEG_A,1);ch(SEG_B,1);ch(SEG_C,1);ch(SEG_D,1);ch(SEG_E,0);ch(SEG_F,0);ch(SEG_G,1);break;// 3
case 4: ch(SEG_A,0);ch(SEG_B,1);ch(SEG_C,1);ch(SEG_D,0);ch(SEG_E,0);ch(SEG_F,1);ch(SEG_G,1);break;// 4
case 5: ch(SEG_A,1);ch(SEG_B,0);ch(SEG_C,1);ch(SEG_D,1);ch(SEG_E,0);ch(SEG_F,1);ch(SEG_G,1);break;// 5
case 6: ch(SEG_A,1);ch(SEG_B,0);ch(SEG_C,1);ch(SEG_D,1);ch(SEG_E,1);ch(SEG_F,1);ch(SEG_G,1);break;// 6
case 7: ch(SEG_A,1);ch(SEG_B,1);ch(SEG_C,1);ch(SEG_D,0);ch(SEG_E,0);ch(SEG_F,0);ch(SEG_G,0);break;// 7
case 8: ch(SEG_A,1);ch(SEG_B,1);ch(SEG_C,1);ch(SEG_D,1);ch(SEG_E,1);ch(SEG_F,1);ch(SEG_G,1);break;// 8
case 9: ch(SEG_A,1);ch(SEG_B,1);ch(SEG_C,1);ch(SEG_D,1);ch(SEG_E,0);ch(SEG_F,1);ch(SEG_G,1);break;// 9
case 10: ch(SEG_A,0);ch(SEG_B,0);ch(SEG_C,0);ch(SEG_D,0);ch(SEG_E,0);ch(SEG_F,0);ch(SEG_G,0);ch(DP,0);break;// пусто
}}
void anod(){
switch(an){
case 0:ch(GND1,0);ch(GND2,1);ch(GND3,1);ch(GND4,1);ch(GND5,1); break;
case 1:ch(GND1,1);ch(GND2,0);ch(GND3,1);ch(GND4,1);ch(GND5,1); break;
case 2:ch(GND1,1);ch(GND2,1);ch(GND3,0);ch(GND4,1);ch(GND5,1); break;
case 3:ch(GND1,1);ch(GND2,1);ch(GND3,1);ch(GND4,0);ch(GND5,1); break;
case 4:ch(GND1,1);ch(GND2,1);ch(GND3,1);ch(GND4,1);ch(GND5,0); break;
}}
void ch(int pin, int logic){digitalWrite(pin,logic);}
void audio_pt(){
pt.setInput(in); // входы 1...4 (0...3) или 6 моно (4)
pt.setMute(0,0,0,0,0,0,0); // MUTE OFF для выходов (0,0,0,0,0,0,0);
// MUTE ON для выходов (1,1,1,1,1,1,1);
// fl, fr, ct, sub, sl, sr, все выходы mute
pt.setFeature(0,0); // дополнительные функции 0...3
// 0 - Enhanced Surround Function Active
// 1 - Enhanced Surround Function Disabled
// 0 - Mixed Channel (0dB) Setup
// 1 - Mixed Channel (+6dB) Setup
}
void audio_tda(){
tda.setAtt(1,vol_reg);// 0 макс громк, -79(79) мин громк
tda.setAtt(2,vol_reg);
tda.setAtt(3,vol_reg);
tda.setAtt(4,vol_reg);
tda.setAtt(5,vol_reg);
tda.setAtt(6,vol_reg);
}