| 
			
			
			
			 Гуру 
			
		
			
				
			
			
			
				 
				Регистрация: 16.04.2014 
				
				Возраст: 41 
				
Город: Gdynia 
Регион: другой - для добавления сообщить ab 
					Сообщений: 2,548
				 
				
				
				     
			 					
		
	 | 
	
	
	
	
		
			
			
				 
				добавил автоматическое переключение текущего аудиовхода на заданный
			 
			 
			
		
		
		
		
	PHP код: 
	
		
			
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 //Скетч для 7442D
 int ver = 92;
 // с подавлением дребезга кнопок 
 // с динамическим увеличением/уменьшением громкости при удержании кнопок ( с УСКОРЕНИЕМ при удержании)
 // с энкодером (код грея - коррекция ошибок энкодера) 
 // динамическое изменение скорости уменьшения\увеличения громкости при долгом воздействии на энкодер++. (требуется тонкая подстройка в реальной машине)
 // с функцией MUTE
 // дисплей по I2C
 // с ползунком громкости на дисплее
 // с монитором по ком-порту
 //мигание встроенного светодиода   при нажатии-удержании кнопок громкости.( при вращении энкодером пока убрал)
 //с выбором в меню, какое значение громкости выставлять при подаче питания на ардуину. С записью этого значения в еепром и чтением при подаче питания на атмегу. ( если не прописано, то пишется громкость по умолчанию -24dB )
 //C активацией внутреннего эквалайзера TDA7442D (EQ_ON EQ_OFF) -  басы и пищалки
 // Добавил меню сброса на настройки по умолчанию ( заодно восстанавливает неправильно записанный еепром на нужные значения), работает только один раз, потом надо передёрнуть питание. 
 // добавил выбор источника IN1 - IN4 с записью в еепром. По умолчанию стоит IN1 (3 и 4 контакты TDA7442D). 
 // добавил автоматическое переключение текущего аудиовхода на заданный. Например, для громкой связи через колонки.  переменная (autoAUX2 = 0;) Нужна для автоматического включения какого-либо входа  IN1-4, если (autoAUX2 ==1) .
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 // класс титановый велосипед для тактовой кнопки. (версия 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_A01, 4, 5, 6, 16, 11, 12, 13, 14, POSITIVE);  // для 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(_pb, INPUT);
 digitalWrite(_pb, 1);
 //===================
 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) {p = np; click(); start = stop; b = 1; t = 1; r = 1;} // состояние цифрового пина изменилось.
 //==============================================================================
 if (b != 0          ) {if (stop - start > bounce_     ) {b = 0; click();      }} // фильтр дребезга.
 if (c != 0          ) {if (stop - start > doubleclick_) {c = 0;               }} // обнуление счётчика двойного клика.
 if (t != 0 && s == 1) {if (stop - start > timer_      ) {t = 0; timer     = 1;}} // неактивность.
 if (r != 0 && s == 0) {if (stop - start > retention_  ) {r = 0; retention = 1;}} // нажатие и удержание.
 //==============================================================================
 }
 
 void click() {                       // нажатие, отпускание, двойное нажатие.
 if (b == 0 && s != p) {s = p;
 if (s == 0) {click_down = 1; ++c; if (c == 2) {c = 0; doubleclick = 1;}}
 if (s == 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 stepVOLamount = 0; // шаг изменения громкости энкодером. Логика меняется в строках 310
 byte stepENC = 0; // шаг изменения громкости энкодером в режиме ускорения (постоянное вращение)
 
 unsigned long currentTimeVoumeControl;
 unsigned long loopTimeVoumeControl;
 unsigned long prevTimeE = millis(); // время когда последний раз переключали энкодер
 
 enum {ENC_PIN1 = 9, ENC_PIN2 = 10};
 // Преобразование значения Грея в двоичный код
 // без изменений прямиком из wilipedia
 unsigned graydecode(unsigned gray) {
   unsigned bin;
   for (bin = 0; gray; gray >>= 1)
     bin ^= gray;
   return bin;
 }
 //  grayValue - Значение Грея
 //  value     - Преобразованное значение Грея
 //  oldValue  - Старое преобразованное значение Грея
 
 //конец для энкодера~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
 //====================================================================================
 //=====================================================================================================================================================================================================================================================
 
 
 
 
 
  void setup()    
  { 
 Serial.begin(250000); // ком порт     
 pinMode(13, OUTPUT); // настройка пина встроенного светодиода на выход (чтоб моргать мог)        
 Wire.begin(); // включение библиотеки I2C шины 
 lcd.begin(16, 2);//initialize the lcd newE
 
 /*~~~~~~~~ для энкодера~~~~~~~~~~*/
 pinMode(ENC_PIN1, INPUT); //настройка пинов энкодера
 digitalWrite(ENC_PIN1, 1);       // включить подтягивающий резистор http://arduino.ru/Tutorial/DigitalPins
 pinMode(ENC_PIN2, INPUT);
 digitalWrite(ENC_PIN2, 1);
 
 /*~~~~~~~~конец для энкодера~~~~~~~~~~*/
 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
 
  } 
 //=====================================================================================================================================================================================================================================================
 
 
 
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 // ЕСЛИ удерживаются кнопки регулировки громкости, то увеличиваем или уменьшаем громкость на один шаг (1dB) с периодичностью (interval - USCORENIE + 8)
 void VOLFAST(unsigned long interval )
 {
   static unsigned long prevTime = 0; // время когда последний раз увеличивали или уменьшали громкость
   if(millis() - prevTime > interval-USCORENIE) {
                                        prevTime = millis();  // если зажаты сразу две кнопки, приоритет будет на громкость вниз.
                                        if (Vupupup == 1 && 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 subaddress, byte 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 num, char *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(MasterVolume, 0, 80, 80, 0);// переменная, зеркалим значение громкости, чтобы нормально выводить на дисплей(громче-больше)http://arduino.ua/ru/prog/Map
                                                         lcd.setCursor(0, 0);
                                                         lcd.printHorizontalGraph('v', 0, Mdisp, 80); //name of the bar, first  row, current value, max. value вывод полоски громкости в первой строке
                                                         //-------------------2 строка---------------------------------
                                                         lcd.setCursor(0, 1); //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 (BASSlevelBYTE, 30,24,   1, 7))*2; }// положительное значение
                                                           if (16<=BASSlevelBYTE && BASSlevelBYTE<=23) {  BASSlevelDEC = (map (BASSlevelBYTE, 16,22, -7, -1))*2; }// отрицательное значение
                                                           if (BASSlevelBYTE == 0b00011111 || BASSlevelBYTE == 0b00010111) {BASSlevelDEC = 0;}
                                                           //конвертация верхов из байт в десятичную
                                                           if (142<=TREBlevelBYTE && TREBlevelBYTE<=254) {  TREBlevelDEC = (map (TREBlevelBYTE, 238,142,   1, 7))*2; }// положительное значение
                                                           if (14<=TREBlevelBYTE && TREBlevelBYTE<=126)  {  TREBlevelDEC = (map (TREBlevelBYTE, 14,110, -7, -1))*2; }// отрицательное значение
                                                           if (TREBlevelBYTE == 0b01111110 || TREBlevelBYTE == 0b11111110) {TREBlevelDEC = 0;}
                                                           //_____________________________________________________________________________________________________________________________
 
                                                           lcd.setCursor(0, 0);
                                                           lcd.print(strokaI);
                                                           
                                                           lcd.setCursor(0, 1); //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 < 6 ) {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;}
                                                                                     }
                                           
                                                                           
                                            }// конец вращение влево
                     
                                            
                         else if (oldValue == 1) //  вращение вправо
                                                                 { 
                                                                 timerMENU = millis();
                                                                 if (MENUmode == 0)  // то регулируем громкость  
                                                                                    { 
                                                                                    if (MasterVolume == 0){stepENC = 1;} else {stepENC++;}    /*Serial.println(stepENC);*/
                                                                                    if( stepENC < 3 ) {stepVOLamount = 1;}
                                                                                    else  if( stepENC < 6 ) {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;}
                                                                                     }
                         }// конец вращение вправо
                          
                 }//конец Энкодер вращается
 
  
   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 = MasterVolume; MasterVolume=80; }
                           if (MuteActiv==0 ) { MasterVolume = MasterVolumeDoMUTE; MuteActiv = 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=7;}          //ограничим количество режимов меню (всего 7 пунктов)
                         if(vibor_nomera_punkta_v_MENU>=8)   { 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 адрес)
                                                              sprintf( strokaI,"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 = 2; MasterVolume = 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) {sprintf( strokaI,"SETUP BASS  eqON") ;}
                                                             if (EQstate == 0b00000110) {sprintf( strokaI,"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) // выбор включен ли эквалайзер 
                                                             {
                                                             sprintf( strokaI,"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) {sprintf( strokaI,"SETUP TREB  eqON") ;}
                                                              if (EQstate == 0b00000110) {sprintf( strokaI,"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) // сброс на начальные установки
                                                             {
                                                               sprintf( strokaI,"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)
                                                             {
                                                              sprintf( strokaI,"INPUT SELECT    ") ;
                                                              sprintf(strokaII,"        AUX __  ") ; IntToChar( (map (selectINPUT, 0, 6,   4, 1)) , &strokaII[11]   );  
                                                             }
                       if (MUTE_or_MENU_button.click_down && vibor_nomera_punkta_v_MENU==7){MENUmode = 7; }
                    //--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------         
                    }//КОНЕЦ режима меню и настроек  ( конец главного меню)  ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ 
 // ворая ступень меню ~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`                   
                                  if (MENUmode == 2)//настройка громкости при первом включении ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ 
                                                    {
                                                     sprintf(  strokaI,"select volume on");
                                                     sprintf( strokaII,"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) {sprintf( strokaI,"set bass    eqON") ;}
                                                     if (EQstate == 0b00000110) {sprintf( strokaI,"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) {sprintf( strokaI,"set treb    eqON") ;}
                                                     if (EQstate == 0b00000110) {sprintf( strokaI,"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)// сброс на начальные установки
                                                    {
                                                       sprintf( strokaI,                           "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
                                                                                                                                                             MENUmode = 0; // вышли в корень меню. 
                                                                                                                                                             } 
                                                                     }
                                                       
                                                           
                                                    }//~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ 
                                   if (MENUmode == 7)  // // ВЫБОР ВХОДА ( IN1 - IN4)
                                                    {
                                                     sprintf  ( strokaI,"select AUX      ");  
                                                     //sprintf  (strokaII,"                ") ;IntToChar(selectINPUT, &strokaII[11]);} //map (selectINPUT, 0, 6,   1, 4); 
                           sprintf  (strokaII,"                ") ;IntToChar((map (selectINPUT, 0, 6,   4, 1)), &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);}
                                                                                         }             
 //~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~            
            
 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~конец обработки 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 = MasterVolume; MasterVolume=80; }  // этими двумя строками возвращаем громкость на уровень " ДО НАЖАТИЯ MENU-MUTE"
                             if (MuteActiv==0 ) { MasterVolume = MasterVolumeDoMUTE; MuteActiv = 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 = 0; USCORENIE = 0;}   //если отпустили кнопку, надо бы перестать увеличивать громкость по шагам
   if (VOLDNbutton.click_up) { Vdndndn = 0; USCORENIE = 0;}       
 VOLFAST(VOLUME_INTERVAL); //заходим в функцию VOLFAST, которая  ЕСЛИ удерживаются кнопки регулировки громкости, то увеличивает или уменьшает громкость на один шаг (1dB) с периодичностью VOLUME_INTERVAL.   
 /*===================================================================================================================*/
 
 
 
 /*для энкодера~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
 ENCODER(); // опрос энкодера раз в 0 миллисекунду
 /*конец для энкодера~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
 
 
 
 /*ДЛЯ активации другого входа по сообытию */
 if (autoAUX2 ==1) {selectINPUT_OLD =  selectINPUT; selectINPUT = 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(1, EQstate);  //SURROUND & OUT & EFFECT CONTROL( -6 FIX OFF) 0b00000001 = EQ_ON
 tda7442(2, 0b00000011);  //SURROUND PHASE RESISTOR( 37KOm)
 tda7442(3, BASSlevelBYTE);  //BXXX0011 BASS SELECTION (0dB)-14dB  (0b0001100 = 14dB; 0b00011000 + 0b00000001 = 0b00011001 (+12dB) 
 tda7442(4, TREBlevelBYTE);  //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(7, 0b00000000);  //BXXX0111 NOT ALLOWED
 tda7442(8, 0b00000000);  //BXXX1000 NOT ALLOWED         
 tda7442(9, selectINPUT/*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);
 }//конец LOOP//~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~
 //=====================================================================================================================================================================================================================================================
 //__________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________ 
 
		
	 
  
		
	
		
		
		
		
			
		
		
		
		
		
						  
				
				Последний раз редактировалось oleg707; 27.11.2016 в 16:16.
				
				
			
		
		
	
	 |