1

Тема: R2A15908SP

Протестировано!!!

libraries - Данный контент доступен только зарегистрированным пользователям.
datasheet - Данный контент доступен только зарегистрированным пользователям.

5 Input Selector 2ch Electronic Volume with Tone & Surround

The R2A15908SP is an optimum audio signal processor IC for TV. It has a 5ch input selector with mono switch,
surround, tone control (2band), input gain control and 2ch master volume. It can control all of these functions with I2C
bus.

http://forum.rcl-radio.ru/uploads/images/2020/09/b2c495e046133dd6aae4170cf44b4fc3.png

R2A15908SP.h

// Алксандр Лиман
// liman324@yandex.ru

#ifndef R2A15908SP_H
#define R2A15908SP_H
// address 7 bit
#define R2A15908SP_address 0b1000001 // 0x65 - 7 bit

//Sub addresses
#define VOLUME_L    0x00
#define VOLUME_R    0x01
#define INPUT_GAIN  0x02
#define STEREO_MODE 0x03
#define BASS_TREB   0x04


#include <Arduino.h>
class R2A15908SP
{
  public:
     R2A15908SP();
void setVolume_left(byte vol_l);        // volume left  -87...0 dB === byte 0...87
void setVolume_right(byte vol_r);       // volume right -87...0 dB === byte 0...87
void setIn_Gain(byte in, byte gain);    // in1...in5 === byte 0...4 /// mute === byte 7
                                        // gain_in 0...20 dB === byte 0...10 /// step 2 dB
void setStereo(byte stereo, byte mode); // byte 0 === stereo, byte 1 === Lch, byte 2 === Rch
                                        // byte 0 === Bypass, byte 1 === Tone, byte 2 === Tone&Surround Hi, byte 3 === Tone&Surround Low
void setTone(int bass, int treb);    // -14...14 dB === int -7...+7

  private:
	void writeWire(char a, char b);
};
	
#endif //R2A15908SP_H

R2A15908SP.cpp

#include <Arduino.h>
#include <Wire.h>
#include "R2A15908SP.h"

R2A15908SP::R2A15908SP(){
	Wire.begin();
}

void R2A15908SP::setVolume_left(byte vol_l){
  vol_l = ((87 - vol_l)  << 1);
  writeWire(VOLUME_L, vol_l);
}

void R2A15908SP::setVolume_right(byte vol_r){
  vol_r = ((87 - vol_r)  << 1);
  writeWire(VOLUME_R, vol_r);
}

void R2A15908SP::setIn_Gain(byte in, byte gain){
  byte sum_in_gain = (in << 5) + (gain << 1);
  writeWire(INPUT_GAIN, sum_in_gain);
}

void R2A15908SP::setStereo(byte stereo, byte mode){
  byte sum_st_md = (stereo << 6) + (mode << 4);
  writeWire(STEREO_MODE, sum_st_md);
}

void R2A15908SP::setTone(int bass, int treb){
  if(bass >= 0){bass = ((bass + 0b1000) << 4);}
  if(bass < 0){bass = (abs(bass) << 4);}
  if(treb >= 0){treb = treb + 0b1000;}
  if(treb < 0){treb = abs(treb);}
  byte sum_bass_treb = bass + treb;
  writeWire(BASS_TREB, sum_bass_treb);
}

void R2A15908SP::writeWire(char a, char b){
  Wire.beginTransmission(R2A15908SP_address);
  Wire.write (a);
  Wire.write (b);
  Wire.endTransmission();
}

test.ino

#include <Wire.h> 
#include <R2A15908SP.h> 
R2A15908SP ra;

void setup(){
   audio();
  delay(1000);
  }

void loop(){}

void audio(){
  ra.setVolume_left(80); // -87...0 dB === int 0...87
  ra.setVolume_right(80);// -87...0 dB === int 0...87 
  ra.setIn_Gain(0,0);    // IN 1...5 === byte 0...4 /// int 7 === mute
                         // GAIN 0...20 dB step 2 dB === int 0...10
  ra.setStereo(0,1);     // 0 = stereo / 1 = Lch / 2 = Rch
                         // 0 = bypass / 1 = tone / 2 = tone&surround_hi / 3 = tone&surround_low
  ra.setTone(0,0);     // bass and treb -14...14 dB step 2 dB === int -7...7
  }   

Скетч использует 2202 байт (6%) памяти устройства. Всего доступно 32256 байт.
Глобальные переменные используют 219 байт (10%) динамической памяти, оставляя 1829 байт для локальных переменных. Максимум: 2048 байт.

2

Re: R2A15908SP

#define IR_1 0x2FDD02F // Кнопка вверх
#define IR_2 0x2FD32CD // Кнопка вниз
#define IR_3 0x2FD906F // Кнопка >
#define IR_4 0x2FDF20D // Кнопка <
#define IR_5 0x2FD708F // Кнопка IN
#define IR_6 0x2FD00FF // Кнопка POWER
#define IR_7 0x2FD2AD5 // Кнопка MUTE

#include <Wire.h> 
#include <EEPROM.h>
#include <R2A15908SP.h> 
#include <boarddefs.h>
#include <IRremote.h>          // http://rcl-radio.ru/wp-content/uploads/2019/06/IRremote.zip
#include <Encoder.h>           // http://rcl-radio.ru/wp-content/uploads/2019/05/Encoder.zip
#include <LiquidCrystal_I2C.h> // http://forum.rcl-radio.ru/misc.php?action=pan_download&item=45&download=1
  R2A15908SP ra;
  Encoder myEnc(8, 9);//  D8, D9 = CLK, DT
  IRrecv irrecv(12);  //  D12 = IR
  decode_results ir; 
  LiquidCrystal_I2C lcd(0x27,16,2); // SDA, SCL
  byte a1[8] = {0b00000,0b10101,0b10101,0b10101,0b10101,0b10101,0b10101,0b00000};
  byte a2[8] = {0b00000,0b10100,0b10100,0b10100,0b10100,0b10100,0b10100,0b00000};
  byte a3[8] = {0b00000,0b10000,0b10000,0b10000,0b10000,0b10000,0b10000,0b00000}; 
  unsigned long oldPosition  = -999,newPosition,times,times1;
  byte z,z0,z1,w,w2,power,gr1,gr2,in,in_old,xd,www,mute;
  int mode,menu,vol,menu_in,x,gain0,gain1,gain2,gain3,gain4,gain5,bas,treb,ball,stereo;
  

void setup(){
  Serial.begin(9600);
  pinMode(7,INPUT); // кнопка энкодера
  OCR2A = 200; TCCR1B |= (1 << WGM22)|(1 << CS20)|(1 << CS21); TIMSK2 |= (1 << OCIE2A); // timer2
  Wire.begin();lcd.init();lcd.backlight();irrecv.enableIRIn();
  lcd.createChar(0,a1);lcd.createChar(1,a2);lcd.createChar(2,a3);
  lcd.setCursor(0,0);lcd.print(F("   R2A15908SP   "));
  delay(2000);lcd.clear();
  if(EEPROM.read(100)!=0){for(int i=0;i<101;i++){EEPROM.update(i,0);}}// очистка памяти при первом включении
  vol = EEPROM.read(0);in = EEPROM.read(1);bas = EEPROM.read(2)-7;treb = EEPROM.read(3)-7;ball = EEPROM.read(4)-6;
  stereo = EEPROM.read(5);mode = EEPROM.read(6);
  gain1 = EEPROM.read(10);gain2 = EEPROM.read(11);gain3 = EEPROM.read(12);gain4 = EEPROM.read(13);gain5 = EEPROM.read(14);
  switch(in){
     case 0: gain0 = gain1;break;
     case 1: gain0 = gain2;break;
     case 2: gain0 = gain3;break;
     case 3: gain0 = gain4;break;
     case 4: gain0 = gain5;break;}
  audio();
  }


 
