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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.09.2016, 20:27   #11
oleg707
Гуру
 
Аватар для oleg707
 
Регистрация: 16.04.2014
Возраст: 39
Город: Gdynia
Регион: другой - для добавления сообщить ab
Сообщений: 2,548
oleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond repute
По умолчанию

Цитата:
Сообщение от yuriy m Посмотреть сообщение
И тут Остапа понесло... в хорошем смысле
Когда я искал хоть какую нибудь инфу, чтобы делать самому с нуля - нифига нету, только на одном сайте печатка+HEX прошивка, так только за деньги ( с платного аккаунта).
А тут простая схема, ардуину любую цеплять, пины только переназначить.
Бери и повторяй.


Навыдёргивал из другого скетча управление энкодером, быстро, практически без переработки, без обработки дребезга.

PHP код:
//Для запуска tda7442 достаточно загрузить скетчь который ниже в ардуино
/*
вход к джеку наушников телефона
выход - на линейный вход активной акустики.
Прицепил 2 кнопки для теста ( подтяжку не надо, использую внутренние резаки; один конец кнопок  на минус, второй на 52 и 53 пины)
Энкодер подключается так: общий на массу, остальные на 50 и 53 пины.

При нажатии кнопок громкости в ком порт идут значения громкости 
0-80 звук есть, 80-255 Mute.
Монитор ком порта работает только когда есть питание на TDA7442!
*/

// про энкодер http://arduino.ru/forum/apparatnye-voprosy/ispolzuem-enkoder
#include "Wire.h" //добавление библиотеки I2C шины 
//настройка кнопок громкости
const int volUPbutton 52;     // номер пина на подключение кнопки VOL+
const int volDNbutton 53;     // номер пина на подключение кнопки VOL-  
//для энкодера
int stepVOLamount 2// шаг изменения громкости энкодером
unsigned long currentTimeVoumeControl;
unsigned long loopTimeVoumeControl;
const 
int pin_A 50// 
const int pin_B 51// 
unsigned char encoder_A;
unsigned char encoder_B;
unsigned char encoder_A_prev=0;
//конец для энкодера

int buttonStateVOLup 0//переменная для чтения статуса кнопки
int buttonStateVOLdn 0//переменная для чтения статуса кнопки
byte MasterVolume 36// переменная, хранящая в себе громкость выходного звука, 0 - макс громкость, 79- минимальная, 80-255 MUTE http://arduino.ru/Reference/Byte Тип данных byte 8-ми битное беззнаковое целое число, в диапазоне 0..255
 
void setup() 

pinMode(13OUTPUT); // настройка пина встроенного светодиода на выход (чтоб моргать мог)
pinMode(volUPbuttonINPUT); //настройка порта ардуины на вход - приём данных от кнопки громкости +
pinMode(volDNbuttonINPUT); //настройка порта ардуины на вход - приём данных от кнопки громкости -
digitalWrite(volUPbuttonHIGH);       // включить подтягивающий резистор http://arduino.ru/Tutorial/DigitalPins
digitalWrite(volDNbuttonHIGH);       // включить подтягивающий резистор

Wire.begin(); // включение библиотеки I2C шины 
delay(1000); 
Serial.begin(9600); // ком порт
Serial.println(MasterVolume);

pinMode(pin_AINPUT); //настройка пинов энкодера
digitalWrite(pin_AHIGH);       // включить подтягивающий резистор http://arduino.ru/Tutorial/DigitalPins
pinMode(pin_BINPUT);
digitalWrite(pin_BHIGH);
currentTimeVoumeControl millis(); //для энкодера
loopTimeVoumeControl currentTimeVoumeControl;//для энкодера


