Гуру
Регистрация: 16.04.2014
Возраст: 40
Город: Gdynia
Регион: другой - для добавления сообщить ab
Сообщений: 2,548
|
добавил 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_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 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 = 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
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 == 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;}
}
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 < 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;}
}
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 = 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=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 адрес)
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 (vibor_nomera_punkta_v_MENU == 8) // приглушение источника (INPUT_ATTENUATION)
{
sprintf( strokaI,"ATTENUATION ") ;
sprintf(strokaII,"INPUT ") ; IntToChar( (map (INPUT_ATTENUATION, 64, 127, 63, 0)) , &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");
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
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 (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);}
}
}//~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
if (MENUmode == 8) // приглушение источника (INPUT_ATTENUATION)
{
sprintf ( strokaI,"SET ATTENUATION ");
sprintf (strokaII,"Level = "); IntToChar( (map (INPUT_ATTENUATION, 64, 127, 63, 0)) , &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 = 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(0, INPUT_ATTENUATION); //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);
//Serial.print("INPUT_ATTENUATION = "); Serial.print(INPUT_ATTENUATION); Serial.print(" "); Serial.println(INPUT_ATTENUATION, BIN);
}//конец LOOP//~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~
//=====================================================================================================================================================================================================================================================
//__________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
|