void loop(){
  /////////////////// IR ///////////////////////////////////
 
  if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);irrecv.resume();times=millis();w=1;}// IR приемник - чтение, в мониторе порта отображаются коды кнопок
  if(ir.value==0){gr1=0;gr2=0;}// запрет нажатий не активных кнопок пульта
  
  if(power==0){
  if(ir.value==IR_2 && mute==0){menu++;gr1=0;gr2=0;cl2();times=millis();w=1;w2=1;if(menu>5){menu=0;}}// меню кнопка вверх 
  if(ir.value==IR_1 && mute==0){menu--;gr1=0;gr2=0;cl2();times=millis();w=1;w2=1;if(menu<0){menu=5;}}// меню кнопка вниз
  
  if(ir.value==IR_5){menu=0;in++;gr1=0;gr2=0;cl2();times=millis();w=1;w2=1;if(in>4){in = 0;}audio();}// IN
  
  if(ir.value==IR_7 && mute==0){mute=1;menu=100;;gr1=0;gr2=0;cl2();times=millis();w=1;w2=1;in_old=in;in=7;audio();lcd.setCursor(0,0);lcd.print(F("      MUTE      "));delay(300);}// MUTE
  if(ir.value==IR_7 && mute==1){mute=0;menu=0;;gr1=0;gr2=0;cl2();times=millis();w=1;w2=1;in=in_old;audio();delay(300);}// MUTE
  }

  if(ir.value==IR_6 && power==0){power=1;menu=100;gr1=0;gr2=0;cl2();times=millis();w=1;w2=1;in_old=in;in=7;audio();lcd.setCursor(0,0);lcd.print(F("   POWER OFF    "));delay(3000);lcd.noBacklight();}//  кнопка POWER OFF
  if(ir.value==IR_6 && power==1){power=0;menu=0;gr1=0;gr2=0;cl2();times=millis();w=1;w2=1;in=in_old;audio();lcd.setCursor(0,0);lcd.backlight();lcd.print(F("   POWER  ON    "));delay(1000);lcd.clear();}//  кнопка POWER OFF
  
 //////////////// INPUT MENU //////////////////////////////////////////////////////////
  if(power==0){
  if(digitalRead(7)==LOW && menu_in==0 && mute==0){x++;xd=1;delay(200);}
  if(digitalRead(7)==HIGH && menu_in==0 && x>0 && mute==0){xd=1;x=0;times=millis();times1=millis();w=1;w2=1;}
  if(x > 5){menu_in=1;lcd.clear();lcd.setCursor(0,0);lcd.print(F("   INPUT MENU    "));delay(1000);lcd.clear(); times1 = millis();}
  if(menu_in==1){menu=0;x=0;if(digitalRead(7)==LOW){times=millis();times1=millis();w=1;w2=1;in++;www=1;if(in>4){in = 0;}delay(200); }
  //gain
     switch(in){
     case 0: gain0 = gain1;break;
     case 1: gain0 = gain2;break;
     case 2: gain0 = gain3;break;
     case 3: gain0 = gain4;break;
     case 4: gain0 = gain5;break;}
     if (newPosition != oldPosition) {
    oldPosition = newPosition;
    gain0=gain0+newPosition;myEnc.write(0);newPosition=0;times=millis();times1=millis();w=1;w2=1;www=1;gain_func();audio();} 
   switch(in){
     case 0: gain1 = gain0;break;
     case 1: gain2 = gain0;break;
     case 2: gain3 = gain0;break;
     case 3: gain4 = gain0;break;
     case 4: gain5 = gain0;break;} 
    if(www==1){audio();www=0;}
    lcd.setCursor(5,1);lcd.print(" ");lcd.print(gain0*2);lcd.print(" ");lcd.setCursor(8,1);lcd.print(F(" dB"));
     // end gain
    lcd.setCursor(3,0);lcd.print(F("INPUT "));
    switch(in){
      case 0: lcd.print(F("AUX1"));break;
      case 1: lcd.print(F("AUX2"));break;
      case 2: lcd.print(F("AUX3"));break;
      case 3: lcd.print(F("AUX4"));break;
      case 4: lcd.print(F("AUX5"));break;}}  
  if(digitalRead(7)==HIGH && millis()-times1>3000 && menu_in==1){x=0;menu=-1;menu_in=0;times=millis();times1=millis();w=1;w2=1;lcd.clear();}
  if(digitalRead(7)==HIGH && xd == 1 && menu_in==0){menu++;times=millis();w=1;w2=1;xd=0;lcd.clear();if(menu>5){menu=0;}}
  }
  ///////////////// END INPUT MENU /////////////////////////////////////////////////////// 
 

 //////////////////// VOLUME /////////////////////////////////
 if(menu==0 && menu_in==0 && power==0){
     if(ir.value==IR_3){vol++;gr1=1;gr2=0;cl();times=millis();w=1;w2=1;vol_func();audio();}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){vol++;gr2=0;cl();times=millis();w=1;w2=1;vol_func();audio();}// кнопка >>>>>>
     if(ir.value==IR_4){vol--;gr1=0;gr2=1;cl();times=millis();w=1;w2=1;vol_func();audio();}// кнопка <
     if(ir.value==0xFFFFFFFF and gr2==1){vol--;gr1=0;cl();times=millis();w=1;w2=1;vol_func();audio();}// кнопка <<<<<<
  
   if (newPosition != oldPosition){oldPosition = newPosition;
     vol=vol+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;vol_func();audio();} 
     lcd.setCursor(0,0);lcd.print(F("VOLUME "));
     if(vol<10){lcd.setCursor(8,0);}else{lcd.setCursor(7,0);}lcd.print(" ");lcd.print(vol-12);lcd.print(" ");
     lcd.setCursor(12,0);
     switch(in){
      case 0: lcd.print(F("AUX1"));break;
      case 1: lcd.print(F("AUX2"));break;
      case 2: lcd.print(F("AUX3"));break;
      case 3: lcd.print(F("AUX4"));break;
      case 4: lcd.print(F("AUX5"));break;} 

   if(w2==1){
   for(z=0,z0=0,z1=0;z<=map(vol, 12,87, 0, 48);z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1,1);lcd.print(F("   "));}}
   if(z1==3){lcd.setCursor(z0,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0,1);lcd.write((uint8_t)2);}w2=0;}}

 ///////////////////////// BASS +/-14 dB /////////////////////////////////////////////////////////
   if(menu==1){
     if(ir.value==IR_3){bas++;gr1=1;gr2=0;cl3();times=millis();w=1;w2=1;bass_func();audio();}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){bas++;gr2=0;cl3();times=millis();w=1;w2=1;bass_func();audio();}// кнопка >>>>>>
     if(ir.value==IR_4){bas--;gr1=0;gr2=1;cl3();times=millis();w=1;w2=1;bass_func();audio();}// кнопка <
     if(ir.value==0xFFFFFFFF and gr2==1){bas--;gr1=0;cl3();times=millis();w=1;w2=1;bass_func();audio();}// кнопка <<<<<<
     
   if (newPosition != oldPosition) {
    oldPosition = newPosition;
    bas=bas+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;bass_func();audio();} 
   lcd.setCursor(0,0);lcd.print(F("BASS    "));
   if(bas>=0){lcd.print(F("+"));}lcd.print(bas*2);lcd.print(" ");lcd.setCursor(13,0);lcd.print(F("dB"));
   if(w2==1){
   for(z=0,z0=0,z1=0;z<=(bas*2+14+1);z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+3,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1+3,1);lcd.print(F("   "));}}
   if(z1==3){lcd.setCursor(z0+3,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+3,1);lcd.write((uint8_t)2);}w2=0;}} 
  /////////////////////// END BASS //////////////////////////////////    