void loop(){ 

  
buttonStateVOLup digitalRead(volUPbutton); // читаем статус кнопки volUPbutton
  // проверяем, нажата ли кнопка 
    
if (buttonStateVOLup == LOW) {  
                                     
digitalWrite(13HIGH); 
                                     if (
MasterVolume==0){Serial.println ("I tak VOLUME MAX (0dB)"); } else (MasterVolume--);
                                     
Serial.println(MasterVolume);  delay(50);
                                 } 
//если нажата кнопка VOL+, то включаем светик, уменьшаем переменную громкости (для увеличения звука)выводим значение громкости в порт и паузу от дребезга
                                              
else {      digitalWrite(13LOW);  }//если нет - просто тушим светик.
     
  
buttonStateVOLdn digitalRead(volDNbutton); // читаем статус кнопки volDNbutton   
      // проверяем, нажата ли кнопка 
      
if (buttonStateVOLdn == LOW)
                                 {      if (
MasterVolume==80){Serial.println ("I tak VOLUME MIN (80dB-MUTE)");}  else (MasterVolume++);
                                         
Serial.println(MasterVolume);  delay(30); 
                                 }
//если нажата кнопка VOL- увеличиваем переменную громкости (для уменьшения звука)выводим значение громкости в порт и паузу от дребезга

 /*
tda7442(0, 0b01100000);  //INPUT ATTENUATION  -16dB (0b - показывает, что данные будут в двоичной форме. )
потом идут разряды
D7 D6 D5 D4 D3 D2 D1 D0
по даташиту (5,1 пункт) D7 это B ( в табличке, B = 1 incremental bus; active B = 0 no incremental bus;X = indifferent 0,1)поэтому D7 будет 0.
D7 D6 D5 D4 D3 D2 D1 D0
B  X  X  X  0  0  0  0    INPUT ATTENUATION (из даташита)

X X X 0 0 0 0 INPUT ATTENUATION

*/




tda7442(00b01000000);  //INPUT ATTENUATION    приглушение ВХОДНОГО (IN1-IN4) канала (0 ~ -31.5dB)(0db-макс громкость, без приглушения)
tda7442(10b00000110);  //SURROUND & OUT & EFFECT CONTROL( -6 FIX OFF)
tda7442(20b00000011);  //SURROUND PHASE RESISTOR( 37KOm)
tda7442(30b00011111);  //BXXX0011 BASS SELECTION (0dB)-14dB
tda7442(40b01111110);  //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(70b00000000);  //BXXX0111 NOT ALLOWED
tda7442(80b00000000);  //BXXX1000 NOT ALLOWED         
tda7442(90b00000110);  //BXXX1001 INPUT MULTIPLEXER выбор источника IN1-4
            
 

 
void tda7442(byte subaddressbyte data)  //Вызов tda7719 char??

Wire.beginTransmission(0x40); //СТАРТ и Адрес микросхема tda7442 
//или Wire.beginTransmission(0b1000000);
//после beginTransmission дуина ждёт по линии ДАТА ответа от tda7442 ( присаживание линии на землю)и потом передает
Wire.write(subaddress);       //Подадрес команды 
Wire.write(data);             //Команда 
//Serial.println(subaddress);   //Пишем подадрем в монитор 
//Serial.println(data);         //Пишем команду в монитор 
Wire.endTransmission();       //СТОП 
//delay(500); 


//для энкодера
currentTimeVoumeControl millis();
if(
currentTimeVoumeControl >= (loopTimeVoumeControl 5)){ // проверяем каждые 5мс (200 Гц)
encoder_A digitalRead(pin_A); // считываем состояние выхода А энкодера
encoder_B digitalRead(pin_B); // считываем состояние выхода А энкодера
if((!encoder_A) && (encoder_A_prev)){ // если состояние изменилось с положительного к нулю
                                     
if(encoder_B)  { // выход В в полож. сост., значит вращение по часовой стрелке
                                                    // увеличиваем громкость, не более чем до 80
                                                     
if(MasterVolume stepVOLamount <= 80) (MasterVolume += stepVOLamount); Serial.println(MasterVolume);
                                                    }
                                                             else { 
// выход В в 0 сост., значит вращение против часовой стрелки
                                                                    // уменьшаем громкость, но не ниже 0
                                                                    
if(MasterVolume stepVOLamount >= 0) (MasterVolume -= stepVOLamount); Serial.println(MasterVolume);
                                                                  }
                                     }

encoder_A_prev encoder_A// сохраняем значение А для следующего цикла
loopTimeVoumeControl currentTimeVoumeControl; }
//конец для энкодера

oleg707 вне форума   Ответить с цитированием
Старый 29.09.2016, 19:12   #12
Rage2
Banned
 
Регистрация: 06.11.2009
Возраст: 38
Город: Nizhniy Novgorod
Регион: 52
Машина: Ford Focus III
Сообщений: 1,776
Rage2 has a brilliant futureRage2 has a brilliant futureRage2 has a brilliant futureRage2 has a brilliant futureRage2 has a brilliant futureRage2 has a brilliant futureRage2 has a brilliant futureRage2 has a brilliant futureRage2 has a brilliant futureRage2 has a brilliant futureRage2 has a brilliant future
По умолчанию

oleg707, красафчик! Лайк! =)
...плз. продолжай
Rage2 вне форума   Ответить с цитированием
Старый 30.09.2016, 23:21   #13
oleg707
Гуру
 
Аватар для oleg707
 
Регистрация: 16.04.2014
Возраст: 39
Город: Gdynia
Регион: другой - для добавления сообщить ab
Сообщений: 2,548
oleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond repute
Lightbulb

http://pccar.ru/showthread.php?p=370522#post370522
фильтр дребезга, отслеживание событий: нажатие, отпускание, двойное нажатие и т.д.

В ардуино понадобилось мне иметь шаблон для обработки кучи кнопок.
Начал было писать сам, но нашел на просторах код, который подстроил под себя. Может кому пригодиться.
Просто подключаете кнопки к массе и пинам ( X + n) количеством сколько хотите, правите код и пользуете.
oleg707 вне форума   Ответить с цитированием
Старый 01.10.2016, 15:11   #14
oleg707
Гуру
 
Аватар для oleg707
 
Регистрация: 16.04.2014
Возраст: 39
Город: Gdynia
Регион: другой - для добавления сообщить ab
Сообщений: 2,548
oleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond repute
Lightbulb без энкодера, без ДЕЛАЕВ, с подавлением дребезга кнопок

без энкодера, без ДЕЛАЕВ, с подавлением дребезга кнопок и с увеличением/уменьшением громкости при удержании кнопок.

PHP код:
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// класс титановый велосипед для тактовой кнопки. (версия 1.0)http://arduino.ru/forum/programmirovanie/klass-titanovyi-velosiped-dlya-taktovoi-knopki
// фильтр дребезга, отслеживание событий: нажатие, отпускание, двойное нажатие(doubleclick), нажато и удерживается в течении определённого времени, отпущено и неактивно в течении определённого времени.

#include <Arduino.h>
#include "Wire.h" //добавление библиотеки I2C шины

  


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

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

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

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









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

