Гуру
Регистрация: 16.04.2014
Возраст: 40
Город: Gdynia
Регион: другой - для добавления сообщить ab
Сообщений: 2,548
|
без энкодера, без ДЕЛАЕВ, с подавлением дребезга кнопок
без энкодера, без ДЕЛАЕВ, с подавлением дребезга кнопок и с увеличением/уменьшением громкости при удержании кнопок.
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(_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; }
}
}
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//конец кода для чтения состояний кнопок ~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//Подтяжку для кнопок на +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(13, OUTPUT); // настройка пина встроенного светодиода на выход (чтоб моргать мог)
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==1 )//если кнопка REDbutton отпущена .. (статус отпущенной кнопки == 1)
{
digitalWrite(13,1); //включили диодик
}
//конфигурация 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, 0b00011111); //BXXX0011 BASS SELECTION (0dB)-14dB
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, 0b00000110); //BXXX1001 INPUT MULTIPLEXER выбор источника IN1-4
//конец конфигурации void tda7442~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
}//конец LOOP//~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~
// void tda7442 вызов управления по I2C ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void tda7442(byte subaddress, byte 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 == 1 && 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(_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; }
}
}
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//конец кода для чтения состояний кнопок ~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//Подтяжку для кнопок на +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(13, OUTPUT); // настройка пина встроенного светодиода на выход (чтоб моргать мог)
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 = 0; USCORENIE = 0;}
if (VOLDNbutton.click_up) { Vdndndn = 0; USCORENIE = 0;}
//===================================================================================
VOLFAST(VOLUME_INTERVAL); //заходим в функцию VOLFAST, которая ЕСЛИ удерживаются кнопки регулировки громкости, то увеличивает или уменьшает громкость на один шаг (1dB) с периодичностью VOLUME_INTERVAL.
if(REDbutton.click_down==1)//если кнопка REDbutton нажата ... (статус нажатой кнопки == 1)
{
digitalWrite(13,0); //выключили диодик
}
if (REDbutton.click_up==1 )//если кнопка REDbutton отпущена .. (статус отпущенной кнопки == 1)
{
digitalWrite(13,1); //включили диодик
}
//конфигурация 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, 0b00011111); //BXXX0011 BASS SELECTION (0dB)-14dB
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, 0b00000110); //BXXX1001 INPUT MULTIPLEXER выбор источника IN1-4
//конец конфигурации void tda7442~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
}//конец LOOP//~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~
// void tda7442 вызов управления по I2C ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void tda7442(byte subaddress, byte 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 == 1 && 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(_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; }
}
}
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//конец кода для чтения состояний кнопок ~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//Подтяжку для кнопок на +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(13, OUTPUT); // настройка пина встроенного светодиода на выход (чтоб моргать мог)
Wire.begin(); // включение библиотеки I2C шины
//~~~~~~~~ для энкодера~~~~~~~~~~
pinMode(pin_A, INPUT); //настройка пинов энкодера
digitalWrite(pin_A, HIGH); // включить подтягивающий резистор http://arduino.ru/Tutorial/DigitalPins
pinMode(pin_B, INPUT);
digitalWrite(pin_B, HIGH);
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 = 0; USCORENIE = 0;}
if (VOLDNbutton.click_up) { Vdndndn = 0; USCORENIE = 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==1 )//если кнопка REDbutton отпущена .. (статус отпущенной кнопки == 1)
{
digitalWrite(13,1); //включили диодик
}
//конфигурация 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, 0b00011111); //BXXX0011 BASS SELECTION (0dB)-14dB
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, 0b00000110); //BXXX1001 INPUT MULTIPLEXER выбор источника IN1-4
//конец конфигурации void tda7442~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
}//конец LOOP//~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~
// void tda7442 вызов управления по I2C ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void tda7442(byte subaddress, byte 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 == 1 && 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.
|