///////////////////////// TREBLE +/-14 dB /////////////////////////////////////////////////////////
   if(menu==2){
     if(ir.value==IR_3){treb++;gr1=1;gr2=0;cl3();times=millis();w=1;w2=1;treb_func();audio();}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){treb++;gr2=0;cl3();times=millis();w=1;w2=1;treb_func();audio();}// кнопка >>>>>>
     if(ir.value==IR_4){treb--;gr1=0;gr2=1;cl3();times=millis();w=1;w2=1;treb_func();audio();}// кнопка <
     if(ir.value==0xFFFFFFFF and gr2==1){treb--;gr1=0;cl3();times=millis();w=1;w2=1;treb_func();audio();}// кнопка <<<<<<
    
   if (newPosition != oldPosition) {
    oldPosition = newPosition;
    treb=treb+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;treb_func();audio();} 
   lcd.setCursor(0,0);lcd.print(F("TREBLE  "));
   if(treb>=0){lcd.print(F("+"));}lcd.print(treb*2);lcd.print(" ");lcd.setCursor(13,0);lcd.print(F("dB"));
   if(w2==1){
   for(z=0,z0=0,z1=0;z<=(treb*2+14+1);z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+3,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1+3,1);lcd.print(F("   "));}}
   if(z1==3){lcd.setCursor(z0+3,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+3,1);lcd.write((uint8_t)2);}w2=0;}} 
  /////////////////////// END TREBLE //////////////////////////////////

 ////////////////// BALANCE /////////////////////////////////////////////////////////////////
   if(menu==3){
     if(ir.value==IR_3){ball++;gr1=1;gr2=0;cl3();times=millis();w=1;w2=1;ball_func();audio();}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){ball++;gr2=0;cl3();times=millis();w=1;w2=1;ball_func();audio();}// кнопка >>>>>>
     if(ir.value==IR_4){ball--;gr1=0;gr2=1;cl3();times=millis();w=1;w2=1;ball_func();audio();}// кнопка <
     if(ir.value==0xFFFFFFFF and gr2==1){ball--;gr1=0;cl3();times=millis();w=1;w2=1;ball_func();audio();}// кнопка <<<<<<
     
    if (newPosition != oldPosition) {
    oldPosition = newPosition;
    ball=ball+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;ball_func();audio();} 
  lcd.setCursor(0,0);
   if(ball>=0){lcd.print("-");}else{lcd.print("+");}
  lcd.print(abs(ball));lcd.print(" dB ");
  lcd.print(" <>  ");
   if(ball>=0){lcd.print("+");}else{lcd.print("-");}
  lcd.print(abs(ball));lcd.print(" dB ");
  if(w2==1){lcd.setCursor(ball+5,1);lcd.print(F("   "));
  if(ball==0){lcd.setCursor(ball+7,1);lcd.write((uint8_t)0);lcd.write((uint8_t)0);}
  if(ball>0){ lcd.setCursor(ball+8,1);lcd.write((uint8_t)0);}
  if(ball<0){ lcd.setCursor(ball+7,1);lcd.write((uint8_t)0);}
  lcd.print(F("   "));w2=0;}} 


/////////////// Stereo / Mono //////////////////////////
  if(menu==4){
     if(ir.value==IR_3){stereo++;gr1=1;gr2=0;cl3();times=millis();w=1;w2=1;if(stereo>2){stereo=0;}audio();}// кнопка > 
     if(ir.value==IR_4){stereo--;gr1=0;gr2=1;cl3();times=millis();w=1;w2=1;if(stereo<0){stereo=2;}audio();}// кнопка <
     
    if (newPosition != oldPosition) {
    oldPosition = newPosition;
    stereo=stereo+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;if(stereo>2){stereo=0;};if(stereo<0){stereo=2;}audio();} 
  lcd.setCursor(0,0);lcd.print(" Stereo / Mono  ");
  lcd.setCursor(0,1);
  switch(stereo){
    case 0: lcd.print("     STEREO     ");break;
    case 1: lcd.print("    Lch Mono    ");break;
    case 2: lcd.print("    Rch Mono    ");break;
    }}

///////////////  Mode Selector //////////////////////////
  if(menu==5){
     if(ir.value==IR_3){mode++;gr1=1;gr2=0;cl3();times=millis();w=1;w2=1;if(mode>3){mode=0;}audio();}// кнопка > 
     if(ir.value==IR_4){mode--;gr1=0;gr2=1;cl3();times=millis();w=1;w2=1;if(mode<0){mode=3;}audio();}// кнопка <
     
    if (newPosition != oldPosition) {
    oldPosition = newPosition;
    mode=mode+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;if(mode>3){mode=0;};if(mode<0){mode=3;}audio();} 
  lcd.setCursor(0,0);lcd.print(" Mode Selector  ");
  lcd.setCursor(0,1);
  switch(mode){
    case 0: lcd.print("     BYPASS     ");break;
    case 1: lcd.print("      TONE      ");break;
    case 2: lcd.print("Tone&Surround Hi");break;
    case 3: lcd.print("Tone&Surround Lo");break;
    }}    
     
 ///////////// EEPROM ////////////////////////////////////////
  if(millis()-times>5000 && w==1){
     EEPROM.write(0,vol);EEPROM.write(1,in);EEPROM.write(2,bas+7);EEPROM.write(3,treb+7);EEPROM.write(4,ball+6);
     EEPROM.write(5,stereo);EEPROM.write(6,mode);
     EEPROM.write(10,gain1);EEPROM.write(11,gain2);EEPROM.write(12,gain3);EEPROM.write(13,gain4);EEPROM.write(14,gain5);
     menu=0;w=0;w2=1;cl2();}
  }// LOOP

void ball_func(){if(ball>6){ball=6;}if(ball<-6){ball=-6;}}
void treb_func(){if(treb>7){treb=7;}if(treb<-7){treb=-7;}}
void bass_func(){if(bas>7){bas=7;}if(bas<-7){bas=-7;}}
void gain_func(){if(gain0>10){gain0=10;}if(gain0<0){gain0=0;}}  
void vol_func(){if(vol>87){vol=87;}if(vol<12){vol=12;}}
void cl(){ir.value=0;}
void cl1(){ir.value=0;delay(20);}
void cl2(){ir.value=0;lcd.clear();}
void cl3(){ir.value=0;delay(100);}


   
void audio(){
  ra.setVolume_left(vol-6+ball); // -87...0 dB === int 0...87
  ra.setVolume_right(vol-6-ball);// -87...0 dB === int 0...87 
  ra.setIn_Gain(in,gain0);    // IN 1...5 === byte 0...4 /// int 7 === mute
                         // GAIN 0...20 dB step 2 dB === int 0...10
  ra.setStereo(stereo,mode);     // 0 = stereo / 1 = Lch / 2 = Rch
                         // 0 = bypass / 1 = tone / 2 = tone&surround_hi / 3 = tone&surround_low
  ra.setTone(bas,treb);     // bass and treb -14...14 dB step 2 dB === int -7...7
  }   