// __________ТУТ НАЗНАЧАЕМ ИМЕНА НАШИХ КНОПОК И К КАКИМ ПИНАМ ОНИ ПОДКЛЮЧЕНЫ__________(также сюда пишем имена переменных, то, что обычно пишется ДО void setup().
BUTTON REDbutton(31);     //назначаем красной кнопке ножку 31. То есть один конец конпки подключён на пин 31 ардуины меги, а второй  конец конпки подключён на массу (GND)     Подтяжку на +5В делать не надо,  код для чтения состояний кнопок включает внутренний подтягивающий резистор на 20кОм
BUTTON BLACKbutton (33);  //назначаем красной кнопке ножку 33. То есть один конец конпки подключён на пин 33 ардуины меги, а второй  конец конпки подключён на массу (GND)    Подтяжку на +5В делать не надо,  код для чтения состояний кнопок включает внутренний подтягивающий резистор на 20кОм
BUTTON VOLUPbutton(53);   //назначаем кнопке ГРОМКОСТИ++ ножку 53
BUTTON VOLDNbutton(52);   //назначаем кнопке ГРОМКОСТИ-- ножку 52
byte MasterVolume 26//СТАВИМ НАЧАЛЬНОЕ ЗНАЧЕНИЕ ГРОМКОСТИ ПРИ ПОДАЧЕ ПИТАНИЯ НА АРДУИНУ - переменная, хранящая в себе громкость выходного звука, 0 - макс громкость, 79- минимальная, 80-255 MUTE http://arduino.ru/Reference/Byte Тип данных byte 8-ми битное беззнаковое целое число, Если DEC - в диапазоне 0..255
#define  VOLUME_INTERVAL  100UL  // интервал(время) между изменениями уровня громкости (0,05 секунд)
boolean Vupupup 0//переменная, показывающая надо ли увеличивать громкость раз в #define  VOLUME_INTERVAL  100UL (0,1Сек)
boolean Vdndndn 0//переменная, показывающая надо ли уменьшать громкость раз в #define  VOLUME_INTERVAL  100UL (0,1Сек)






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

 


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

 

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

 // Serial.println("___________________start__________________________________ ");

 
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");}            // нажатие и удержание 
 


 
if (BLACKbutton.click_down) {Serial.println("BLACKbutton = click_down"); }
 if (
BLACKbutton.click_up) {Serial.println("BLACKbutton = click_up"); }
 if (
BLACKbutton.doubleclick) {Serial.println("BLACKbutton = doubleclick"); }
 if (
BLACKbutton.timer) {Serial.println("BLACKbutton = timer"); }
 if (
BLACKbutton.retention) {Serial.println("BLACKbutton = retention"); }

 
// Serial.println("___________________end______________________________ ");




  
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"); // выводим значение громкости в ком порт
          
        
}

  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"); // выводим значение громкости в ком порт
        
        
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  
if (VOLUPbutton.retention==1)//если кнопка нажата  и удержмвается //надо бы увеличивать громкость по шагам
        

         
digitalWrite(13,1); 
         
VOLUPbutton.read();    // читаем фильтрованное значение СТАТУСА кнопки громкости 
         
if (MasterVolume==0){Serial.println ("I tak VOLUME MAX (0dB)"); } else (MasterVolume--);  Serial.print("MasterVolume = "); Serial.print(MasterVolume); Serial.println("dB"); // выводим значение громкости в ком порт
         
Vupupup 1;
        }
 if (
VOLUPbutton.click_up) { Vupupup 0; }          
 
//if (Vupupup == 1){VOLUPbutton.read();if (MasterVolume==0){Serial.println ("I tak VOLUME MAX (0dB)"); } else (MasterVolume--);  Serial.print("MasterVolume = "); Serial.print(MasterVolume); Serial.println("dB");} 
//~~~~~~~~~~~~
 
if (VOLDNbutton.retention==1)//если кнопка нажата  и удержмвается //надо бы уменьшать громкость по шагам
        

         
digitalWrite(13,1); 
         if (
MasterVolume==80){Serial.println ("I tak VOLUME MIN (80dB-MUTE)");}  else (MasterVolume++);    Serial.print("MasterVolume = "); Serial.print(MasterVolume); Serial.println("dB"); // выводим значение громкости в ком порт
         
Vdndndn 1;
        }
         
 
//if (Vdndndn == 1){} 
if (VOLUPbutton.click_up) { Vupupup 0; }  
if (
VOLDNbutton.click_up) { Vdndndn 0; }          
//===================================================================================
VOLFAST(VOLUME_INTERVAL); //заходим в функцию VOLFAST, которая  ЕСЛИ удерживаются кнопки регулировки громкости, то увеличивает или уменьшает громкость на один шаг (1dB) с периодичностью interval.
   

  
     
if(REDbutton.click_down==1)//если кнопка REDbutton нажата ... (статус нажатой кнопки == 1)
           

            
digitalWrite(13,0); //выключили диодик
           

      if (
REDbutton.click_up==)//если кнопка REDbutton отпущена .. (статус отпущенной кнопки == 1)
      
           

            
digitalWrite(13,1); //включили диодик
           
}
        



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

tda7442(00b01000000);  //INPUT ATTENUATION    приглушение ВХОДНОГО (IN1-IN4) канала (0 ~ -31.5dB)(0db-макс громкость, без приглушения)
tda7442(10b00000110);  //SURROUND & OUT & EFFECT CONTROL( -6 FIX OFF)
tda7442(20b00000011);  //SURROUND PHASE RESISTOR( 37KOm)
tda7442(30b00011111);  //BXXX0011 BASS SELECTION (0dB)-14dB
tda7442(40b01111110);  //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(70b00000000);  //BXXX0111 NOT ALLOWED
tda7442(80b00000000);  //BXXX1000 NOT ALLOWED         
tda7442(90b00000110);  //BXXX1001 INPUT MULTIPLEXER выбор источника IN1-4
//конец конфигурации void tda7442~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

}//конец LOOP//~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~

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

Wire.beginTransmission(0x40); //СТАРТ и Адрес микросхема tda7442 
//после 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~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~








//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// ЕСЛИ удерживаются кнопки регулировки громкости, то увеличиваем или уменьшаем громкость на один шаг (1dB) с периодичностью interval.
void VOLFAST(unsigned long interval )
{
  static 
unsigned long prevTime 0// время когда последний раз увеличивали или уменьшали громкость
  
if(millis() - prevTime interval ) {
                                      
prevTime millis();  // если зажаты сразу две кнопки, приоритет будет на громкость вниз.
                                       
if (Vupupup == && Vdndndn == 0) { 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)); } // если зажата громкость вверх, то увеличиваем громкость на один шаг (1dB) с периодичностью interval.
                                       
