TDA7313 + DS3231 + IR + LCD2004 (Arduino)

Ранее в http://rcl-radio.ru/?p=58563 описывался пример использования аудиопроцессора TDA7313 под управлением Arduino Nano с дисплеем LCD1602, на этой странице будет рассмотрен аналогичный пример но с использованием дисплея LCD2004 c I2C модулем на базе микросхем PCF8574, что позволяет подключать символьный дисплей LCD2004 к плате Arduino всего по двум проводам SDA и SCL (А4 и А5).

Микросхема TDA7313 имеет три стерео входа, регуляторы тембра НЧ и ВЧ, тонкомпенсация и четыре выхода (псевдоквадро). Управление осуществляется с помощью I2C. Обвязка минимальная — несколько конденсаторов и два резистора. Номинальное напряжение питания 9В.

Основные характеристики TDA7313

  • Напряжение питания 6…10 В (9 В рекомендуемое)
  • КНИ не более 0,01 %
  • Отношение сигнал / шум 106 дБ
  • Разделение каналов на частоте 1 кГц 103 дБ
  • Регулировка громкости от -78.75 до 0 дБ (0…63 уровня)
  • Регулировка тембра НЧ и ВЧ ±14 дБ (-7…+7)
  • Регулировка аттенюаторов независимое для каждого выхода от -38.75 до 0 дБ (шаг 1,25  дБ)
  • Регулировка предусилителя от 0 до 11.25 дБ (шаг 3,75 дБ)

Плата Arduino Nano аудиопроцессор TDA7313 обмениваются данными на шине I2C по линиям SDA (data — данные) и SCL (clock — синхронизация).

Плата Пин SDA Пин SCL
Arduino Uno, Nano, Pro и Pro Mini A4 A5

В данном примере применены несколько модулей, таких как энкодер KY-040, часы реального времени DS3231, LCD2004_I2C, ИК-датчик VS1838B. Управление параметрами аудиопроцессора осуществляется при помощи 4-х кнопок — STANDBY, MUTE, SET, INPUT и энкодера KY-040.

В проекте используется два меню, в первом меню выводятся основные параметры аудиопроцессора — громкость, тембр НЧ и ВЧ, индикатор входа и часы. Во втором меню осуществляется регулировка дополнительных параметров — аттенюаторы выходов, включение или выключение тонкомпенсации, яркость подсветки дисплея в активном режиме и в режиме STANDBY.

Дополнительно имеется меню входов которое активируется нажатием кнопки INPUT, при этом происходит переключение входа и имеется возможность изменить регулировку предусилителя входа (независимая для каждого входа) при помощи энкодера.

Так как предусмотрена управляемая яркость подсветки дисплея, то можно установить яркость подсветки в основном  режиме и в режиме STANDBY (как правило с пониженной яркостью подсветки), регулировка яркости подсветки осуществляется в меню №2.

Подсветка — убрать перемычку с модуля I2C PCF8574 и подключить вывод модуля к цифровому выходу Arduino D6. Перед подключением замерить ток подсветки который не должен превышать 20 мА (у моего модуля ток не более 15 мА, замер производить между контактами перемычки).

 

Максимальный выходной ток одного выхода Arduino Nano не должен превышать 40 мА.

В проекте используются часы реального времени DS3231, текущее время выводится в меню №1, а так же в режиме STANDBY.

Установить текущее время можно двумя способами:

  • Установки времени через скетч:

Раскомментируйте строку:

clock.setDateTime(__DATE__, __TIME__); // Устанавливаем время на часах, основываясь на времени компиляции скетча

загрузите скетч, далее закомментируйте строку:

// clock.setDateTime(__DATE__, __TIME__); // Устанавливаем время на часах, основываясь на времени компиляции скетча

повторно загрузите скетч.

  • Установка времени кнопками:

Перейдите в режим STANDBY, нажать и удерживать кнопку энкодера, нажимать кнопки:
SET — обнуление секунд
IN — коррекция минут
MUTE — коррекция часов

