PCCar.ru - Ваш автомобильный компьютер

Вернуться   PCCar.ru - Ваш автомобильный компьютер > MP3Car ТехИнфа > AndroidCar > Звук

Ответ
 
Опции темы Поиск в этой теме
Старый 27.11.2016, 22:32   #51
oleg707
Гуру
 
Аватар для oleg707
 
Регистрация: 16.04.2014
Возраст: 40
Город: Gdynia
Регион: другой - для добавления сообщить ab
Сообщений: 2,548
oleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond repute
По умолчанию добавил INPUT ATTENUATION - приглушение ВХОДНОГО (IN1-IN4) канала

не выдержал и добавил, пока всё еще в голове.
INPUT ATTENUATION - приглушение ВХОДНОГО (IN1-IN4) канала, будет полезно для микширования аудиосигнала (8,10 пины TDA7442D - постоянный сигнал; (3,4)(5,2)(6,1)(7,28) пины - подмешиваемый сигнал с регулировкой громкости с шагом 0,5 dB ).
PHP код:
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//Скетч для 7442D
int ver 95;
// с подавлением дребезга кнопок 
// с динамическим увеличением/уменьшением громкости при удержании кнопок ( с УСКОРЕНИЕМ при удержании)
// с энкодером (код грея - коррекция ошибок энкодера) 
// динамическое изменение скорости уменьшения\увеличения громкости при долгом воздействии на энкодер++. (требуется тонкая подстройка в реальной машине)
// с функцией MUTE
// дисплей по I2C
// с ползунком громкости на дисплее
// с монитором по ком-порту
//мигание встроенного светодиода   при нажатии-удержании кнопок громкости.( при вращении энкодером пока убрал)
//с выбором в меню, какое значение громкости выставлять при подаче питания на ардуину. С записью этого значения в еепром и чтением при подаче питания на атмегу. ( если не прописано, то пишется громкость по умолчанию -24dB )
//C активацией внутреннего эквалайзера TDA7442D (EQ_ON EQ_OFF) -  басы и пищалки
// Добавил меню сброса на настройки по умолчанию ( заодно восстанавливает неправильно записанный еепром на нужные значения), работает только один раз, потом надо передёрнуть питание. 
// добавил выбор источника IN1 - IN4 с записью в еепром. По умолчанию стоит IN1 (3 и 4 контакты TDA7442D). 
// добавил автоматическое переключение текущего аудиовхода на заданный. Например, для громкой связи через колонки.  переменная (autoAUX2 = 0;) Нужна для автоматического включения какого-либо входа  IN1-4, если (autoAUX2 ==1) .
// добавил INPUT ATTENUATION  - приглушение ВХОДНОГО (IN1-IN4) канала, будет полезно для микширования аудиосигнала (8,10 пины TDA7442D - постоянный сигнал; (3,4)(5,2)(6,1)(7,28) пины - подмешиваемый сигнал с регулировкой громкости с шагом 0,5 dB ). 
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// класс титановый велосипед для тактовой кнопки. (версия 1.0)http://arduino.ru/forum/programmirovanie/klass-titanovyi-velosiped-dlya-taktovoi-knopki
// фильтр дребезга, отслеживание событий: нажатие, отпускание, двойное нажатие(doubleclick), нажато и удерживается в течении определённого времени, отпущено и неактивно в течении определённого времени.
// Bitwise NOT (~) https://www.arduino.cc/en/Reference/BitwiseXorNot
// abs() Возвращает модуль числа. http://arduino.ru/Reference/Abs
#include <Arduino.h>
#include <Wire.h> /*добавление библиотеки I2C шины*/
#include <LiquidCrystal_I2C.h>  /*добавление библиотеки для работы с дисплеем по I2C*/
LiquidCrystal_I2C lcd(PCF8574_ADDR_A21_A11_A014561611121314POSITIVE);  // для newE  описание библиотеки http://elchupanibrei.livejournal.com/27443.html#t23347 
#include <EEPROM.h>
char  strokaI[32] = "                ";// Массив для вывода 1 строки на дисплей
char strokaII[32] = "                ";// Массив для вывода 2 строки на дисплей




  


class BUTTON {
public:
//============================================================================================
// константы настроек класса.
static const byte bounce_            =   50// длительность отслеживания дребезга.
static const byte doubleclick_       =  250// длительность отслеживания двойного нажатия.
static const unsigned long timer_    5000// длительность отслеживания неактивности.
static const unsigned int retention_ 500// длительность отслеживания нажатия и удержания.
//============================================================================================
unsigned long start// старт отсчёта времени.
boolean p;           // состояние пина кнопки.
boolean s;           // программное состояние кнопки.
boolean b;           // состояние таймера фильтра дребезга.
byte    c;           // переменная счётчика двойного нажатия.
boolean t;           // состояние таймера неактивности.
boolean r;           // состояние таймера нажатия и удержания.
//============================================================
boolean click_down;  // событие нажатия.
boolean click_up;    // событие отпускания.
boolean doubleclick// событие двойного нажатия.
boolean timer;       // событие неактивности.
boolean retention;   // событие нажатия и удержания.
//============================================================
byte _pb;
//============================================================
BUTTON(byte pb) {
_pb pb;
pinMode(_pbINPUT);
digitalWrite(_pb1);
//===================
start millis();
p     digitalRead(_pb);
// p     = !digitalRead(_pb); // отключить тихий старт.
s     p;
b     0;
c     0;
t     0;
r     0;
//==============
click_down  0;
click_up    0;
doubleclick 0;
timer       0;
retention   0;
//==============
}

void read() {
//==============================================================================
boolean np digitalRead(_pb); // текущее состояние пина кнопки.
unsigned long stop millis(); // стоп отсчёта времени.
//==============================================================================
click_down  0;
click_up    0;
doubleclick 0;
timer       0;
retention   0;
//==============================================================================
if (np != p) {npclick(); start stop111;} // состояние цифрового пина изменилось.
//==============================================================================
if (!= 0          ) {if (stop start bounce_     ) {0click();      }} // фильтр дребезга.
if (!= 0          ) {if (stop start doubleclick_) {0;               }} // обнуление счётчика двойного клика.
if (!= && == 1) {if (stop start timer_      ) {0timer     1;}} // неактивность.
if (!= && == 0) {if (stop start retention_  ) {0retention 1;}} // нажатие и удержание.
//==============================================================================
}

void click() {                       // нажатие, отпускание, двойное нажатие.
if (== && != p) {p;
if (
== 0) {click_down 1; ++c; if (== 2) {0doubleclick 1;}}
if (
== 1) {click_up   1;}
}
}

};
// конец class BUTTON
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//конец кода для чтения состояний кнопок ~
//=====================================================================================================================================================================================================================================================










//Подтяжку для кнопок на +5В делать не надо,  код для чтения состояний кнопок включает внутренний подтягивающий резистор на 20кОм

//                 ТУТ НАЗНАЧАЕМ ИМЕНА НАШИХ КНОПОК И К КАКИМ ПИНАМ ОНИ ПОДКЛЮЧЕНЫ           (также сюда пишем имена переменных, то, что обычно пишется ДО void setup().
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//BUTTON REDbutton(31);     //назначаем красной кнопке ножку 31. То есть один конец конпки подключён на пин 31 ардуины меги, а второй  конец конпки подключён на массу (GND)     Подтяжку на +5В делать не надо,  код для чтения состояний кнопок включает внутренний подтягивающий резистор на 20кОм
//BUTTON BLACKbutton (33);  //назначаем красной кнопке ножку 33. То есть один конец конпки подключён на пин 33 ардуины меги, а второй  конец конпки подключён на массу (GND)    Подтяжку на +5В делать не надо,  код для чтения состояний кнопок включает внутренний подтягивающий резистор на 20кОм
BUTTON VOLUPbutton(6);   //назначаем кнопке ГРОМКОСТИ++ ножку D6
BUTTON VOLDNbutton(7);   //назначаем кнопке ГРОМКОСТИ-- ножку D7
BUTTON MUTE_or_MENU_button(8);   //назначаем кнопке MUTE_or_MENU ножку D8

#define  VOLUME_INTERVAL  100UL  // интервал(время) между изменениями уровня громкости (0,05 секунд)
boolean Vupupup 0//переменная, показывающая надо ли увеличивать громкость раз в #define  VOLUME_INTERVAL  100UL (0,1Сек)
boolean Vdndndn 0//переменная, показывающая надо ли уменьшать громкость раз в #define  VOLUME_INTERVAL  100UL (0,1Сек)
byte USCORENIE 0//переменная, ускорение изменения громкости при удержании кнопок VOL+ и VOL-
boolean MuteActiv 0// Признак включённого режима MUTE (временное отключение громкости)
byte MENUmode 0// Признак включённого режима MENU
unsigned long timerMENU =  millis(); // время до того, как мы выйдем из режима меню в обычный режим.
byte vibor_nomera_punkta_v_MENU=1// выбор режима меню
byte MasterVolumeDoMUTE 80//Значение грмкости во время того, как включаем MUTE
byte MasterVolume EEPROM.read(80); //Значение громкости во время первого включения атмеги, надо читать из еепром. - переменная, хранящая в себе громкость выходного звука, 0 - макс громкость, 79- минимальная, 80-255 MUTE http://arduino.ru/Reference/Byte Тип данных byte 8-ми битное беззнаковое целое число, Если DEC - в диапазоне 0..255
byte  BASSlevelBYTE =EEPROM.read(81);  // значение уровня басов в двоичном виде, для прямого управления tda7442.  
int   BASSlevelDEC 0//значение уровня басов в десятичном виде, Может быть от -14 до +14 (-7-0-+7)
byte  TREBlevelBYTE EEPROM.read(82); // считываем уровень высоких частот из внутренней еепром с 82го адреса.
int   TREBlevelDEC 0//значение уровня пищалок в десятичном виде, Может быть от -14 до +14 (-7-0-+7)
byte EQstate =  EEPROM.read(79); //логическое состояние эквалайзера. 0b11111001 - включен,  0b00000110 eq вЫключён
byte DEFAULT_RESETstate 0// если 1 , то ресет всех значений и еепрома на значеня по умолчанию. 
byte selectINPUT EEPROM.read(78);  //BXXX1001 INPUT MULTIPLEXER выбор источника IN1-4 (6-in1 4-in4  2-in3 0-in2) поскольку физические номера входов ( по даташиту) и программные различаются, для облегчения кода придётся  поменять номера входов
bool autoAUX2 0// эта переменная нужна для автоматического включения какого-либо входа  IN1-4 . Например, для громкой связи через колонки. 
byte selectINPUT_OLD selectINPUT//  выбор источника, на который переключаться после окончания "сеанса громкой связи "
byte INPUT_ATTENUATION EEPROM.read(77);  //INPUT ATTENUATION    приглушение ВХОДНОГО (IN1-IN4) канала (0 ~ -31.5dB)(0db-макс громкость, без приглушения) 64 = 0dB   127 = -31.5dB


//====================================================================================
//для энкодера~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

byte stepVOLamount 0// шаг изменения громкости энкодером. Логика меняется в строках 310
byte stepENC 0// шаг изменения громкости энкодером в режиме ускорения (постоянное вращение)

unsigned long currentTimeVoumeControl;
unsigned long loopTimeVoumeControl;
unsigned long prevTimeE millis(); // время когда последний раз переключали энкодер

enum {ENC_PIN1 9ENC_PIN2 10};
// Преобразование значения Грея в двоичный код
// без изменений прямиком из wilipedia
unsigned graydecode(unsigned gray) {
  
unsigned bin;
  for (
bin 0graygray >>= 1)
    
bin ^= gray;
  return 
bin;
}
//  grayValue - Значение Грея
//  value     - Преобразованное значение Грея
//  oldValue  - Старое преобразованное значение Грея