if (Vdndndn == 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)); }// если зажата громкость вниз, то уменьшаем громкость на один шаг (1dB) с периодичностью interval.
   
  
                                      
}
}
 
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

то же самое, но с УСКОРЕНИЕМ при удержании
PHP код:
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// класс титановый велосипед для тактовой кнопки. (версия 1.0)http://arduino.ru/forum/programmirovanie/klass-titanovyi-velosiped-dlya-taktovoi-knopki
// фильтр дребезга, отслеживание событий: нажатие, отпускание, двойное нажатие(doubleclick), нажато и удерживается в течении определённого времени, отпущено и неактивно в течении определённого времени.

#include <Arduino.h>
#include "Wire.h" //добавление библиотеки I2C шины

  


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

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

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

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









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

// __________ТУТ НАЗНАЧАЕМ ИМЕНА НАШИХ КНОПОК И К КАКИМ ПИНАМ ОНИ ПОДКЛЮЧЕНЫ__________(также сюда пишем имена переменных, то, что обычно пишется ДО void setup().
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
BUTTON REDbutton(31);     //назначаем красной кнопке ножку 31. То есть один конец конпки подключён на пин 31 ардуины меги, а второй  конец конпки подключён на массу (GND)     Подтяжку на +5В делать не надо,  код для чтения состояний кнопок включает внутренний подтягивающий резистор на 20кОм
BUTTON BLACKbutton (33);  //назначаем красной кнопке ножку 33. То есть один конец конпки подключён на пин 33 ардуины меги, а второй  конец конпки подключён на массу (GND)    Подтяжку на +5В делать не надо,  код для чтения состояний кнопок включает внутренний подтягивающий резистор на 20кОм
BUTTON VOLUPbutton(53);   //назначаем кнопке ГРОМКОСТИ++ ножку 53
BUTTON VOLDNbutton(52);   //назначаем кнопке ГРОМКОСТИ-- ножку 52
byte MasterVolume 26//СТАВИМ НАЧАЛЬНОЕ ЗНАЧЕНИЕ ГРОМКОСТИ ПРИ ПОДАЧЕ ПИТАНИЯ НА АРДУИНУ - переменная, хранящая в себе громкость выходного звука, 0 - макс громкость, 79- минимальная, 80-255 MUTE http://arduino.ru/Reference/Byte Тип данных byte 8-ми битное беззнаковое целое число, Если DEC - в диапазоне 0..255
#define  VOLUME_INTERVAL  100UL  // интервал(время) между изменениями уровня громкости (0,05 секунд)
boolean Vupupup 0//переменная, показывающая надо ли увеличивать громкость раз в #define  VOLUME_INTERVAL  100UL (0,1Сек)
boolean Vdndndn 0//переменная, показывающая надо ли уменьшать громкость раз в #define  VOLUME_INTERVAL  100UL (0,1Сек)
int USCORENIE 0//переменная, ускорение изменения громкости при удержании кнопок VOL+ и VOL-
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~





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

 


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

 

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

 // Serial.println("___________________start__________________________________ ");

 
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");}            // нажатие и удержание 
 


 
if (BLACKbutton.click_down) {Serial.println("BLACKbutton = click_down"); }
 if (
BLACKbutton.click_up) {Serial.println("BLACKbutton = click_up"); }
 if (
BLACKbutton.doubleclick) {Serial.println("BLACKbutton = doubleclick"); }
 if (
BLACKbutton.timer) {Serial.println("BLACKbutton = timer"); }
 if (
BLACKbutton.retention) {Serial.println("BLACKbutton = retention"); }

 
// Serial.println("___________________end______________________________ ");




  
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)//если кнопка нажата  и удержмвается //надо бы увеличивать громкость по шагам
        

         
digitalWrite(13,1); 
         
VOLUPbutton.read();    // читаем фильтрованное значение СТАТУСА кнопки громкости 
         
if (MasterVolume==0){Serial.println ("I tak VOLUME MAX (0dB)"); } else (MasterVolume--);  Serial.print("MasterVolume = "); Serial.print(MasterVolume); Serial.println("dB"); // выводим значение громкости в ком порт
         
Vupupup 1;
        }
 if (
VOLUPbutton.click_up) { Vupupup 0; }          
 
//if (Vupupup == 1){VOLUPbutton.read();if (MasterVolume==0){Serial.println ("I tak VOLUME MAX (0dB)"); } else (MasterVolume--);  Serial.print("MasterVolume = "); Serial.print(MasterVolume); Serial.println("dB");} 
//~~~~~~~~~~~~
 
if (VOLDNbutton.retention==1)//если кнопка нажата  и удержмвается //надо бы уменьшать громкость по шагам
        

         
digitalWrite(13,1); 
         if (
MasterVolume==80){Serial.println ("I tak VOLUME MIN (80dB-MUTE)");}  else (MasterVolume++);    Serial.print("MasterVolume = "); Serial.print(MasterVolume); Serial.println("dB"); // выводим значение громкости в ком порт
         
Vdndndn 1;
        }
         
 
//if (Vdndndn == 1){} 
if (VOLUPbutton.click_up) { Vupupup 0USCORENIE 0;}  
if (
VOLDNbutton.click_up) { Vdndndn 0USCORENIE 0;}          
//===================================================================================
VOLFAST(VOLUME_INTERVAL); //заходим в функцию VOLFAST, которая  ЕСЛИ удерживаются кнопки регулировки громкости, то увеличивает или уменьшает громкость на один шаг (1dB) с периодичностью VOLUME_INTERVAL.
   

  
     
if(REDbutton.click_down==1)//если кнопка REDbutton нажата ... (статус нажатой кнопки == 1)
           

            
digitalWrite(13,0); //выключили диодик
           

      if (
REDbutton.click_up==)//если кнопка REDbutton отпущена .. (статус отпущенной кнопки == 1)
      
           

            
digitalWrite(13,1); //включили диодик
           
}
        



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