ИК пульт дублирует работу энкодера и кнопок. Для управления регулятором подойдет практически любой пульт ИК, для поддержки Вашего пульта необходимо прописать коды кнопок в скетч:

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

Для получения кодов кнопок Вашего пульта загрузите скетч и откройте монитор порта, при нажатии кнопки пульта его код будет отображен в мониторе порта.

В проекте предусмотрен выход STANDBY для управления режим STANDBY усилителя мощности, а так же режим MUTE. Все параметры сохраняются в энергонезависимую память, сохранение происходит в момент перехода в режим STANDBY.

#define IR_1 0x33B8A05F // Кнопка вверх
#define IR_2 0x33B8609F // Кнопка вниз
#define IR_3 0x33B810EF // Кнопка >
#define IR_4 0x33B8E01F // Кнопка <
#define IR_5 0x33B850AF // Кнопка IN
#define IR_6 0x33B844BB // Кнопка SET
#define IR_7 0x33B8946B // Кнопка MUTE
#define IR_8 0x33B800FF // Кнопка STANDBY (POWER)
 
#include <Wire.h> 
#include <TDA7313.h>            // http://rcl-radio.ru/wp-content/uploads/2019/05/TDA7313-1.zip
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>  // http://forum.rcl-radio.ru/misc.php?action=pan_download&item=45&download=1
#include <Encoder.h>            // http://rcl-radio.ru/wp-content/uploads/2019/05/Encoder.zip    
#include <EEPROM.h>
#include <MsTimer2.h>           // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip       
#include <boarddefs.h>          // входит в состав библиотеки IRremote
#include <IRremote.h>           // http://rcl-radio.ru/wp-content/uploads/2019/06/IRremote.zip
#include <DS3231.h>
   DS3231 clock;RTCDateTime DateTime;
   TDA7313 tda;
   LiquidCrystal_I2C lcd(0x27,20,4);  // Устанавливаем дисплей
   IRrecv irrecv(12); // указываем вывод модуля IR приемника
   Encoder myEnc(9, 8);// DT, CLK
   decode_results ir; 
      int menu,menu0,menu1,vol,bass,treb,in,balans,balans_d,vol_d,bass_d,treb_d,temp0,par,hour,minut,secon,z_old,gain0,loud;
      int gain1,gain2,gain3,brig0,brig1;
      byte w2[4],z,z0,z1,n,q,gr1,gr2,www,i,w,mute,power,in_x,save,i1,power_on=1;
      unsigned long time0,oldPosition  = -999,newPosition,times_in;
      int att_lr,att_rr,att_lf,att_rf;
      byte mesto2[7]={0,10,0,10,6,0,10};
      byte mesto3[7]={0,0,1,1,2,3,3};
 
void setup() {
  irrecv.enableIRIn();lcd.init();lcd.backlight();clock.begin();Serial.begin(9600);
  pinMode(10,INPUT);  // МЕНЮ КНОПКА SW энкодера
  pinMode(2,INPUT_PULLUP);   // КНОПКА SET
  pinMode(3,INPUT_PULLUP);   // КНОПКА IN
  pinMode(4,INPUT_PULLUP);   // КНОПКА MUTE
  pinMode(5,INPUT_PULLUP);   // КНОПКА STANDBY
  pinMode(7,OUTPUT);  // ВЫХОД УПРАВЛЕНИЯ STANDBY
  pinMode(6,OUTPUT);  // ВЫХОД УПРАВЛЕНИЯ ПОДСВЕТКОЙ
  analogWrite(6, 200);// больше 200 не делать
  lcd.setCursor(3,1);lcd.print("Sound Processor");lcd.setCursor(7,2);lcd.print("TDA7313"); delay(3000);lcd.clear();
  MsTimer2::set(3, to_Timer);MsTimer2::start();
  //  clock.setDateTime(__DATE__, __TIME__); // Устанавливаем время на часах, основываясь на времени компиляции скетча
  if(EEPROM.read(100)!=0){for(int i=0;i<101;i++){EEPROM.update(i,0);}}// очистка памяти при первом включении  
  vol = EEPROM.read(0);treb = EEPROM.read(1)-7;bass = EEPROM.read(2)-7;in = EEPROM.read(3);
  gain1 = EEPROM.read(6);gain2 = EEPROM.read(7);
  att_lr = EEPROM.read(20);att_rr = EEPROM.read(21);att_lf = EEPROM.read(22);att_rf = EEPROM.read(23);
  gain3 = EEPROM.read(8);loud = EEPROM.read(10);brig0 = EEPROM.read(11);brig1 = EEPROM.read(12);
  switch(in){
     case 0: gain0 = gain1;break;
     case 1: gain0 = gain2;break;
     case 2: gain0 = gain3;break;
     }
  w2_arr();audio();cl();
  analogWrite(6, 25*brig0);
}
 