//конец для энкодера~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
//====================================================================================
//=====================================================================================================================================================================================================================================================





 
void setup()    
 { 
Serial.begin(250000); // ком порт     
pinMode(13OUTPUT); // настройка пина встроенного светодиода на выход (чтоб моргать мог)        
Wire.begin(); // включение библиотеки I2C шины 
lcd.begin(162);//initialize the lcd newE

/*~~~~~~~~ для энкодера~~~~~~~~~~*/
pinMode(ENC_PIN1INPUT); //настройка пинов энкодера
digitalWrite(ENC_PIN11);       // включить подтягивающий резистор http://arduino.ru/Tutorial/DigitalPins
pinMode(ENC_PIN2INPUT);
digitalWrite(ENC_PIN21);

/*~~~~~~~~конец для энкодера~~~~~~~~~~*/
Serial.println("   S E T U P  ok   ");
Serial.print("   ver s"); Serial.println(ver);
lcd.noBacklight();
Serial.println("perexodim k osnovnoy programme ");
lcd.backlight();
if (
MasterVolume == 255) {EEPROM.write(80,24); MasterVolume 24;} //если считанное значение громкости_при_включении за рамками диапазона (0-80), то берём среднее значение 24 и пишем его в еепром по адресу 80 (0x80)
if (BASSlevelBYTE == 255) {EEPROM.write(81,0b00011111); BASSlevelBYTE 0b00011111; } //если считанное значение уровня басов за рамками диапазона, то пишем туда значение 0b00011111 ( в двоичной системе счисления - 8 байт)(0dB)
if (TREBlevelBYTE == 255) {EEPROM.write(82,0b11111110); TREBlevelBYTE 0b11111110; } //если считанное значение уровня верхов за рамками диапазона,0b11111110 ( в двоичной системе счисления - 8 байт)(+0dB)
if (EQstate == 255) {EEPROM.write(79,0b11111001); EQstate 0b11111001;} //  = EQ_ON
if (selectINPUT ==255 ){EEPROM.write(78,6); selectINPUT 6;} // AUX SELECT
if ( INPUT_ATTENUATION == 255)  {EEPROM.write(77,64); INPUT_ATTENUATION 64;} //INPUT ATTENUATION    приглушение ВХОДНОГО (IN1-IN4) канала (0 ~ -31.5dB)(0db-макс громкость, без приглушения) 64 = 0dB   127 = -31.5dB
 

//=====================================================================================================================================================================================================================================================



//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// ЕСЛИ удерживаются кнопки регулировки громкости, то увеличиваем или уменьшаем громкость на один шаг (1dB) с периодичностью (interval - USCORENIE + 8)
void VOLFAST(unsigned long interval )
{
  static 
unsigned long prevTime 0// время когда последний раз увеличивали или уменьшали громкость
  
if(millis() - prevTime interval-USCORENIE) {
                                       
prevTime millis();  // если зажаты сразу две кнопки, приоритет будет на громкость вниз.
                                       
if (Vupupup == && Vdndndn == 0) {if(interval-USCORENIE>8+20){USCORENIE USCORENIE 8;} if (MasterVolume==0)  { } else (MasterVolume--);  digitalWrite(13,!digitalRead(13)); } // если зажата громкость вверх, то увеличиваем громкость на один шаг (1dB) с периодичностью interval.
                                       
if (Vdndndn == 1)                 {if(interval-USCORENIE>10+20){USCORENIE USCORENIE 10;} if (MasterVolume==80){} else (MasterVolume++);  digitalWrite(13,!digitalRead(13)); } // если зажата громкость вниз, то уменьшаем громкость на один шаг (1dB) с периодичностью interval.
  
  
                                      
}
}
 
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~



/* функция void tda7442 вызов управления по I2C ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
void tda7442(byte subaddressbyte data)  //Вызов данных tda7442

Wire.beginTransmission(0x40); /*СТАРТ (посылается бит старта по I2C шине) и Адрес микросхемы  tda7442  (посылается 7бит адреса по I2C шине и еще один нолик)*/
/*после beginTransmission дуина ждёт по линии ДАТА ответа от tda7442 ( присаживание линии на землю во время 8 бита синхросигнала)и потом передает*/
Wire.write(subaddress);       //Подадрес команды 
Wire.write(data);             //Команда 
Wire.endTransmission();       //СТОП 
/* То есть когда есть связь с tda7442, то функция (void tda7442) посылает сначала первый пакет tda7442(0), потом данные этого пакета 0b01000000
   Потом функция (void tda7442) посылает  второй пакет tda7442(1), потом данные этого пакета 0b00000110
   и так до конца: tda7442(9, 0b00000110); */
}
/*конец void tda7442~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

//===========================================================================================================================================================================
//===========================================================================================================================================================================
//===========================================================================================================================================================================

void IntToChar(int numchar *text)//функция, возвращающая число в текстовый вид 000 111
{
  
//text[0] = (num/100) + '0'; // первое значение _00 - эта строчка нужна для 3хзначного числа.
  
text[1] = ((num/10)%10) + '0';// второе значение __0
  
text[2] = (num%10) + '0'// третее значение ___
}
//===========================================================================================================================================================================
//===========================================================================================================================================================================
//===========================================================================================================================================================================


void printDISPLAY(unsigned long interval//функция вывода информации на дисплей и конвертации басов и высоких частот из байт в десятичную систему.
{
  static 
unsigned long prevTime=0;
  if(
millis()-prevTime>interval){
                                     
prevTime=millis();
                                     if (
13,1){digitalWrite(13,0);} 
                                     if (
MENUmode == 0) {
                                                        
int Mdisp =map(MasterVolume080800);// переменная, зеркалим значение громкости, чтобы нормально выводить на дисплей(громче-больше)http://arduino.ua/ru/prog/Map
                                                        
lcd.setCursor(00);
                                                        
lcd.printHorizontalGraph('v'0Mdisp80); //name of the bar, first  row, current value, max. value вывод полоски громкости в первой строке
                                                        //-------------------2 строка---------------------------------
                                                        
lcd.setCursor(01); //2строка 0символ 
                                                        
if (MasterVolume==80)
                                                              {
lcd.print      ("      MUTE      ");  }
                                                              else  {
lcd.print("VOLUME     -");  }
                                                        
lcd.print(MasterVolume);
                                                        
lcd.print("dB ");
                                                        
                                                       }
                                      else 
//if (MENUmode == 1-6)
                                                        
{
                                                          
//конвертация басов из байт в десятичную_____________________________________________________________________________________
                                                          
if (24<=BASSlevelBYTE && BASSlevelBYTE<=31) {  BASSlevelDEC = (map (BASSlevelBYTE30,24,   17))*2; }// положительное значение
                                                          
if (16<=BASSlevelBYTE && BASSlevelBYTE<=23) {  BASSlevelDEC = (map (BASSlevelBYTE16,22, -7, -1))*2; }// отрицательное значение
                                                          
if (BASSlevelBYTE == 0b00011111 || BASSlevelBYTE == 0b00010111) {BASSlevelDEC 0;}
                                                          
//конвертация верхов из байт в десятичную
                                                          
if (142<=TREBlevelBYTE && TREBlevelBYTE<=254) {  TREBlevelDEC = (map (TREBlevelBYTE238,142,   17))*2; }// положительное значение
                                                          
if (14<=TREBlevelBYTE && TREBlevelBYTE<=126)  {  TREBlevelDEC = (map (TREBlevelBYTE14,110, -7, -1))*2; }// отрицательное значение
                                                          
if (TREBlevelBYTE == 0b01111110 || TREBlevelBYTE == 0b11111110) {TREBlevelDEC 0;}
                                                          
//_____________________________________________________________________________________________________________________________

                                                          
lcd.setCursor(00);
                                                          
lcd.print(strokaI);
                                                          
                                                          
lcd.setCursor(01); //2строка 0символ 
                                                          
lcd.print(strokaII);
                                                        }

                                  
                              }
}



//===========================================================================================================================================================================
//===========================================================================================================================================================================
//===========================================================================================================================================================================

void ENCODER () //функция обработки энкодера
{
  
    static 
uint8_t oldValue 0;
    
uint8_t grayValue digitalRead(ENC_PIN1) | (digitalRead(ENC_PIN2) << 1), value graydecode(grayValue);
    if (
stepENC >0){if((millis() - prevTimeE >120)){if (stepENC>6){stepENC=6;}/*НАДО ОбНУЛЯТЬРАЗ В 420*/ if((millis() - prevTimeE 130)) {prevTimeE millis(); stepENC--;}}} //это обнуляет "ускоение" энкодера при регулировке громкости, суммарно около секунды
                        
                    

  
if (value == 0// Энкодер вращается
                

                   
                        if (
oldValue == 3)  /*  вращение влево // увеличиваем громкость, не более чем до 80*/
                                          
{
                                                                
timerMENU millis();
                                                                if (
MENUmode == 0)  // то регулируем громкость   
                                                                                    
{     
                                                                                    if (
MasterVolume == 80){stepENC 1;} else {stepENC++;}   /* Serial.println(stepENC);*/
                                                                                    
if( stepENC ) {stepVOLamount 1;}
                                                                                    else  if( 
stepENC 10 ) {stepVOLamount 4;} else  if( stepENC 14 ) {stepVOLamount 6;} else  if( stepENC 24 ) {stepVOLamount 8;}
                                                                                    
prevTimeE millis();
                                                                                    if(
MasterVolume stepVOLamount <= 80) {(MasterVolume += stepVOLamount);}else {MasterVolume 80;}
                                                                                    }
                                                                if (
MENUmode == 1//то лазим по меню
                                                                                    
{
                                                                                    
vibor_nomera_punkta_v_MENU--;
                                                                                    }
                                                                                    
                                                                if (
MENUmode == 2//настройка громкости при включении и потом запись в еепром (80)
                                                                                    
{
                                                                                    if  (
MasterVolume<=79){MasterVolume++;}
                                                                                    }
                                                                                                                                                     
                                                                if (
MENUmode == 3)  //настройка басов
                                                                                    

                                                                                      if (
BASSlevelBYTE==31 ){BASSlevelBYTE 23;} 
                                                                                      if (
BASSlevelBYTE<=23 && BASSlevelBYTE>16){BASSlevelBYTE BASSlevelBYTE-0b00000001;}
                                                                                      if (
BASSlevelBYTE>=24 && BASSlevelBYTE<=31){BASSlevelBYTE BASSlevelBYTE+0b00000001;}
                                                                                     } 
                                                    
                                                                if (
MENUmode == 4)  //настройка пищалок
                                                                                    

                                                                                      if (
TREBlevelBYTE==254 ){TREBlevelBYTE 126;} 
                                                                                      if (
TREBlevelBYTE<=126 && TREBlevelBYTE>14){TREBlevelBYTE TREBlevelBYTE-16;}
                                                                                      if (
TREBlevelBYTE>=142 && TREBlevelBYTE<=254){TREBlevelBYTE TREBlevelBYTE+16;}
                                                                                    } 
                                                                if (
MENUmode == 5// EQstate
                                                                                    
{
                                                                                      
EQstate =0b00000110//0b00000110 eq вЫключён
                                                                                    
}
                                                                if (
MENUmode == 6// РЕСЕТ настроек
                                                                                    
{
                                                                                      
DEFAULT_RESETstate 1;
                                                                                    }
                                if (
MENUmode == 7// выбор источника
                                                                                    
{
                                                                                      if (
selectINPUT<6) {selectINPUT selectINPUT+2;}
                                                                                    }
                                if (
MENUmode == 8// приглушение  источника (INPUT_ATTENUATION) 
                                                                                    
{
                                                                                      if (
INPUT_ATTENUATION 127) {INPUT_ATTENUATION INPUT_ATTENUATION+1;}
                                                                                    }   
                                          
                                                                          
                                           }
// конец вращение влево
                    
                                           
                        
else if (oldValue == 1//  вращение вправо
                                                                

                                                                
timerMENU millis();
                                                                if (
MENUmode == 0)  // то регулируем громкость  
                                                                                   

                                                                                   if (
MasterVolume == 0){stepENC 1;} else {stepENC++;}    /*Serial.println(stepENC);*/
                                                                                   
if( stepENC ) {stepVOLamount 1;}
                                                                                   else  if( 
stepENC ) {stepVOLamount 4;}    else  if( stepENC 12 ) {stepVOLamount 6;}  else  if( stepENC 18 ) {stepVOLamount 10;}
                                                                                   
prevTimeE millis();
                                                                                   if(
MasterVolume stepVOLamount >= 0){ (MasterVolume -= stepVOLamount);} else{ MasterVolume 0/*Serial.println(MasterVolume);*/ }  /* уменьшаем громкость, но не ниже 0*/
                                                                                   
}
                                                                if (
MENUmode == 1//выбор в корне основного меню
                                                                                   

                                                                                   
vibor_nomera_punkta_v_MENU++;  
                                                                                   } 
                                                                if (
MENUmode == 2//настройка громкости при включении и потом запись в еепром (80)
                                                                                  
{
                                                                                   if  (
MasterVolume>=1){MasterVolume--;}
                                                                                  } 
                                            
                                            
                                                                if (
MENUmode == 3)    //настройка басов
                                                                                  
{
                                                                                  if (
BASSlevelBYTE>24 && BASSlevelBYTE<31){BASSlevelBYTE BASSlevelBYTE-0b00000001;}
                                                                                  if (
BASSlevelBYTE==23 ){BASSlevelBYTE 30;}  
                                                                                  if (
BASSlevelBYTE==31 ){BASSlevelBYTE 30;}                              
                                                                                  if (
BASSlevelBYTE<=23 && BASSlevelBYTE>=16){BASSlevelBYTE BASSlevelBYTE+0b00000001;}
                                                                                  }
                                                                if (
MENUmode == 4//настройка пищалок
                                                                                  
{
                                                                                    if (
TREBlevelBYTE>142 && TREBlevelBYTE<254){TREBlevelBYTE TREBlevelBYTE-16;}
                                                                                    if (
TREBlevelBYTE==126 ){TREBlevelBYTE 238;}  
                                                                                    if (
TREBlevelBYTE==254 ){TREBlevelBYTE 238;}                              
                                                                                    if (
TREBlevelBYTE<=126 && TREBlevelBYTE>=14){TREBlevelBYTE TREBlevelBYTE+16;}
                                                                                  }
                                                                if (
MENUmode == 5// EQstate
                                                                                  
{
                                                                                  
EQstate =0b11111001//0b00000001 eq включён - есть подмешивание каналов ??? 0b11111001
                                                                                  
}  
                                                                if (
MENUmode == 6){DEFAULT_RESETstate 2;}   
                                if (
MENUmode == 7// выбор источника
                                                                                    
{
                                                                                      if (
selectINPUT>0) {selectINPUT selectINPUT-2;}
                                                                                    }
                                if (
MENUmode == 8// приглушение  источника (INPUT_ATTENUATION) 
                                                                                    
{
                                                                                      if (
INPUT_ATTENUATION 64) {INPUT_ATTENUATION INPUT_ATTENUATION-1;}
                                                                                    }         
                        }
// конец вращение вправо
                         
                
}//конец Энкодер вращается

 
  
oldValue value;

 
  
//конец функции обработки энкодера

//===========================================================================================================================================================================
//===========================================================================================================================================================================
//===========================================================================================================================================================================


 
void loop() //~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~

 

  
 

 
VOLUPbutton.read();    // читаем фильтрованное значение СТАТУСА кнопки громкости 
VOLDNbutton.read();    // читаем фильтрованное значение СТАТУСА кнопки громкости 
MUTE_or_MENU_button.read();     // читаем фильтрованное значение СТАТУСА кнопки MUTE

                          /*               Примеры
                           REDbutton.read();      // читаем фильтрованное значение СТАТУСА кнопки
                           BLACKbutton.read();    // читаем фильтрованное значение СТАТУСА кнопки
                           if (REDbutton.click_down) {Serial.println("REDbutton = najata"); }             //нажатие кнопки  
                           if (REDbutton.click_up) {Serial.println("REDbutton = otpustily"); }            //отпускание кнопки 
                           if (REDbutton.doubleclick) {Serial.println("REDbutton = doubleclick"); }       //двойной клик 
                           if (REDbutton.timer) {Serial.println("REDbutton = neaktivnost knopki"); }      //неактивность 
                           if (REDbutton.retention) {Serial.println("REDbutton = uderjanie");}            // нажатие и удержание  
                           */


 
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~обработка MUTE_or_MENU_button~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
 
if (MasterVolume<80&&MuteActiv ==1){MuteActiv 0;}
 if (
MUTE_or_MENU_button.click_down){timerMENU millis();}
 if (
MENUmode == 0)
                   {
                   if (
MUTE_or_MENU_button.click_down)//если кнопка MUTE однократно нажата
                          

                          if (
MuteActiv == 0){MasterVolumeDoMUTE MasterVolume;}
                          
MuteActiv = (!MuteActiv); 
                          if (
MuteActiv == 1){ MasterVolumeDoMUTE MasterVolumeMasterVolume=80; }
                          if (
MuteActiv==) { MasterVolume MasterVolumeDoMUTEMuteActiv 0; }
                          
Serial.print("MuteActiv = " );Serial.print(MuteActiv);Serial.print("   MasterVolume = "); Serial.println(MasterVolume);
                          }
                   }    
 
 
 
 if (
MENUmode == 1)//зашли в режим меню и настроек (главное меню)  ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ 
                   
{
                        if(
vibor_nomera_punkta_v_MENU<=0)   { vibor_nomera_punkta_v_MENU=8;}          //ограничим количество режимов меню (всего 8 пунктов)
                        
if(vibor_nomera_punkta_v_MENU>=9)   { vibor_nomera_punkta_v_MENU=1;}          //переключать режимы будем циклично
    
                        
sprintf(strokaI,"-- SETUP MODE --"); //запись в буфер текста и значений
                      //--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------         
                        
if (vibor_nomera_punkta_v_MENU == 1){sprintf(strokaII,"<   exit setup  ");  }    
                        if (
MUTE_or_MENU_button.click_down && vibor_nomera_punkta_v_MENU==1){MENUmode 0;} //если кнопка MUTE однократно нажата в режиме vibor_nomera_punkta_v_MENU_1( EXIT setup), то => закрыть меню и выйти в обычный режим
                      //--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------         
                        
if (vibor_nomera_punkta_v_MENU == 2){//настройка громкости при первом включении (с записью в еепром 80 адрес)
                                                             
sprintfstrokaI,"SETUP volume on ");
                                                             
sprintf(strokaII,"power ON   -__dB") ; IntToChar(EEPROM.read(80), &strokaII[11]);
                                                            }   
                        if (
MUTE_or_MENU_button.click_down && vibor_nomera_punkta_v_MENU==2){MENUmode 2MasterVolume EEPROM.read(80);}// //если кнопка MUTE однократно нажата в режиме vibor_nomera_punkta_v_MENU_2 (setup vol on Pon) , то надо бы включить подменю выбора значения 0-80 для записи в еепром атмеги
                      //--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------         
                        
if (vibor_nomera_punkta_v_MENU == 3)//SETUP bass - настройка басов
                                                            
{
                                                            if (
EQstate == 0b11111001) {sprintfstrokaI,"SETUP BASS  eqON") ;}
                                                            if (
EQstate == 0b00000110) {sprintfstrokaI,"SETUP BASS eqOFF") ;}
                                                            if (
BASSlevelDEC >=0)      {sprintf(strokaII,"now bass=  +__dB") ;IntToChar(BASSlevelDEC , &strokaII[11]);} 
                                                            else                       {
sprintf(strokaII,"now bass=  -__dB") ;IntToChar(((~BASSlevelDEC)+1), &strokaII[11]);}
                                  
                                                            }   
                        if (
MUTE_or_MENU_button.click_down && vibor_nomera_punkta_v_MENU==3){MENUmode 3; }
                      
            
                      
//--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------         
                        
if (vibor_nomera_punkta_v_MENU == 5// выбор включен ли эквалайзер 
                                                            
{
                                                            
sprintfstrokaI,"SETUP  EQ state "); 
                                                            if (
EQstate == 0b11111001) {sprintf(strokaII,"   EQ  ON       ") ;}
                                                            else              {
sprintf(strokaII,"   EQ  OFF      ") ;}                  
                                                            } 
                        if (
MUTE_or_MENU_button.click_down && vibor_nomera_punkta_v_MENU==5){MENUmode 5; }
                      
//--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------         
              
                      
if (vibor_nomera_punkta_v_MENU == 4// настройка пищалок
                                                            
{
                                                             if (
EQstate == 0b11111001) {sprintfstrokaI,"SETUP TREB  eqON") ;}
                                                             if (
EQstate == 0b00000110) {sprintfstrokaI,"SETUP TREB eqOFF") ;}
                                                                   if (
TREBlevelDEC >=0){sprintf(strokaII,"now treb=  +__dB") ;IntToChar(TREBlevelDEC , &strokaII[11]);}   
                                                                       else             {
sprintf(strokaII,"now treb=  -__dB") ;IntToChar(((~TREBlevelDEC)+1), &strokaII[11]);}  
                                                            } 
                      if (
MUTE_or_MENU_button.click_down && vibor_nomera_punkta_v_MENU==4){MENUmode 4; }
                     
//--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------         

                      
if (vibor_nomera_punkta_v_MENU == 6// сброс на начальные установки
                                                            
{
                                                              
sprintfstrokaI,"RESET ALL PARAMS") ;
                                                              
sprintf(strokaII,"   TO DEFAULT   ") ;
                                                            } 
                      if (
MUTE_or_MENU_button.click_down && vibor_nomera_punkta_v_MENU==6){MENUmode 6; }
                      
//--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------         
                      
if (vibor_nomera_punkta_v_MENU == 7// ВЫБОР ВХОДА ( IN1 - IN4)
                                                            
{
                                                             
sprintfstrokaI,"INPUT SELECT    ") ;
                                                             
sprintf(strokaII,"        AUX __  ") ; IntToChar( (map (selectINPUT06,   41)) , &strokaII[11]   );  
                                                            }
                      if (
MUTE_or_MENU_button.click_down && vibor_nomera_punkta_v_MENU==7){MENUmode 7; }
                   
//--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------         
            
if (vibor_nomera_punkta_v_MENU == 8// приглушение  источника (INPUT_ATTENUATION) 
                                                            
{
                                                             
sprintfstrokaI,"ATTENUATION     ") ;
                                                             
sprintf(strokaII,"INPUT           ") ; IntToChar( (map (INPUT_ATTENUATION64127,   630)) , &strokaII[11]   );  
                                                            }
                      if (
MUTE_or_MENU_button.click_down && vibor_nomera_punkta_v_MENU==8){MENUmode 8; }
                   
//--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------         

                   
}//КОНЕЦ режима меню и настроек  ( конец главного меню)  ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ 
// ворая ступень меню ~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`                   
                                 
if (MENUmode == 2)//настройка громкости при первом включении ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ 
                                                   
{
                                                    
sprintf(  strokaI,"select volume on");
                                                    
sprintfstrokaII,"power ON   -__dB");  IntToChar(MasterVolume, &strokaII[11]);
                                                    
                                                    if (
MUTE_or_MENU_button.click_down){  
                                                                                        if (
EEPROM.read(80)==MasterVolume){ } else { EEPROM.write(80,MasterVolume); MENUmode 1; }
                                                                                       }
                                                   }
//~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ 
                                 
if (MENUmode == 3)//SETUP bass - настройка басов 
                                                   
{
                                                    if (
EQstate == 0b11111001) {sprintfstrokaI,"set bass    eqON") ;}
                                                    if (
EQstate == 0b00000110) {sprintfstrokaI,"set bass   eqOFF") ;}
                                                          if (
BASSlevelDEC >=0){sprintf(strokaII,"level      +__dB") ;IntToChar(BASSlevelDEC, &strokaII[11]);} 
                                                                          else {
sprintf(strokaII,"level      -__dB") ;IntToChar(((~BASSlevelDEC)+1), &strokaII[11]);}
                                                    if (
MUTE_or_MENU_button.click_down){  
                                                                                        if (
EEPROM.read(81)==BASSlevelBYTE){ } else { MENUmode 1;EEPROM.write(81,BASSlevelBYTE);}
                                                                                       }
                                                   }