tda7442(00b01000000);  //INPUT ATTENUATION    приглушение ВХОДНОГО (IN1-IN4) канала (0 ~ -31.5dB)(0db-макс громкость, без приглушения)
tda7442(10b00000110);  //SURROUND & OUT & EFFECT CONTROL( -6 FIX OFF)
tda7442(20b00000011);  //SURROUND PHASE RESISTOR( 37KOm)
tda7442(30b00011111);  //BXXX0011 BASS SELECTION (0dB)-14dB
tda7442(40b01111110);  //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(70b00000000);  //BXXX0111 NOT ALLOWED
tda7442(80b00000000);  //BXXX1000 NOT ALLOWED         
tda7442(90b00000110);  //BXXX1001 INPUT MULTIPLEXER выбор источника IN1-4
//конец конфигурации void tda7442~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

}//конец LOOP//~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~

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

Wire.beginTransmission(0x40); //СТАРТ и Адрес микросхема tda7442 
//после 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~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~








//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// ЕСЛИ удерживаются кнопки регулировки громкости, то увеличиваем или уменьшаем громкость на один шаг (1dB) с периодичностью (interval - USCORENIE + 8)
void VOLFAST(unsigned long interval )
{
  static 
unsigned long prevTime 0// время когда последний раз увеличивали или уменьшали громкость
  
if(millis() - prevTime interval-USCORENIE) {
                                      
prevTime millis();  // если зажаты сразу две кнопки, приоритет будет на громкость вниз.
                                       
if (Vupupup == && Vdndndn == 0) {if(interval-USCORENIE>8+20){USCORENIE USCORENIE 8;} if (MasterVolume==0){Serial.println ("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.println ("I tak VOLUME MIN (80dB-MUTE)");}  else (MasterVolume++);    Serial.print("MasterVolume = "); Serial.print(MasterVolume); Serial.println("dB"); digitalWrite(13,!digitalRead(13)); }// если зажата громкость вниз, то уменьшаем громкость на один шаг (1dB) с периодичностью interval.
  
  
                                      
}
}
 
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
то же самое, но еще и с энкодером.
PHP код:
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// класс титановый велосипед для тактовой кнопки. (версия 1.0)http://arduino.ru/forum/programmirovanie/klass-titanovyi-velosiped-dlya-taktovoi-knopki
// фильтр дребезга, отслеживание событий: нажатие, отпускание, двойное нажатие(doubleclick), нажато и удерживается в течении определённого времени, отпущено и неактивно в течении определённого времени.

#include <Arduino.h>
#include "Wire.h" //добавление библиотеки I2C шины
//для энкодера
int stepVOLamount 2// шаг изменения громкости энкодером
unsigned long currentTimeVoumeControl;
unsigned long loopTimeVoumeControl;
const 
int pin_A 50// 
const int pin_B 51// 
unsigned char encoder_A;
unsigned char encoder_B;
unsigned char encoder_A_prev=0;
//конец для энкодера
  


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

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

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

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









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

// __________ТУТ НАЗНАЧАЕМ ИМЕНА НАШИХ КНОПОК И К КАКИМ ПИНАМ ОНИ ПОДКЛЮЧЕНЫ__________(также сюда пишем имена переменных, то, что обычно пишется ДО void setup().
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
BUTTON REDbutton(31);     //назначаем красной кнопке ножку 31. То есть один конец конпки подключён на пин 31 ардуины меги, а второй  конец конпки подключён на массу (GND)     Подтяжку на +5В делать не надо,  код для чтения состояний кнопок включает внутренний подтягивающий резистор на 20кОм
BUTTON BLACKbutton (33);  //назначаем красной кнопке ножку 33. То есть один конец конпки подключён на пин 33 ардуины меги, а второй  конец конпки подключён на массу (GND)    Подтяжку на +5В делать не надо,  код для чтения состояний кнопок включает внутренний подтягивающий резистор на 20кОм
BUTTON VOLUPbutton(53);   //назначаем кнопке ГРОМКОСТИ++ ножку 53
BUTTON VOLDNbutton(52);   //назначаем кнопке ГРОМКОСТИ-- ножку 52
byte MasterVolume 26//СТАВИМ НАЧАЛЬНОЕ ЗНАЧЕНИЕ ГРОМКОСТИ ПРИ ПОДАЧЕ ПИТАНИЯ НА АРДУИНУ - переменная, хранящая в себе громкость выходного звука, 0 - макс громкость, 79- минимальная, 80-255 MUTE http://arduino.ru/Reference/Byte Тип данных byte 8-ми битное беззнаковое целое число, Если DEC - в диапазоне 0..255
#define  VOLUME_INTERVAL  100UL  // интервал(время) между изменениями уровня громкости (0,05 секунд)
boolean Vupupup 0//переменная, показывающая надо ли увеличивать громкость раз в #define  VOLUME_INTERVAL  100UL (0,1Сек)
boolean Vdndndn 0//переменная, показывающая надо ли уменьшать громкость раз в #define  VOLUME_INTERVAL  100UL (0,1Сек)
int USCORENIE 0//переменная, ускорение изменения громкости при удержании кнопок VOL+ и VOL-
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~





 
void setup()    
 { 
Serial.begin(9600); // ком порт     
pinMode(13OUTPUT); // настройка пина встроенного светодиода на выход (чтоб моргать мог)        
Wire.begin(); // включение библиотеки I2C шины  
//~~~~~~~~ для энкодера~~~~~~~~~~
pinMode(pin_AINPUT); //настройка пинов энкодера
digitalWrite(pin_AHIGH);       // включить подтягивающий резистор http://arduino.ru/Tutorial/DigitalPins
pinMode(pin_BINPUT);
digitalWrite(pin_BHIGH);
currentTimeVoumeControl millis(); //для энкодера
loopTimeVoumeControl currentTimeVoumeControl;//для энкодера
//~~~~~~~~конец для энкодера~~~~~~~~~~
 


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

 

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

 // Serial.println("___________________start__________________________________ ");

 
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");}            // нажатие и удержание 
 


 
if (BLACKbutton.click_down) {Serial.println("BLACKbutton = click_down"); }
 if (
BLACKbutton.click_up) {Serial.println("BLACKbutton = click_up"); }
 if (
BLACKbutton.doubleclick) {Serial.println("BLACKbutton = doubleclick"); }
 if (
BLACKbutton.timer) {Serial.println("BLACKbutton = timer"); }
 if (
BLACKbutton.retention) {Serial.println("BLACKbutton = retention"); }

 
// Serial.println("___________________end______________________________ ");




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

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

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  
if (VOLUPbutton.retention==1){Vupupup 1;}//если кнопка нажата  и удерживается //надо бы увеличивать громкость по шагам
  
if (VOLDNbutton.retention==1){Vdndndn 1; }     //если кнопка нажата  и удержмвается //надо бы уменьшать громкость по шагам
if (VOLUPbutton.click_up) { Vupupup 0USCORENIE 0;}  
if (
VOLDNbutton.click_up) { Vdndndn 0USCORENIE 0;}          
//===================================================================================

VOLFAST(VOLUME_INTERVAL); //заходим в функцию VOLFAST, которая  ЕСЛИ удерживаются кнопки регулировки громкости, то увеличивает или уменьшает громкость на один шаг (1dB) с периодичностью VOLUME_INTERVAL.

//для энкодера~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
currentTimeVoumeControl millis();
if(
currentTimeVoumeControl >= (loopTimeVoumeControl 5)){ // проверяем каждые 5мс (200 Гц)состояние энкодера
encoder_A digitalRead(pin_A); // считываем состояние выхода А энкодера
encoder_B digitalRead(pin_B); // считываем состояние выхода А энкодера

if((!encoder_A) && (encoder_A_prev)) // если состояние изменилось с положительного к нулю
                                     
{
                                       if(
encoder_B)  { // выход В в полож. сост., значит вращение по часовой стрелке // увеличиваем громкость, не более чем до 80
                                                      
if(MasterVolume stepVOLamount <= 80) {(MasterVolume += stepVOLamount); Serial.println(MasterVolume);}
                                                      }
                                                     else { 
// выход В в 0 сост., значит вращение против часовой стрелки
                                                          
if(MasterVolume stepVOLamount >= 0){ (MasterVolume -= stepVOLamount); Serial.println(MasterVolume); }  // уменьшаем громкость, но не ниже 0
                                                          
}
                                     }
    
encoder_A_prev encoder_A// сохраняем значение А для следующего цикла
loopTimeVoumeControl currentTimeVoumeControl; }
//конец для энкодера~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


  
     
if(REDbutton.click_down==1)//если кнопка REDbutton нажата ... (статус нажатой кнопки == 1)
           

            
digitalWrite(13,0); //выключили диодик
           

      if (
REDbutton.click_up==)//если кнопка REDbutton отпущена .. (статус отпущенной кнопки == 1)
      
           

            
digitalWrite(13,1); //включили диодик
           
}
        



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

tda7442(00b01000000);  //INPUT ATTENUATION    приглушение ВХОДНОГО (IN1-IN4) канала (0 ~ -31.5dB)(0db-макс громкость, без приглушения)
tda7442(10b00000110);  //SURROUND & OUT & EFFECT CONTROL( -6 FIX OFF)
tda7442(20b00000011);  //SURROUND PHASE RESISTOR( 37KOm)
tda7442(30b00011111);  //BXXX0011 BASS SELECTION (0dB)-14dB
tda7442(40b01111110);  //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(70b00000000);  //BXXX0111 NOT ALLOWED
tda7442(80b00000000);  //BXXX1000 NOT ALLOWED         
tda7442(90b00000110);  //BXXX1001 INPUT MULTIPLEXER выбор источника IN1-4
//конец конфигурации void tda7442~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~






}//конец LOOP//~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~

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

Wire.beginTransmission(0x40); //СТАРТ и Адрес микросхема tda7442 
//после 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~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~








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

Последний раз редактировалось oleg707; 01.10.2016 в 21:06.
oleg707 вне форума   Ответить с цитированием
Старый 02.10.2016, 20:55   #15
oleg707
Гуру
 
Аватар для oleg707
 
Регистрация: 16.04.2014
Возраст: 39
Город: Gdynia
Регион: другой - для добавления сообщить ab
Сообщений: 2,548
oleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond repute
По умолчанию

//Скетч
// с подавлением дребезга кнопок
// с динамическим увеличением/уменьшением громкости при удержании кнопок ( с УСКОРЕНИЕМ при удержании)
// с энкодером
// с функцией MUTE
//без дисплея по I2C
//без активации внутреннего эквалайзера TDA7442D

PHP код:
//~~~~~~~~~~~~Описание начнется с 100 строки~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// класс титановый велосипед для тактовой кнопки. (версия 1.0)http://arduino.ru/forum/programmirovanie/klass-titanovyi-velosiped-dlya-taktovoi-knopki
// фильтр дребезга, отслеживание событий: нажатие, отпускание, двойное нажатие(doubleclick), нажато и удерживается в течении определённого времени, отпущено и неактивно в течении определённого времени.

#include <Arduino.h>
#include "Wire.h" //добавление библиотеки I2C шины
//для энкодера~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
int stepVOLamount 2// шаг изменения громкости энкодером
unsigned long currentTimeVoumeControl;
unsigned long loopTimeVoumeControl;
const 
int pin_A 50// 
const int pin_B 51// 
unsigned char encoder_A;
unsigned char encoder_B;
unsigned char encoder_A_prev=0;
//конец для энкодера~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  


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

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

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

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


//Скетч 
// с подавлением дребезга кнопок 
// с динамическим увеличением/уменьшением громкости при удержании кнопок ( с УСКОРЕНИЕМ при удержании)
// с энкодером с функцией MUTE
//без дисплея по I2C






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

// __________ТУТ НАЗНАЧАЕМ ИМЕНА НАШИХ КНОПОК И К КАКИМ ПИНАМ ОНИ ПОДКЛЮЧЕНЫ__________(также сюда пишем имена переменных, то, что обычно пишется ДО void setup().
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
BUTTON REDbutton(31);     //назначаем красной кнопке ножку 31. То есть один конец конпки подключён на пин 31 ардуины меги, а второй  конец конпки подключён на массу (GND)     Подтяжку на +5В делать не надо,  код для чтения состояний кнопок включает внутренний подтягивающий резистор на 20кОм
BUTTON BLACKbutton (33);  //назначаем красной кнопке ножку 33. То есть один конец конпки подключён на пин 33 ардуины меги, а второй  конец конпки подключён на массу (GND)    Подтяжку на +5В делать не надо,  код для чтения состояний кнопок включает внутренний подтягивающий резистор на 20кОм
BUTTON VOLUPbutton(53);   //назначаем кнопке ГРОМКОСТИ++ ножку 53
BUTTON VOLDNbutton(52);   //назначаем кнопке ГРОМКОСТИ-- ножку 52
BUTTON MUTEbutton(49);   //назначаем кнопке MUTE ножку 49
byte MasterVolume 26//СТАВИМ НАЧАЛЬНОЕ ЗНАЧЕНИЕ ГРОМКОСТИ ПРИ ПОДАЧЕ ПИТАНИЯ НА АРДУИНУ - переменная, хранящая в себе громкость выходного звука, 0 - макс громкость, 79- минимальная, 80-255 MUTE http://arduino.ru/Reference/Byte Тип данных byte 8-ми битное беззнаковое целое число, Если DEC - в диапазоне 0..255
#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-
bool MuteActiv 0// Признак включённого режима MUTE (временное отключение громкости)
byte MasterVolumeDoMUTE 80//Значение грмкости во время того, как включаем MUTE
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~





 
void setup()    
 { 
Serial.begin(9600); // ком порт     
pinMode(13OUTPUT); // настройка пина встроенного светодиода на выход (чтоб моргать мог)        
Wire.begin(); // включение библиотеки I2C шины  
//~~~~~~~~ для энкодера~~~~~~~~~~
pinMode(pin_AINPUT); //настройка пинов энкодера
digitalWrite(pin_AHIGH);       // включить подтягивающий резистор http://arduino.ru/Tutorial/DigitalPins
pinMode(pin_BINPUT);
digitalWrite(pin_BHIGH);
currentTimeVoumeControl millis(); //для энкодера
loopTimeVoumeControl currentTimeVoumeControl;//для энкодера
//~~~~~~~~конец для энкодера~~~~~~~~~~
 


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

 

VOLUPbutton.read();    // читаем фильтрованное значение СТАТУСА кнопки громкости 
VOLDNbutton.read();    // читаем фильтрованное значение СТАТУСА кнопки громкости 
REDbutton.read();      // читаем фильтрованное значение СТАТУСА кнопки
BLACKbutton.read();    // читаем фильтрованное значение СТАТУСА кнопки
MUTEbutton.read();      // читаем фильтрованное значение СТАТУСА кнопки MUTE
 // Serial.println("___________________start__________________________________ ");

 
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");}            // нажатие и удержание 
 


 
if (BLACKbutton.click_down) {Serial.println("BLACKbutton = click_down"); }
 if (
BLACKbutton.click_up) {Serial.println("BLACKbutton = click_up"); }
 if (
BLACKbutton.doubleclick) {Serial.println("BLACKbutton = doubleclick"); }
 if (
BLACKbutton.timer) {Serial.println("BLACKbutton = timer"); }
 if (
BLACKbutton.retention) {Serial.println("BLACKbutton = retention"); }

 
// Serial.println("___________________end______________________________ ");
 
 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~обработка MUTE~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

 
if (MasterVolume<80&&MuteActiv ==1){MuteActiv 0;}
 if (
MUTEbutton.click_down)//если кнопка MUTE однократно нажата
        

        
Serial.println("   M U T E     ");
        if (
MuteActiv == 0){MasterVolumeDoMUTE MasterVolume;}
        
MuteActiv = (!MuteActiv); 
        if (
MuteActiv == 1){ MasterVolumeDoMUTE MasterVolumeMasterVolume=80; }
        if (
MuteActiv==) { MasterVolume MasterVolumeDoMUTEMuteActiv 0; }
        
Serial.print("MuteActiv = " );Serial.print(MuteActiv);Serial.print("   MasterVolume = "); Serial.println(MasterVolume);
        
Serial.println("   END M U T E     ");
        }


        
 
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~конец обработки MUTE~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

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

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

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  
if (VOLUPbutton.retention==1){Vupupup 1;}//если кнопка нажата  и удерживается //надо бы увеличивать громкость по шагам
  
if (VOLDNbutton.retention==1){Vdndndn 1; }     //если кнопка нажата  и удержмвается //надо бы уменьшать громкость по шагам
if (VOLUPbutton.click_up) { Vupupup 0USCORENIE 0;}  
if (
VOLDNbutton.click_up) { Vdndndn 0USCORENIE 0;}          
//===================================================================================

VOLFAST(VOLUME_INTERVAL); //заходим в функцию VOLFAST, которая  ЕСЛИ удерживаются кнопки регулировки громкости, то увеличивает или уменьшает громкость на один шаг (1dB) с периодичностью VOLUME_INTERVAL.

//для энкодера~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
currentTimeVoumeControl millis();
if(
currentTimeVoumeControl >= (loopTimeVoumeControl 5)){ // проверяем каждые 5мс (200 Гц)состояние энкодера
encoder_A digitalRead(pin_A); // считываем состояние выхода А энкодера
encoder_B digitalRead(pin_B); // считываем состояние выхода А энкодера

if((!encoder_A) && (encoder_A_prev)) // если состояние изменилось с положительного к нулю
                                     
{
                                       if(
encoder_B)  { // выход В в полож. сост., значит вращение по часовой стрелке // увеличиваем громкость, не более чем до 80
                                                      
if(MasterVolume stepVOLamount <= 80) {(MasterVolume += stepVOLamount); Serial.println(MasterVolume);}
                                                      }
                                                     else { 
// выход В в 0 сост., значит вращение против часовой стрелки
                                                          
if(MasterVolume stepVOLamount >= 0){ (MasterVolume -= stepVOLamount); Serial.println(MasterVolume); }  // уменьшаем громкость, но не ниже 0
                                                          
}
                                     }
    
encoder_A_prev encoder_A// сохраняем значение А для следующего цикла
loopTimeVoumeControl currentTimeVoumeControl; }
//конец для энкодера~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


  
     
if(REDbutton.click_down==1)//если кнопка REDbutton нажата ... (статус нажатой кнопки == 1)
           

            
digitalWrite(13,0); //выключили диодик
           

      if (
REDbutton.click_up==)//если кнопка REDbutton отпущена .. (статус отпущенной кнопки == 1)
      
           

            
digitalWrite(13,1); //включили диодик
           
}
        



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

tda7442(00b01000000);  //INPUT ATTENUATION    приглушение ВХОДНОГО (IN1-IN4) канала (0 ~ -31.5dB)(0db-макс громкость, без приглушения)
tda7442(10b00000110);  //SURROUND & OUT & EFFECT CONTROL( -6 FIX OFF)
tda7442(20b00000011);  //SURROUND PHASE RESISTOR( 37KOm)
tda7442(30b00011111);  //BXXX0011 BASS SELECTION (0dB)-14dB
tda7442(40b01111110);  //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(70b00000000);  //BXXX0111 NOT ALLOWED
tda7442(80b00000000);  //BXXX1000 NOT ALLOWED         
tda7442(90b00000110);  //BXXX1001 INPUT MULTIPLEXER выбор источника IN1-4
//конец конфигурации void tda7442~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~






}//конец LOOP//~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~

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