ISR (TIMER2_COMPA_vect){newPosition = myEnc.read()/4;} 

Re: R2A15908SP

все круто рабочий скетч. автору большое спасибо. дал вторую жизнь  "microlab solo 4c"(там установлен аудиопроцессор R2A15908SP ) .
я в своё время для tda7313 прошивку писал, и не по наслышке знаю с какими сложностями может столкнутся начинающий ардуинщик. кому интересен скетч для tda7313 пишите.

4

Re: R2A15908SP

Доброго дня. Немного не в тему, но думаю выражу желание многих радиолюбителей. Понимаю, что с Китайской промышленностью не поспоришь в ценовой политике, но всё же вещь созданная своими руками. Отвлёкся я, короче, по делу-у Вас множество схем аудиопроцессоров различного качества. Но хотелось бы собрать полноценное воспроизводящее устройство, как хорошего качества МП3 плеер, оснащённый процессором обработки звука. Оконечный усилитель каждый выберет себе по вкусу. Есть модуль Ардуино DF плеер. Он незаслуженно не рассматривается радиолюбителями, при этом имеет отменные параметры ЦАП. Единственный его недостаток это затруднённая библиотека для аудиотреков. Я баловался с ним, применив обычное кнопочное управление и отметил отличное качество звука на линейном выходе. Предлагаю админу рассмотреть этот плеер.

5

Re: R2A15908SP

Ардуино DF плеер - у меня есть этот плеер, он работает автономно отлично, но в паре с ардуино просто ужасно, надо переименовывать все файлы в формат 0001, 0002 ... есть ограничения по кол-ву файлов в папке. Была попытка создать проект, но ни чего не вышло, работает, но не так как хотелось.

6

Re: R2A15908SP

Привет, подскажите в чем может быть проблема ? адекватно работает только сетевая кнопка, АUX постоянно перебирает входы http://forum.rcl-radio.ru/uploads/images/2023/12/fa44ce0316d3f45f45eabac7c3b810b7.jpeg

7

Re: R2A15908SP

Мне нужно видеть скетч

8

Re: R2A15908SP

Скетч с этой страницы скопирован

9

Re: R2A15908SP

Судя по скетчу, кнопка in должна иметь подтягивающий резистор к GND и при нажатии кнопки замыкаться на +5В

10 (2023-12-16 19:45:07 отредактировано skorost69)

Re: R2A15908SP

привезать ? UNPUT PULLUP

11

Re: R2A15908SP

Можно, но тогда все что связано с if(digitalRead(7)== надо инвертировать

12

Re: R2A15908SP

помогло , но появилось это при переходе по меню - регулировки баса и высоких, после не реагирует ни на одну кнопку, энкодер не подключенhttp://forum.rcl-radio.ru/uploads/images/2023/12/83efcf75b463216a2bb8fd377d320b53.jpeg

13

Re: R2A15908SP

В setup() перед запросом переменных из EEPROM добавьте:

if(EEPROM.read(100)!=0){for(int i=0;i<101;i++){EEPROM.update(i,0);}}// очистка памяти при первом включении

14

Re: R2A15908SP

Благодарю! заработало. Скетч который выложен в статье - не работает, я его первый раз скачивал.

15

Re: R2A15908SP

Я внес в статью дополнительный код и текст.

16

Re: R2A15908SP

спасибо

17

Re: R2A15908SP

Я правильно понял - инвертировать if(digitalRead(7) это с HIGH на LOW ? подскажите ардуино про мини могу использовать ? дело в том что мне не нужны кнопки, энкодер - все с пульта хочу сделать.

18

Re: R2A15908SP

Прочитал я внимательно статью, там нет кнопки INPUT, есть только энкодер, в энкодере подтягивающие резисторы стоят. Скетч нормально без энкодера работать не будет.

19

Re: R2A15908SP

может много прошу) я не силен в программировании а можно от него избавиться ?

20

Re: R2A15908SP

делаю проект небольшого усилителя , с статье в любом случае автора скетча упомяну https://dzen.ru/id/637606fce37a9d144c70c60a , но не хотелось бы не допиленный под свою задумку выкладыватьhttp://forum.rcl-radio.ru/uploads/images/2023/12/186450313d2730d5ab39fab5483ff721.jpg

21

Re: R2A15908SP

Тестируйте

#define IR_1 0x33B8A05F // Кнопка вверх
#define IR_2 0x33B8609F // Кнопка вниз
#define IR_3 0x33B810EF // Кнопка >
#define IR_4 0x33B8E01F // Кнопка <
#define IR_5 0x33B844BB // Кнопка IN
#define IR_6 0x33B800FF // Кнопка POWER
#define IR_7 0x33B8946B // Кнопка MUTE


#include <Wire.h> 
#include <EEPROM.h>
#include <R2A15908SP.h> 
#include <boarddefs.h>
#include <IRremote.h>          // http://rcl-radio.ru/wp-content/uploads/2019/06/IRremote.zip
#include <LiquidCrystal_I2C.h> // http://forum.rcl-radio.ru/misc.php?action=pan_download&item=45&download=1
  R2A15908SP ra;
  IRrecv irrecv(12);  //  D12 = IR
  decode_results ir; 
  LiquidCrystal_I2C lcd(0x27,16,2); // SDA, SCL
  byte a1[8] = {0b00000,0b10101,0b10101,0b10101,0b10101,0b10101,0b10101,0b00000};
  byte a2[8] = {0b00000,0b10100,0b10100,0b10100,0b10100,0b10100,0b10100,0b00000};
  byte a3[8] = {0b00000,0b10000,0b10000,0b10000,0b10000,0b10000,0b10000,0b00000}; 
  unsigned long oldPosition  = -999,newPosition,times,times1,times2;
  byte z,z0,z1,w,w2=1,power,gr1,gr2,in,in_old,xd,www,mute;
  int mode,menu,vol,menu_in,x,gain0,gain1,gain2,gain3,gain4,gain5,bas,treb,ball,stereo;
  

void setup(){
  Serial.begin(9600);
  Wire.begin();lcd.init();lcd.backlight();irrecv.enableIRIn();
  lcd.createChar(0,a1);lcd.createChar(1,a2);lcd.createChar(2,a3);
  lcd.setCursor(0,0);lcd.print(F("   R2A15908SP   "));
  delay(2000);lcd.clear();
  if(EEPROM.read(100)!=0){for(int i=0;i<101;i++){EEPROM.update(i,0);}}// очистка памяти при первом включении
  vol = EEPROM.read(0);in = EEPROM.read(1);bas = EEPROM.read(2)-7;treb = EEPROM.read(3)-7;ball = EEPROM.read(4)-6;
  stereo = EEPROM.read(5);mode = EEPROM.read(6);
  gain1 = EEPROM.read(10);gain2 = EEPROM.read(11);gain3 = EEPROM.read(12);gain4 = EEPROM.read(13);gain5 = EEPROM.read(14);
  switch(in){
     case 0: gain0 = gain1;break;
     case 1: gain0 = gain2;break;
     case 2: gain0 = gain3;break;
     case 3: gain0 = gain4;break;
     case 4: gain0 = gain5;break;}
  audio();
  }


 
void loop(){
  /////////////////// IR ///////////////////////////////////
 
  if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);irrecv.resume();times=millis();w=1;}// IR приемник - чтение, в мониторе порта отображаются коды кнопок
  if(ir.value==0){gr1=0;gr2=0;}// запрет нажатий не активных кнопок пульта
  
  if(power==0){
  if(ir.value==IR_2 && mute==0){menu++;gr1=0;gr2=0;cl2();times=millis();w=1;w2=1;if(menu>5){menu=0;}}// меню кнопка вверх 
  if(ir.value==IR_1 && mute==0){menu--;gr1=0;gr2=0;cl2();times=millis();w=1;w2=1;if(menu<0){menu=5;}}// меню кнопка вниз
  
  if(ir.value==IR_5){menu=6;in++;gr1=0;gr2=0;cl2();times2=millis();w=1;w2=1;if(in>4){in = 0;}audio();}// IN
  
  if(ir.value==IR_7 && mute==0){mute=1;menu=100;;gr1=0;gr2=0;cl2();times=millis();w=1;w2=1;in_old=in;in=7;audio();lcd.setCursor(0,0);lcd.print(F("      MUTE      "));delay(300);}// MUTE
  if(ir.value==IR_7 && mute==1){mute=0;menu=0;;gr1=0;gr2=0;cl2();times=millis();w=1;w2=1;in=in_old;audio();delay(300);}// MUTE
  }

  if(ir.value==IR_6 && power==0){power=1;menu=100;gr1=0;gr2=0;cl2();times=millis();w=1;w2=1;in_old=in;in=7;audio();lcd.setCursor(0,0);lcd.print(F("   POWER OFF    "));delay(3000);lcd.noBacklight();}//  кнопка POWER OFF
  if(ir.value==IR_6 && power==1){power=0;menu=0;gr1=0;gr2=0;cl2();times=millis();w=1;w2=1;in=in_old;audio();lcd.setCursor(0,0);lcd.backlight();lcd.print(F("   POWER  ON    "));delay(1000);lcd.clear();}//  кнопка POWER OFF
  
 
 //////////////////// VOLUME /////////////////////////////////
 if(menu==0){
     if(ir.value==IR_3){vol++;gr1=1;gr2=0;cl();times=millis();w=1;w2=1;vol_func();audio();}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){vol++;gr2=0;cl();times=millis();w=1;w2=1;vol_func();audio();}// кнопка >>>>>>
     if(ir.value==IR_4){vol--;gr1=0;gr2=1;cl();times=millis();w=1;w2=1;vol_func();audio();}// кнопка <
     if(ir.value==0xFFFFFFFF and gr2==1){vol--;gr1=0;cl();times=millis();w=1;w2=1;vol_func();audio();}// кнопка <<<<<<
  
     lcd.setCursor(0,0);lcd.print(F("VOLUME "));
     if(vol<10){lcd.setCursor(8,0);}else{lcd.setCursor(7,0);}lcd.print(" ");lcd.print(vol-12);lcd.print(" ");
     lcd.setCursor(12,0);
     switch(in){
      case 0: lcd.print(F("AUX1"));break;
      case 1: lcd.print(F("AUX2"));break;
      case 2: lcd.print(F("AUX3"));break;
      case 3: lcd.print(F("AUX4"));break;
      case 4: lcd.print(F("AUX5"));break;} 

   if(w2==1){
   for(z=0,z0=0,z1=0;z<=map(vol, 12,87, 0, 48);z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1,1);lcd.print(F("   "));}}
   if(z1==3){lcd.setCursor(z0,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0,1);lcd.write((uint8_t)2);}w2=0;}}

 ///////////////////////// BASS +/-14 dB /////////////////////////////////////////////////////////
   if(menu==1){
     if(ir.value==IR_3){bas++;gr1=1;gr2=0;cl3();times=millis();w=1;w2=1;bass_func();audio();}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){bas++;gr2=0;cl3();times=millis();w=1;w2=1;bass_func();audio();}// кнопка >>>>>>
     if(ir.value==IR_4){bas--;gr1=0;gr2=1;cl3();times=millis();w=1;w2=1;bass_func();audio();}// кнопка <
     if(ir.value==0xFFFFFFFF and gr2==1){bas--;gr1=0;cl3();times=millis();w=1;w2=1;bass_func();audio();}// кнопка <<<<<<
     
   lcd.setCursor(0,0);lcd.print(F("BASS    "));
   if(bas>=0){lcd.print(F("+"));}lcd.print(bas*2);lcd.print(" ");lcd.setCursor(13,0);lcd.print(F("dB"));
   if(w2==1){
   for(z=0,z0=0,z1=0;z<=(bas*2+14+1);z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+3,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1+3,1);lcd.print(F("   "));}}
   if(z1==3){lcd.setCursor(z0+3,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+3,1);lcd.write((uint8_t)2);}w2=0;}} 
  /////////////////////// END BASS //////////////////////////////////    

///////////////////////// TREBLE +/-14 dB /////////////////////////////////////////////////////////
   if(menu==2){
     if(ir.value==IR_3){treb++;gr1=1;gr2=0;cl3();times=millis();w=1;w2=1;treb_func();audio();}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){treb++;gr2=0;cl3();times=millis();w=1;w2=1;treb_func();audio();}// кнопка >>>>>>
     if(ir.value==IR_4){treb--;gr1=0;gr2=1;cl3();times=millis();w=1;w2=1;treb_func();audio();}// кнопка <
     if(ir.value==0xFFFFFFFF and gr2==1){treb--;gr1=0;cl3();times=millis();w=1;w2=1;treb_func();audio();}// кнопка <<<<<<
    
  
   lcd.setCursor(0,0);lcd.print(F("TREBLE  "));
   if(treb>=0){lcd.print(F("+"));}lcd.print(treb*2);lcd.print(" ");lcd.setCursor(13,0);lcd.print(F("dB"));
   if(w2==1){
   for(z=0,z0=0,z1=0;z<=(treb*2+14+1);z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+3,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1+3,1);lcd.print(F("   "));}}
   if(z1==3){lcd.setCursor(z0+3,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+3,1);lcd.write((uint8_t)2);}w2=0;}} 
  /////////////////////// END TREBLE //////////////////////////////////

 ////////////////// BALANCE /////////////////////////////////////////////////////////////////
   if(menu==3){
     if(ir.value==IR_3){ball++;gr1=1;gr2=0;cl3();times=millis();w=1;w2=1;ball_func();audio();}// кнопка > 
     if(ir.value==IR_4){ball--;gr1=0;gr2=1;cl3();times=millis();w=1;w2=1;ball_func();audio();}// кнопка <
     
  lcd.setCursor(0,0);
   if(ball>=0){lcd.print("-");}else{lcd.print("+");}
  lcd.print(abs(ball));lcd.print(" dB ");
  lcd.print(" <>  ");
   if(ball>=0){lcd.print("+");}else{lcd.print("-");}
  lcd.print(abs(ball));lcd.print(" dB ");
  if(w2==1){lcd.setCursor(ball+5,1);lcd.print(F("   "));
  if(ball==0){lcd.setCursor(ball+7,1);lcd.write((uint8_t)0);lcd.write((uint8_t)0);}
  if(ball>0){ lcd.setCursor(ball+8,1);lcd.write((uint8_t)0);}
  if(ball<0){ lcd.setCursor(ball+7,1);lcd.write((uint8_t)0);}
  lcd.print(F("   "));w2=0;}} 


/////////////// Stereo / Mono //////////////////////////
  if(menu==4){
     if(ir.value==IR_3){stereo++;gr1=1;gr2=0;cl3();times=millis();w=1;w2=1;if(stereo>2){stereo=0;}audio();}// кнопка > 
     if(ir.value==IR_4){stereo--;gr1=0;gr2=1;cl3();times=millis();w=1;w2=1;if(stereo<0){stereo=2;}audio();}// кнопка <
     
   
  lcd.setCursor(0,0);lcd.print(" Stereo / Mono  ");
  lcd.setCursor(0,1);
  switch(stereo){
    case 0: lcd.print("     STEREO     ");break;
    case 1: lcd.print("    Lch Mono    ");break;
    case 2: lcd.print("    Rch Mono    ");break;
    }}

///////////////  Mode Selector //////////////////////////
  if(menu==5){
     if(ir.value==IR_3){mode++;gr1=1;gr2=0;cl3();times=millis();w=1;w2=1;if(mode>3){mode=0;}audio();}// кнопка > 
     if(ir.value==IR_4){mode--;gr1=0;gr2=1;cl3();times=millis();w=1;w2=1;if(mode<0){mode=3;}audio();}// кнопка <
     
   
  lcd.setCursor(0,0);lcd.print(" Mode Selector  ");
  lcd.setCursor(0,1);
  switch(mode){
    case 0: lcd.print("     BYPASS     ");break;
    case 1: lcd.print("      TONE      ");break;
    case 2: lcd.print("Tone&Surround Hi");break;
    case 3: lcd.print("Tone&Surround Lo");break;
    }}   

  //////////////// INPUT MENU //////////////////////////////////////////////////////////
  if(menu==6){
  //gain
     switch(in){
     case 0: gain0 = gain1;break;
     case 1: gain0 = gain2;break;
     case 2: gain0 = gain3;break;
     case 3: gain0 = gain4;break;
     case 4: gain0 = gain5;break;}

     if(ir.value==IR_3){gain0++;gr1=1;gr2=0;cl3();times=millis();www=1;w=1;w2=1;vol_func();}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){gain0++;gr2=0;cl3();times=millis();www=1;w=1;w2=1;vol_func();}// кнопка >>>>>>
     if(ir.value==IR_4){gain0--;gr1=0;gr2=1;cl3();times=millis();www=1;w=1;w2=1;vol_func();}// кнопка <
     if(ir.value==0xFFFFFFFF and gr2==1){gain0--;gr1=0;cl3();times=millis();www=1;w=1;w2=1;vol_func();}// кнопка <<<<<<

   switch(in){
     case 0: gain1 = gain0;break;
     case 1: gain2 = gain0;break;
     case 2: gain3 = gain0;break;
     case 3: gain4 = gain0;break;
     case 4: gain5 = gain0;break;} 
   
    if(www==1){audio();www=0;}
    lcd.setCursor(5,1);lcd.print(" ");lcd.print(gain0*2);lcd.print(" ");lcd.setCursor(8,1);lcd.print(F(" dB"));
     // end gain
    lcd.setCursor(3,0);lcd.print(F("INPUT "));
    switch(in){
      case 0: lcd.print(F("AUX1"));break;
      case 1: lcd.print(F("AUX2"));break;
      case 2: lcd.print(F("AUX3"));break;
      case 3: lcd.print(F("AUX4"));break;
      case 4: lcd.print(F("AUX5"));break;}
      
      }     
     
 ///////////// EEPROM ////////////////////////////////////////
  if(millis()-times>3000 && w==1 && power==0 && mute==0){
     EEPROM.write(0,vol);EEPROM.write(1,in);EEPROM.write(2,bas+7);EEPROM.write(3,treb+7);EEPROM.write(4,ball+6);
     EEPROM.write(5,stereo);EEPROM.write(6,mode);
     EEPROM.write(10,gain1);EEPROM.write(11,gain2);EEPROM.write(12,gain3);EEPROM.write(13,gain4);EEPROM.write(14,gain5);
     menu=0;w=0;w2=1;cl2();}
  }// LOOP

void ball_func(){if(ball>6){ball=6;}if(ball<-6){ball=-6;}}
void treb_func(){if(treb>7){treb=7;}if(treb<-7){treb=-7;}}
void bass_func(){if(bas>7){bas=7;}if(bas<-7){bas=-7;}}
void gain_func(){if(gain0>10){gain0=10;}if(gain0<0){gain0=0;}}  
void vol_func(){if(vol>87){vol=87;}if(vol<12){vol=12;}}
void cl(){ir.value=0;}
void cl1(){ir.value=0;delay(20);}
void cl2(){ir.value=0;lcd.clear();}
void cl3(){ir.value=0;delay(100);}


   
void audio(){
  ra.setVolume_left(vol-6+ball); // -87...0 dB === int 0...87
  ra.setVolume_right(vol-6-ball);// -87...0 dB === int 0...87 
  ra.setIn_Gain(in,gain0);    // IN 1...5 === byte 0...4 /// int 7 === mute
                         // GAIN 0...20 dB step 2 dB === int 0...10
  ra.setStereo(stereo,mode);     // 0 = stereo / 1 = Lch / 2 = Rch
                         // 0 = bypass / 1 = tone / 2 = tone&surround_hi / 3 = tone&surround_low
  ra.setTone(bas,treb);     // bass and treb -14...14 dB step 2 dB === int -7...7
  }   

22

Re: R2A15908SP

Благодарю! по окончании проекта отпишусь а вывести выход управления Standby можно ? усилитель LA 4450 ей нужно подать 5 вольт в режиме ОN  и OFF - 0

23

Re: R2A15908SP

а вывести выход управления Standby можно ? усилитель LA 4450 ей нужно подать 5 вольт в режиме ОN  и OFF - 0

D13 - выход управления STANDBY

#define IR_1 0x33B8A05F // Кнопка вверх
#define IR_2 0x33B8609F // Кнопка вниз
#define IR_3 0x33B810EF // Кнопка >
#define IR_4 0x33B8E01F // Кнопка <
#define IR_5 0x33B844BB // Кнопка IN
#define IR_6 0x33B800FF // Кнопка POWER
#define IR_7 0x33B8946B // Кнопка MUTE


#include <Wire.h> 
#include <EEPROM.h>
#include <R2A15908SP.h> 
#include <boarddefs.h>
#include <IRremote.h>          // http://rcl-radio.ru/wp-content/uploads/2019/06/IRremote.zip
#include <LiquidCrystal_I2C.h> // http://forum.rcl-radio.ru/misc.php?action=pan_download&item=45&download=1
  R2A15908SP ra;
  IRrecv irrecv(12);  //  D12 = IR
  decode_results ir; 
  LiquidCrystal_I2C lcd(0x27,16,2); // SDA, SCL
  byte a1[8] = {0b00000,0b10101,0b10101,0b10101,0b10101,0b10101,0b10101,0b00000};
  byte a2[8] = {0b00000,0b10100,0b10100,0b10100,0b10100,0b10100,0b10100,0b00000};
  byte a3[8] = {0b00000,0b10000,0b10000,0b10000,0b10000,0b10000,0b10000,0b00000}; 
  unsigned long oldPosition  = -999,newPosition,times,times1,times2;
  byte z,z0,z1,w,w2=1,power,gr1,gr2,in,in_old,xd,www,mute;
  int mode,menu,vol,menu_in,x,gain0,gain1,gain2,gain3,gain4,gain5,bas,treb,ball,stereo;
  

void setup(){
  Serial.begin(9600);
  Wire.begin();lcd.init();lcd.backlight();irrecv.enableIRIn();
  lcd.createChar(0,a1);lcd.createChar(1,a2);lcd.createChar(2,a3);
  lcd.setCursor(0,0);lcd.print(F("   R2A15908SP   "));
  delay(2000);lcd.clear();
  pinMode(13,OUTPUT);
  if(EEPROM.read(100)!=0){for(int i=0;i<101;i++){EEPROM.update(i,0);}}// очистка памяти при первом включении
  vol = EEPROM.read(0);in = EEPROM.read(1);bas = EEPROM.read(2)-7;treb = EEPROM.read(3)-7;ball = EEPROM.read(4)-6;
  stereo = EEPROM.read(5);mode = EEPROM.read(6);
  gain1 = EEPROM.read(10);gain2 = EEPROM.read(11);gain3 = EEPROM.read(12);gain4 = EEPROM.read(13);gain5 = EEPROM.read(14);
  switch(in){
     case 0: gain0 = gain1;break;
     case 1: gain0 = gain2;break;
     case 2: gain0 = gain3;break;
     case 3: gain0 = gain4;break;
     case 4: gain0 = gain5;break;}
  audio();
  }


 
void loop(){
  /////////////////// IR ///////////////////////////////////
 
  if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);irrecv.resume();times=millis();w=1;}// IR приемник - чтение, в мониторе порта отображаются коды кнопок
  if(ir.value==0){gr1=0;gr2=0;}// запрет нажатий не активных кнопок пульта
  
  if(power==0){
  if(ir.value==IR_2 && mute==0){menu++;gr1=0;gr2=0;cl2();times=millis();w=1;w2=1;if(menu>5){menu=0;}}// меню кнопка вверх 
  if(ir.value==IR_1 && mute==0){menu--;gr1=0;gr2=0;cl2();times=millis();w=1;w2=1;if(menu<0){menu=5;}}// меню кнопка вниз
  
  if(ir.value==IR_5){menu=6;in++;gr1=0;gr2=0;cl2();times2=millis();w=1;w2=1;if(in>4){in = 0;}audio();}// IN
  
  if(ir.value==IR_7 && mute==0){mute=1;menu=100;;gr1=0;gr2=0;cl2();times=millis();w=1;w2=1;in_old=in;in=7;audio();lcd.setCursor(0,0);lcd.print(F("      MUTE      "));delay(300);}// MUTE
  if(ir.value==IR_7 && mute==1){mute=0;menu=0;;gr1=0;gr2=0;cl2();times=millis();w=1;w2=1;in=in_old;audio();delay(300);}// MUTE
  }

  if(ir.value==IR_6 && power==0){power=1;menu=100;gr1=0;gr2=0;cl2();times=millis();w=1;w2=1;in_old=in;in=7;audio();lcd.setCursor(0,0);lcd.print(F("   POWER OFF    "));delay(3000);lcd.noBacklight();}//  кнопка POWER OFF
  if(ir.value==IR_6 && power==1){power=0;menu=0;gr1=0;gr2=0;cl2();times=millis();w=1;w2=1;in=in_old;audio();lcd.setCursor(0,0);lcd.backlight();lcd.print(F("   POWER  ON    "));delay(1000);lcd.clear();}//  кнопка POWER OFF
  
 if(power==0){digitalWrite(13,HIGH);}else{digitalWrite(13,LOW);}
 //////////////////// VOLUME /////////////////////////////////
 if(menu==0){
     if(ir.value==IR_3){vol++;gr1=1;gr2=0;cl();times=millis();w=1;w2=1;vol_func();audio();}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){vol++;gr2=0;cl();times=millis();w=1;w2=1;vol_func();audio();}// кнопка >>>>>>
     if(ir.value==IR_4){vol--;gr1=0;gr2=1;cl();times=millis();w=1;w2=1;vol_func();audio();}// кнопка <
     if(ir.value==0xFFFFFFFF and gr2==1){vol--;gr1=0;cl();times=millis();w=1;w2=1;vol_func();audio();}// кнопка <<<<<<
  
     lcd.setCursor(0,0);lcd.print(F("VOLUME "));
     if(vol<10){lcd.setCursor(8,0);}else{lcd.setCursor(7,0);}lcd.print(" ");lcd.print(vol-12);lcd.print(" ");
     lcd.setCursor(12,0);
     switch(in){
      case 0: lcd.print(F("AUX1"));break;
      case 1: lcd.print(F("AUX2"));break;
      case 2: lcd.print(F("AUX3"));break;
      case 3: lcd.print(F("AUX4"));break;
      case 4: lcd.print(F("AUX5"));break;} 

   if(w2==1){
   for(z=0,z0=0,z1=0;z<=map(vol, 12,87, 0, 48);z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1,1);lcd.print(F("   "));}}
   if(z1==3){lcd.setCursor(z0,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0,1);lcd.write((uint8_t)2);}w2=0;}}

 ///////////////////////// BASS +/-14 dB /////////////////////////////////////////////////////////
   if(menu==1){
     if(ir.value==IR_3){bas++;gr1=1;gr2=0;cl3();times=millis();w=1;w2=1;bass_func();audio();}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){bas++;gr2=0;cl3();times=millis();w=1;w2=1;bass_func();audio();}// кнопка >>>>>>
     if(ir.value==IR_4){bas--;gr1=0;gr2=1;cl3();times=millis();w=1;w2=1;bass_func();audio();}// кнопка <
     if(ir.value==0xFFFFFFFF and gr2==1){bas--;gr1=0;cl3();times=millis();w=1;w2=1;bass_func();audio();}// кнопка <<<<<<
     
   lcd.setCursor(0,0);lcd.print(F("BASS    "));
   if(bas>=0){lcd.print(F("+"));}lcd.print(bas*2);lcd.print(" ");lcd.setCursor(13,0);lcd.print(F("dB"));
   if(w2==1){
   for(z=0,z0=0,z1=0;z<=(bas*2+14+1);z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+3,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1+3,1);lcd.print(F("   "));}}
   if(z1==3){lcd.setCursor(z0+3,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+3,1);lcd.write((uint8_t)2);}w2=0;}} 
  /////////////////////// END BASS //////////////////////////////////    

///////////////////////// TREBLE +/-14 dB /////////////////////////////////////////////////////////
   if(menu==2){
     if(ir.value==IR_3){treb++;gr1=1;gr2=0;cl3();times=millis();w=1;w2=1;treb_func();audio();}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){treb++;gr2=0;cl3();times=millis();w=1;w2=1;treb_func();audio();}// кнопка >>>>>>
     if(ir.value==IR_4){treb--;gr1=0;gr2=1;cl3();times=millis();w=1;w2=1;treb_func();audio();}// кнопка <
     if(ir.value==0xFFFFFFFF and gr2==1){treb--;gr1=0;cl3();times=millis();w=1;w2=1;treb_func();audio();}// кнопка <<<<<<
    
  
   lcd.setCursor(0,0);lcd.print(F("TREBLE  "));
   if(treb>=0){lcd.print(F("+"));}lcd.print(treb*2);lcd.print(" ");lcd.setCursor(13,0);lcd.print(F("dB"));
   if(w2==1){
   for(z=0,z0=0,z1=0;z<=(treb*2+14+1);z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+3,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1+3,1);lcd.print(F("   "));}}
   if(z1==3){lcd.setCursor(z0+3,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+3,1);lcd.write((uint8_t)2);}w2=0;}} 
  /////////////////////// END TREBLE //////////////////////////////////

 ////////////////// BALANCE /////////////////////////////////////////////////////////////////
   if(menu==3){
     if(ir.value==IR_3){ball++;gr1=1;gr2=0;cl3();times=millis();w=1;w2=1;ball_func();audio();}// кнопка > 
     if(ir.value==IR_4){ball--;gr1=0;gr2=1;cl3();times=millis();w=1;w2=1;ball_func();audio();}// кнопка <
     
  lcd.setCursor(0,0);
   if(ball>=0){lcd.print("-");}else{lcd.print("+");}
  lcd.print(abs(ball));lcd.print(" dB ");
  lcd.print(" <>  ");
   if(ball>=0){lcd.print("+");}else{lcd.print("-");}
  lcd.print(abs(ball));lcd.print(" dB ");
  if(w2==1){lcd.setCursor(ball+5,1);lcd.print(F("   "));
  if(ball==0){lcd.setCursor(ball+7,1);lcd.write((uint8_t)0);lcd.write((uint8_t)0);}
  if(ball>0){ lcd.setCursor(ball+8,1);lcd.write((uint8_t)0);}
  if(ball<0){ lcd.setCursor(ball+7,1);lcd.write((uint8_t)0);}
  lcd.print(F("   "));w2=0;}} 


/////////////// Stereo / Mono //////////////////////////
  if(menu==4){
     if(ir.value==IR_3){stereo++;gr1=1;gr2=0;cl3();times=millis();w=1;w2=1;if(stereo>2){stereo=0;}audio();}// кнопка > 
     if(ir.value==IR_4){stereo--;gr1=0;gr2=1;cl3();times=millis();w=1;w2=1;if(stereo<0){stereo=2;}audio();}// кнопка <
     
   
  lcd.setCursor(0,0);lcd.print(" Stereo / Mono  ");
  lcd.setCursor(0,1);
  switch(stereo){
    case 0: lcd.print("     STEREO     ");break;
    case 1: lcd.print("    Lch Mono    ");break;
    case 2: lcd.print("    Rch Mono    ");break;
    }}

///////////////  Mode Selector //////////////////////////
  if(menu==5){
     if(ir.value==IR_3){mode++;gr1=1;gr2=0;cl3();times=millis();w=1;w2=1;if(mode>3){mode=0;}audio();}// кнопка > 
     if(ir.value==IR_4){mode--;gr1=0;gr2=1;cl3();times=millis();w=1;w2=1;if(mode<0){mode=3;}audio();}// кнопка <
     
   
  lcd.setCursor(0,0);lcd.print(" Mode Selector  ");
  lcd.setCursor(0,1);
  switch(mode){
    case 0: lcd.print("     BYPASS     ");break;
    case 1: lcd.print("      TONE      ");break;
    case 2: lcd.print("Tone&Surround Hi");break;
    case 3: lcd.print("Tone&Surround Lo");break;
    }}   

  //////////////// INPUT MENU //////////////////////////////////////////////////////////
  if(menu==6){
  //gain
     switch(in){
     case 0: gain0 = gain1;break;
     case 1: gain0 = gain2;break;
     case 2: gain0 = gain3;break;
     case 3: gain0 = gain4;break;
     case 4: gain0 = gain5;break;}

     if(ir.value==IR_3){gain0++;gr1=1;gr2=0;cl3();times=millis();www=1;w=1;w2=1;vol_func();}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){gain0++;gr2=0;cl3();times=millis();www=1;w=1;w2=1;vol_func();}// кнопка >>>>>>
     if(ir.value==IR_4){gain0--;gr1=0;gr2=1;cl3();times=millis();www=1;w=1;w2=1;vol_func();}// кнопка <
     if(ir.value==0xFFFFFFFF and gr2==1){gain0--;gr1=0;cl3();times=millis();www=1;w=1;w2=1;vol_func();}// кнопка <<<<<<

   switch(in){
     case 0: gain1 = gain0;break;
     case 1: gain2 = gain0;break;
     case 2: gain3 = gain0;break;
     case 3: gain4 = gain0;break;
     case 4: gain5 = gain0;break;} 
   
    if(www==1){audio();www=0;}
    lcd.setCursor(5,1);lcd.print(" ");lcd.print(gain0*2);lcd.print(" ");lcd.setCursor(8,1);lcd.print(F(" dB"));
     // end gain
    lcd.setCursor(3,0);lcd.print(F("INPUT "));
    switch(in){
      case 0: lcd.print(F("AUX1"));break;
      case 1: lcd.print(F("AUX2"));break;
      case 2: lcd.print(F("AUX3"));break;
      case 3: lcd.print(F("AUX4"));break;
      case 4: lcd.print(F("AUX5"));break;}
      
      }     
     
 ///////////// EEPROM ////////////////////////////////////////
  if(millis()-times>3000 && w==1 && power==0 && mute==0){
     EEPROM.write(0,vol);EEPROM.write(1,in);EEPROM.write(2,bas+7);EEPROM.write(3,treb+7);EEPROM.write(4,ball+6);
     EEPROM.write(5,stereo);EEPROM.write(6,mode);
     EEPROM.write(10,gain1);EEPROM.write(11,gain2);EEPROM.write(12,gain3);EEPROM.write(13,gain4);EEPROM.write(14,gain5);
     menu=0;w=0;w2=1;cl2();}
  }// LOOP

void ball_func(){if(ball>6){ball=6;}if(ball<-6){ball=-6;}}
void treb_func(){if(treb>7){treb=7;}if(treb<-7){treb=-7;}}
void bass_func(){if(bas>7){bas=7;}if(bas<-7){bas=-7;}}
void gain_func(){if(gain0>10){gain0=10;}if(gain0<0){gain0=0;}}  
void vol_func(){if(vol>87){vol=87;}if(vol<12){vol=12;}}
void cl(){ir.value=0;}
void cl1(){ir.value=0;delay(20);}
void cl2(){ir.value=0;lcd.clear();}
void cl3(){ir.value=0;delay(100);}


   
void audio(){
  ra.setVolume_left(vol-6+ball); // -87...0 dB === int 0...87
  ra.setVolume_right(vol-6-ball);// -87...0 dB === int 0...87 
  ra.setIn_Gain(in,gain0);    // IN 1...5 === byte 0...4 /// int 7 === mute
                         // GAIN 0...20 dB step 2 dB === int 0...10
  ra.setStereo(stereo,mode);     // 0 = stereo / 1 = Lch / 2 = Rch
                         // 0 = bypass / 1 = tone / 2 = tone&surround_hi / 3 = tone&surround_low
  ra.setTone(bas,treb);     // bass and treb -14...14 dB step 2 dB === int -7...7
  }   

24

Re: R2A15908SP

Спасибо, чет не подумал -  if(power==0){digitalWrite(13,HIGH);}else{digitalWrite(13,LOW);} стал в каждой строке прописывать)

25

Re: R2A15908SP

Подскажите этот процессор вообще можно как то проверить ? подал 1 кГц никаких признаков жизни