Гуру
Регистрация: 16.04.2014
Возраст: 41
Город: Gdynia
Регион: другой - для добавления сообщить ab
Сообщений: 2,548
|
товарищи, подскажите момент
Сделал регулировку басов, но нет реакции.
То есть меняю команду tda7442(3, BASSlevelBYTE);
А басы не меняются. Я так понял, нужно активировать эквалайзер, вопрос что прописать
даташит
разобрался
tda7442(1, 0b00000001); //SURROUND & OUT & EFFECT CONTROL( -6 FIX OFF)
tda7442(0, 0b01000000); //INPUT ATTENUATION приглушение ВХОДНОГО (IN1-IN4) канала (0 ~ -31.5dB)(0db-макс громкость, без приглушения)
tda7442(1, 0b00000110); //SURROUND & OUT & EFFECT CONTROL( -6 FIX OFF)
tda7442(2, 0b00000011); //SURROUND PHASE RESISTOR( 37KOm)
tda7442(3, BASSlevelBYTE); //BXXX0011 BASS SELECTION (0dB)-14dB (0b0001100 = 14dB; 0b00011000 + 0b00000001 = 0b00011001 (+12dB)
tda7442(4, 0b01111110); //BXXX0100 TREBLE (0dB)
//tda7442(5, 0b00000000); //BXXX0101 SPEAKER ATTENUATION "L" (0dB)( SPEAKER SELECTION = 0dB ~ -79dB) громкость правого канала
//tda7442(6, 0b00000000); //BXXX0110 SPEAKER ATTENUATION "R" (0dB) громкость левого канала
// регулировку громкости можно делать 0dB ~ -79dB в DEC c шагом 1. если (80-255) - то MUTE
tda7442(5, MasterVolume); //0 - макс громкость, 80-255 - MUTE .
tda7442(6, MasterVolume);
tda7442(7, 0b00000000); //BXXX0111 NOT ALLOWED
tda7442(8, 0b00000000); //BXXX1000 NOT ALLOWED
tda7442(9, 6/*0b00000110*/); //BXXX1001 INPUT MULTIPLEXER выбор источника IN1-4 (6-in1 4-in4 2-in3 0-in2)
Вот текущий скетч:
PHP код:
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //Скетч для 7442 int ver = 70; // с подавлением дребезга кнопок // с динамическим увеличением/уменьшением громкости при удержании кнопок ( с УСКОРЕНИЕМ при удержании) // с энкодером (код грея - коррекция ошибок энкодера) // динамическое изменение скорости уменьшения\увеличения громкости при долгом воздействии на энкодер++. (требуется тонкая подстройка в реальной машине) // с функцией MUTE // дисплей по I2C // с ползунком громкости на дисплее // с монитором по ком-порту //мигание встроенного светодиода при нажатии-удержании кнопок громкости.( при вращении энкодером пока убрал) //с выбором в меню, какое значение громкости выставлять при подаче питания на ардуину. С записью этого значения в еепром и чтением при подаче питания на атмегу. ( если не прописано, то пишется громкость по умолчанию -24dB ) //без активации внутреннего эквалайзера TDA7442D //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // класс титановый велосипед для тактовой кнопки. (версия 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)
int TREBLElevel = EEPROM.read(82); // считываем уровень высоких частот из внутренней еепром с 82го адреса.
//==================================================================================== //для энкодера~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
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);
//MasterVolume = 80;//mute 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);} //если считанное значение уровня басов за рамками диапазона, то пишем туда значение 0b00011111 ( в двоичной системе счисления - 8 байт)(0dB)
} //=====================================================================================================================================================================================================================================================
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ЕСЛИ удерживаются кнопки регулировки громкости, то увеличиваем или уменьшаем громкость на один шаг (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){Serial.print ("I tak VOLUME MAX (0dB) "); } else (MasterVolume--); Serial.print("MasterVolume = "); Serial.print(MasterVolume); Serial.println("dB"); digitalWrite(13,!digitalRead(13)); } // если зажата громкость вверх, то увеличиваем громкость на один шаг (1dB) с периодичностью interval. if (Vdndndn == 1) {if(interval-USCORENIE>10+20){USCORENIE = USCORENIE + 10;} if (MasterVolume==80){Serial.print ("I tak VOLUME MIN (80dB-MUTE) ");} else (MasterVolume++); Serial.print("MasterVolume = "); Serial.print(MasterVolume); Serial.println("dB"); 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) { text[0] = (num/100) + '0'; text[1] = ((num/10)%10) + '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) {
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) { } }
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;} } } }
oldValue = value;
// if (BASSlevelDEC > 0){BASSlevel_character = 1;} else {BASSlevel_character = 0;} /*if(1<=BASSlevelDEC<=7) { BASSlevelBYTE = map (BASSlevelDEC, 1, 7, 30,24); } if(-7<=BASSlevelDEC<=-1) { BASSlevelBYTE = map (BASSlevelDEC, -1, -7, 16,22); } if (BASSlevelDEC == 0){BASSlevelBYTE = 0b00011111;} Serial.print("~BASSlevelDEC = "); Serial.print(~BASSlevelDEC); Serial.print("((~BASSlevelDEC)+1) = "); Serial.println(((~BASSlevelDEC)+1)); Serial.print("BASSlevel DEC = "); Serial.print(BASSlevelDEC); Serial.print(" "); Serial.print("BASSlevelBYTE = "); Serial.print(BASSlevelBYTE,BIN); Serial.println(" "); */ //конвертация басов из байт в десятичную 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;} Serial.print("BASSlevel DEC = "); Serial.print(BASSlevelDEC); Serial.print(" "); Serial.print("BASSlevelBYTE = "); Serial.print(BASSlevelBYTE,BIN); Serial.println(" ");
}
//=========================================================================================================================================================================== //=========================================================================================================================================================================== //===========================================================================================================================================================================
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=4;} //ограничим количество режимов if(vibor_nomera_punkta_v_MENU>=5) { 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) { sprintf( strokaI,"SETUP bass "); //sprintf(strokaII,"bass ___dB") ; if (BASSlevelDEC >=0){sprintf(strokaII,"bass +___dB") ;IntToChar(BASSlevelDEC , &strokaII[11]);} else {sprintf(strokaII,"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 == 4) { sprintf( strokaI,"SETUP treble "); sprintf(strokaII,"treble ___dB") ;IntToChar(EEPROM.read(82), &strokaII[11]); } if (MUTE_or_MENU_button.click_down && vibor_nomera_punkta_v_MENU==4){MENUmode = 4; } //-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- }//~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ if (MENUmode == 2)//настройка громкости при первом включении ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ { sprintf( strokaI,"select volume on"); sprintf( strokaII,"power ON - "); IntToChar(MasterVolume, &strokaII[13]); if (MUTE_or_MENU_button.click_down) { if (EEPROM.read(80)==MasterVolume){ } else { EEPROM.write(80,MasterVolume); MENUmode = 1; } } }//~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ if (MENUmode == 3)//SETUP bass - настройка басов ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ { sprintf( strokaI,"select bass "); if (BASSlevelDEC >=0){sprintf(strokaII,"level +___ ") ;IntToChar(BASSlevelDEC, &strokaII[11]);} else {sprintf(strokaII,"level -___ ") ;IntToChar(((~BASSlevelDEC)+1), &strokaII[11]);} if (MUTE_or_MENU_button.click_down) { if (EEPROM.read(81)==BASSlevelBYTE){ } else { MENUmode = 1;EEPROM.write(81,BASSlevelBYTE);} } }//~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ //Serial.print("vibor_nomera_punkta_v_MENU = " );Serial.print(vibor_nomera_punkta_v_MENU);Serial.print(" MENUmode = "); Serial.println(MENUmode); /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~конец обработки 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; } //=========================================================================================================================================================================== //=========================================================================================================================================================================== //===========================================================================================================================================================================
/*~~~~~~~~~~~~~~~~~~~~~~обработка нажатия кнопок громкости~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ 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 миллисекунду /*конец для энкодера~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*конфигурация void tda7442~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
tda7442(0, 0b01000000); //INPUT ATTENUATION приглушение ВХОДНОГО (IN1-IN4) канала (0 ~ -31.5dB)(0db-макс громкость, без приглушения) tda7442(1, 0b00000110); //SURROUND & OUT & EFFECT CONTROL( -6 FIX OFF) tda7442(2, 0b00000011); //SURROUND PHASE RESISTOR( 37KOm) tda7442(3, BASSlevelBYTE); //BXXX0011 BASS SELECTION (0dB)-14dB (0b0001100 = 14dB; 0b00011000 + 0b00000001 = 0b00011001 (+12dB) tda7442(4, 0b01111110); //BXXX0100 TREBLE (0dB) //tda7442(5, 0b00000000); //BXXX0101 SPEAKER ATTENUATION "L" (0dB)( SPEAKER SELECTION = 0dB ~ -79dB) громкость правого канала //tda7442(6, 0b00000000); //BXXX0110 SPEAKER ATTENUATION "R" (0dB) громкость левого канала // регулировку громкости можно делать 0dB ~ -79dB в DEC c шагом 1. если (80-255) - то MUTE tda7442(5, MasterVolume); //0 - макс громкость, 80-255 - MUTE . tda7442(6, MasterVolume); tda7442(7, 0b00000000); //BXXX0111 NOT ALLOWED tda7442(8, 0b00000000); //BXXX1000 NOT ALLOWED tda7442(9, 6/*0b00000110*/); //BXXX1001 INPUT MULTIPLEXER выбор источника IN1-4 (6-in1 4-in4 2-in3 0-in2) /*конец конфигурации void tda7442~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//BASSconvertBYTEtoDEC; printDISPLAY(120); // выводим на дисплей раз в 100( запуская фушкцию)
//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); - тогда число выведется в двоичном виде
}//конец LOOP//~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~ //===================================================================================================================================================================================================================================================== //__________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Последний раз редактировалось oleg707; 25.11.2016 в 16:08.
|