Wire.beginTransmission(0x40); //СТАРТ и Адрес микросхема tda7442 
//после 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~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~








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

Последний раз редактировалось oleg707; 02.10.2016 в 21:57.
oleg707 вне форума   Ответить с цитированием
Старый 05.10.2016, 23:58   #16
demtro
Старший Пользователь
 
Регистрация: 17.12.2014
Возраст: 32
Город: Самара
Регион: 63, 163
Машина: Lifan Solano
Сообщений: 184
demtro is on a distinguished road
По умолчанию

Если можно схему подключения выложи.
demtro вне форума   Ответить с цитированием
Старый 06.10.2016, 00:51   #17
yuriy m
Старший Пользователь
 
Регистрация: 13.11.2011
Возраст: 45
Город: Гомель BY
Регион: 03
Машина: Гольф2 -> Lancia Zeta
Сообщений: 376
yuriy m is a jewel in the roughyuriy m is a jewel in the roughyuriy m is a jewel in the rough
По умолчанию

Когда с андрюши управлять будишь ?
__________________
Управление под ANDROID ... http://www.pccar.ru/showthread.php?t=24001
Мой старый проект http://www.pccar.ru/showthread.php?t=18038
yuriy m вне форума   Ответить с цитированием
Старый 06.10.2016, 19:21   #18
oleg707
Гуру
 
Аватар для oleg707
 
Регистрация: 16.04.2014
Возраст: 39
Город: Gdynia
Регион: другой - для добавления сообщить ab
Сообщений: 2,548
oleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond repute
По умолчанию

Цитата:
Сообщение от yuriy m Посмотреть сообщение
Когда с андрюши управлять будишь ?
Когда андроид сдк освою.
Фишка в том, что это решение АППАРАТНОЕ и не зависит от зависаний планшета, задержек включения-выключения и прочего. И подключать можно хоть на кассетный плеер.
oleg707 вне форума   Ответить с цитированием
Старый 06.10.2016, 19:25   #19
oleg707
Гуру
 
Аватар для oleg707
 
Регистрация: 16.04.2014
Возраст: 39
Город: Gdynia
Регион: другой - для добавления сообщить ab
Сообщений: 2,548
oleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond repute
По умолчанию

Цитата:
Сообщение от demtro Посмотреть сообщение
Если можно схему подключения выложи.
а чего её выкладывать то, в даташите есть.
Когда сделаю рабочую версию с 8 атмегой - тогда печатку и выложу.
oleg707 вне форума   Ответить с цитированием
Старый 06.10.2016, 19:58   #20
Kisel39
Старший Пользователь
 
Регистрация: 28.02.2013
Возраст: 45
Город: Железнодорожный
Регион: 50, 90, 150
Машина: Polo Sedan
Сообщений: 174
Kisel39 is a splendid one to beholdKisel39 is a splendid one to beholdKisel39 is a splendid one to beholdKisel39 is a splendid one to beholdKisel39 is a splendid one to beholdKisel39 is a splendid one to beholdKisel39 is a splendid one to behold
По умолчанию

Не в обиду Олег, можно намного правильнее сделать:
Как я понимаю приемом и управлением будет рулить приложение с андройда,
Так делай всю обработку в приложении, а атмега будет только шлюзом.
Я тоже пытался читать протокол cannyo , но на ардуино ничего не вышло, вернее читать получалось, а отправлять - никак, только на 32 битах ARM заработало и то на 96 Mhz. Андройду посилу многое, да и ресурсы другие, у меня сейчас тинси наполовину шлюз на вторую ( управление питанием и чтением данных ), если андройд тупонет...
Молодец, удачи в проекте !
Kisel39 вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

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

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



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


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