//~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ 
                                 
if (MENUmode == 5)  // выбор включен ли эквалайзер 
                                                   
{
                                                    
sprintf                           (  strokaI,"select EQ state ");  
                                                    if (
EQstate == 0b11111001) {sprintf(strokaII,"EQ now is ON    ") ;}
                                                    else                       {
sprintf(strokaII,"EQ now is OFF   ") ;}
                                                    if (
MUTE_or_MENU_button.click_down) {
                                                                                         if (
EEPROM.read(79) == EQstate) {} else { MENUmode 1;EEPROM.write(79,EQstate);}
                                                                                        }
                                                   }
//~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ 
                                 
if (MENUmode == 4)// настройка пищалок
                                                   
{
                                                    if (
EQstate == 0b11111001) {sprintfstrokaI,"set treb    eqON") ;}
                                                    if (
EQstate == 0b00000110) {sprintfstrokaI,"set treb   eqOFF") ;}
                                                          if (
TREBlevelDEC >=0){sprintf(strokaII,"level      +__dB") ;IntToChar(TREBlevelDEC, &strokaII[11]);} 
                                                                          else {
sprintf(strokaII,"level      -__dB") ;IntToChar(((~TREBlevelDEC)+1), &strokaII[11]);}
                                                    if (
MUTE_or_MENU_button.click_down){   
                                                                                        if (
EEPROM.read(82)==TREBlevelBYTE){ } else { MENUmode 1;EEPROM.write(82,TREBlevelBYTE);}
                                                                                       }
                                                   }
//~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~    
                                 
if (MENUmode == 6)// сброс на начальные установки
                                                   