void loop() {
  DateTime = clock.getDateTime();hour = DateTime.hour;minut = DateTime.minute;secon = DateTime.second;
 
/////////////////////////////// УПРАВЛЕНИЕ //////////////////////////////////////////////
  if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);irrecv.resume();time0=millis();w=1;}// IR приемник - чтение, в мониторе порта отображаются коды кнопок
  if(ir.value==0){gr1=0;gr2=0;}// запрет нажатий не активных кнопок пульта  
 
  if(mute==0&&power==0){ 
  if(ir.value==IR_2&&menu0==0){menu++;gr1=0;gr2=0;cl1();time0=millis();in_x=0;w=1;w2_arr();if(menu>2){menu=0;}}//меню 1
  if(ir.value==IR_1&&menu0==0){menu--;gr1=0;gr2=0;cl1();time0=millis();in_x=0;w=1;w2_arr();if(menu<0){menu=2;}}//меню 1
 
  if(ir.value==IR_2&&menu0==1){menu1++;gr1=0;gr2=0;cl1();time0=millis();in_x=0;w=1;if(menu1>6){menu1=0;}}//меню 2
  if(ir.value==IR_1&&menu0==1){menu1--;gr1=0;gr2=0;cl1();time0=millis();in_x=0;w=1;if(menu1<0){menu1=6;}}//меню 2
 
  if(digitalRead(10)==LOW&&menu0==0){menu++;delay(200);time0=millis();in_x=0;w=1;w2_arr();if(menu>2){menu=0;}}// меню 0
  if(digitalRead(10)==LOW&&menu0==1){menu1++;delay(200);time0=millis();in_x=0;w=1;if(menu1>6){menu1=0;}}// меню 1
 
  if((ir.value==IR_6||digitalRead(2)==LOW)&&menu0==0){menu0=1;cl();in_x=0;time0=millis();w=1;lcd.setCursor(6,1);lcd.print("SETTING"); delay(2000);lcd.clear();}
  if((ir.value==IR_6||digitalRead(2)==LOW)&&menu0==1){menu0=0;menu=0;cl();in_x=0;w2_arr();time0=millis();w=1;lcd.setCursor(8,1);lcd.print("MENU"); delay(2000);lcd.clear();}
 
  if(ir.value==IR_5||digitalRead(3)==LOW){in++;cl();time0=millis();times_in=millis();in_x=1;w=1;www=1;menu0=100;menu=100;if(in>2){in=0;}}// IN
  }
  if((ir.value==IR_7||digitalRead(4)==LOW)&&mute==0&&power==0){mute=1;in_x=0;tda.setAttLR(31);tda.setAttRR(31);tda.setAttLF(31);tda.setAttRF(31);
      menu0=100;cl();w=1;w2_arr();lcd.setCursor(8,1);lcd.print("MUTE");delay(300);}// mute on
  if((ir.value==IR_7||digitalRead(4)==LOW)&&mute==1&&power==0){mute=0;cl();time0=millis();w=1;w2_arr();menu0=0;menu=0;myEnc.write(0);audio();}// mute off
 
  if(((ir.value==IR_8||digitalRead(5)==LOW)&&power==0)||power_on==1){power=1;in_x=0;power_on=0;save=1;tda.setAttLR(31);tda.setAttRR(31);tda.setAttLF(31);tda.setAttRF(31);
      cl();lcd.setCursor(5,1);lcd.print("POWER  OFF");menu0=100;delay(3000);analogWrite(6, brig1*25);}// power off
  if((ir.value==IR_8||digitalRead(5)==LOW)&&power==1){power=0;analogWrite(6, brig0*25);lcd.clear();lcd.setCursor(5,1);lcd.print("POWER   ON ");w=1;w2_arr();menu0=0;myEnc.write(0);audio();delay(3000);cl();}// power on
 
if(power==0){digitalWrite(7,HIGH);
   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}; 
   byte a4[8] = {0b10000,0b11000,0b11100,0b11110,0b11100,0b11000,0b10000,0b00000}; //>
   byte a5[8] = {0b00000,0b00000,0b00000,0b00000,0b00000,0b00000,0b00000,0b00000};
   lcd.createChar(0,a1);lcd.createChar(1,a2);lcd.createChar(2,a3);lcd.createChar(3,a4);lcd.createChar(4,a5);
  }
  if(power==1){digitalWrite(7,LOW);
      byte v1[8] = {7,7,7,7,7,7,7,7};
      byte v2[8] = {7,7,0, 0, 0, 0, 0, 0};      
      byte v3[8] = { 0, 0, 0, 0, 0,0,31,31};
      byte v4[8] = {31,31, 0, 0, 0, 0,31,31};
      byte v5[8] = { 28, 28, 0, 0, 0, 0, 28, 28};
      byte v6[8] = {28,28,28,28,28,28,28,28};
      byte v7[8] = { 0, 0, 0, 0, 0, 0,7,7};
      byte v8[8] = { 31, 31,0,0,0,0,0, 0};
   byte a[6];
   byte i0,d1,d2,d3,d4,d5,d6,e1,e2,e3;
  lcd.createChar(1, v1);lcd.createChar(2, v2);lcd.createChar(3, v3);lcd.createChar(4, v4);lcd.createChar(5, v5);lcd.createChar(6, v6);lcd.createChar(7, v7);lcd.createChar(8, v8);
 
     a[0]=DateTime.hour/10;
     a[1]=DateTime.hour%10;
     a[2]=DateTime.minute/10;
     a[3]=DateTime.minute%10;
     a[4]=DateTime.second/10;
     a[5]=DateTime.second%10;
 
 for(i=0;i<6;i++){
      switch(i){
        case 0: e1=0,e2=1,e3=2;break;
        case 1: e1=3,e2=4,e3=5;break;
        case 2: e1=7,e2=8,e3=9;break;
        case 3: e1=10,e2=11,e3=12;break;
        case 4: e1=14,e2=15,e3=16;break;
        case 5: e1=17,e2=18,e3=19;break;
        }
      switch(a[i]){
        case 0: d1=1,d2=8,d3=6,d4=1,d5=3,d6=6;break;
        case 1: d1=32,d2=2,d3=6,d4=32,d5=32,d6=6;break;
        case 2: d1=2,d2=8,d3=6,d4=1,d5=4,d6=5;break;
        case 3: d1=2,d2=4,d3=6,d4=7,d5=3,d6=6;break;
        case 4: d1=1,d2=3,d3=6,d4=32,d5=32,d6=6;break;
        case 5: d1=1,d2=4,d3=5,d4=7,d5=3,d6=6;break;
        case 6: d1=1,d2=4,d3=5,d4=1,d5=3,d6=6;break;
        case 7: d1=1,d2=8,d3=6,d4=32,d5=32,d6=6;break;
        case 8: d1=1,d2=4,d3=6,d4=1,d5=3,d6=6;break;
        case 9: d1=1,d2=4,d3=6,d4=7,d5=3,d6=6;break;
    }
 
      lcd.setCursor(e1,0);lcd.write((uint8_t)d1);lcd.setCursor(e2,0);lcd.write((uint8_t)d2);lcd.setCursor(e3,0);lcd.write((uint8_t)d3);
      lcd.setCursor(e1,1);lcd.write((uint8_t)d4);lcd.setCursor(e2,1);lcd.write((uint8_t)d5);lcd.setCursor(e3,1);lcd.write((uint8_t)d6);
  }
  lcd.setCursor(6,0);lcd.print(".");lcd.setCursor(13,0);lcd.print(".");lcd.setCursor(6,1);lcd.print(".");lcd.setCursor(13,1);lcd.print(".");
  lcd.setCursor(5,3);lcd.print("POWER  OFF");
  if(digitalRead(10)==LOW&&digitalRead(2)==LOW){hour++;if(hour>23){hour=0;} clock.setDateTime(2020, 9, 15, hour, minut, secon);delay(100);}    // SET
  if(digitalRead(10)==LOW&&digitalRead(3)==LOW){minut++;if(minut>59){minut=0;} clock.setDateTime(2020, 9, 15, hour, minut, secon);delay(100); }// IN
  if(digitalRead(10)==LOW&&digitalRead(4)==LOW){secon=0; clock.setDateTime(2020, 9, 15, hour, minut, secon);delay(100); }                      // MUTE
  } 
 
 /////////////////////////////// MENU0 = VOLUME TERBLE BASS BALANCE ///////////////////////////////////////////////////////////////////////
  if(menu0==0){ 
    switch(menu){
      case 0: temp0 = vol;q=0;break;
      case 1: temp0 = bass;q=1;break;
      case 2: temp0 = treb;q=2;break;}
 
     if(ir.value==IR_3){temp0++;gr1=1;gr2=0;cl1();time0=millis();w=1;w2[q]=1;www=1;}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){temp0++;gr2=0;cl1();time0=millis();;w=1;w2[q]=1;www=1;}// кнопка >>>>>>
     if(ir.value==IR_4){temp0--;gr1=0;gr2=1;cl1();time0=millis();;w=1;w2[q]=1;www=1;}// кнопка <
     if(ir.value==0xFFFFFFFF and gr2==1){temp0--;gr1=0;cl1();time0=millis();w=1;w2[q]=1;www=1;}// кнопка <<<<<<   
 
   if (newPosition != oldPosition){oldPosition = newPosition;
     temp0=temp0+newPosition;myEnc.write(0);newPosition=0;time0=millis();w=1;w2[q]=1;www=1;} 
 
     switch(menu){
      case 0: vol = temp0;vol_func();break;
      case 1: bass = temp0;bass_func();break;
      case 2: treb = temp0;treb_func();break;}
 
   au();
   for(i=0;i<3;i++){if(menu==i){lcd.setCursor(0,i);lcd.write((uint8_t)3);}else{lcd.setCursor(0,i);lcd.print(" ");}}
   lcd.setCursor(1,0);lcd.print("VOLUME ");if(vol>=0){lcd.print(" ");}lcd.print(vol);lcd.print(" ");vol_d=map(vol,0,63,1,24);
   lcd.setCursor(1,1);lcd.print("BASS   ");if(bass>=0){lcd.print(" ");}lcd.print(bass);lcd.print(" ");bass_d=map(bass,-7,7,1,24);
   lcd.setCursor(1,2);lcd.print("TREBLE ");if(treb>=0){lcd.print(" ");}lcd.print(treb);lcd.print(" ");treb_d=map(treb,-7,7,1,24);
   lcd.setCursor(1,3);lcd.print("INPUT   ");lcd.print(in+1);lcd.print("  ");
   lcd.print(DateTime.hour/10);lcd.print(DateTime.hour%10);lcd.print(":");lcd.print(DateTime.minute/10);lcd.print(DateTime.minute%10);lcd.print(":");
   lcd.print(DateTime.second/10);lcd.print(DateTime.second%10);
 
   for(n=0;n<3;n++){if(w2[n]==1){
   switch(n){
    case 0: par = vol_d;break;
    case 1: par = bass_d;break;
    case 2: par = treb_d;break;} 
 
   for(z=0,z0=0,z1=0;z<=par;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+12,n);lcd.write((uint8_t)0);lcd.setCursor(z0+1+12,n);Serial.println(z0);z_old=7-par/3;while(z_old>0){z_old=z_old-1;lcd.write((uint8_t)4);}}}
   if(z1==3){lcd.setCursor(z0+12,n);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+12,n);lcd.write((uint8_t)2);}w2[n]=0;}
   }}// menu0 = 0
///////////////////////////////////////////////////////////////////////////////////////////////
 
 if(menu0==1){
     switch(menu1){
      case 0: temp0 = att_lr;break;
      case 1: temp0 = att_rr;break;
      case 2: temp0 = att_lf;break;
      case 3: temp0 = att_rf;break;
      case 4: temp0 = loud;break;
      case 5: temp0 = brig0;break;
      case 6: temp0 = brig1;break;
      }
 
     if(ir.value==IR_3){temp0++;gr1=1;gr2=0;cl1();time0=millis();w=1;www=1;}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){temp0++;gr2=0;cl1();time0=millis();w=1;www=1;}// кнопка >>>>>>
     if(ir.value==IR_4){temp0--;gr1=0;gr2=1;cl1();time0=millis();;w=1;www=1;}// кнопка <
     if(ir.value==0xFFFFFFFF and gr2==1){temp0--;gr1=0;cl1();time0=millis();w=1;www=1;}// кнопка <<<<<<     
 
   if (newPosition != oldPosition){oldPosition = newPosition;
     temp0=temp0+newPosition;myEnc.write(0);newPosition=0;time0=millis();w=1;www=1;} 
 
     switch(menu1){
      case 0: att_lr = temp0;att_lr_func();break;
      case 1: att_rr = temp0;att_rr_func();break;
      case 2: att_lf = temp0;att_lf_func();break;
      case 3: att_rf = temp0;att_rf_func();break;      
      case 4: loud  = temp0;loud_func();break;
      case 5: brig0  = temp0;brig0_func();break;
      case 6: brig1  = temp0;brig1_func();break;
      }
 
  au();analogWrite(6, brig0*25);
  for(i=0;i<7;i++){if(menu1==i){lcd.setCursor(mesto2[i],mesto3[i]);lcd.write((uint8_t)3);}else{lcd.setCursor(mesto2[i],mesto3[i]);lcd.print(" ");}}
 
  lcd.setCursor(1,0);lcd.print("ATT_LR ");lcd.print(att_lr);lcd.print(" ");lcd.setCursor(11,0);lcd.print("ATT_RR ");lcd.print(att_rr);lcd.print(" ");
  lcd.setCursor(1,1);lcd.print("ATT_LF ");lcd.print(att_lf);lcd.print(" ");lcd.setCursor(11,1);lcd.print("ATT_RF ");lcd.print(att_rf);lcd.print(" ");
  lcd.setCursor(7,2);lcd.print("LOUD ");if(loud==0){lcd.print("OFF");}else{lcd.print("ON ");}
  lcd.setCursor(1,3);lcd.print("BRIG_1 ");lcd.print(brig0);lcd.print(" ");lcd.setCursor(11,3);lcd.print("BRIG_2 ");lcd.print(brig1);
 
 } // menu0 = 1
 
 
////////////////////////// GAIN IN /////////////////////////////////////////////////////////////////////////////////////
if(in_x==1){ menu0=100;
   switch(in){
     case 0: gain0 = gain1;break;
     case 1: gain0 = gain2;break;
     case 2: gain0 = gain3;break;
     }
 
     if(ir.value==IR_3){gain0++;gr1=1;gr2=0;cl1();time0=millis();times_in=millis();www=1;w=1;gain_func();}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){gain0++;gr2=0;cl1();time0=millis();times_in=millis();www=1;w=1;gain_func();}// кнопка >>>>>>
     if(ir.value==IR_4){gain0--;gr1=0;gr2=1;cl1();time0=millis();times_in=millis();www=1;w=1;gain_func();}// кнопка <
     if(ir.value==0xFFFFFFFF and gr2==1){gain0--;gr1=0;cl1();time0=millis();times_in=millis();www=1;w=1;gain_func();}// кнопка <<<<<<  
 
    if (newPosition != oldPosition) {oldPosition = newPosition;
    gain0=gain0+newPosition;myEnc.write(0);newPosition=0;time0=millis();times_in=millis();www=1;w=1;gain_func();} 
 
   switch(in){
     case 0: gain1 = gain0;break;
     case 1: gain2 = gain0;break;
     case 2: gain3 = gain0;break;
     }
 
  au();
  lcd.setCursor(5,1);lcd.print("Gain IN ");lcd.print(in+1);lcd.setCursor(6,2);lcd.print(float(gain0*3.75));lcd.print(" ");lcd.print("dB ");
   }
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////   
 
if(millis()-time0>10000&&w==1&&mute==0&&power==0){if(menu0==1){cl();}w=0;menu0=0;menu=0;w2_arr();}
if(millis()-times_in>3000&&w==1&&in_x==1&&mute==0&&power==0){time0=millis();w=0;in_x=0;menu0=0;menu=0;w2_arr();cl();}
 
if(save==1){save=0;
     EEPROM.update(0,vol);EEPROM.update(1,treb+7);EEPROM.update(2,bass+7);EEPROM.update(3,in);
     EEPROM.update(6,gain1);EEPROM.update(7,gain2);EEPROM.update(8,gain3);
     EEPROM.update(20,att_lr);EEPROM.update(21,att_rr);EEPROM.update(22,att_lf);EEPROM.update(23,att_rf);
     EEPROM.update(10,loud);EEPROM.update(11,brig0);EEPROM.update(12,brig1);}
 
}// loop
 
void brig1_func(){if(brig1>8){brig1=8;}if(brig1<0){brig1=0;}}
void brig0_func(){if(brig0>8){brig0=8;}if(brig0<0){brig0=0;}}
void w2_arr(){w2[0]=1;w2[1]=1;w2[2]=1;w2[3]=1;}
void au(){if(www==1){audio();www=0;}}
 
void in_func(){if(in>2){in=2;}if(in<0){in=0;}}
void loud_func(){if(loud<0){loud=0;}if(loud>1){loud=1;}}
void gain_func(){if(gain0<0){gain0=0;}if(gain0>3){gain0=3;}}
void att_lr_func(){if(att_lr<0){att_lr=0;}if(att_lr>31){att_lr=31;}}
void att_rr_func(){if(att_rr<0){att_rr=0;}if(att_rr>31){att_rr=31;}}
void att_lf_func(){if(att_lf<0){att_lf=0;}if(att_lf>31){att_lf=31;}}
void att_rf_func(){if(att_rf<0){att_rf=0;}if(att_rf>31){att_rf=31;}}
void vol_func(){if(vol<0){vol=0;}if(vol>63){vol=63;}}
void treb_func(){if(treb<-7){treb=-7;}if(treb>7){treb=7;}}
void bass_func(){if(bass<-7){bass=-7;}if(bass>7){bass=7;}}
 
void cl(){ir.value=0;delay(300);lcd.clear();}
void cl1(){ir.value=0;delay(200);}  
void audio(){
  tda.setVolume(vol); // громкость 0...63
  tda.setAttLR(att_lr);   // аттенюатор LR 0...31
  tda.setAttRR(att_rr);   // аттенюатор RR 0...31
  tda.setAttLF(att_lf);   // аттенюатор LF 0...31
  tda.setAttRF(att_rf);   // аттенюатор RF 0...31
  tda.setSwitch(in,loud,gain0); // вход 0...2, тонкомпенсация 1 вкл 0 выкл, усиление 0...3
  tda.setBass(bass);    // тембр НЧ -7...+7
  tda.setTreble(treb);  // тембр ВЧ -7...+7
}
 
void to_Timer(){newPosition = myEnc.read()/4;}

Форум — http://forum.rcl-radio.ru/viewtopic.php?pid=6158#p6158

Добавить комментарий

Войти с помощью: