5.1 volume control

hi there!
I am working on a project where I have to control individual channel volume using r2s15902fp IC. I have a code for just to control whole volume but not individual channels(left, right, front, woofer). I am attaching the code I have below here. please help me in programming.
:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <R2S15902FP.h>
#include <Encoder.h>
#include <EEPROM.h>
#include <MsTimer2.h>
#include <boarddefs.h>
#include <IRremote.h>
LiquidCrystal_I2C lcd(0x27,16,2); // Устанавливаем дисплей
IRrecv irrecv(12); // указываем вывод модуля IR приемника
Encoder myEnc(9, 8);// DT, CLK
decode_results ir;
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 time,oldPosition = -999,newPosition;
int menu,vol,vol_d,treb,treb_d,bass,bass_d,in;
byte w,w2,z,z0,z1;

void setup(){ irrecv.enableIRIn(); // запускаем модуль IR
lcd.init();lcd.backlight();// Включаем подсветку дисплея
lcd.setCursor(0,0);lcd.print(" R2S15902FP ");delay(2000);
Serial.begin(9600); lcd.createChar(0,a1);lcd.createChar(1,a2);lcd.createChar(2,a3);
pinMode(DATA, OUTPUT); // D2
pinMode(CLK, OUTPUT); // D3
pinMode(10,INPUT);// МЕНЮ КНОПКА SW энкодера
MsTimer2::set(3, to_Timer);MsTimer2::start(); // АКТИВИРУЕМ ПРЕРЫВАНИЯ ДЛЯ ЭНКОДЕРА
vol = EEPROM.read(0);treb = EEPROM.read(1);bass = EEPROM.read(2);in = EEPROM.read(3);
delay(100);cl();
audio();
}

void loop(){
if(digitalRead(10)==LOW){menu++;cl();time=millis();w=1;w2=1;if(menu>3){menu=0;}}// меню

if(menu==0){

if (newPosition != oldPosition){oldPosition = newPosition;
vol=vol+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;vol_func();audio();}
lcd.setCursor(0,0);lcd.print("VOLUME ");
lcd.print(" ");lcd.print(-vol);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");vol_d=48-vol;
if(w2==1){
for(z=0,z0=0,z1=0;z<=vol_d;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(" ");}}
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;}}

///////////////////////// TREBLE +/-14 dB /////////////////////////////////////////////////////////
if(menu==1){

 if (newPosition != oldPosition) {
oldPosition = newPosition;
treb=treb+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;treb_func();audio();} 

lcd.setCursor(0,0);lcd.print("TREBLE ");
lcd.print(" ");lcd.print(14-treb2);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");treb_d=28-treb2;
if(w2==1){
for(z=0,z0=0,z1=0;z<=treb_d;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(" ");}}
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;}}

///////////////////////// BASS +/-14 dB /////////////////////////////////////////////////////////
if(menu==2){

 if (newPosition != oldPosition) {
oldPosition = newPosition;
bass=bass+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;bass_func();audio();} 

lcd.setCursor(0,0);lcd.print("BASS ");
lcd.print(" ");lcd.print(14-bass2);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");bass_d=28-bass2;
if(w2==1){
for(z=0,z0=0,z1=0;z<=bass_d;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(" ");}}
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;}}

///////////////////// IN /////////////////////////////////////////////////////////////////////////
if(menu==3){
if (newPosition != oldPosition) {
oldPosition = newPosition;
in=in-newPosition;myEnc.write(0);newPosition=0;time=millis();cl();w=1;w2=1;in_func();audio();}
lcd.setCursor(0,0);lcd.print("INPUT ");lcd.print(in+1);
}

if(millis()-time>10000 && w==1){
EEPROM.update(0,vol);EEPROM.update(1,treb);EEPROM.update(2,bass);EEPROM.update(3,in);
menu=0;w=0;w2=1;cl();}
}
void in_func(){if(in>2){in=0;}if(in<0){in=2;}}
void bass_func(){if(bass>14){bass=14;}if(bass<0){bass=0;}}
void treb_func(){if(treb>14){treb=14;}if(treb<0){treb=0;}}
void vol_func(){if(vol<0){vol=0;}if(vol>99){vol=99;}}
void cl(){ir.value=0;delay(300);lcd.clear();}
void to_Timer(){newPosition = myEnc.read()/4;}
void audio(){
Slot1(in,0,0,bass,treb,0);
// input selector 1...3 === int 0...2
//REC-Output Gain Control int 0...6 dB === int 0...3
//ADC Input ATT 0...-6 dB === int 0...3
//bass int 0 === +14dB int 8 === 0dB int 15 === -14dB
//treble int 0 === +14dB int 8 === 0dB int 15 === -14dB
//Input Gain 0...14 dB === int 0...7
Slot2(0,vol,0,vol); // gain0, volume0, gain1, volume1
Slot3(0,vol,0,vol); // gain2, volume2, gain3, volume3
Slot4(0,vol,0,vol); // gain4, volume4, gain5, volume5
// gain 0...14 dB === int 0...7
// volume 0...-99 dB === int 0...100
}

Read the forum guidelines.

Use the IDE autoformat tool (ctrl-t or Tools, Auto Format) to indent the code for readability before posting code.

Post your code in code tags.

It looks like you can set 6 different gains and 6 different volumes. You just have to decide how you want to control each.

1 Like

thanks for the reply sir. I'm unable to find how to write code for it. could you please help!!
here is the datasheet of r2s15092fp IC https://www.renesas.com/us/en/document/dst/r2s15902fp-datasheet

Are you saying that you did not write this code and you have not figured out what it does?

It might be easier to figure out with less compressed formatting:

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <R2S15902FP.h>
#include <Encoder.h>
#include <EEPROM.h>
#include <MsTimer2.h>
#include <boarddefs.h>
#include <IRremote.h>

LiquidCrystal_I2C lcd(0x27, 16, 2); // Устанавливаем дисплей
IRrecv irrecv(12); // указываем вывод модуля IR приемника
Encoder myEnc(9, 8);// DT, CLK
decode_results ir;
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 time, oldPosition = -999, newPosition;
int menu, vol, vol_d, treb, treb_d, bass, bass_d, in;
byte w, w2, z, z0, z1;

void setup()
{
  irrecv.enableIRIn(); // запускаем модуль IR
  lcd.init(); 
  lcd.backlight(); // Включаем подсветку дисплея
  lcd.setCursor(0, 0); 
  lcd.print(" R2S15902FP "); 
  delay(2000);
  Serial.begin(9600); 
  lcd.createChar(0, a1); 
  lcd.createChar(1, a2); 
  lcd.createChar(2, a3);
  pinMode(DATA, OUTPUT); // D2
  pinMode(CLK, OUTPUT); // D3
  pinMode(10, INPUT); // МЕНЮ КНОПКА SW энкодера
  MsTimer2::set(3, to_Timer); 
  MsTimer2::start(); // АКТИВИРУЕМ ПРЕРЫВАНИЯ ДЛЯ ЭНКОДЕРА
  vol = EEPROM.read(0); 
  treb = EEPROM.read(1); 
  bass = EEPROM.read(2); 
  in = EEPROM.read(3);
  delay(100); cl();
  audio();
}

void loop()
{
  if (digitalRead(10) == LOW)
  {
    menu++;  // меню
    cl();
    time = millis();
    w = 1;
    w2 = 1;
    if (menu > 3)
    {
      menu = 0;
    }
  }

  if (menu == 0)
  {
    if (newPosition != oldPosition)
    {
      oldPosition = newPosition;
      vol = vol + newPosition; 
      myEnc.write(0); 
      newPosition = 0; 
      time = millis(); 
      w = 1; 
      w2 = 1; 
      vol_func(); 
      audio();
    }
    lcd.setCursor(0, 0); 
    lcd.print("VOLUME ");
    lcd.print(" "); 
    lcd.print(-vol); 
    lcd.print(" "); 
    lcd.setCursor(13, 0); 
    lcd.print("dB"); 
    vol_d = 48 - vol;
    if (w2 == 1)
    {
      for (z = 0, z0 = 0, z1 = 0; z <= vol_d; 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(" ");
        }
      }
      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;
    }
  }

  ///////////////////////// TREBLE +/-14 dB /////////////////////////////////////////////////////////
  if (menu == 1)
  {

    if (newPosition != oldPosition)
    {
      oldPosition = newPosition;
      treb = treb + newPosition; 
      myEnc.write(0); 
      newPosition = 0; 
      time = millis(); 
      w = 1; w2 = 1; 
      treb_func(); 
      audio();
    }
    lcd.setCursor(0, 0); 
    lcd.print("TREBLE ");
    lcd.print(" "); 
    lcd.print(14 - treb2); 
    lcd.print(" "); 
    lcd.setCursor(13, 0); 
    lcd.print("dB"); 
    treb_d = 28 - treb2;
    if (w2 == 1)
    {
      for (z = 0, z0 = 0, z1 = 0; z <= treb_d; 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(" ");
        }
      }
      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;
    }
  }

  ///////////////////////// BASS +/-14 dB /////////////////////////////////////////////////////////
  if (menu == 2)
  {

    if (newPosition != oldPosition)
    {
      oldPosition = newPosition;
      bass = bass + newPosition; 
      myEnc.write(0); 
      newPosition = 0; 
      time = millis(); 
      w = 1; 
      w2 = 1; 
      bass_func(); 
      audio();
    }
    lcd.setCursor(0, 0); 
    lcd.print("BASS ");
    lcd.print(" "); 
    lcd.print(14 - bass2); 
    lcd.print(" "); 
    lcd.setCursor(13, 0); 
    lcd.print("dB"); 
    bass_d = 28 - bass2;
    if (w2 == 1)
    {
      for (z = 0, z0 = 0, z1 = 0; z <= bass_d; 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(" ");
        }
      }
      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;
    }
  }

  ///////////////////// IN /////////////////////////////////////////////////////////////////////////
  if (menu == 3)
  {
    if (newPosition != oldPosition)
    {
      oldPosition = newPosition;
      in = in - newPosition; 
      myEnc.write(0); 
      newPosition = 0; 
      time = millis(); 
      cl(); 
      w = 1; 
      w2 = 1; 
      in_func(); 
      audio();
    }
    lcd.setCursor(0, 0); 
    lcd.print("INPUT "); 
    lcd.print(in + 1);
  }

  if (millis() - time > 10000 && w == 1)
  {
    EEPROM.update(0, vol); 
    EEPROM.update(1, treb); 
    EEPROM.update(2, bass); 
    EEPROM.update(3, in);
    menu = 0; 
    w = 0; 
    w2 = 1; 
    cl();
  }
}

void in_func()
{
  if (in > 2)
  {
    in = 0;
  } if (in < 0)
  {
    in = 2;
  }
}

void bass_func()
{
  if (bass > 14)
  {
    bass = 14;
  } 
  if (bass < 0)
  {
    bass = 0;
  }
}

void treb_func()
{
  if (treb > 14)
  {
    treb = 14;
  } 
  if (treb < 0)
  {
    treb = 0;
  }
}

void vol_func()
{
  if (vol < 0)
  {
    vol = 0;
  } 
  if (vol > 99)
  {
    vol = 99;
  }
}

void cl()
{
  ir.value = 0;
  delay(300);
  lcd.clear();
}

void to_Timer()
{
  newPosition = myEnc.read() / 4;
}

void audio()
{
  Slot1(in, 0, 0, bass, treb, 0);
  // input selector 1...3 === int 0...2
  //REC-Output Gain Control int 0...6 dB === int 0...3
  //ADC Input ATT 0...-6 dB === int 0...3
  //bass int 0 === +14dB int 8 === 0dB int 15 === -14dB
  //treble int 0 === +14dB int 8 === 0dB int 15 === -14dB
  //Input Gain 0...14 dB === int 0...7
  Slot2(0, vol, 0, vol); // gain0, volume0, gain1, volume1
  Slot3(0, vol, 0, vol); // gain2, volume2, gain3, volume3
  Slot4(0, vol, 0, vol); // gain4, volume4, gain5, volume5
  // gain 0...14 dB === int 0...7
  // volume 0...-99 dB === int 0...100
}

No ,I did not mean that .Again thanks for the reply. And I modified the code .thanks. and sorry I'm new to forum .

void audio() {
Slot1(in , 0 , lr , bass, treb, sr );
Slot2(0, lr, 0, lr); // gain0, volume0, gain1, volume1
Slot3(0, vol, 0, swr); // gain2, volume2, gain3, volume3
Slot4(0, sr, 0, sr); // gain4, volume4, gain5, volume5
}

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.