{
                                                      
sprintfstrokaI,                           "reset ALL       ") ;
                                                      if (
DEFAULT_RESETstate==1){sprintf(strokaII,"params     <NO> ") ;  if (MUTE_or_MENU_button.click_down) {MENUmode 0;}}
                                                      if (
DEFAULT_RESETstate==2){sprintf(strokaII,"params    <YES> ") ;  if (MUTE_or_MENU_button.click_down//если выбрали в меню сброс на начальные установки, то 
                                                                                                                                                            
{
                                                                                                                                                            
DEFAULT_RESETstate=0// обнуляем переменную сброса ( сбросить или НЕ сбросить можно только один раз, потом надо передёргивать питание атмеги)
                                                                                                                                                            
EEPROM.write(81,0b00011111); BASSlevelBYTE 0b00011111//по умолчанию басы
                                                                                                                                                            
EEPROM.write(82,0b11111110); TREBlevelBYTE 0b11111110//по умолчанию пищалки
                                                                                                                                                            
EEPROM.write(79,0b11111001); EQstate 0b11111001;     //по умолчанию статус EQ  = EQ ON
                                                                                                                                                            
EEPROM.write(80,24);         MasterVolume 24;      //по умолчанию громкость при включении
                                                                              
EEPROM.write(78,6); // //по умолчанию выбор входа AUX
                                                                              
EEPROM.write(77,64); INPUT_ATTENUATION 64;//INPUT ATTENUATION    приглушение ВХОДНОГО (IN1-IN4) канала (0 ~ -31.5dB)(0db-макс громкость, без приглушения) 64 = 0dB   255 = -31.5dB
                                                                                                                                                            
MENUmode 0// вышли в корень меню. 
                                                                                                                                                            

                                                                    }
                                                      
                                                          
                                                   }
//~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ 
                                  
if (MENUmode == 7)  // // ВЫБОР ВХОДА ( IN1 - IN4)
                                                   
{
                                                    
sprintf  strokaI,"select AUX      ");  
                          
sprintf  (strokaII,"                ") ;IntToChar((map (selectINPUT06,   41)), &strokaII[11]); //map (selectINPUT, 0, 6,   1, 4); 
                                                    
if (MUTE_or_MENU_button.click_down) {
                                                                                         if (
EEPROM.read(78) == selectINPUT) {} else { MENUmode 1;EEPROM.write(78,selectINPUT);}
                                                                                        }
                           }
//~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~  
                  
if (MENUmode == 8)  // приглушение  источника (INPUT_ATTENUATION) 
                                                   
{
                                                    
sprintf  strokaI,"SET ATTENUATION ");  
                            
sprintf  (strokaII,"Level =         ");  IntToChar( (map (INPUT_ATTENUATION64127,   630)) , &strokaII[11]   ); 
                                                  
//  sprintf  (strokaII,"Level =         ");  IntToChar( INPUT_ATTENUATION , &strokaII[11]   ); 
                          
if (MUTE_or_MENU_button.click_down) {
                                                                                         if (
EEPROM.read(77) == INPUT_ATTENUATION) {} else { MENUmode 1;EEPROM.write(77,INPUT_ATTENUATION);}
                                                                                        }
                           }                    
//~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~            
           
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~конец обработки MUTE_or_MENU_button~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

//===========================================================================================================================================================================
//======================================================обработка MENU===================================================================================================
//===========================================================================================================================================================================

if (MUTE_or_MENU_button.retention) {                                           // если удерживаем нажатой кнопку MUTE  
                            //Serial.println("MUTE_or_MENU_button = uderjanie");
                            
MENUmode = (!MENUmode); //инвертируем признак того, что мы в меню //MENUmode = 2 - есть и такая строка, тогда MENUmode = (!MENUmode); должно работать некорректно. НО работает так, как надо
                            
timerMENU millis(); 
                            
MuteActiv = (!MuteActiv); //возвращаем состояние MUTE на предидущее ( потому что нажав кнопку меню мы сначела жмём MUTE, а только потом активируется меню)
                            
if (MuteActiv == 1){ MasterVolumeDoMUTE MasterVolumeMasterVolume=80; }  // этими двумя строками возвращаем громкость на уровень " ДО НАЖАТИЯ MENU-MUTE"
                            
if (MuteActiv==) { MasterVolume MasterVolumeDoMUTEMuteActiv 0; }
                          }            


if( 
millis() - timerMENU >= 10000 && MENUmode >= 1// в режиме меню ждем 10 сек
                                   
{
                                    
MENUmode 0;
                                    
DEFAULT_RESETstate=0// обнулили переменную сброса настроек. Теперь настройки сбросить нельзя до перезапуска атмеги
                                   
}
//===========================================================================================================================================================================
//===========================================================================================================================================================================
//===========================================================================================================================================================================



/*~~~~~~~~~~~~~~~~~~~~~~обработка нажатия кнопок громкости~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
  
if (VOLUPbutton.click_down/*если кнопка VOL+ однократно нажата  то ДЕЛАЕМ ШАГ(1 РАЗ): включаем светик, уменьшаем переменную громкости (для увеличения звука)выводим значение громкости в порт.*/
        
{                                                       
           if (
MasterVolume==0){Serial.println ("I tak VOLUME MAX (0dB)"); } else (MasterVolume--);  Serial.print("MasterVolume = "); Serial.print(MasterVolume); Serial.println("dB"); // выводим значение громкости в ком порт
           
digitalWrite(13,!digitalRead(13)); 
        }
  if (
VOLDNbutton.click_down/*если кнопка VOL- однократно нажата то ДЕЛАЕМ ШАГ(1 РАЗ): увеличиваем переменную громкости (для уменьшения звука)выводим значение громкости в порт*/
        
{  
           if (
MasterVolume==80){Serial.println ("I tak VOLUME MIN (80dB-MUTE)");}  else (MasterVolume++);    Serial.print("MasterVolume = "); Serial.print(MasterVolume); Serial.println("dB"); // выводим значение громкости в ком порт
           
digitalWrite(13,!digitalRead(13)); 
        }
/*===================================================================================================================*/

/*~~~~~~~~~~~~~~~~~~~~~~обработка удержания кнопок громкости~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
if (VOLUPbutton.retention==1){Vupupup 1;}                  //если кнопка нажата  и удерживается //надо бы увеличивать громкость по шагам
if (VOLDNbutton.retention==1){Vdndndn 1; }                 //если кнопка нажата  и удержмвается //надо бы уменьшать громкость по шагам
  
if (VOLUPbutton.click_up) { Vupupup 0USCORENIE 0;}   //если отпустили кнопку, надо бы перестать увеличивать громкость по шагам
  
if (VOLDNbutton.click_up) { Vdndndn 0USCORENIE 0;}       
VOLFAST(VOLUME_INTERVAL); //заходим в функцию VOLFAST, которая  ЕСЛИ удерживаются кнопки регулировки громкости, то увеличивает или уменьшает громкость на один шаг (1dB) с периодичностью VOLUME_INTERVAL.   
/*===================================================================================================================*/



/*для энкодера~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
ENCODER(); // опрос энкодера раз в 0 миллисекунду
/*конец для энкодера~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/



/*ДЛЯ активации другого входа по сообытию */
if (autoAUX2 ==1) {selectINPUT_OLD =  selectINPUTselectINPUT 2;} // если сработало сообытие ( например на пин autoAUX2 пришла 1), то сохраняем текущий звуковой вход в selectINPUT_OLD, и включаем ВХОД 2 ( если нужен другой вход, то вместо 2 поставить 0 2 4 6)(6 - вход звука по умолчанию 3,4 пины)
                         
else  {if (MENUmode == 0) {selectINPUT selectINPUT_OLD ;}}     // если сообытие прошло, то возвращаемся на звуковой вход, который играл до этого. 
/* конец активации другого входа по сообытию*/



/*конфигурация void tda7442~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

//tda7442(0, 0b01000000);  //INPUT ATTENUATION    приглушение ВХОДНОГО (IN1-IN4) канала (0 ~ -31.5dB)(0db-макс громкость, без приглушения)
tda7442(0INPUT_ATTENUATION);  //INPUT ATTENUATION    приглушение ВХОДНОГО (IN1-IN4) канала (0 ~ -31.5dB)(0db-макс громкость, без приглушения)
tda7442(1EQstate);  //SURROUND & OUT & EFFECT CONTROL( -6 FIX OFF) 0b00000001 = EQ_ON
tda7442(20b00000011);  //SURROUND PHASE RESISTOR( 37KOm)
tda7442(3BASSlevelBYTE);  //BXXX0011 BASS SELECTION (0dB)-14dB  (0b0001100 = 14dB; 0b00011000 + 0b00000001 = 0b00011001 (+12dB) 
tda7442(4TREBlevelBYTE);  //BXXX0100  0b01111110 TREBLE (0dB)
tda7442(5,  MasterVolume); //0 - макс громкость, 80-255 - MUTE .  // регулировку громкости можно делать  0dB ~ -79dB в DEC c шагом 1. если (80-255) - то MUTE    //tda7442(5, 0b00000000);  //BXXX0101 SPEAKER ATTENUATION "L" (0dB)( SPEAKER SELECTION = 0dB ~ -79dB) громкость правого канала
tda7442(6,  MasterVolume); //tda7442(6, 0b00000000);  //BXXX0110 SPEAKER ATTENUATION "R" (0dB) громкость левого канала
tda7442(70b00000000);  //BXXX0111 NOT ALLOWED
tda7442(80b00000000);  //BXXX1000 NOT ALLOWED         
tda7442(9selectINPUT/*0b00000110*/);  //BXXX1001 INPUT MULTIPLEXER выбор источника IN1-4 (6-in1 4-in4  2-in3 0-in2 по даташиту)
/*конец конфигурации void tda7442~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/






 
  
  
  
  
 








printDISPLAY(120); // выводим на дисплей раз в 120( запуская фушкцию)
 
//для отладки:
//byte digit=10; http://arduino.ru/forum/programmirovanie/hex-bin
//Serial.println(digit); // "Представляем" в десятчной"
//Serial.println(digit,HEX); // "Представляем" в шестднацатеричной"
//Serial.println(digit,BIN); // "Представляем" в двоичной"
//Serial.print("BASSlevel DEC = "); Serial.print(BASSlevelDEC); Serial.print(" dB    ");  Serial.print("BASSlevelBYTE = "); Serial.print(BASSlevelBYTE,BIN); Serial.println(" ");
                                                            //Serial.println(curr_bit_data,BIN); - тогда число выведется в двоичном виде
//Serial.print("TREBlevel DEC = "); Serial.print(TREBlevelDEC); Serial.print(" dB    ");  Serial.print("TREBlevelBYTE = "); Serial.print(TREBlevelBYTE,BIN); Serial.println(" ");

//Serial.print("selectINPUT  = "); Serial.println(selectINPUT);
//Serial.print("INPUT_ATTENUATION  = "); Serial.print(INPUT_ATTENUATION); Serial.print("     "); Serial.println(INPUT_ATTENUATION, BIN);
}//конец LOOP//~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~
//=====================================================================================================================================================================================================================================================
//__________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________ 
oleg707 вне форума   Ответить с цитированием
Старый 29.11.2016, 01:39   #52
oleg707
Гуру
 
Аватар для oleg707
 
Регистрация: 16.04.2014
Возраст: 40
Город: Gdynia
Регион: другой - для добавления сообщить ab
Сообщений: 2,548
oleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond repute
Lightbulb всё таки добавил моргание встроенным светодиодом на энкодер

когда нечего больше добавлять, начинают добавлять свистоперделки
еще чуть уменьшил периодичность вывода на дисплей - больше тормозит проц, зато чуть отзывчивее стал экран.
PHP код:
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//Скетч для 7442D
int ver 98;
// с подавлением дребезга кнопок 
// с динамическим увеличением/уменьшением громкости при удержании кнопок ( с УСКОРЕНИЕМ при удержании)
// с энкодером (код грея - коррекция ошибок энкодера) 
// динамическое изменение скорости уменьшения\увеличения громкости при долгом воздействии на энкодер++. (требуется тонкая подстройка в реальной машине)
// с функцией MUTE
// дисплей по I2C
// с ползунком громкости на дисплее
// с монитором по ком-порту
//мигание встроенного светодиода   при нажатии-удержании кнопок громкости, при вращении энкодером, при нажатии на кнопку энкодера(mute) или при её удержании (меню)
//с выбором в меню, какое значение громкости выставлять при подаче питания на ардуину. С записью этого значения в еепром и чтением при подаче питания на атмегу. ( если не прописано, то пишется громкость по умолчанию -24dB )
//C активацией внутреннего эквалайзера TDA7442D (EQ_ON EQ_OFF) -  басы и пищалки
// Добавил меню сброса на настройки по умолчанию ( заодно восстанавливает неправильно записанный еепром на нужные значения), работает только один раз, потом надо передёрнуть питание. 
// добавил выбор источника IN1 - IN4 с записью в еепром. По умолчанию стоит IN1 (3 и 4 контакты TDA7442D). 
// добавил автоматическое переключение текущего аудиовхода на заданный. Например, для громкой связи через колонки.  переменная (autoAUX2 = 0;) Нужна для автоматического включения какого-либо входа  IN1-4, если (autoAUX2 ==1) .
// добавил INPUT ATTENUATION  - приглушение ВХОДНОГО (IN1-IN4) канала, будет полезно для микширования аудиосигнала (8,10 пины TDA7442D - постоянный сигнал; (3,4)(5,2)(6,1)(7,28) пины - подмешиваемый сигнал с регулировкой громкости с шагом 0,5 dB ). 
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// класс титановый велосипед для тактовой кнопки. (версия 1.0)http://arduino.ru/forum/programmirovanie/klass-titanovyi-velosiped-dlya-taktovoi-knopki
// фильтр дребезга, отслеживание событий: нажатие, отпускание, двойное нажатие(doubleclick), нажато и удерживается в течении определённого времени, отпущено и неактивно в течении определённого времени.
// Bitwise NOT (~) https://www.arduino.cc/en/Reference/BitwiseXorNot
// abs() Возвращает модуль числа. http://arduino.ru/Reference/Abs
#include <Arduino.h>
#include <Wire.h> /*добавление библиотеки I2C шины*/
#include <LiquidCrystal_I2C.h>  /*добавление библиотеки для работы с дисплеем по I2C*/
LiquidCrystal_I2C lcd(PCF8574_ADDR_A21_A11_A014561611121314POSITIVE);  // для newE  описание библиотеки http://elchupanibrei.livejournal.com/27443.html#t23347 
#include <EEPROM.h>
char  strokaI[32] = "                ";// Массив для вывода 1 строки на дисплей , объявляем длиннее(32символа), чтобы не было глюков с отображением на экране
char strokaII[32] = "                ";// Массив для вывода 2 строки на дисплей




  


class BUTTON {
public:
//============================================================================================
// константы настроек класса.
static const byte bounce_            =   50// длительность отслеживания дребезга.
static const byte doubleclick_       =  250// длительность отслеживания двойного нажатия.
static const unsigned long timer_    5000// длительность отслеживания неактивности.
static const unsigned int retention_ 500// длительность отслеживания нажатия и удержания.
//============================================================================================
unsigned long start// старт отсчёта времени.
boolean p;           // состояние пина кнопки.
boolean s;           // программное состояние кнопки.
boolean b;           // состояние таймера фильтра дребезга.
byte    c;           // переменная счётчика двойного нажатия.
boolean t;           // состояние таймера неактивности.
boolean r;           // состояние таймера нажатия и удержания.
//============================================================
boolean click_down;  // событие нажатия.
boolean click_up;    // событие отпускания.
boolean doubleclick// событие двойного нажатия.
boolean timer;       // событие неактивности.
boolean retention;   // событие нажатия и удержания.
//============================================================
byte _pb;
//============================================================
BUTTON(byte pb) {
_pb pb;
pinMode(_pbINPUT);
digitalWrite(_pb1);
//===================
start millis();
p     digitalRead(_pb);
// p     = !digitalRead(_pb); // отключить тихий старт.
s     p;
b     0;
c     0;
t     0;
r     0;
//==============
click_down  0;
click_up    0;
doubleclick 0;
timer       0;
retention   0;
//==============
}

void read() {
//==============================================================================
boolean np digitalRead(_pb); // текущее состояние пина кнопки.
unsigned long stop millis(); // стоп отсчёта времени.
//==============================================================================
click_down  0;
click_up    0;
doubleclick 0;
timer       0;
retention   0;
//==============================================================================
if (np != p) {npclick(); start stop111;} // состояние цифрового пина изменилось.
//==============================================================================
if (!= 0          ) {if (stop start bounce_     ) {0click();      }} // фильтр дребезга.
if (!= 0          ) {if (stop start doubleclick_) {0;               }} // обнуление счётчика двойного клика.
if (!= && == 1) {if (stop start timer_      ) {0timer     1;}} // неактивность.
if (!= && == 0) {if (stop start retention_  ) {0retention 1;}} // нажатие и удержание.
//==============================================================================
}

void click() {                       // нажатие, отпускание, двойное нажатие.
if (== && != p) {p;
if (
== 0) {click_down 1; ++c; if (== 2) {0doubleclick 1;}}
if (
== 1) {click_up   1;}
}
}

};
// конец class BUTTON
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//конец кода для чтения состояний кнопок ~
//=====================================================================================================================================================================================================================================================










//Подтяжку для кнопок на +5В делать не надо,  код для чтения состояний кнопок включает внутренний подтягивающий резистор на 20кОм

//                 ТУТ НАЗНАЧАЕМ ИМЕНА НАШИХ КНОПОК И К КАКИМ ПИНАМ ОНИ ПОДКЛЮЧЕНЫ           (также сюда пишем имена переменных, то, что обычно пишется ДО void setup().
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//BUTTON REDbutton(31);     //назначаем красной кнопке ножку 31. То есть один конец конпки подключён на пин 31 ардуины меги, а второй  конец конпки подключён на массу (GND)     Подтяжку на +5В делать не надо,  код для чтения состояний кнопок включает внутренний подтягивающий резистор на 20кОм
//BUTTON BLACKbutton (33);  //назначаем красной кнопке ножку 33. То есть один конец конпки подключён на пин 33 ардуины меги, а второй  конец конпки подключён на массу (GND)    Подтяжку на +5В делать не надо,  код для чтения состояний кнопок включает внутренний подтягивающий резистор на 20кОм
BUTTON VOLUPbutton(6);   //назначаем кнопке ГРОМКОСТИ++ ножку D6
BUTTON VOLDNbutton(7);   //назначаем кнопке ГРОМКОСТИ-- ножку D7
BUTTON MUTE_or_MENU_button(8);   //назначаем кнопке MUTE_or_MENU ножку D8

#define  VOLUME_INTERVAL  100UL  // интервал(время) между изменениями уровня громкости (0,05 секунд)
boolean Vupupup 0//переменная, показывающая надо ли увеличивать громкость раз в #define  VOLUME_INTERVAL  100UL (0,1Сек)
boolean Vdndndn 0//переменная, показывающая надо ли уменьшать громкость раз в #define  VOLUME_INTERVAL  100UL (0,1Сек)
byte USCORENIE 0//переменная, ускорение изменения громкости при удержании кнопок VOL+ и VOL-
boolean MuteActiv 0// Признак включённого режима MUTE (временное отключение громкости)
byte MENUmode 0// Признак включённого режима MENU
unsigned long timerMENU =  millis(); // время до того, как мы выйдем из режима меню в обычный режим.
byte vibor_nomera_punkta_v_MENU=1// выбор режима меню
byte MasterVolumeDoMUTE 80//Значение грмкости во время того, как включаем MUTE
byte MasterVolume EEPROM.read(80); //Значение громкости во время первого включения атмеги, надо читать из еепром. - переменная, хранящая в себе громкость выходного звука, 0 - макс громкость, 79- минимальная, 80-255 MUTE http://arduino.ru/Reference/Byte Тип данных byte 8-ми битное беззнаковое целое число, Если DEC - в диапазоне 0..255
byte  BASSlevelBYTE =EEPROM.read(81);  // значение уровня басов в двоичном виде, для прямого управления tda7442.  
int   BASSlevelDEC 0//значение уровня басов в десятичном виде, Может быть от -14 до +14 (-7-0-+7)
byte  TREBlevelBYTE EEPROM.read(82); // считываем уровень высоких частот из внутренней еепром с 82го адреса.
int   TREBlevelDEC 0//значение уровня пищалок в десятичном виде, Может быть от -14 до +14 (-7-0-+7)
byte EQstate =  EEPROM.read(79); //логическое состояние эквалайзера. 0b11111001 - включен,  0b00000110 eq вЫключён
byte DEFAULT_RESETstate 0// если 1 , то ресет всех значений и еепрома на значеня по умолчанию. 
byte selectINPUT EEPROM.read(78);  //BXXX1001 INPUT MULTIPLEXER выбор источника IN1-4 (6-in1 4-in4  2-in3 0-in2) поскольку физические номера входов ( по даташиту) и программные различаются, для облегчения кода придётся  поменять номера входов
bool autoAUX2 0// эта переменная нужна для автоматического включения какого-либо входа  IN1-4 . Например, для громкой связи через колонки. 
byte selectINPUT_OLD selectINPUT//  выбор источника, на который переключаться после окончания "сеанса громкой связи "
byte INPUT_ATTENUATION EEPROM.read(77);  //INPUT ATTENUATION    приглушение ВХОДНОГО (IN1-IN4) канала (0 ~ -31.5dB)(0db-макс громкость, без приглушения) 64 = 0dB   127 = -31.5dB


//====================================================================================
//для энкодера~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

byte stepVOLamount 0// шаг изменения громкости энкодером. Логика меняется в строках 310
byte stepENC 0// шаг изменения громкости энкодером в режиме ускорения (постоянное вращение)

unsigned long currentTimeVoumeControl;
unsigned long loopTimeVoumeControl;
unsigned long prevTimeE millis(); // время когда последний раз переключали энкодер

enum {ENC_PIN1 9ENC_PIN2 10};
// Преобразование значения Грея в двоичный код
// без изменений прямиком из wilipedia
unsigned graydecode(unsigned gray) {
  
unsigned bin;
  for (
bin 0graygray >>= 1)
    
bin ^= gray;
  return 
bin;
}
//  grayValue - Значение Грея
//  value     - Преобразованное значение Грея
//  oldValue  - Старое преобразованное значение Грея

//конец для энкодера~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
//====================================================================================
//=====================================================================================================================================================================================================================================================





 
void setup()    
 { 
Serial.begin(250000); // ком порт     
pinMode(13OUTPUT); // настройка пина встроенного светодиода на выход (чтоб моргать мог)        
Wire.begin(); // включение библиотеки I2C шины 
lcd.begin(162);//initialize the lcd newE

/*~~~~~~~~ для энкодера~~~~~~~~~~*/
pinMode(ENC_PIN1INPUT); //настройка пинов энкодера
digitalWrite(ENC_PIN11);       // включить подтягивающий резистор http://arduino.ru/Tutorial/DigitalPins
pinMode(ENC_PIN2INPUT);
digitalWrite(ENC_PIN21);

/*~~~~~~~~конец для энкодера~~~~~~~~~~*/
Serial.println("   S E T U P  ok   ");
Serial.print("   ver s"); Serial.println(ver);
lcd.noBacklight();
Serial.println("perexodim k osnovnoy programme ");
lcd.backlight();
if (
MasterVolume == 255) {EEPROM.write(80,24); MasterVolume 24;} //если считанное значение громкости_при_включении за рамками диапазона (0-80), то берём среднее значение 24 и пишем его в еепром по адресу 80 (0x80)
if (BASSlevelBYTE == 255) {EEPROM.write(81,0b00011111); BASSlevelBYTE 0b00011111; } //если считанное значение уровня басов за рамками диапазона, то пишем туда значение 0b00011111 ( в двоичной системе счисления - 8 байт)(0dB)
if (TREBlevelBYTE == 255) {EEPROM.write(82,0b11111110); TREBlevelBYTE 0b11111110; } //если считанное значение уровня верхов за рамками диапазона,0b11111110 ( в двоичной системе счисления - 8 байт)(+0dB)
if (EQstate == 255) {EEPROM.write(79,0b11111001); EQstate 0b11111001;} //  = EQ_ON
if (selectINPUT ==255 ){EEPROM.write(78,6); selectINPUT 6;} // AUX SELECT
if ( INPUT_ATTENUATION == 255)  {EEPROM.write(77,64); INPUT_ATTENUATION 64;} //INPUT ATTENUATION    приглушение ВХОДНОГО (IN1-IN4) канала (0 ~ -31.5dB)(0db-макс громкость, без приглушения) 64 = 0dB   127 = -31.5dB
 

//=====================================================================================================================================================================================================================================================



//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// ЕСЛИ удерживаются кнопки регулировки громкости, то увеличиваем или уменьшаем громкость на один шаг (1dB) с периодичностью (interval - USCORENIE + 8)
void VOLFAST(unsigned long interval )
{
  static 
unsigned long prevTime 0// время когда последний раз увеличивали или уменьшали громкость
  
if(millis() - prevTime interval-USCORENIE) {
                                       
prevTime millis();  // если зажаты сразу две кнопки, приоритет будет на громкость вниз.
                                       
if (Vupupup == && Vdndndn == 0) {if(interval-USCORENIE>8+20){USCORENIE USCORENIE 8;} if (MasterVolume==0)  { } else (MasterVolume--);  digitalWrite(13,!digitalRead(13)); } // если зажата громкость вверх, то увеличиваем громкость на один шаг (1dB) с периодичностью interval.
                                       
if (Vdndndn == 1)                 {if(interval-USCORENIE>10+20){USCORENIE USCORENIE 10;} if (MasterVolume==80){} else (MasterVolume++);  digitalWrite(13,!digitalRead(13)); } // если зажата громкость вниз, то уменьшаем громкость на один шаг (1dB) с периодичностью interval.
  
  
                                      
}
}
 
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~



/* функция void tda7442 вызов управления по I2C ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
void tda7442(byte subaddressbyte data)  //Вызов данных tda7442

Wire.beginTransmission(0x40); /*СТАРТ (посылается бит старта по I2C шине) и Адрес микросхемы  tda7442  (посылается 7бит адреса по I2C шине и еще один нолик)*/
/*после beginTransmission дуина ждёт по линии ДАТА ответа от tda7442 ( присаживание линии на землю во время 8 бита синхросигнала)и потом передает*/
Wire.write(subaddress);       //Подадрес команды 
Wire.write(data);             //Команда 
Wire.endTransmission();       //СТОП 
/* То есть когда есть связь с tda7442, то функция (void tda7442) посылает сначала первый пакет tda7442(0), потом данные этого пакета 0b01000000
   Потом функция (void tda7442) посылает  второй пакет tda7442(1), потом данные этого пакета 0b00000110
   и так до конца: tda7442(9, 0b00000110); */
}
/*конец void tda7442~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

//===========================================================================================================================================================================
//===========================================================================================================================================================================
//===========================================================================================================================================================================

void IntToChar(int numchar *text)//функция, возвращающая число в текстовый вид 000 111
{
  
//text[0] = (num/100) + '0'; // первое значение _00 - эта строчка нужна для 3хзначного числа.
  
text[1] = ((num/10)%10) + '0';// второе значение __0
  
text[2] = (num%10) + '0'// третее значение ___
}
//===========================================================================================================================================================================
//===========================================================================================================================================================================
//===========================================================================================================================================================================


void printDISPLAY(unsigned long interval//функция вывода информации на дисплей и конвертации басов и высоких частот из байт в десятичную систему.
{
  static 
unsigned long prevTime=0;
  if(
millis()-prevTime>interval){
                                     
prevTime=millis();
                                     if (
13,1){digitalWrite(13,0);} 
                                     if (
MENUmode == 0) {
                                                        
int Mdisp =map(MasterVolume080800);// переменная, зеркалим значение громкости, чтобы нормально выводить на дисплей(громче-больше)http://arduino.ua/ru/prog/Map
                                                        
lcd.setCursor(00);
                                                        
lcd.printHorizontalGraph('v'0Mdisp80); //name of the bar, first  row, current value, max. value вывод полоски громкости в первой строке
                                                        //-------------------2 строка---------------------------------
                                                        
lcd.setCursor(01); //2строка 0символ 
                                                        
if (MasterVolume==80)
                                                              {
lcd.print      ("      MUTE      ");  }
                                                              else  {
lcd.print("VOLUME     -");  }
                                                        
lcd.print(MasterVolume);
                                                        
lcd.print("dB ");
                                                        
                                                       }
                                      else 
//if (MENUmode == 1-6)
                                                        
{
                                                          
//конвертация басов из байт в десятичную_____________________________________________________________________________________
                                                          
if (24<=BASSlevelBYTE && BASSlevelBYTE<=31) {  BASSlevelDEC = (map (BASSlevelBYTE30,24,   17))*2; }// положительное значение
                                                          
if (16<=BASSlevelBYTE && BASSlevelBYTE<=23) {  BASSlevelDEC = (map (BASSlevelBYTE16,22, -7, -1))*2; }// отрицательное значение
                                                          
if (BASSlevelBYTE == 0b00011111 || BASSlevelBYTE == 0b00010111) {BASSlevelDEC 0;}
                                                          
//конвертация верхов из байт в десятичную
                                                          
if (142<=TREBlevelBYTE && TREBlevelBYTE<=254) {  TREBlevelDEC = (map (TREBlevelBYTE238,142,   17))*2; }// положительное значение
                                                          
if (14<=TREBlevelBYTE && TREBlevelBYTE<=126)  {  TREBlevelDEC = (map (TREBlevelBYTE14,110, -7, -1))*2; }// отрицательное значение
                                                          
if (TREBlevelBYTE == 0b01111110 || TREBlevelBYTE == 0b11111110) {TREBlevelDEC 0;}
                                                          
//_____________________________________________________________________________________________________________________________

                                                          
lcd.setCursor(00);
                                                          
lcd.print(strokaI);
                                                          
                                                          
lcd.setCursor(01); //2строка 0символ 
                                                          
lcd.print(strokaII);
                                                        }

                                  
                              }
}



//===========================================================================================================================================================================
//===========================================================================================================================================================================
//===========================================================================================================================================================================

void ENCODER () //функция обработки энкодера
{
  
    static 
uint8_t oldValue 0;
    
uint8_t grayValue digitalRead(ENC_PIN1) | (digitalRead(ENC_PIN2) << 1), value graydecode(grayValue);
    if (
stepENC >0){if((millis() - prevTimeE >120)){if (stepENC>6){stepENC=6;}/*НАДО ОбНУЛЯТЬРАЗ В 420*/ if((millis() - prevTimeE 130)) {prevTimeE millis(); stepENC--;}}} //это обнуляет "ускоение" энкодера при регулировке громкости, суммарно около секунды
                        
                    

  
if (value == 0// Энкодер вращается
                

                   
                        if (
oldValue == 3)  /*  вращение влево // увеличиваем громкость, не более чем до 80*/
                                          
{
                                                                
timerMENU millis();
                                
digitalWrite(13,1);
                                                                if (
MENUmode == 0)  // то регулируем громкость   
                                                                                    
{     
                                                                                    if (
MasterVolume == 80){stepENC 1;} else {stepENC++;}   /* Serial.println(stepENC);*/
                                                                                    
if( stepENC ) {stepVOLamount 1;}
                                                                                    else  if( 
stepENC 10 ) {stepVOLamount 4;} else  if( stepENC 14 ) {stepVOLamount 6;} else  if( stepENC 24 ) {stepVOLamount 8;}
                                                                                    
prevTimeE millis();
                                                                                    if(
MasterVolume stepVOLamount <= 80) {(MasterVolume += stepVOLamount);}else {MasterVolume 80;}
                                                                                    }
                                                                if (
MENUmode == 1//то лазим по меню
                                                                                    
{
                                                                                    
vibor_nomera_punkta_v_MENU--;
                                                                                    }
                                                                                    
                                                                if (
MENUmode == 2//настройка громкости при включении и потом запись в еепром (80)
                                                                                    
{
                                                                                    if  (
MasterVolume<=79){MasterVolume++;}
                                                                                    }
                                                                                                                                                     
                                                                if (
MENUmode == 3)  //настройка басов
                                                                                    

                                                                                      if (
BASSlevelBYTE==31 ){BASSlevelBYTE 23;} 
                                                                                      if (
BASSlevelBYTE<=23 && BASSlevelBYTE>16){BASSlevelBYTE BASSlevelBYTE-0b00000001;}
                                                                                      if (
BASSlevelBYTE>=24 && BASSlevelBYTE<=31){BASSlevelBYTE BASSlevelBYTE+0b00000001;}
                                                                                     } 
                                                    
                                                                if (
MENUmode == 4)  //настройка пищалок
                                                                                    

                                                                                      if (
TREBlevelBYTE==254 ){TREBlevelBYTE 126;} 
                                                                                      if (
TREBlevelBYTE<=126 && TREBlevelBYTE>14){TREBlevelBYTE TREBlevelBYTE-16;}
                                                                                      if (
TREBlevelBYTE>=142 && TREBlevelBYTE<=254){TREBlevelBYTE TREBlevelBYTE+16;}
                                                                                    } 
                                                                if (
MENUmode == 5// EQstate
                                                                                    
{
                                                                                      
EQstate =0b00000110//0b00000110 eq вЫключён
                                                                                    
}
                                                                if (
MENUmode == 6// РЕСЕТ настроек
                                                                                    
{
                                                                                      
DEFAULT_RESETstate 1;
                                                                                    }
                                                               if (
MENUmode == 7// выбор источника
                                                                                    
{
                                                                                      if (
selectINPUT<6) {selectINPUT selectINPUT+2;}
                                                                                    }
                                                               if (
MENUmode == 8// приглушение  источника (INPUT_ATTENUATION) 
                                                                                    
{
                                                                                      if (
INPUT_ATTENUATION 127) {INPUT_ATTENUATION INPUT_ATTENUATION+1;}
                                                                                    }   
                                          
                                                                          
                                           }
// конец вращение влево
                    
                                           
                        
else if (oldValue == 1//  вращение вправо
                                                                

                                                                
timerMENU millis();
                                
digitalWrite(13,1);
                                                                if (
MENUmode == 0)  // то регулируем громкость  
                                                                                   

                                                                                   if (
MasterVolume == 0){stepENC 1;} else {stepENC++;}    /*Serial.println(stepENC);*/
                                                                                   
if( stepENC ) {stepVOLamount 1;}
                                                                                   else  if( 
stepENC ) {stepVOLamount 4;}    else  if( stepENC 12 ) {stepVOLamount 6;}  else  if( stepENC 18 ) {stepVOLamount 10;}
                                                                                   
prevTimeE millis();
                                                                                   if(
MasterVolume stepVOLamount >= 0){ (MasterVolume -= stepVOLamount);} else{ MasterVolume 0/*Serial.println(MasterVolume);*/ }  /* уменьшаем громкость, но не ниже 0*/
                                                                                   
}
                                                                if (
MENUmode == 1//выбор в корне основного меню
                                                                                   

                                                                                   
vibor_nomera_punkta_v_MENU++;  
                                                                                   } 
                                                                if (
MENUmode == 2//настройка громкости при включении и потом запись в еепром (80)
                                                                                  
{
                                                                                   if  (
MasterVolume>=1){MasterVolume--;}
                                                                                  } 
                                            
                                            
                                                                if (
MENUmode == 3)    //настройка басов
                                                                                  
{
                                                                                  if (
BASSlevelBYTE>24 && BASSlevelBYTE<31){BASSlevelBYTE BASSlevelBYTE-0b00000001;}
                                                                                  if (
BASSlevelBYTE==23 ){BASSlevelBYTE 30;}  
                                                                                  if (
BASSlevelBYTE==31 ){BASSlevelBYTE 30;}                              
                                                                                  if (
BASSlevelBYTE<=23 && BASSlevelBYTE>=16){BASSlevelBYTE BASSlevelBYTE+0b00000001;}
                                                                                  }
                                                                if (
MENUmode == 4//настройка пищалок
                                                                                  
{
                                                                                    if (
TREBlevelBYTE>142 && TREBlevelBYTE<254){TREBlevelBYTE TREBlevelBYTE-16;}
                                                                                    if (
TREBlevelBYTE==126 ){TREBlevelBYTE 238;}  
                                                                                    if (
TREBlevelBYTE==254 ){TREBlevelBYTE 238;}                              
                                                                                    if (
TREBlevelBYTE<=126 && TREBlevelBYTE>=14){TREBlevelBYTE TREBlevelBYTE+16;}
                                                                                  }
                                                                if (
MENUmode == 5// EQstate
                                                                                  
{
                                                                                  
EQstate =0b11111001//0b00000001 eq включён - есть подмешивание каналов ??? 0b11111001
                                                                                  
}  
                                                                if (
MENUmode == 6){DEFAULT_RESETstate 2;}   
                                                                if (
MENUmode == 7// выбор источника
                                                                                    
{
                                                                                      if (
selectINPUT>0) {selectINPUT selectINPUT-2;}
                                                                                    }
                                                                if (
MENUmode == 8// приглушение  источника (INPUT_ATTENUATION) 
                                                                                    
{
                                                                                      if (
INPUT_ATTENUATION 64) {INPUT_ATTENUATION INPUT_ATTENUATION-1;}
                                                                                    }         
                        }
// конец вращение вправо
                         
                
}//конец Энкодер вращается

 
  
oldValue value;

 
  
//конец функции обработки энкодера

//===========================================================================================================================================================================
//===========================================================================================================================================================================
//===========================================================================================================================================================================


 
void loop() //~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~

 

  
 

 
VOLUPbutton.read();    // читаем фильтрованное значение СТАТУСА кнопки громкости 
VOLDNbutton.read();    // читаем фильтрованное значение СТАТУСА кнопки громкости 
MUTE_or_MENU_button.read();     // читаем фильтрованное значение СТАТУСА кнопки MUTE

                          /*               Примеры
                           REDbutton.read();      // читаем фильтрованное значение СТАТУСА кнопки
                           BLACKbutton.read();    // читаем фильтрованное значение СТАТУСА кнопки
                           if (REDbutton.click_down) {Serial.println("REDbutton = najata"); }             //нажатие кнопки  
                           if (REDbutton.click_up) {Serial.println("REDbutton = otpustily"); }            //отпускание кнопки 
                           if (REDbutton.doubleclick) {Serial.println("REDbutton = doubleclick"); }       //двойной клик 
                           if (REDbutton.timer) {Serial.println("REDbutton = neaktivnost knopki"); }      //неактивность 
                           if (REDbutton.retention) {Serial.println("REDbutton = uderjanie");}            // нажатие и удержание  
                           */


 
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~обработка MUTE_or_MENU_button~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
 
if (MasterVolume<80&&MuteActiv ==1){MuteActiv 0;}
 if (
MUTE_or_MENU_button.click_down){timerMENU millis(); digitalWrite(13,1);}
 if (
MENUmode == 0)
                   {
//MENUmode == 0
                   
if (MUTE_or_MENU_button.click_down)//если кнопка MUTE однократно нажата
                          

                          if (
MuteActiv == 0){MasterVolumeDoMUTE MasterVolume;}
                          
MuteActiv = (!MuteActiv); 
                          if (
MuteActiv == 1){ MasterVolumeDoMUTE MasterVolumeMasterVolume=80; }
                          if (
MuteActiv==) { MasterVolume MasterVolumeDoMUTEMuteActiv 0; }
                          
Serial.print("MuteActiv = " );Serial.print(MuteActiv);Serial.print("   MasterVolume = "); Serial.println(MasterVolume);
                          }
                   }
//MENUmode == 0    
 
 
 
 
if (MENUmode == 1)//зашли в режим меню и настроек (главное меню)  ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ 
                   
{
                        if(
vibor_nomera_punkta_v_MENU<=0)   { vibor_nomera_punkta_v_MENU=8;}          //ограничим количество режимов меню (всего 8 пунктов)
                        
if(vibor_nomera_punkta_v_MENU>=9)   { vibor_nomera_punkta_v_MENU=1;}          //переключать режимы будем циклично
    
                        
sprintf(strokaI,"-- SETUP MODE --"); //запись в буфер текста и значений
                      //--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------         
                        
if (vibor_nomera_punkta_v_MENU == 1){sprintf(strokaII,"<   exit setup  ");  }    
                        if (
MUTE_or_MENU_button.click_down && vibor_nomera_punkta_v_MENU==1){MENUmode 0;} //если кнопка MUTE однократно нажата в режиме vibor_nomera_punkta_v_MENU_1( EXIT setup), то => закрыть меню и выйти в обычный режим
                      //--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------         
                        
if (vibor_nomera_punkta_v_MENU == 2){//настройка громкости при первом включении (с записью в еепром 80 адрес)
                                                             
sprintfstrokaI,"SETUP volume on ");
                                                             
sprintf(strokaII,"power ON   -__dB") ; IntToChar(EEPROM.read(80), &strokaII[11]);
                                                            }   
                        if (
MUTE_or_MENU_button.click_down && vibor_nomera_punkta_v_MENU==2){MENUmode 2MasterVolume EEPROM.read(80);}// //если кнопка MUTE однократно нажата в режиме vibor_nomera_punkta_v_MENU_2 (setup vol on Pon) , то надо бы включить подменю выбора значения 0-80 для записи в еепром атмеги
                      //--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------         
                        
if (vibor_nomera_punkta_v_MENU == 3)//SETUP bass - настройка басов
                                                            
{
                                                            if (
EQstate == 0b11111001) {sprintfstrokaI,"SETUP BASS  eqON") ;}
                                                            if (
EQstate == 0b00000110) {sprintfstrokaI,"SETUP BASS eqOFF") ;}
                                                            if (
BASSlevelDEC >=0)      {sprintf(strokaII,"now bass=  +__dB") ;IntToChar(BASSlevelDEC , &strokaII[11]);} 
                                                            else                       {
sprintf(strokaII,"now bass=  -__dB") ;IntToChar(((~BASSlevelDEC)+1), &strokaII[11]);}
                                  
                                                            }   
                        if (
MUTE_or_MENU_button.click_down && vibor_nomera_punkta_v_MENU==3){MENUmode 3; }
                      
            
                      
//--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------         
                        
if (vibor_nomera_punkta_v_MENU == 5// выбор включен ли эквалайзер 
                                                            
{
                                                            
sprintfstrokaI,"SETUP  EQ STATE "); 
                                                            if (
EQstate == 0b11111001) {sprintf(strokaII,"   EQ  ON       ") ;}
                                                            else                       {
sprintf(strokaII,"   EQ  OFF      ") ;}                  
                                                            } 
                        if (
MUTE_or_MENU_button.click_down && vibor_nomera_punkta_v_MENU==5){MENUmode 5; }
                      
//--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------         
              
                      
if (vibor_nomera_punkta_v_MENU == 4// настройка пищалок
                                                            
{
                                                             if (
EQstate == 0b11111001) {sprintfstrokaI,"SETUP TREB  eqON") ;}
                                                             if (
EQstate == 0b00000110) {sprintfstrokaI,"SETUP TREB eqOFF") ;}
                                                                   if (
TREBlevelDEC >=0){sprintf(strokaII,"now treb=  +__dB") ;IntToChar(TREBlevelDEC , &strokaII[11]);}   
                                                                       else             {
sprintf(strokaII,"now treb=  -__dB") ;IntToChar(((~TREBlevelDEC)+1), &strokaII[11]);}  
                                                            } 
                      if (
MUTE_or_MENU_button.click_down && vibor_nomera_punkta_v_MENU==4){MENUmode 4; }
                     
//--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------         

                      
if (vibor_nomera_punkta_v_MENU == 6// сброс на начальные установки
                                                            
{
                                                              
sprintfstrokaI,"RESET ALL PARAMS") ;
                                                              
sprintf(strokaII,"   TO DEFAULT   ") ;
                                                            } 
                      if (
MUTE_or_MENU_button.click_down && vibor_nomera_punkta_v_MENU==6){MENUmode 6; }
                      
//--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------         
                      
if (vibor_nomera_punkta_v_MENU == 7// ВЫБОР ВХОДА ( IN1 - IN4)
                                                            
{
                                                             
sprintfstrokaI,"INPUT SELECT    ") ;
                                                             
sprintf(strokaII,"        AUX __  ") ; IntToChar( (map (selectINPUT06,   41)) , &strokaII[11]   );  
                                                            }
                      if (
MUTE_or_MENU_button.click_down && vibor_nomera_punkta_v_MENU==7){MENUmode 7; }
                   
//--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------         
                      
if (vibor_nomera_punkta_v_MENU == 8// приглушение  источника (INPUT_ATTENUATION) 
                                                            
{
                                                             
sprintfstrokaI,"ATTENUATION     ") ;
                                                             
sprintf(strokaII,"INPUT           ") ; IntToChar( (map (INPUT_ATTENUATION64127,   630)) , &strokaII[11]   );  
                                                            }
                      if (
MUTE_or_MENU_button.click_down && vibor_nomera_punkta_v_MENU==8){MENUmode 8; }
                   
//--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------         

                   
}//КОНЕЦ режима меню и настроек  ( конец главного меню)  ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ 
// ворая ступень меню ~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`                   
                                 
if (MENUmode == 2)//настройка громкости при первом включении ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ 
                                                   
{
                                                    
sprintf(  strokaI,"select volume on");
                                                    
sprintfstrokaII,"power ON   -__dB");  IntToChar(MasterVolume, &strokaII[11]);
                                                    
                                                    if (
MUTE_or_MENU_button.click_down){  
                                                                                        if (
EEPROM.read(80)==MasterVolume){ } else { EEPROM.write(80,MasterVolume); MENUmode 1; }
                                                                                       }
                                                   }
//~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ 
                                 
if (MENUmode == 3)//SETUP bass - настройка басов 
                                                   
{
                                                    if (
EQstate == 0b11111001) {sprintfstrokaI,"set bass    eqON") ;}
                                                    if (
EQstate == 0b00000110) {sprintfstrokaI,"set bass   eqOFF") ;}
                                                          if (
BASSlevelDEC >=0){sprintf(strokaII,"level      +__dB") ;IntToChar(BASSlevelDEC, &strokaII[11]);} 
                                                                          else {
sprintf(strokaII,"level      -__dB") ;IntToChar(((~BASSlevelDEC)+1), &strokaII[11]);}
                                                    if (
MUTE_or_MENU_button.click_down){  
                                                                                        if (
EEPROM.read(81)==BASSlevelBYTE){ } else { MENUmode 1;EEPROM.write(81,BASSlevelBYTE);}
                                                                                       }
                                                   }
//~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ 
                                 
if (MENUmode == 5)  // выбор включен ли эквалайзер 
                                                   
{
                                                    
sprintf                           (  strokaI,"select EQ state ");  
                                                    if (
EQstate == 0b11111001) {sprintf(strokaII,"EQ now is ON    ") ;}
                                                    else                       {
sprintf(strokaII,"EQ now is OFF   ") ;}
                                                    if (
MUTE_or_MENU_button.click_down) {
                                                                                         if (
EEPROM.read(79) == EQstate) {} else { MENUmode 1;EEPROM.write(79,EQstate);}
                                                                                        }
                                                   }
//~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ 
                                 
if (MENUmode == 4)// настройка пищалок
                                                   
{
                                                    if (
EQstate == 0b11111001) {sprintfstrokaI,"set treb    eqON") ;}
                                                    if (
EQstate == 0b00000110) {sprintfstrokaI,"set treb   eqOFF") ;}
                                                          if (
TREBlevelDEC >=0){sprintf(strokaII,"level      +__dB") ;IntToChar(TREBlevelDEC, &strokaII[11]);} 
                                                                          else {
sprintf(strokaII,"level      -__dB") ;IntToChar(((~TREBlevelDEC)+1), &strokaII[11]);}
                                                    if (
MUTE_or_MENU_button.click_down){   
                                                                                        if (
EEPROM.read(82)==TREBlevelBYTE){ } else { MENUmode 1;EEPROM.write(82,TREBlevelBYTE);}
                                                                                       }
                                                   }
//~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~    
                                 
if (MENUmode == 6)// сброс на начальные установки
                                                   
{
                                                      
sprintfstrokaI,                           "reset ALL       ") ;
                                                      if (
DEFAULT_RESETstate==1){sprintf(strokaII,"params     <NO> ") ;  if (MUTE_or_MENU_button.click_down) {MENUmode 0;}}
                                                      if (
DEFAULT_RESETstate==2){sprintf(strokaII,"params    <YES> ") ;  if (MUTE_or_MENU_button.click_down//если выбрали в меню сброс на начальные установки, то 
                                                                                                                                                            
{
                                                                                                                                                            
DEFAULT_RESETstate=0// обнуляем переменную сброса ( сбросить или НЕ сбросить можно только один раз, потом надо передёргивать питание атмеги)
                                                                                                                                                            
EEPROM.write(81,0b00011111); BASSlevelBYTE 0b00011111//по умолчанию басы
                                                                                                                                                            
EEPROM.write(82,0b11111110); TREBlevelBYTE 0b11111110//по умолчанию пищалки
                                                                                                                                                            
EEPROM.write(79,0b11111001); EQstate 0b11111001;     //по умолчанию статус EQ  = EQ ON
                                                                                                                                                            
EEPROM.write(80,24);         MasterVolume 24;      //по умолчанию громкость при включении
                                                                              
EEPROM.write(78,6); // //по умолчанию выбор входа AUX
                                                                              
EEPROM.write(77,64); INPUT_ATTENUATION 64;//INPUT ATTENUATION    приглушение ВХОДНОГО (IN1-IN4) канала (0 ~ -31.5dB)(0db-макс громкость, без приглушения) 64 = 0dB   255 = -31.5dB
                                                                                                                                                            
MENUmode 0// вышли в корень меню. 
                                                                                                                                                            

                                                                    }
                                                      
                                                          
                                                   }
//~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ 
                                  
if (MENUmode == 7)  // // ВЫБОР ВХОДА ( IN1 - IN4)
                                                   
{
                                                    
sprintf  strokaI,"select AUX      ");  
                                                    
sprintf  (strokaII,"                ") ;IntToChar((map (selectINPUT06,   41)), &strokaII[11]); //map (selectINPUT, 0, 6,   1, 4); 
                                                    
if (MUTE_or_MENU_button.click_down) {
                                                                                         if (
EEPROM.read(78) == selectINPUT) {} else { MENUmode 1;EEPROM.write(78,selectINPUT);}
                                                                                        }
                          }
//~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~  
                                  
if (MENUmode == 8)  // приглушение  источника (INPUT_ATTENUATION) 
                                                   
{
                                                    
sprintf  strokaI,"set attenuation ");  
                                                    
sprintf  (strokaII,"level =         ");  IntToChar( (map (INPUT_ATTENUATION64127,   630)) , &strokaII[11]   ); 
                                                    if (
MUTE_or_MENU_button.click_down) {
                                                                                         if (
EEPROM.read(77) == INPUT_ATTENUATION) {} else { MENUmode 1;EEPROM.write(77,INPUT_ATTENUATION);}
                                                                                        }
                                                   }                    
//~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~            
           
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~конец обработки MUTE_or_MENU_button~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

//===========================================================================================================================================================================
//======================================================обработка MENU===================================================================================================
//===========================================================================================================================================================================

if (MUTE_or_MENU_button.retention) {                                           // если удерживаем нажатой кнопку MUTE  
                            
digitalWrite(13,1);
                            
MENUmode = (!MENUmode); //инвертируем признак того, что мы в меню //MENUmode = 2 - есть и такая строка, тогда MENUmode = (!MENUmode); должно работать некорректно. НО работает так, как надо
                            
timerMENU millis(); 
                            
MuteActiv = (!MuteActiv); //возвращаем состояние MUTE на предидущее ( потому что нажав кнопку меню мы сначела жмём MUTE, а только потом активируется меню)
                            
if (MuteActiv == 1){ MasterVolumeDoMUTE MasterVolumeMasterVolume=80; }  // этими двумя строками возвращаем громкость на уровень " ДО НАЖАТИЯ MENU-MUTE"
                            
if (MuteActiv==) { MasterVolume MasterVolumeDoMUTEMuteActiv 0; }
                          }            


if( 
millis() - timerMENU >= 10000 && MENUmode >= 1// в режиме меню ждем 10 сек
                                   
{
                                    
MENUmode 0;
                                    
DEFAULT_RESETstate=0// обнулили переменную сброса настроек. Теперь настройки сбросить нельзя до перезапуска атмеги
                                   
}
//===========================================================================================================================================================================
//===========================================================================================================================================================================
//===========================================================================================================================================================================



/*~~~~~~~~~~~~~~~~~~~~~~обработка нажатия кнопок громкости~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
  
if (VOLUPbutton.click_down/*если кнопка VOL+ однократно нажата  то ДЕЛАЕМ ШАГ(1 РАЗ): включаем светик, уменьшаем переменную громкости (для увеличения звука)выводим значение громкости в порт.*/
        
{                                                       
           if (
MasterVolume==0){Serial.println ("I tak VOLUME MAX (0dB)"); } else (MasterVolume--);  Serial.print("MasterVolume = "); Serial.print(MasterVolume); Serial.println("dB"); // выводим значение громкости в ком порт
           
digitalWrite(13,!digitalRead(13)); 
        }
  if (
VOLDNbutton.click_down/*если кнопка VOL- однократно нажата то ДЕЛАЕМ ШАГ(1 РАЗ): увеличиваем переменную громкости (для уменьшения звука)выводим значение громкости в порт*/
        
{  
           if (
MasterVolume==80){Serial.println ("I tak VOLUME MIN (80dB-MUTE)");}  else (MasterVolume++);    Serial.print("MasterVolume = "); Serial.print(MasterVolume); Serial.println("dB"); // выводим значение громкости в ком порт
           
digitalWrite(13,!digitalRead(13)); 
        }
/*===================================================================================================================*/

/*~~~~~~~~~~~~~~~~~~~~~~обработка удержания кнопок громкости~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
if (VOLUPbutton.retention==1){Vupupup 1;}                  //если кнопка нажата  и удерживается //надо бы увеличивать громкость по шагам
if (VOLDNbutton.retention==1){Vdndndn 1; }                 //если кнопка нажата  и удержмвается //надо бы уменьшать громкость по шагам
  
if (VOLUPbutton.click_up) { Vupupup 0USCORENIE 0;}   //если отпустили кнопку, надо бы перестать увеличивать громкость по шагам
  
if (VOLDNbutton.click_up) { Vdndndn 0USCORENIE 0;}       
VOLFAST(VOLUME_INTERVAL); //заходим в функцию VOLFAST, которая  ЕСЛИ удерживаются кнопки регулировки громкости, то увеличивает или уменьшает громкость на один шаг (1dB) с периодичностью VOLUME_INTERVAL.   
/*===================================================================================================================*/



/*для энкодера~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
ENCODER(); // опрос энкодера раз в 0 миллисекунду
/*конец для энкодера~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/



/*ДЛЯ активации другого входа по сообытию */
if (autoAUX2 ==1) {selectINPUT_OLD =  selectINPUTselectINPUT 2;} // если сработало сообытие ( например на пин autoAUX2 пришла 1), то сохраняем текущий звуковой вход в selectINPUT_OLD, и включаем ВХОД 2 ( если нужен другой вход, то вместо 2 поставить 0 2 4 6)(6 - вход звука по умолчанию 3,4 пины)
                         
else  {if (MENUmode == 0) {selectINPUT selectINPUT_OLD ;}}     // если сообытие прошло, то возвращаемся на звуковой вход, который играл до этого. 
/* конец активации другого входа по сообытию*/



/*конфигурация void tda7442~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

//tda7442(0, 0b01000000);  //INPUT ATTENUATION    приглушение ВХОДНОГО (IN1-IN4) канала (0 ~ -31.5dB)(0db-макс громкость, без приглушения)
tda7442(0INPUT_ATTENUATION);  //INPUT ATTENUATION    приглушение ВХОДНОГО (IN1-IN4) канала (0 ~ -31.5dB)(0db-макс громкость, без приглушения)
tda7442(1EQstate);  //SURROUND & OUT & EFFECT CONTROL( -6 FIX OFF) 0b00000001 = EQ_ON
tda7442(20b00000011);  //SURROUND PHASE RESISTOR( 37KOm)
tda7442(3BASSlevelBYTE);  //BXXX0011 BASS SELECTION (0dB)-14dB  (0b0001100 = 14dB; 0b00011000 + 0b00000001 = 0b00011001 (+12dB) 
tda7442(4TREBlevelBYTE);  //BXXX0100  0b01111110 TREBLE (0dB)
tda7442(5,  MasterVolume); //0 - макс громкость, 80-255 - MUTE .  // регулировку громкости можно делать  0dB ~ -79dB в DEC c шагом 1. если (80-255) - то MUTE    //tda7442(5, 0b00000000);  //BXXX0101 SPEAKER ATTENUATION "L" (0dB)( SPEAKER SELECTION = 0dB ~ -79dB) громкость правого канала
tda7442(6,  MasterVolume); //tda7442(6, 0b00000000);  //BXXX0110 SPEAKER ATTENUATION "R" (0dB) громкость левого канала
tda7442(70b00000000);  //BXXX0111 NOT ALLOWED
tda7442(80b00000000);  //BXXX1000 NOT ALLOWED         
tda7442(9selectINPUT/*0b00000110*/);  //BXXX1001 INPUT MULTIPLEXER выбор источника IN1-4 (6-in1 4-in4  2-in3 0-in2 по даташиту)
/*конец конфигурации void tda7442~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/






 
  
  
  
  
 








printDISPLAY(100); // выводим на дисплей раз в 120( запуская фушкцию)
 
//для отладки:
//byte digit=10; http://arduino.ru/forum/programmirovanie/hex-bin
//Serial.println(digit); // "Представляем" в десятчной"
//Serial.println(digit,HEX); // "Представляем" в шестднацатеричной"
//Serial.println(digit,BIN); // "Представляем" в двоичной"
//Serial.print("BASSlevel DEC = "); Serial.print(BASSlevelDEC); Serial.print(" dB    ");  Serial.print("BASSlevelBYTE = "); Serial.print(BASSlevelBYTE,BIN); Serial.println(" ");
                                                            //Serial.println(curr_bit_data,BIN); - тогда число выведется в двоичном виде
//Serial.print("TREBlevel DEC = "); Serial.print(TREBlevelDEC); Serial.print(" dB    ");  Serial.print("TREBlevelBYTE = "); Serial.print(TREBlevelBYTE,BIN); Serial.println(" ");

//Serial.print("selectINPUT  = "); Serial.println(selectINPUT);
//Serial.print("INPUT_ATTENUATION  = "); Serial.print(INPUT_ATTENUATION); Serial.print("     "); Serial.println(INPUT_ATTENUATION, BIN);
}//конец LOOP//~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~
//=====================================================================================================================================================================================================================================================
//__________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________ 
oleg707 вне форума   Ответить с цитированием
Старый 01.12.2016, 01:49   #53
Elliot
Новый Пользователь
 
Регистрация: 01.12.2016
Регион: 50, 90, 150
Сообщений: 1
Elliot is on a distinguished road
По умолчанию

OVC3860 хороший модуль,функционала дофига и дешевый.Для качества звука запитывать его лучше через DC\DC изолированный преобразователь. Вопрос oleg707 ,а вы прогой FLPROG случаем не пользуетесь?
Elliot вне форума   Ответить с цитированием
Старый 01.12.2016, 12:20   #54
oleg707
Гуру
 
Аватар для oleg707
 
Регистрация: 16.04.2014
Возраст: 40
Город: Gdynia
Регион: другой - для добавления сообщить ab
Сообщений: 2,548
oleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond repute
По умолчанию

Цитата:
Сообщение от Elliot Посмотреть сообщение
OVC3860 хороший модуль,функционала дофига и дешевый.Для качества звука запитывать его лучше через DC\DC изолированный преобразователь. Вопрос oleg707 ,а вы прогой FLPROG случаем не пользуетесь?
OVC3860 - можно, Поддержка A2DP AVRCP Bluetooth 2.0 есть.
Позже, возможно. Мне нужна была штука, заменяющая переменный резистор, для регулировки громкости.

FLPROG пытался при знакомстве с дуиной, как то не пошло.
Я сейчас код пишу в notepad++ (с++), а потом переношу в ардуино IDE. Там и проверяю, и пишу ( либо через юсб, либо череp ISP-программатор)
oleg707 вне форума   Ответить с цитированием
Старый 01.12.2016, 22:24   #55
yuriy m
Старший Пользователь
 
Регистрация: 13.11.2011
Возраст: 46
Город: Гомель BY
Регион: 03
Машина: Гольф2 -> Lancia Zeta
Сообщений: 376
yuriy m is a jewel in the roughyuriy m is a jewel in the roughyuriy m is a jewel in the rough
По умолчанию

Цитата:
Сообщение от oleg707 Посмотреть сообщение
Я сейчас код пишу в notepad++ (с++), а потом переношу в ардуино IDE. Там и проверяю, и пишу ( либо через юсб, либо череp ISP-программатор)
+1 хоть и ардуины не люблю,но пишу в notepadе... Только зачем переносить ? если и так на автомате работает,через вкладку внешний редактор...
__________________
Управление под ANDROID ... http://www.pccar.ru/showthread.php?t=24001
Мой старый проект http://www.pccar.ru/showthread.php?t=18038
yuriy m вне форума   Ответить с цитированием
Старый 02.12.2016, 00:15   #56
oleg707
Гуру
 
Аватар для oleg707
 
Регистрация: 16.04.2014
Возраст: 40
Город: Gdynia
Регион: другой - для добавления сообщить ab
Сообщений: 2,548
oleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond repute
По умолчанию

Цитата:
Сообщение от yuriy m Посмотреть сообщение
+1 хоть и ардуины не люблю,но пишу в notepadе... Только зачем переносить ? если и так на автомате работает,через вкладку внешний редактор...
тоже можно... давно пробовал, как то не прижилось. Компилировать неудобно, приходится незакрытую скобку искать, прыгая туда сюда. А в notepadе++ у меня и 10 вкладок может быть открыто, с разными кусками кода.
А так ctrl+C ctrl+V наше всё
oleg707 вне форума   Ответить с цитированием
Старый 02.12.2016, 00:37   #57
0617
Пользователь
 
Регистрация: 15.04.2014
Город: Волжский
Регион: 34
Машина: Peugeot 408
Сообщений: 57
0617 is a jewel in the rough0617 is a jewel in the rough0617 is a jewel in the rough
По умолчанию

Прошу прощения, что встреваю в разговор мэтров.
Мне кажется весьма комфортной PlatformIO.

Последний раз редактировалось 0617; 19.03.2017 в 13:17.
0617 вне форума   Ответить с цитированием
Старый 02.12.2016, 02:10   #58
oleg707
Гуру
 
Аватар для oleg707
 
Регистрация: 16.04.2014
Возраст: 40
Город: Gdynia
Регион: другой - для добавления сообщить ab
Сообщений: 2,548
oleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond repute
По умолчанию

Цитата:
Сообщение от 0617 Посмотреть сообщение
Прошу прощения, что встреваю в разговор мэтров.
Мне кажется весьма комфортной PlatformIO.
Нюансы PlatformIO

PlatformIO ускоряет работу, это более гибкий инструмент по сравнению с Arduino IDE и с ним легче автоматизировать рутинные задачи. Есть при этом несколько моментов которые стоит учитывать:
компиляция в PlatformIO не всегда равноценна компиляции в Arduino IDE, то что скопмилировалось в PlatformIO может не компилироваться в Arduino IDE и наоборот
структура папок проекта не совпадает со структурой для Arduino IDE
не все библиотеки доступны для установки через platformio lib.

Тем более нотепеда++ и ардуино 1,6,12 пока хватает, в отличие от знаний и опыта.
Хотя чем больше пишу кода, тем больше волосы дыбом встают по поводу старых проектов.
oleg707 вне форума   Ответить с цитированием
Старый 14.12.2016, 16:59   #59
demtro
Старший Пользователь
 
Регистрация: 17.12.2014
Возраст: 33
Город: Самара
Регион: 63, 163
Машина: Lifan Solano
Сообщений: 184
demtro is on a distinguished road
По умолчанию

autoAUX2 на какой пин атмеги настроен этот вход?
demtro вне форума   Ответить с цитированием
Старый 14.12.2016, 18:09   #60
oleg707
Гуру
 
Аватар для oleg707
 
Регистрация: 16.04.2014
Возраст: 40
Город: Gdynia
Регион: другой - для добавления сообщить ab
Сообщений: 2,548
oleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond repute
По умолчанию

bool autoAUX2 = 0; это переменная. может быть 0 или 1
как хотим, так и обрабатываем.
oleg707 вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.



Часовой пояс GMT +4, время: 20:09.


Работает на vBulletin® версия 3.8.4.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot