Re: PT2313 + энкодер + ИК пульт + анализатор спектра
удалите строчку:
if(spek==1 && (ir.value==MENU_DOWN||ir.value==MENU_UP)){cl();menu=0;}
посмотрите что изменилось
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
forum.rcl-radio.ru → Тестирование скетчей → PT2313 + энкодер + ИК пульт + анализатор спектра
Страницы Назад 1 … 4 5 6 7 8 … 11 Далее
Чтобы отправить ответ, вы должны войти или зарегистрироваться
удалите строчку:
if(spek==1 && (ir.value==MENU_DOWN||ir.value==MENU_UP)){cl();menu=0;}
посмотрите что изменилось
удалите строчку:
if(spek==1 && (ir.value==MENU_DOWN||ir.value==MENU_UP)){cl();menu=0;}
посмотрите что изменилось
Тут видимо проблема или в пульте или ИК приемнике , в порте какая то дичь . Всегда разные коды , пробовал другой пульт и все так же.
как бэ вызов нужных меню работает , но коды нужные не идут и по этому вообще не вызывается нужные менюшки.
У меня последний код отлично работал, я открыл монитор порта и смотрел чтобы при нажатии на кнопку появлялся только один код (что бы не было двойного нажатия кнопки). Все работало как положено, без вызова меню громкости (при выходе из анализатора).
Датчик ИК очень чувствителен к наводкам, не любит когда близко подносят пульт. На него могут влиять внешние источника света, например светодиодные лампы.
Возможно импульсные помехи по питанию.
У меня последний код отлично работал, я открыл монитор порта и смотрел чтобы при нажатии на кнопку появлялся только один код (что бы не было двойного нажатия кнопки). Все работало как положено, без вызова меню громкости (при выходе из анализатора).
Датчик ИК очень чувствителен к наводкам, не любит когда близко подносят пульт. На него могут влиять внешние источника света, например светодиодные лампы.
Возможно импульсные помехи по питанию.
У меня нет нужного щупа для осциллографа , дабы проверить шум по питанию ЮСБ . Так то я питаю весь набор от 2х18650 в послед (8.2 В).
Так жэ у меня освещение это лампа накала 100 Вт , возможно Сам монитор ПК или лцд наводит , но как бэ ИК привемник отвернут от них . И в комнате темно.
Все прошлые скетчи работали нормально и по порту все хорошо , ну бывали редко мусорные коды в порте. И сама проблема с Volume. Я нажимал ВЧ+ или ВЧ- , а оно мне вызывало Volume , а затем ВЧ .
А вот последний скетч стал дубовым на вызовы любых меню и в порте летит мусор .
Вот код который работает , но только проблема с Volume , что лезет вперед очереди .
#define VOLUME_MAX 0xFF50AF // громкость прибавить
#define VOLUME_MIN 0xFF10EF // громкость убавить
#define BASS_MAX 0xFF8877 // НЧ прибавить
#define BASS_MIN 0xFFA857 // НЧ убавить
#define TREB_MAX 0xFF08F7 // ВЧ прибавить
#define TREB_MIN 0xFF28D7 // ВЧ убавить
#define BALL_R 0x731A3E02 // баланс вправо
#define BALL_L 0x6825E53E // баланс влево
#define IN1 0xFF20DF // выбор вход 1
#define IN2 0xFF609F // выбор вход 2
#define IN3 0xFF30CF // выбор вход 3
#define LEFT 0xFF6897 // убавить в любом меню
#define RIGHT 0xFF48B7 // прибавить в любом меню
#define MENU_DOWN 0xFFB04F // навигация по меню
#define MENU_UP 0xFFA05F // навигация по меню
#define LOUD 0xFF708F // Loudness
#define POWER 0xFF00FF // POWER
#define MUTE 0xFF40BF // MUTE
#define AUTO_GAIN 1 // автонастройка по громкости
#define VOL_THR 25 // порог тишины (ниже него отображения на матрице не будет)
#define LOW_PASS 20 // нижний порог чувствительности шумов (нет скачков при отсутствии звука)
#define DEF_GAIN 85 // максимальный порог по умолчанию
#define FHT_N 256 // ширина спектра х2
#define LOG_OUT 1
#include <FHT.h>
#include <Wire.h>
#include <PT2313.h>
//#include <LiquidCrystal_I2C.h>
#include <LiquidCrystal.h>
#include <Encoder.h>
#include <MsTimer2.h>
#include <boarddefs.h>
#include <IRremote.h>
#include <EEPROM.h>
//LiquidCrystal_I2C lcd(0x27,16,2);
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);// RS,E,D4,D5,D6,D7
PT2313 audioChip;
IRrecv irrecv(12); // указываем вывод модуля IR приемника
Encoder myEnc(9, 8);//CLK, DT
decode_results ir;
byte posOffset[16] = {2, 3, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30}; // вч выше
byte in,w,w2,gr1,gr2,www,z,z0,z1;
int vol,vol_d,bass,bass_d,treb,treb_d,balans,gain,gain0,gain1,gain2;
unsigned long time,oldPosition = -999,newPosition;
unsigned long gainTimer;
byte maxValue, maxValue_f,spek;
float k = 0.1;
byte gain_sp = DEF_GAIN;
int i1,yyy,vol_old;
bool loud,k1,k2,k3,k4,k5,power,mute;
int menu, a3;
void setup(){
Serial.begin(9600);Wire.begin();
//lcd.init();lcd.backlight();
lcd.begin(16, 2);
irrecv.enableIRIn(); // запускаем модуль IR
audioChip.initialize(0,true);
pinMode(10,INPUT_PULLUP);// МЕНЮ КНОПКА SW энкодера
pinMode(11,OUTPUT);// OUTPUT MUTE
pinMode(13,OUTPUT);// OUTPUT STANDBY
pinMode(A3,INPUT);// 5 BUTTON
ADMUX = 0b01100000; ADCSRA = 0b11010100; // http://rcl-radio.ru/?p=57478
MsTimer2::set(3, to_Timer);MsTimer2::start(); // АКТИВИРУЕМ ПРЕРЫВАНИЯ ДЛЯ ЭНКОДЕРА
vol = EEPROM.read(0);// vol eeprom
bass = EEPROM.read(1)-7;// bass eeprom
treb = EEPROM.read(3)-7;// treb eeprom
balans = EEPROM.read(4)-4;// balans eeprom
in = EEPROM.read(5);// in eeprom
gain0 = EEPROM.read(6);
gain1 = EEPROM.read(7);
gain2 = EEPROM.read(8);
loud = EEPROM.read(9);
switch(in){
case 0: gain = gain0;break;
case 1: gain = gain1;break;
case 2: gain = gain2;break;
}
audio();
}
void loop(){
////////////////// ИК приемник - обработка кодов кнопок ///////////////////////////////////////
if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);irrecv.resume();time=millis();w=1;
if(spek==1&&ir.value!=POWER&&ir.value!=MUTE&&ir.value!=VOLUME_MAX&&ir.value!=VOLUME_MIN&&ir.value!=BASS_MAX&&ir.value!=BASS_MIN&&ir.value!=TREB_MAX&&ir.value!=TREB_MIN&&ir.value!=BALL_R&&ir.value!=BALL_L&&ir.value!=LOUD){
menu=0;cl();}}// IR приемник - чтение, в мониторе порта отображаются коды кнопок
if(ir.value==0){gr1=0;gr2=0;}// запрет нажатий не активных кнопок пульта
/////////////// POWER //////////////////////////////////////////////
if(ir.value==POWER&&power==0){power=1;gr1=0;gr2=0;w=1;w2=1;menu=100;cl();myEnc.write(0);vol_old=vol;vol=0;
lcd.setCursor(3,0);lcd.print(F("POWER OFF"));audio();delay(2000);}
if(ir.value==POWER&&power==1){power=0;gr1=0;gr2=0;cl();w=1;w2=1;menu=0;myEnc.write(0);vol=vol_old;
lcd.setCursor(3,0);lcd.print(F("POWER ON"));audio();delay(2000);cl();}
if(power==0){digitalWrite(13,HIGH);}else{digitalWrite(13,LOW);}
if(mute==1){digitalWrite(11,HIGH);}else{digitalWrite(11,LOW);}
////////////// MUTE /////////////////////////////////////////////////
if(power==0){
if(ir.value==MUTE && mute==0){mute=1;gr1=0;gr2=0;w=1;w2=1;menu=100;cl();myEnc.write(0);vol_old=vol;vol=0;
lcd.setCursor(3,0);lcd.print(F(" MUTE "));audio();}
if(ir.value==MUTE && mute==1){mute=0;gr1=0;gr2=0;w=1;w2=1;menu=0;cl();myEnc.write(0);vol=vol_old;audio();}
}
////////////////////////////////////////////////////////////////////
// a3 = 1023;
a3 = (analogRead(A3));
if(a3 < 50){k1=1;}
if(a3 > 50 && a3 < 150){k2=1;}
if(a3 > 150 && a3 < 250){k3=1;}
if(a3 > 250 && a3 < 350){k4=1;}
if(a3 > 350 && a3 < 500){k5=1;}
if (newPosition != oldPosition) {if(spek==1){cl();menu=0;}}
if(spek==0){
byte a1[8] = {0b00000,0b10101,0b10101,0b10101,0b10101,0b10101,0b10101,0b00000};
byte a2[8] = {0b00000,0b10100,0b10100,0b10100,0b10100,0b10100,0b10100,0b00000};
byte a3[8] = {0b00000,0b10000,0b10000,0b10000,0b10000,0b10000,0b10000,0b00000};
lcd.createChar(0,a1);lcd.createChar(1,a2);lcd.createChar(2,a3);
}else{
byte v1[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b01110};
byte v2[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b01110, 0b01110};
byte v3[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b01110, 0b01110, 0b01110};
byte v4[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b01110, 0b01110, 0b01110, 0b01110};
byte v5[8] = {0b00000, 0b00000, 0b00000, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110};
byte v6[8] = {0b00000, 0b00000, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110};
byte v7[8] = {0b00000, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110};
byte v8[8] = {0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110};
lcd.createChar(0, v1);lcd.createChar(1, v2);lcd.createChar(2, v3);lcd.createChar(3, v4);lcd.createChar(4, v5);lcd.createChar(5, v6);lcd.createChar(6, v7);lcd.createChar(7, v8);
}
///////////////////// управление ////////////////////////////////////////////////////
if(power==0){
if(digitalRead(10)==LOW){menu++;cl();;time=millis();w=1;w2=1;if(menu>3){menu=0;}}// меню
if(k5==1){in++;k5=0;;cl();delay(200);time=millis()-7000;w=1;w2=1;www=1;menu=4;if(in>2){in=0;};audio();}// КНОПКА ВЫБОРА ВХОДА IN
if(ir.value==VOLUME_MAX && menu!=0){vol++;menu=0;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;vol_func();audio();}// vol_max
if(ir.value==VOLUME_MIN && menu!=0){vol--;menu=0;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;vol_func();audio();}// vol_min
if(ir.value==BASS_MAX && menu!=1){bass++;menu=1;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;bass_func();audio();}// bass_max
if(ir.value==BASS_MIN && menu!=1){bass--;menu=1;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;bass_func();audio();}// bass_min
if(ir.value==TREB_MAX && menu!=2){treb++;menu=2;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;treb_func();audio();}// treb_max
if(ir.value==TREB_MIN && menu!=2){treb--;menu=2;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;treb_func();audio();}// treb_min
if(ir.value==BALL_R && menu!=3){balans++;menu=3;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;balans_func();audio();}// balans_right
if(ir.value==BALL_L && menu!=3){balans--;menu=3;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;balans_func();audio();}// balans_left
if(ir.value==IN1){in=0;cl();time=millis()-7000;w=1;time=millis();w=1;w2=1;www=1;menu=4;gr1=0;gr2=0;audio();}// IN1
if(ir.value==IN2){in=1;cl();time=millis()-7000;w=1;time=millis();w=1;w2=1;www=1;menu=4;gr1=0;gr2=0;audio();}// IN2
if(ir.value==IN3){in=2;cl();time=millis()-7000;w=1;time=millis();w=1;w2=1;www=1;menu=4;gr1=0;gr2=0;audio();}// IN3
if(ir.value==MENU_DOWN || k1==1){menu++;k1=0;cl();time=millis();w=1;w2=1;if(menu>3){menu=0;}}// menu_down
if(ir.value==MENU_UP || k2==1){menu--;k2=0;cl();time=millis();w=1;w2=1;if(menu<0||menu>3){menu=3;}}// menu_up
if(ir.value==LOUD && loud==0){loud=1;cl();time=millis();w=1;w2=1;lcd.setCursor(2,0);lcd.print("Loudness ON");audio();delay(2000);}// loud_on
if(ir.value==LOUD && loud==1){loud=0;cl();time=millis();w=1;w2=1;lcd.setCursor(2,0);lcd.print("Loudness OFF");audio();delay(2000);}// loud_off
}
/////////////////////// VOLUME //////////////
if(menu==0){
if(ir.value==VOLUME_MAX || ir.value==RIGHT || k4==1){vol++;k4=0;gr1=1;gr2=0;cl();time=millis();w=1;w2=1;vol_func();audio();}// кнопка >
if((ir.value==0xFFFFFFFF || k3==1) and gr1==1){vol++;k3=0;gr2=0;cl();time=millis();w=1;w2=1;vol_func();audio();}// кнопка >>>>>>
if(ir.value==VOLUME_MIN || ir.value==LEFT || k3==1){vol--;k3=0;gr1=0;gr2=1;cl();time=millis();w=1;w2=1;vol_func();audio();}// кнопка <
if((ir.value==0xFFFFFFFF || k4==1) and gr2==1){vol--;k4=0;gr1=0;cl();time=millis();w=1;w2=1;vol_func();audio();}// кнопка <<<<<<
if (newPosition != oldPosition){oldPosition = newPosition;
vol=vol+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;vol_func();audio();}
lcd.setCursor(0,0);lcd.print(F("Volume "));
lcd.print(" ");lcd.print(-62+vol);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");vol_d=vol-14;
if(w2==1){
for(z=0,z0=0,z1=0;z<=vol_d;z++,z1++){if(z1>2){z1=0;z0++;}
if(z1==1){lcd.setCursor(z0,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1,1);lcd.print(" ");}}
if(z1==3){lcd.setCursor(z0,1);lcd.write((uint8_t)1);}
if(z1==2){lcd.setCursor(z0,1);lcd.write((uint8_t)2);}w2=0;}}
/////////////////// BASS //////////////
if(menu==1){
if(ir.value==BASS_MAX || ir.value==RIGHT || k4==1){bass++;k4=0;gr1=1;gr2=0;cl();time=millis();w=1;w2=1;bass_func();audio();}// кнопка >
if((ir.value==0xFFFFFFFF || k3==1) and gr1==1){bass++;k3=0;gr2=0;cl();time=millis();w=1;w2=1;bass_func();audio();}// кнопка >>>>>>
if(ir.value==BASS_MIN || ir.value==LEFT || k3==1){bass--;k3=0;gr1=0;gr2=1;cl();time=millis();w=1;w2=1;bass_func();audio();}// кнопка <
if((ir.value==0xFFFFFFFF || k4==1) and gr2==1){bass--;k4=0;gr1=0;cl();time=millis();w=1;w2=1;bass_func();audio();}// кнопка <<<<<<
if (newPosition != oldPosition) {
oldPosition = newPosition;
bass=bass+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;bass_func();audio();}
lcd.setCursor(0,0);lcd.print(F("Bass "));
lcd.print(" ");lcd.print(bass*2);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");bass_d=bass*2+15;
if(w2==1){
for(z=0,z0=0,z1=0;z<=bass_d;z++,z1++){if(z1>2){z1=0;z0++;}
if(z1==1){lcd.setCursor(z0+3,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1+3,1);lcd.print(" ");}}
if(z1==3){lcd.setCursor(z0+3,1);lcd.write((uint8_t)1);}
if(z1==2){lcd.setCursor(z0+3,1);lcd.write((uint8_t)2);}w2=0;}}
///////////////// TREBLE //////////////////
if(menu==2){
if(ir.value==TREB_MAX || ir.value==RIGHT || k4==1){treb++;k4=0;gr1=1;gr2=0;cl();time=millis();w=1;w2=1;treb_func();audio();}// кнопка >
if((ir.value==0xFFFFFFFF || k3==1) and gr1==1){treb++;k3=0;gr2=0;cl();time=millis();w=1;w2=1;treb_func();audio();}// кнопка >>>>>>
if(ir.value==TREB_MIN || ir.value==LEFT || k3==1){treb--;k3=0;gr1=0;gr2=1;cl();time=millis();w=1;w2=1;treb_func();audio();}// кнопка <
if((ir.value==0xFFFFFFFF || k4==1) and gr2==1){treb--;k4=0;gr1=0;cl();time=millis();w=1;w2=1;treb_func();audio();}// кнопка <<<<<<
if (newPosition != oldPosition) {
oldPosition = newPosition;
treb=treb+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;treb_func();audio();}
lcd.setCursor(0,0);lcd.print(F("Treble "));
lcd.print(" ");lcd.print(treb*2);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");treb_d=treb*2+15;
if(w2==1){
for(z=0,z0=0,z1=0;z<=treb_d;z++,z1++){if(z1>2){z1=0;z0++;}
if(z1==1){lcd.setCursor(z0+3,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1+3,1);lcd.print(" ");}}
if(z1==3){lcd.setCursor(z0+3,1);lcd.write((uint8_t)1);}
if(z1==2){lcd.setCursor(z0+3,1);lcd.write((uint8_t)2);}w2=0;}}
//////////////// BALANSE +\- 4 dB /////////////
if(menu==3){
if(ir.value==BALL_R || ir.value==RIGHT || k4==1){balans++;k4=0;gr1=1;gr2=0;cl();time=millis();w=1;balans_func();audio();}// кнопка >
if(ir.value==BALL_L || ir.value==LEFT || k3==1){balans--;k3=0;gr1=0;gr2=1;cl();time=millis();w=1;balans_func();audio();}// кнопка <
if (newPosition != oldPosition) {
oldPosition = newPosition;
balans=balans+newPosition;myEnc.write(0);newPosition=0;lcd.clear();time=millis();w=1;balans_func();audio();}
lcd.setCursor(0,0);
if(balans>=0){lcd.print("-");}else{lcd.print("+");}
lcd.print(abs(balans));lcd.print(" dB ");
if(balans==0){lcd.print(" <> ");}
if(balans<0){lcd.print(" < ");}
if(balans>0){lcd.print(" > ");}
if(balans>=0){lcd.print("+");}else{lcd.print("-");}
lcd.print(abs(balans));lcd.print(" dB ");
lcd.setCursor(0,1);lcd.print("L");
lcd.setCursor(15,1);lcd.print("R");
if(balans<0){lcd.setCursor(balans+7,1);lcd.write((uint8_t)0);}
if(balans>0){lcd.setCursor(balans+8,1);lcd.write((uint8_t)0);}
if(balans==0){lcd.setCursor(7,1);lcd.write((uint8_t)0);lcd.setCursor(8,1);lcd.write((uint8_t)0);}}
/////////////////////////////////////////////////////////////
/////////// input + gain /////////////////////////////////////////
if(menu==4){
switch(in){
case 0: gain = gain0;break;
case 1: gain = gain1;break;
case 2: gain = gain2;break;
}
if(ir.value==RIGHT || k4==1){gain++;k4=0;gr1=1;gr2=0;cl();time=millis();w=1;w2=1;gain_func();audio();}// кнопка >
if(ir.value==LEFT || k3==1){gain--;k3=0;gr1=0;gr2=1;cl();time=millis();w=1;w2=1;gain_func();audio();}// кнопка <
if (newPosition != oldPosition) {
oldPosition = newPosition;
gain=gain+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;gain_func();audio();}
switch(in){
case 0: gain0 = gain;break;
case 1: gain1 = gain;break;
case 2: gain2 = gain;break;
}
lcd.setCursor(0,0);lcd.print(" INPUT ");lcd.print(in+1);
lcd.setCursor(0,1);lcd.print(" GAIN ");
switch(gain){
case 3: lcd.print(" +11.25 dB");break;
case 2: lcd.print(" +7.5 dB");break;
case 1: lcd.print(" +3.75 dB");break;
case 0: lcd.print(" 0 dB");break;
}
}
/////////////////////////////////////////////////////////////
// запись всех настроек в EEPROM если кнопки + и - не нажимались в течении 10 сек
// если настройки тембра, баланса и номер входа не менялись в течении 10 сек, переход в рег. Громкости
if(millis()-time>10000 && w==1 && power==0 && mute==0){
EEPROM.update(0,vol);
EEPROM.update(4,balans+4);
EEPROM.update(1,bass+7);
EEPROM.update(3,treb+7);
EEPROM.update(5,in);
EEPROM.update(6,gain0); EEPROM.update(7,gain1); EEPROM.update(8,gain2);
EEPROM.update(9,loud);
menu=100;lcd.clear();w=0;w2=1;cl();spek=1;
}
if(spek==1){
analyzeAudio(); // функция FHT, забивает массив fht_log_out[] величинами по спектру
for (int pos = 0; pos < 16; pos++) { // для окошек дисплея с 0 по 15
// найти максимум из пачки тонов
if (fht_log_out[posOffset[pos]] > maxValue) maxValue = fht_log_out[posOffset[pos]];
lcd.setCursor(pos, 0);
// преобразовать значение величины спектра в диапазон 0..15 с учётом настроек
int posLevel = map(fht_log_out[posOffset[pos]], LOW_PASS, gain_sp, 0, 15);
posLevel = constrain(posLevel, 0, 15);
while(yyy<2){yyy++;
if (posLevel > 7) { // если значение больше 7 (значит нижний квадратик будет полный)
lcd.write((uint8_t)posLevel - 8); // верхний квадратик залить тем что осталось
lcd.setCursor(pos, 1); // перейти на нижний квадратик
lcd.write((uint8_t)7); // залить его полностью
}
else { // если значение меньше 8
lcd.print(" "); // верхний квадратик пустой
lcd.setCursor(pos, 1); // нижний квадратик
lcd.write((uint8_t)posLevel); // залить полосками
}} yyy=0;
}
if (AUTO_GAIN) {
maxValue_f = maxValue * k + maxValue_f * (1 - k);
if (millis() - gainTimer > 1500) { // каждые 1500 мс
// если максимальное значение больше порога, взять его как максимум для отображения
if (maxValue_f > VOL_THR) gain_sp = maxValue_f;
// если нет, то взять порог побольше, чтобы шумы вообще не проходили
else gain_sp = 100;
gainTimer = millis();
}
}else{gain_sp = DEF_GAIN;}
}
//////////////////////////////////
}// LOOP
void audio(){
audioChip.source(in);//select your source 1...3 вход 3...1
audioChip.volume(vol);//Vol 0...62 шаг 1 дБ
audioChip.gain(gain);//gain 0...3 шаг 3.75 дБ
audioChip.bass(bass);//bass -7...+7 шаг 2 дБ
audioChip.treble(treb);//treble -7...+7 шаг 2 дБ
audioChip.balance(balans);//-31...+31 программно ограничено до +\-8 дБ
audioChip.loudness(loud);//true or false // тонкомпенсация
}
void gain_func(){if(gain<0){gain=3;}if(gain>3){gain=0;}}
void balans_func(){if(balans>4){balans=4;}if(balans<-4){balans=-4;}}
void treb_func(){if(treb>7){treb=7;}if(treb<-7){treb=-7;}}
void bass_func(){if(bass>7){bass=7;}if(bass<-7){bass=-7;}}
void vol_func(){if(vol<0){vol=0;}if(vol>62){vol=62;}}
void cl(){ir.value=0;delay(300);spek=0;lcd.clear();}
void to_Timer(){newPosition = myEnc.read()/4;}
void analyzeAudio() {
cli();
while( i1 < FHT_N ) { i1++;
do{ADCSRA |= (1 << ADSC);}
while((ADCSRA & (1 << ADIF)) == 0);
fht_input[i1] = (ADCL|ADCH << 8);
//fht_input[i1] = ADCH;
}i1=0;
fht_window(); // window the data for better frequency response
fht_reorder(); // reorder the data before doing the fht
fht_run(); // process the data in the fht
fht_mag_log(); // take the output of the fht
sei();
}
А вот этот проблемный , тут в порте мусор и я жму по 8 раз на кнопку пульта .
#define VOLUME_MAX 0xFF50AF // громкость прибавить
#define VOLUME_MIN 0xFF10EF // громкость убавить
#define BASS_MAX 0xFF8877 // НЧ прибавить
#define BASS_MIN 0xFFA857 // НЧ убавить
#define TREB_MAX 0xFF08F7 // ВЧ прибавить
#define TREB_MIN 0xFF28D7 // ВЧ убавить
#define BALL_R 0x731A3E02 // баланс вправо
#define BALL_L 0x6825E53E // баланс влево
#define IN1 0xFF20DF // выбор вход 1
#define IN2 0xFF609F // выбор вход 2
#define IN3 0xFF30CF // выбор вход 3
#define LEFT 0xFF6897 // убавить в любом меню
#define RIGHT 0xFF48B7 // прибавить в любом меню
#define MENU_DOWN 0xFFB04F // навигация по меню
#define MENU_UP 0xFFA05F // навигация по меню
#define LOUD 0xFF708F // Loudness
#define POWER 0xFF00FF // POWER
#define MUTE 0xFF40BF // MUTE
#define AUTO_GAIN 1 // автонастройка по громкости
#define VOL_THR 25 // порог тишины (ниже него отображения на матрице не будет)
#define LOW_PASS 20 // нижний порог чувствительности шумов (нет скачков при отсутствии звука)
#define DEF_GAIN 85 // максимальный порог по умолчанию
#define FHT_N 256 // ширина спектра х2
#define LOG_OUT 1
#include <FHT.h>
#include <Wire.h>
#include <PT2313.h>
//#include <LiquidCrystal_I2C.h>
#include <LiquidCrystal.h>
#include <Encoder.h>
#include <MsTimer2.h>
#include <boarddefs.h>
#include <IRremote.h>
#include <EEPROM.h>
//LiquidCrystal_I2C lcd(0x27,16,2);
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);// RS,E,D4,D5,D6,D7
PT2313 audioChip;
IRrecv irrecv(12); // указываем вывод модуля IR приемника
Encoder myEnc(9, 8);//CLK, DT
decode_results ir;
byte posOffset[16] = {2, 3, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30}; // вч выше
byte in,w,w2,gr1,gr2,www,z,z0,z1;
int vol,vol_d,bass,bass_d,treb,treb_d,balans,gain,gain0,gain1,gain2;
unsigned long time,oldPosition = -999,newPosition;
unsigned long gainTimer;
byte maxValue, maxValue_f,spek;
float k = 0.1;
byte gain_sp = DEF_GAIN;
int i1,yyy,vol_old;
bool loud,k1,k2,k3,k4,k5,power,mute;
int menu, a3;
void setup(){
Serial.begin(9600);Wire.begin();
//lcd.init();lcd.backlight();
lcd.begin(16, 2);
irrecv.enableIRIn(); // запускаем модуль IR
audioChip.initialize(0,true);
pinMode(10,INPUT_PULLUP);// МЕНЮ КНОПКА SW энкодера
pinMode(11,OUTPUT);// OUTPUT MUTE
pinMode(13,OUTPUT);// OUTPUT STANDBY
pinMode(A3,INPUT);// 5 BUTTON
ADMUX = 0b01100000; ADCSRA = 0b11010100; // http://rcl-radio.ru/?p=57478
MsTimer2::set(3, to_Timer);MsTimer2::start(); // АКТИВИРУЕМ ПРЕРЫВАНИЯ ДЛЯ ЭНКОДЕРА
vol = EEPROM.read(0);// vol eeprom
bass = EEPROM.read(1)-7;// bass eeprom
treb = EEPROM.read(3)-7;// treb eeprom
balans = EEPROM.read(4)-4;// balans eeprom
in = EEPROM.read(5);// in eeprom
gain0 = EEPROM.read(6);
gain1 = EEPROM.read(7);
gain2 = EEPROM.read(8);
loud = EEPROM.read(9);
switch(in){
case 0: gain = gain0;break;
case 1: gain = gain1;break;
case 2: gain = gain2;break;
}
audio();
}
void loop(){
////////////////// ИК приемник - обработка кодов кнопок ///////////////////////////////////////
if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);irrecv.resume();time=millis();w=1;
if(spek==1 && (ir.value==MENU_DOWN||ir.value==MENU_UP)){cl();menu=0;}
}// IR приемник - чтение, в мониторе порта отображаются коды кнопок
if(ir.value==0){gr1=0;gr2=0;}// запрет нажатий не активных кнопок пульта
/////////////// POWER //////////////////////////////////////////////
if(ir.value==POWER&&power==0){power=1;gr1=0;gr2=0;w=1;w2=1;menu=100;cl();myEnc.write(0);vol_old=vol;vol=0;
lcd.setCursor(3,0);lcd.print(F("POWER OFF"));audio();delay(2000);}
if(ir.value==POWER&&power==1){power=0;gr1=0;gr2=0;cl();w=1;w2=1;menu=0;myEnc.write(0);vol=vol_old;
lcd.setCursor(3,0);lcd.print(F("POWER ON"));audio();delay(2000);cl();}
if(power==0){digitalWrite(13,HIGH);}else{digitalWrite(13,LOW);}
if(mute==1){digitalWrite(11,HIGH);}else{digitalWrite(11,LOW);}
////////////// MUTE /////////////////////////////////////////////////
if(power==0){
if(ir.value==MUTE && mute==0){mute=1;gr1=0;gr2=0;w=1;w2=1;menu=100;cl();myEnc.write(0);vol_old=vol;vol=0;
lcd.setCursor(3,0);lcd.print(F(" MUTE "));audio();}
if(ir.value==MUTE && mute==1){mute=0;gr1=0;gr2=0;w=1;w2=1;menu=0;cl();myEnc.write(0);vol=vol_old;audio();}
}
////////////////////////////////////////////////////////////////////
// a3 = 1023;
a3 = (analogRead(A3));
if(a3 < 50){k1=1;}
if(a3 > 50 && a3 < 150){k2=1;}
if(a3 > 150 && a3 < 250){k3=1;}
if(a3 > 250 && a3 < 350){k4=1;}
if(a3 > 350 && a3 < 500){k5=1;}
if (newPosition != oldPosition) {if(spek==1){cl();menu=0;}}
if(spek==0){
byte a1[8] = {0b00000,0b10101,0b10101,0b10101,0b10101,0b10101,0b10101,0b00000};
byte a2[8] = {0b00000,0b10100,0b10100,0b10100,0b10100,0b10100,0b10100,0b00000};
byte a3[8] = {0b00000,0b10000,0b10000,0b10000,0b10000,0b10000,0b10000,0b00000};
lcd.createChar(0,a1);lcd.createChar(1,a2);lcd.createChar(2,a3);
}else{
byte v1[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b01110};
byte v2[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b01110, 0b01110};
byte v3[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b01110, 0b01110, 0b01110};
byte v4[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b01110, 0b01110, 0b01110, 0b01110};
byte v5[8] = {0b00000, 0b00000, 0b00000, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110};
byte v6[8] = {0b00000, 0b00000, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110};
byte v7[8] = {0b00000, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110};
byte v8[8] = {0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110};
lcd.createChar(0, v1);lcd.createChar(1, v2);lcd.createChar(2, v3);lcd.createChar(3, v4);lcd.createChar(4, v5);lcd.createChar(5, v6);lcd.createChar(6, v7);lcd.createChar(7, v8);
}
///////////////////// управление ////////////////////////////////////////////////////
if(power==0){
if(digitalRead(10)==LOW){menu++;cl();;time=millis();w=1;w2=1;if(menu>3){menu=0;}}// меню
if(k5==1){in++;k5=0;;cl();delay(200);time=millis()-7000;w=1;w2=1;www=1;menu=4;if(in>2){in=0;};audio();}// КНОПКА ВЫБОРА ВХОДА IN
if(ir.value==VOLUME_MAX && menu!=0){vol++;menu=0;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;vol_func();audio();}// vol_max
if(ir.value==VOLUME_MIN && menu!=0){vol--;menu=0;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;vol_func();audio();}// vol_min
if(ir.value==BASS_MAX && menu!=1){bass++;menu=1;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;bass_func();audio();}// bass_max
if(ir.value==BASS_MIN && menu!=1){bass--;menu=1;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;bass_func();audio();}// bass_min
if(ir.value==TREB_MAX && menu!=2){treb++;menu=2;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;treb_func();audio();}// treb_max
if(ir.value==TREB_MIN && menu!=2){treb--;menu=2;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;treb_func();audio();}// treb_min
if(ir.value==BALL_R && menu!=3){balans++;menu=3;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;balans_func();audio();}// balans_right
if(ir.value==BALL_L && menu!=3){balans--;menu=3;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;balans_func();audio();}// balans_left
if(ir.value==IN1){in=0;cl();time=millis()-7000;w=1;time=millis();w=1;w2=1;www=1;menu=4;gr1=0;gr2=0;audio();}// IN1
if(ir.value==IN2){in=1;cl();time=millis()-7000;w=1;time=millis();w=1;w2=1;www=1;menu=4;gr1=0;gr2=0;audio();}// IN2
if(ir.value==IN3){in=2;cl();time=millis()-7000;w=1;time=millis();w=1;w2=1;www=1;menu=4;gr1=0;gr2=0;audio();}// IN3
if(ir.value==MENU_DOWN || k1==1){menu++;k1=0;cl();time=millis();w=1;w2=1;if(menu>3){menu=0;}}// menu_down
if(ir.value==MENU_UP || k2==1){menu--;k2=0;cl();time=millis();w=1;w2=1;if(menu<0||menu>3){menu=3;}}// menu_up
if(ir.value==LOUD && loud==0){loud=1;cl();time=millis();w=1;w2=1;lcd.setCursor(2,0);lcd.print("Loudness ON");audio();delay(2000);}// loud_on
if(ir.value==LOUD && loud==1){loud=0;cl();time=millis();w=1;w2=1;lcd.setCursor(2,0);lcd.print("Loudness OFF");audio();delay(2000);}// loud_off
}
/////////////////////// VOLUME //////////////
if(menu==0){
if(ir.value==VOLUME_MAX || ir.value==RIGHT || k4==1){vol++;k4=0;gr1=1;gr2=0;cl1();time=millis();w=1;w2=1;vol_func();audio();}// кнопка >
if((ir.value==0xFFFFFFFF || k3==1) and gr1==1){vol++;k3=0;gr2=0;cl1();time=millis();w=1;w2=1;vol_func();audio();}// кнопка >>>>>>
if(ir.value==VOLUME_MIN || ir.value==LEFT || k3==1){vol--;k3=0;gr1=0;gr2=1;cl1();time=millis();w=1;w2=1;vol_func();audio();}// кнопка <
if((ir.value==0xFFFFFFFF || k4==1) and gr2==1){vol--;k4=0;gr1=0;cl1();time=millis();w=1;w2=1;vol_func();audio();}// кнопка <<<<<<
if (newPosition != oldPosition){oldPosition = newPosition;
vol=vol+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;vol_func();audio();}
lcd.setCursor(0,0);lcd.print(F("Volume "));
lcd.print(" ");lcd.print(-62+vol);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");vol_d=vol-14;
if(w2==1){
for(z=0,z0=0,z1=0;z<=vol_d;z++,z1++){if(z1>2){z1=0;z0++;}
if(z1==1){lcd.setCursor(z0,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1,1);lcd.print(" ");}}
if(z1==3){lcd.setCursor(z0,1);lcd.write((uint8_t)1);}
if(z1==2){lcd.setCursor(z0,1);lcd.write((uint8_t)2);}w2=0;}}
/////////////////// BASS //////////////
if(menu==1){
if(ir.value==BASS_MAX || ir.value==RIGHT || k4==1){bass++;k4=0;gr1=1;gr2=0;cl1();time=millis();w=1;w2=1;bass_func();audio();}// кнопка >
if((ir.value==0xFFFFFFFF || k3==1) and gr1==1){bass++;k3=0;gr2=0;cl1();time=millis();w=1;w2=1;bass_func();audio();}// кнопка >>>>>>
if(ir.value==BASS_MIN || ir.value==LEFT || k3==1){bass--;k3=0;gr1=0;gr2=1;cl1();time=millis();w=1;w2=1;bass_func();audio();}// кнопка <
if((ir.value==0xFFFFFFFF || k4==1) and gr2==1){bass--;k4=0;gr1=0;cl1();time=millis();w=1;w2=1;bass_func();audio();}// кнопка <<<<<<
if (newPosition != oldPosition) {
oldPosition = newPosition;
bass=bass+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;bass_func();audio();}
lcd.setCursor(0,0);lcd.print(F("Bass "));
lcd.print(" ");lcd.print(bass*2);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");bass_d=bass*2+15;
if(w2==1){
for(z=0,z0=0,z1=0;z<=bass_d;z++,z1++){if(z1>2){z1=0;z0++;}
if(z1==1){lcd.setCursor(z0+3,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1+3,1);lcd.print(" ");}}
if(z1==3){lcd.setCursor(z0+3,1);lcd.write((uint8_t)1);}
if(z1==2){lcd.setCursor(z0+3,1);lcd.write((uint8_t)2);}w2=0;}}
///////////////// TREBLE //////////////////
if(menu==2){
if(ir.value==TREB_MAX || ir.value==RIGHT || k4==1){treb++;k4=0;gr1=1;gr2=0;cl1();time=millis();w=1;w2=1;treb_func();audio();}// кнопка >
if((ir.value==0xFFFFFFFF || k3==1) and gr1==1){treb++;k3=0;gr2=0;cl1();time=millis();w=1;w2=1;treb_func();audio();}// кнопка >>>>>>
if(ir.value==TREB_MIN || ir.value==LEFT || k3==1){treb--;k3=0;gr1=0;gr2=1;cl1();time=millis();w=1;w2=1;treb_func();audio();}// кнопка <
if((ir.value==0xFFFFFFFF || k4==1) and gr2==1){treb--;k4=0;gr1=0;cl1();time=millis();w=1;w2=1;treb_func();audio();}// кнопка <<<<<<
if (newPosition != oldPosition) {
oldPosition = newPosition;
treb=treb+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;treb_func();audio();}
lcd.setCursor(0,0);lcd.print(F("Treble "));
lcd.print(" ");lcd.print(treb*2);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");treb_d=treb*2+15;
if(w2==1){
for(z=0,z0=0,z1=0;z<=treb_d;z++,z1++){if(z1>2){z1=0;z0++;}
if(z1==1){lcd.setCursor(z0+3,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1+3,1);lcd.print(" ");}}
if(z1==3){lcd.setCursor(z0+3,1);lcd.write((uint8_t)1);}
if(z1==2){lcd.setCursor(z0+3,1);lcd.write((uint8_t)2);}w2=0;}}
//////////////// BALANSE +\- 4 dB /////////////
if(menu==3){
if(ir.value==BALL_R || ir.value==RIGHT || k4==1){balans++;k4=0;gr1=1;gr2=0;cl();time=millis();w=1;balans_func();audio();}// кнопка >
if(ir.value==BALL_L || ir.value==LEFT || k3==1){balans--;k3=0;gr1=0;gr2=1;cl();time=millis();w=1;balans_func();audio();}// кнопка <
if (newPosition != oldPosition) {
oldPosition = newPosition;
balans=balans+newPosition;myEnc.write(0);newPosition=0;lcd.clear();time=millis();w=1;balans_func();audio();}
lcd.setCursor(0,0);
if(balans>=0){lcd.print("-");}else{lcd.print("+");}
lcd.print(abs(balans));lcd.print(" dB ");
if(balans==0){lcd.print(" <> ");}
if(balans<0){lcd.print(" < ");}
if(balans>0){lcd.print(" > ");}
if(balans>=0){lcd.print("+");}else{lcd.print("-");}
lcd.print(abs(balans));lcd.print(" dB ");
lcd.setCursor(0,1);lcd.print("L");
lcd.setCursor(15,1);lcd.print("R");
if(balans<0){lcd.setCursor(balans+7,1);lcd.write((uint8_t)0);}
if(balans>0){lcd.setCursor(balans+8,1);lcd.write((uint8_t)0);}
if(balans==0){lcd.setCursor(7,1);lcd.write((uint8_t)0);lcd.setCursor(8,1);lcd.write((uint8_t)0);}}
/////////////////////////////////////////////////////////////
/////////// input + gain /////////////////////////////////////////
if(menu==4){
switch(in){
case 0: gain = gain0;break;
case 1: gain = gain1;break;
case 2: gain = gain2;break;
}
if(ir.value==RIGHT || k4==1){gain++;k4=0;gr1=1;gr2=0;cl1();time=millis();w=1;w2=1;gain_func();audio();}// кнопка >
if(ir.value==LEFT || k3==1){gain--;k3=0;gr1=0;gr2=1;cl1();time=millis();w=1;w2=1;gain_func();audio();}// кнопка <
if (newPosition != oldPosition) {
oldPosition = newPosition;
gain=gain+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;gain_func();audio();}
switch(in){
case 0: gain0 = gain;break;
case 1: gain1 = gain;break;
case 2: gain2 = gain;break;
}
lcd.setCursor(0,0);lcd.print(" INPUT ");lcd.print(in+1);
lcd.setCursor(0,1);lcd.print(" GAIN ");
switch(gain){
case 3: lcd.print(" +11.25 dB");break;
case 2: lcd.print(" +7.5 dB");break;
case 1: lcd.print(" +3.75 dB");break;
case 0: lcd.print(" 0 dB");break;
}
}
/////////////////////////////////////////////////////////////
// запись всех настроек в EEPROM если кнопки + и - не нажимались в течении 10 сек
// если настройки тембра, баланса и номер входа не менялись в течении 10 сек, переход в рег. Громкости
if(millis()-time>10000 && w==1 && power==0 && mute==0){
EEPROM.update(0,vol);
EEPROM.update(4,balans+4);
EEPROM.update(1,bass+7);
EEPROM.update(3,treb+7);
EEPROM.update(5,in);
EEPROM.update(6,gain0); EEPROM.update(7,gain1); EEPROM.update(8,gain2);
EEPROM.update(9,loud);
menu=100;lcd.clear();w=0;w2=1;cl();spek=1;
}
if(spek==1){
analyzeAudio(); // функция FHT, забивает массив fht_log_out[] величинами по спектру
for (int pos = 0; pos < 16; pos++) { // для окошек дисплея с 0 по 15
// найти максимум из пачки тонов
if (fht_log_out[posOffset[pos]] > maxValue) maxValue = fht_log_out[posOffset[pos]];
lcd.setCursor(pos, 0);
// преобразовать значение величины спектра в диапазон 0..15 с учётом настроек
int posLevel = map(fht_log_out[posOffset[pos]], LOW_PASS, gain_sp, 0, 15);
posLevel = constrain(posLevel, 0, 15);
while(yyy<2){yyy++;
if (posLevel > 7) { // если значение больше 7 (значит нижний квадратик будет полный)
lcd.write((uint8_t)posLevel - 8); // верхний квадратик залить тем что осталось
lcd.setCursor(pos, 1); // перейти на нижний квадратик
lcd.write((uint8_t)7); // залить его полностью
}
else { // если значение меньше 8
lcd.print(" "); // верхний квадратик пустой
lcd.setCursor(pos, 1); // нижний квадратик
lcd.write((uint8_t)posLevel); // залить полосками
}} yyy=0;
}
if (AUTO_GAIN) {
maxValue_f = maxValue * k + maxValue_f * (1 - k);
if (millis() - gainTimer > 1500) { // каждые 1500 мс
// если максимальное значение больше порога, взять его как максимум для отображения
if (maxValue_f > VOL_THR) gain_sp = maxValue_f;
// если нет, то взять порог побольше, чтобы шумы вообще не проходили
else gain_sp = 100;
gainTimer = millis();
}
}else{gain_sp = DEF_GAIN;}
}
//////////////////////////////////
}// LOOP
void audio(){
audioChip.source(in);//select your source 1...3 вход 3...1
audioChip.volume(vol);//Vol 0...62 шаг 1 дБ
audioChip.gain(gain);//gain 0...3 шаг 3.75 дБ
audioChip.bass(bass);//bass -7...+7 шаг 2 дБ
audioChip.treble(treb);//treble -7...+7 шаг 2 дБ
audioChip.balance(balans);//-31...+31 программно ограничено до +\-8 дБ
audioChip.loudness(loud);//true or false // тонкомпенсация
}
void gain_func(){if(gain<0){gain=3;}if(gain>3){gain=0;}}
void balans_func(){if(balans>4){balans=4;}if(balans<-4){balans=-4;}}
void treb_func(){if(treb>7){treb=7;}if(treb<-7){treb=-7;}}
void bass_func(){if(bass>7){bass=7;}if(bass<-7){bass=-7;}}
void vol_func(){if(vol<0){vol=0;}if(vol>62){vol=62;}}
void cl(){ir.value=0;delay(300);spek=0;lcd.clear();}
void cl1(){ir.value=0;delay(300);spek=0;}
void to_Timer(){newPosition = myEnc.read()/4;}
void analyzeAudio() {
cli();
while( i1 < FHT_N ) { i1++;
do{ADCSRA |= (1 << ADSC);}
while((ADCSRA & (1 << ADIF)) == 0);
fht_input[i1] = (ADCL|ADCH << 8);
//fht_input[i1] = ADCH;
}i1=0;
fht_window(); // window the data for better frequency response
fht_reorder(); // reorder the data before doing the fht
fht_run(); // process the data in the fht
fht_mag_log(); // take the output of the fht
sei();
}
Загрузите этот скетч:
#define VOLUME_MAX 0xFF50AF // громкость прибавить
#define VOLUME_MIN 0xFF10EF // громкость убавить
#define BASS_MAX 0xFF8877 // НЧ прибавить
#define BASS_MIN 0xFFA857 // НЧ убавить
#define TREB_MAX 0xFF08F7 // ВЧ прибавить
#define TREB_MIN 0xFF28D7 // ВЧ убавить
#define BALL_R 0x731A3E02 // баланс вправо
#define BALL_L 0x6825E53E // баланс влево
#define IN1 0xFF20DF // выбор вход 1
#define IN2 0xFF609F // выбор вход 2
#define IN3 0xFF30CF // выбор вход 3
#define LEFT 0xFF6897 // убавить в любом меню
#define RIGHT 0xFF48B7 // прибавить в любом меню
#define MENU_DOWN 0xFFB04F // навигация по меню
#define MENU_UP 0xFFA05F // навигация по меню
#define LOUD 0xFF708F // Loudness
#define POWER 0xFF00FF // POWER
#define MUTE 0xFF40BF // MUTE
#define AUTO_GAIN 1 // автонастройка по громкости
#define VOL_THR 25 // порог тишины (ниже него отображения на матрице не будет)
#define LOW_PASS 20 // нижний порог чувствительности шумов (нет скачков при отсутствии звука)
#define DEF_GAIN 85 // максимальный порог по умолчанию
#define FHT_N 256 // ширина спектра х2
#define LOG_OUT 1
#include <FHT.h>
#include <Wire.h>
#include <PT2313.h>
//#include <LiquidCrystal_I2C.h>
#include <LiquidCrystal.h>
#include <Encoder.h>
#include <MsTimer2.h>
#include <boarddefs.h>
#include <IRremote.h>
#include <EEPROM.h>
//LiquidCrystal_I2C lcd(0x27,16,2);
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);// RS,E,D4,D5,D6,D7
PT2313 audioChip;
IRrecv irrecv(12); // указываем вывод модуля IR приемника
Encoder myEnc(9, 8);//CLK, DT
decode_results ir;
byte posOffset[16] = {2, 3, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30}; // вч выше
byte in,w,w2,gr1,gr2,www,z,z0,z1;
int vol,vol_d,bass,bass_d,treb,treb_d,balans,gain,gain0,gain1,gain2;
unsigned long time,oldPosition = -999,newPosition;
unsigned long gainTimer;
byte maxValue, maxValue_f,spek;
float k = 0.1;
byte gain_sp = DEF_GAIN;
int i1,yyy,vol_old;
bool loud,k1,k2,k3,k4,k5,power,mute;
int menu, a3;
void setup(){
Serial.begin(9600);Wire.begin();
//lcd.init();lcd.backlight();
lcd.begin(16, 2);
irrecv.enableIRIn(); // запускаем модуль IR
audioChip.initialize(0,true);
pinMode(10,INPUT_PULLUP);// МЕНЮ КНОПКА SW энкодера
pinMode(11,OUTPUT);// OUTPUT MUTE
pinMode(13,OUTPUT);// OUTPUT STANDBY
pinMode(A3,INPUT);// 5 BUTTON
ADMUX = 0b01100000; ADCSRA = 0b11010100; // http://rcl-radio.ru/?p=57478
MsTimer2::set(3, to_Timer);MsTimer2::start(); // АКТИВИРУЕМ ПРЕРЫВАНИЯ ДЛЯ ЭНКОДЕРА
vol = EEPROM.read(0);// vol eeprom
bass = EEPROM.read(1)-7;// bass eeprom
treb = EEPROM.read(3)-7;// treb eeprom
balans = EEPROM.read(4)-4;// balans eeprom
in = EEPROM.read(5);// in eeprom
gain0 = EEPROM.read(6);
gain1 = EEPROM.read(7);
gain2 = EEPROM.read(8);
loud = EEPROM.read(9);
switch(in){
case 0: gain = gain0;break;
case 1: gain = gain1;break;
case 2: gain = gain2;break;
}
audio();
}
void loop(){
////////////////// ИК приемник - обработка кодов кнопок ///////////////////////////////////////
if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);irrecv.resume();time=millis();w=1;delay(200);
if(spek==1 && (ir.value==MENU_DOWN||ir.value==MENU_UP)){cl();menu=0;}
}// IR приемник - чтение, в мониторе порта отображаются коды кнопок
if(ir.value==0){gr1=0;gr2=0;}// запрет нажатий не активных кнопок пульта
/////////////// POWER //////////////////////////////////////////////
if(ir.value==POWER&&power==0){power=1;gr1=0;gr2=0;w=1;w2=1;menu=100;cl();myEnc.write(0);vol_old=vol;vol=0;
lcd.setCursor(3,0);lcd.print(F("POWER OFF"));audio();delay(2000);}
if(ir.value==POWER&&power==1){power=0;gr1=0;gr2=0;cl();w=1;w2=1;menu=0;myEnc.write(0);vol=vol_old;
lcd.setCursor(3,0);lcd.print(F("POWER ON"));audio();delay(2000);cl();}
if(power==0){digitalWrite(13,HIGH);}else{digitalWrite(13,LOW);}
if(mute==1){digitalWrite(11,HIGH);}else{digitalWrite(11,LOW);}
////////////// MUTE /////////////////////////////////////////////////
if(power==0){
if(ir.value==MUTE && mute==0){mute=1;gr1=0;gr2=0;w=1;w2=1;menu=100;cl();myEnc.write(0);vol_old=vol;vol=0;
lcd.setCursor(3,0);lcd.print(F(" MUTE "));audio();}
if(ir.value==MUTE && mute==1){mute=0;gr1=0;gr2=0;w=1;w2=1;menu=0;cl();myEnc.write(0);vol=vol_old;audio();}
}
////////////////////////////////////////////////////////////////////
// a3 = 1023;
a3 = (analogRead(A3));
if(a3 < 50){k1=1;}
if(a3 > 50 && a3 < 150){k2=1;}
if(a3 > 150 && a3 < 250){k3=1;}
if(a3 > 250 && a3 < 350){k4=1;}
if(a3 > 350 && a3 < 500){k5=1;}
if (newPosition != oldPosition) {if(spek==1){cl();menu=0;}}
if(spek==0){
byte a1[8] = {0b00000,0b10101,0b10101,0b10101,0b10101,0b10101,0b10101,0b00000};
byte a2[8] = {0b00000,0b10100,0b10100,0b10100,0b10100,0b10100,0b10100,0b00000};
byte a3[8] = {0b00000,0b10000,0b10000,0b10000,0b10000,0b10000,0b10000,0b00000};
lcd.createChar(0,a1);lcd.createChar(1,a2);lcd.createChar(2,a3);
}else{
byte v1[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b01110};
byte v2[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b01110, 0b01110};
byte v3[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b01110, 0b01110, 0b01110};
byte v4[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b01110, 0b01110, 0b01110, 0b01110};
byte v5[8] = {0b00000, 0b00000, 0b00000, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110};
byte v6[8] = {0b00000, 0b00000, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110};
byte v7[8] = {0b00000, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110};
byte v8[8] = {0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110};
lcd.createChar(0, v1);lcd.createChar(1, v2);lcd.createChar(2, v3);lcd.createChar(3, v4);lcd.createChar(4, v5);lcd.createChar(5, v6);lcd.createChar(6, v7);lcd.createChar(7, v8);
}
///////////////////// управление ////////////////////////////////////////////////////
if(power==0){
if(digitalRead(10)==LOW){menu++;cl();;time=millis();w=1;w2=1;if(menu>3){menu=0;}}// меню
if(k5==1){in++;k5=0;;cl();delay(200);time=millis()-7000;w=1;w2=1;www=1;menu=4;if(in>2){in=0;};audio();}// КНОПКА ВЫБОРА ВХОДА IN
if(ir.value==VOLUME_MAX && menu!=0){vol++;menu=0;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;vol_func();audio();}// vol_max
if(ir.value==VOLUME_MIN && menu!=0){vol--;menu=0;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;vol_func();audio();}// vol_min
if(ir.value==BASS_MAX && menu!=1){bass++;menu=1;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;bass_func();audio();}// bass_max
if(ir.value==BASS_MIN && menu!=1){bass--;menu=1;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;bass_func();audio();}// bass_min
if(ir.value==TREB_MAX && menu!=2){treb++;menu=2;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;treb_func();audio();}// treb_max
if(ir.value==TREB_MIN && menu!=2){treb--;menu=2;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;treb_func();audio();}// treb_min
if(ir.value==BALL_R && menu!=3){balans++;menu=3;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;balans_func();audio();}// balans_right
if(ir.value==BALL_L && menu!=3){balans--;menu=3;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;balans_func();audio();}// balans_left
if(ir.value==IN1){in=0;cl();time=millis()-7000;w=1;time=millis();w=1;w2=1;www=1;menu=4;gr1=0;gr2=0;audio();}// IN1
if(ir.value==IN2){in=1;cl();time=millis()-7000;w=1;time=millis();w=1;w2=1;www=1;menu=4;gr1=0;gr2=0;audio();}// IN2
if(ir.value==IN3){in=2;cl();time=millis()-7000;w=1;time=millis();w=1;w2=1;www=1;menu=4;gr1=0;gr2=0;audio();}// IN3
if(ir.value==MENU_DOWN || k1==1){menu++;k1=0;cl();time=millis();w=1;w2=1;if(menu>3){menu=0;}}// menu_down
if(ir.value==MENU_UP || k2==1){menu--;k2=0;cl();time=millis();w=1;w2=1;if(menu<0||menu>3){menu=3;}}// menu_up
if(ir.value==LOUD && loud==0){loud=1;cl();time=millis();w=1;w2=1;lcd.setCursor(2,0);lcd.print("Loudness ON");audio();delay(2000);}// loud_on
if(ir.value==LOUD && loud==1){loud=0;cl();time=millis();w=1;w2=1;lcd.setCursor(2,0);lcd.print("Loudness OFF");audio();delay(2000);}// loud_off
}
/////////////////////// VOLUME //////////////
if(menu==0){
if(ir.value==VOLUME_MAX || ir.value==RIGHT || k4==1){vol++;k4=0;gr1=1;gr2=0;cl1();time=millis();w=1;w2=1;vol_func();audio();}// кнопка >
if((ir.value==0xFFFFFFFF || k3==1) and gr1==1){vol++;k3=0;gr2=0;cl1();time=millis();w=1;w2=1;vol_func();audio();}// кнопка >>>>>>
if(ir.value==VOLUME_MIN || ir.value==LEFT || k3==1){vol--;k3=0;gr1=0;gr2=1;cl1();time=millis();w=1;w2=1;vol_func();audio();}// кнопка <
if((ir.value==0xFFFFFFFF || k4==1) and gr2==1){vol--;k4=0;gr1=0;cl1();time=millis();w=1;w2=1;vol_func();audio();}// кнопка <<<<<<
if (newPosition != oldPosition){oldPosition = newPosition;
vol=vol+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;vol_func();audio();}
lcd.setCursor(0,0);lcd.print(F("Volume "));
lcd.print(" ");lcd.print(-62+vol);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");vol_d=vol-14;
if(w2==1){
for(z=0,z0=0,z1=0;z<=vol_d;z++,z1++){if(z1>2){z1=0;z0++;}
if(z1==1){lcd.setCursor(z0,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1,1);lcd.print(" ");}}
if(z1==3){lcd.setCursor(z0,1);lcd.write((uint8_t)1);}
if(z1==2){lcd.setCursor(z0,1);lcd.write((uint8_t)2);}w2=0;}}
/////////////////// BASS //////////////
if(menu==1){
if(ir.value==BASS_MAX || ir.value==RIGHT || k4==1){bass++;k4=0;gr1=1;gr2=0;cl1();time=millis();w=1;w2=1;bass_func();audio();}// кнопка >
if((ir.value==0xFFFFFFFF || k3==1) and gr1==1){bass++;k3=0;gr2=0;cl1();time=millis();w=1;w2=1;bass_func();audio();}// кнопка >>>>>>
if(ir.value==BASS_MIN || ir.value==LEFT || k3==1){bass--;k3=0;gr1=0;gr2=1;cl1();time=millis();w=1;w2=1;bass_func();audio();}// кнопка <
if((ir.value==0xFFFFFFFF || k4==1) and gr2==1){bass--;k4=0;gr1=0;cl1();time=millis();w=1;w2=1;bass_func();audio();}// кнопка <<<<<<
if (newPosition != oldPosition) {
oldPosition = newPosition;
bass=bass+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;bass_func();audio();}
lcd.setCursor(0,0);lcd.print(F("Bass "));
lcd.print(" ");lcd.print(bass*2);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");bass_d=bass*2+15;
if(w2==1){
for(z=0,z0=0,z1=0;z<=bass_d;z++,z1++){if(z1>2){z1=0;z0++;}
if(z1==1){lcd.setCursor(z0+3,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1+3,1);lcd.print(" ");}}
if(z1==3){lcd.setCursor(z0+3,1);lcd.write((uint8_t)1);}
if(z1==2){lcd.setCursor(z0+3,1);lcd.write((uint8_t)2);}w2=0;}}
///////////////// TREBLE //////////////////
if(menu==2){
if(ir.value==TREB_MAX || ir.value==RIGHT || k4==1){treb++;k4=0;gr1=1;gr2=0;cl1();time=millis();w=1;w2=1;treb_func();audio();}// кнопка >
if((ir.value==0xFFFFFFFF || k3==1) and gr1==1){treb++;k3=0;gr2=0;cl1();time=millis();w=1;w2=1;treb_func();audio();}// кнопка >>>>>>
if(ir.value==TREB_MIN || ir.value==LEFT || k3==1){treb--;k3=0;gr1=0;gr2=1;cl1();time=millis();w=1;w2=1;treb_func();audio();}// кнопка <
if((ir.value==0xFFFFFFFF || k4==1) and gr2==1){treb--;k4=0;gr1=0;cl1();time=millis();w=1;w2=1;treb_func();audio();}// кнопка <<<<<<
if (newPosition != oldPosition) {
oldPosition = newPosition;
treb=treb+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;treb_func();audio();}
lcd.setCursor(0,0);lcd.print(F("Treble "));
lcd.print(" ");lcd.print(treb*2);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");treb_d=treb*2+15;
if(w2==1){
for(z=0,z0=0,z1=0;z<=treb_d;z++,z1++){if(z1>2){z1=0;z0++;}
if(z1==1){lcd.setCursor(z0+3,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1+3,1);lcd.print(" ");}}
if(z1==3){lcd.setCursor(z0+3,1);lcd.write((uint8_t)1);}
if(z1==2){lcd.setCursor(z0+3,1);lcd.write((uint8_t)2);}w2=0;}}
//////////////// BALANSE +\- 4 dB /////////////
if(menu==3){
if(ir.value==BALL_R || ir.value==RIGHT || k4==1){balans++;k4=0;gr1=1;gr2=0;cl();time=millis();w=1;balans_func();audio();}// кнопка >
if(ir.value==BALL_L || ir.value==LEFT || k3==1){balans--;k3=0;gr1=0;gr2=1;cl();time=millis();w=1;balans_func();audio();}// кнопка <
if (newPosition != oldPosition) {
oldPosition = newPosition;
balans=balans+newPosition;myEnc.write(0);newPosition=0;lcd.clear();time=millis();w=1;balans_func();audio();}
lcd.setCursor(0,0);
if(balans>=0){lcd.print("-");}else{lcd.print("+");}
lcd.print(abs(balans));lcd.print(" dB ");
if(balans==0){lcd.print(" <> ");}
if(balans<0){lcd.print(" < ");}
if(balans>0){lcd.print(" > ");}
if(balans>=0){lcd.print("+");}else{lcd.print("-");}
lcd.print(abs(balans));lcd.print(" dB ");
lcd.setCursor(0,1);lcd.print("L");
lcd.setCursor(15,1);lcd.print("R");
if(balans<0){lcd.setCursor(balans+7,1);lcd.write((uint8_t)0);}
if(balans>0){lcd.setCursor(balans+8,1);lcd.write((uint8_t)0);}
if(balans==0){lcd.setCursor(7,1);lcd.write((uint8_t)0);lcd.setCursor(8,1);lcd.write((uint8_t)0);}}
/////////////////////////////////////////////////////////////
/////////// input + gain /////////////////////////////////////////
if(menu==4){
switch(in){
case 0: gain = gain0;break;
case 1: gain = gain1;break;
case 2: gain = gain2;break;
}
if(ir.value==RIGHT || k4==1){gain++;k4=0;gr1=1;gr2=0;cl1();time=millis();w=1;w2=1;gain_func();audio();}// кнопка >
if(ir.value==LEFT || k3==1){gain--;k3=0;gr1=0;gr2=1;cl1();time=millis();w=1;w2=1;gain_func();audio();}// кнопка <
if (newPosition != oldPosition) {
oldPosition = newPosition;
gain=gain+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;gain_func();audio();}
switch(in){
case 0: gain0 = gain;break;
case 1: gain1 = gain;break;
case 2: gain2 = gain;break;
}
lcd.setCursor(0,0);lcd.print(" INPUT ");lcd.print(in+1);
lcd.setCursor(0,1);lcd.print(" GAIN ");
switch(gain){
case 3: lcd.print(" +11.25 dB");break;
case 2: lcd.print(" +7.5 dB");break;
case 1: lcd.print(" +3.75 dB");break;
case 0: lcd.print(" 0 dB");break;
}
}
/////////////////////////////////////////////////////////////
// запись всех настроек в EEPROM если кнопки + и - не нажимались в течении 10 сек
// если настройки тембра, баланса и номер входа не менялись в течении 10 сек, переход в рег. Громкости
if(millis()-time>10000 && w==1 && power==0 && mute==0){
EEPROM.update(0,vol);
EEPROM.update(4,balans+4);
EEPROM.update(1,bass+7);
EEPROM.update(3,treb+7);
EEPROM.update(5,in);
EEPROM.update(6,gain0); EEPROM.update(7,gain1); EEPROM.update(8,gain2);
EEPROM.update(9,loud);
menu=100;lcd.clear();w=0;w2=1;cl();spek=1;
}
if(spek==1){
analyzeAudio(); // функция FHT, забивает массив fht_log_out[] величинами по спектру
for (int pos = 0; pos < 16; pos++) { // для окошек дисплея с 0 по 15
// найти максимум из пачки тонов
if (fht_log_out[posOffset[pos]] > maxValue) maxValue = fht_log_out[posOffset[pos]];
lcd.setCursor(pos, 0);
// преобразовать значение величины спектра в диапазон 0..15 с учётом настроек
int posLevel = map(fht_log_out[posOffset[pos]], LOW_PASS, gain_sp, 0, 15);
posLevel = constrain(posLevel, 0, 15);
while(yyy<2){yyy++;
if (posLevel > 7) { // если значение больше 7 (значит нижний квадратик будет полный)
lcd.write((uint8_t)posLevel - 8); // верхний квадратик залить тем что осталось
lcd.setCursor(pos, 1); // перейти на нижний квадратик
lcd.write((uint8_t)7); // залить его полностью
}
else { // если значение меньше 8
lcd.print(" "); // верхний квадратик пустой
lcd.setCursor(pos, 1); // нижний квадратик
lcd.write((uint8_t)posLevel); // залить полосками
}} yyy=0;
}
if (AUTO_GAIN) {
maxValue_f = maxValue * k + maxValue_f * (1 - k);
if (millis() - gainTimer > 1500) { // каждые 1500 мс
// если максимальное значение больше порога, взять его как максимум для отображения
if (maxValue_f > VOL_THR) gain_sp = maxValue_f;
// если нет, то взять порог побольше, чтобы шумы вообще не проходили
else gain_sp = 100;
gainTimer = millis();
}
}else{gain_sp = DEF_GAIN;}
}
//////////////////////////////////
}// LOOP
void audio(){
audioChip.source(in);//select your source 1...3 вход 3...1
audioChip.volume(vol);//Vol 0...62 шаг 1 дБ
audioChip.gain(gain);//gain 0...3 шаг 3.75 дБ
audioChip.bass(bass);//bass -7...+7 шаг 2 дБ
audioChip.treble(treb);//treble -7...+7 шаг 2 дБ
audioChip.balance(balans);//-31...+31 программно ограничено до +\-8 дБ
audioChip.loudness(loud);//true or false // тонкомпенсация
}
void gain_func(){if(gain<0){gain=3;}if(gain>3){gain=0;}}
void balans_func(){if(balans>4){balans=4;}if(balans<-4){balans=-4;}}
void treb_func(){if(treb>7){treb=7;}if(treb<-7){treb=-7;}}
void bass_func(){if(bass>7){bass=7;}if(bass<-7){bass=-7;}}
void vol_func(){if(vol<0){vol=0;}if(vol>62){vol=62;}}
void cl(){ir.value=0;delay(300);spek=0;lcd.clear();}
void cl1(){ir.value=0;delay(300);spek=0;}
void to_Timer(){newPosition = myEnc.read()/4;}
void analyzeAudio() {
cli();
while( i1 < FHT_N ) { i1++;
do{ADCSRA |= (1 << ADSC);}
while((ADCSRA & (1 << ADIF)) == 0);
fht_input[i1] = (ADCL|ADCH << 8);
//fht_input[i1] = ADCH;
}i1=0;
fht_window(); // window the data for better frequency response
fht_reorder(); // reorder the data before doing the fht
fht_run(); // process the data in the fht
fht_mag_log(); // take the output of the fht
sei();
}
Загрузите этот скетч:
#define VOLUME_MAX 0xFF50AF // громкость прибавить #define VOLUME_MIN 0xFF10EF // громкость убавить #define BASS_MAX 0xFF8877 // НЧ прибавить #define BASS_MIN 0xFFA857 // НЧ убавить #define TREB_MAX 0xFF08F7 // ВЧ прибавить #define TREB_MIN 0xFF28D7 // ВЧ убавить #define BALL_R 0x731A3E02 // баланс вправо #define BALL_L 0x6825E53E // баланс влево #define IN1 0xFF20DF // выбор вход 1 #define IN2 0xFF609F // выбор вход 2 #define IN3 0xFF30CF // выбор вход 3 #define LEFT 0xFF6897 // убавить в любом меню #define RIGHT 0xFF48B7 // прибавить в любом меню #define MENU_DOWN 0xFFB04F // навигация по меню #define MENU_UP 0xFFA05F // навигация по меню #define LOUD 0xFF708F // Loudness #define POWER 0xFF00FF // POWER #define MUTE 0xFF40BF // MUTE #define AUTO_GAIN 1 // автонастройка по громкости #define VOL_THR 25 // порог тишины (ниже него отображения на матрице не будет) #define LOW_PASS 20 // нижний порог чувствительности шумов (нет скачков при отсутствии звука) #define DEF_GAIN 85 // максимальный порог по умолчанию #define FHT_N 256 // ширина спектра х2 #define LOG_OUT 1 #include <FHT.h> #include <Wire.h> #include <PT2313.h> //#include <LiquidCrystal_I2C.h> #include <LiquidCrystal.h> #include <Encoder.h> #include <MsTimer2.h> #include <boarddefs.h> #include <IRremote.h> #include <EEPROM.h> //LiquidCrystal_I2C lcd(0x27,16,2); LiquidCrystal lcd(7, 6, 5, 4, 3, 2);// RS,E,D4,D5,D6,D7 PT2313 audioChip; IRrecv irrecv(12); // указываем вывод модуля IR приемника Encoder myEnc(9, 8);//CLK, DT decode_results ir; byte posOffset[16] = {2, 3, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30}; // вч выше byte in,w,w2,gr1,gr2,www,z,z0,z1; int vol,vol_d,bass,bass_d,treb,treb_d,balans,gain,gain0,gain1,gain2; unsigned long time,oldPosition = -999,newPosition; unsigned long gainTimer; byte maxValue, maxValue_f,spek; float k = 0.1; byte gain_sp = DEF_GAIN; int i1,yyy,vol_old; bool loud,k1,k2,k3,k4,k5,power,mute; int menu, a3; void setup(){ Serial.begin(9600);Wire.begin(); //lcd.init();lcd.backlight(); lcd.begin(16, 2); irrecv.enableIRIn(); // запускаем модуль IR audioChip.initialize(0,true); pinMode(10,INPUT_PULLUP);// МЕНЮ КНОПКА SW энкодера pinMode(11,OUTPUT);// OUTPUT MUTE pinMode(13,OUTPUT);// OUTPUT STANDBY pinMode(A3,INPUT);// 5 BUTTON ADMUX = 0b01100000; ADCSRA = 0b11010100; // http://rcl-radio.ru/?p=57478 MsTimer2::set(3, to_Timer);MsTimer2::start(); // АКТИВИРУЕМ ПРЕРЫВАНИЯ ДЛЯ ЭНКОДЕРА vol = EEPROM.read(0);// vol eeprom bass = EEPROM.read(1)-7;// bass eeprom treb = EEPROM.read(3)-7;// treb eeprom balans = EEPROM.read(4)-4;// balans eeprom in = EEPROM.read(5);// in eeprom gain0 = EEPROM.read(6); gain1 = EEPROM.read(7); gain2 = EEPROM.read(8); loud = EEPROM.read(9); switch(in){ case 0: gain = gain0;break; case 1: gain = gain1;break; case 2: gain = gain2;break; } audio(); } void loop(){ ////////////////// ИК приемник - обработка кодов кнопок /////////////////////////////////////// if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);irrecv.resume();time=millis();w=1;delay(200); if(spek==1 && (ir.value==MENU_DOWN||ir.value==MENU_UP)){cl();menu=0;} }// IR приемник - чтение, в мониторе порта отображаются коды кнопок if(ir.value==0){gr1=0;gr2=0;}// запрет нажатий не активных кнопок пульта /////////////// POWER ////////////////////////////////////////////// if(ir.value==POWER&&power==0){power=1;gr1=0;gr2=0;w=1;w2=1;menu=100;cl();myEnc.write(0);vol_old=vol;vol=0; lcd.setCursor(3,0);lcd.print(F("POWER OFF"));audio();delay(2000);} if(ir.value==POWER&&power==1){power=0;gr1=0;gr2=0;cl();w=1;w2=1;menu=0;myEnc.write(0);vol=vol_old; lcd.setCursor(3,0);lcd.print(F("POWER ON"));audio();delay(2000);cl();} if(power==0){digitalWrite(13,HIGH);}else{digitalWrite(13,LOW);} if(mute==1){digitalWrite(11,HIGH);}else{digitalWrite(11,LOW);} ////////////// MUTE ///////////////////////////////////////////////// if(power==0){ if(ir.value==MUTE && mute==0){mute=1;gr1=0;gr2=0;w=1;w2=1;menu=100;cl();myEnc.write(0);vol_old=vol;vol=0; lcd.setCursor(3,0);lcd.print(F(" MUTE "));audio();} if(ir.value==MUTE && mute==1){mute=0;gr1=0;gr2=0;w=1;w2=1;menu=0;cl();myEnc.write(0);vol=vol_old;audio();} } //////////////////////////////////////////////////////////////////// // a3 = 1023; a3 = (analogRead(A3)); if(a3 < 50){k1=1;} if(a3 > 50 && a3 < 150){k2=1;} if(a3 > 150 && a3 < 250){k3=1;} if(a3 > 250 && a3 < 350){k4=1;} if(a3 > 350 && a3 < 500){k5=1;} if (newPosition != oldPosition) {if(spek==1){cl();menu=0;}} if(spek==0){ byte a1[8] = {0b00000,0b10101,0b10101,0b10101,0b10101,0b10101,0b10101,0b00000}; byte a2[8] = {0b00000,0b10100,0b10100,0b10100,0b10100,0b10100,0b10100,0b00000}; byte a3[8] = {0b00000,0b10000,0b10000,0b10000,0b10000,0b10000,0b10000,0b00000}; lcd.createChar(0,a1);lcd.createChar(1,a2);lcd.createChar(2,a3); }else{ byte v1[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b01110}; byte v2[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b01110, 0b01110}; byte v3[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b01110, 0b01110, 0b01110}; byte v4[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b01110, 0b01110, 0b01110, 0b01110}; byte v5[8] = {0b00000, 0b00000, 0b00000, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110}; byte v6[8] = {0b00000, 0b00000, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110}; byte v7[8] = {0b00000, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110}; byte v8[8] = {0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110}; lcd.createChar(0, v1);lcd.createChar(1, v2);lcd.createChar(2, v3);lcd.createChar(3, v4);lcd.createChar(4, v5);lcd.createChar(5, v6);lcd.createChar(6, v7);lcd.createChar(7, v8); } ///////////////////// управление //////////////////////////////////////////////////// if(power==0){ if(digitalRead(10)==LOW){menu++;cl();;time=millis();w=1;w2=1;if(menu>3){menu=0;}}// меню if(k5==1){in++;k5=0;;cl();delay(200);time=millis()-7000;w=1;w2=1;www=1;menu=4;if(in>2){in=0;};audio();}// КНОПКА ВЫБОРА ВХОДА IN if(ir.value==VOLUME_MAX && menu!=0){vol++;menu=0;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;vol_func();audio();}// vol_max if(ir.value==VOLUME_MIN && menu!=0){vol--;menu=0;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;vol_func();audio();}// vol_min if(ir.value==BASS_MAX && menu!=1){bass++;menu=1;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;bass_func();audio();}// bass_max if(ir.value==BASS_MIN && menu!=1){bass--;menu=1;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;bass_func();audio();}// bass_min if(ir.value==TREB_MAX && menu!=2){treb++;menu=2;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;treb_func();audio();}// treb_max if(ir.value==TREB_MIN && menu!=2){treb--;menu=2;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;treb_func();audio();}// treb_min if(ir.value==BALL_R && menu!=3){balans++;menu=3;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;balans_func();audio();}// balans_right if(ir.value==BALL_L && menu!=3){balans--;menu=3;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;balans_func();audio();}// balans_left if(ir.value==IN1){in=0;cl();time=millis()-7000;w=1;time=millis();w=1;w2=1;www=1;menu=4;gr1=0;gr2=0;audio();}// IN1 if(ir.value==IN2){in=1;cl();time=millis()-7000;w=1;time=millis();w=1;w2=1;www=1;menu=4;gr1=0;gr2=0;audio();}// IN2 if(ir.value==IN3){in=2;cl();time=millis()-7000;w=1;time=millis();w=1;w2=1;www=1;menu=4;gr1=0;gr2=0;audio();}// IN3 if(ir.value==MENU_DOWN || k1==1){menu++;k1=0;cl();time=millis();w=1;w2=1;if(menu>3){menu=0;}}// menu_down if(ir.value==MENU_UP || k2==1){menu--;k2=0;cl();time=millis();w=1;w2=1;if(menu<0||menu>3){menu=3;}}// menu_up if(ir.value==LOUD && loud==0){loud=1;cl();time=millis();w=1;w2=1;lcd.setCursor(2,0);lcd.print("Loudness ON");audio();delay(2000);}// loud_on if(ir.value==LOUD && loud==1){loud=0;cl();time=millis();w=1;w2=1;lcd.setCursor(2,0);lcd.print("Loudness OFF");audio();delay(2000);}// loud_off } /////////////////////// VOLUME ////////////// if(menu==0){ if(ir.value==VOLUME_MAX || ir.value==RIGHT || k4==1){vol++;k4=0;gr1=1;gr2=0;cl1();time=millis();w=1;w2=1;vol_func();audio();}// кнопка > if((ir.value==0xFFFFFFFF || k3==1) and gr1==1){vol++;k3=0;gr2=0;cl1();time=millis();w=1;w2=1;vol_func();audio();}// кнопка >>>>>> if(ir.value==VOLUME_MIN || ir.value==LEFT || k3==1){vol--;k3=0;gr1=0;gr2=1;cl1();time=millis();w=1;w2=1;vol_func();audio();}// кнопка < if((ir.value==0xFFFFFFFF || k4==1) and gr2==1){vol--;k4=0;gr1=0;cl1();time=millis();w=1;w2=1;vol_func();audio();}// кнопка <<<<<< if (newPosition != oldPosition){oldPosition = newPosition; vol=vol+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;vol_func();audio();} lcd.setCursor(0,0);lcd.print(F("Volume ")); lcd.print(" ");lcd.print(-62+vol);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");vol_d=vol-14; if(w2==1){ for(z=0,z0=0,z1=0;z<=vol_d;z++,z1++){if(z1>2){z1=0;z0++;} if(z1==1){lcd.setCursor(z0,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1,1);lcd.print(" ");}} if(z1==3){lcd.setCursor(z0,1);lcd.write((uint8_t)1);} if(z1==2){lcd.setCursor(z0,1);lcd.write((uint8_t)2);}w2=0;}} /////////////////// BASS ////////////// if(menu==1){ if(ir.value==BASS_MAX || ir.value==RIGHT || k4==1){bass++;k4=0;gr1=1;gr2=0;cl1();time=millis();w=1;w2=1;bass_func();audio();}// кнопка > if((ir.value==0xFFFFFFFF || k3==1) and gr1==1){bass++;k3=0;gr2=0;cl1();time=millis();w=1;w2=1;bass_func();audio();}// кнопка >>>>>> if(ir.value==BASS_MIN || ir.value==LEFT || k3==1){bass--;k3=0;gr1=0;gr2=1;cl1();time=millis();w=1;w2=1;bass_func();audio();}// кнопка < if((ir.value==0xFFFFFFFF || k4==1) and gr2==1){bass--;k4=0;gr1=0;cl1();time=millis();w=1;w2=1;bass_func();audio();}// кнопка <<<<<< if (newPosition != oldPosition) { oldPosition = newPosition; bass=bass+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;bass_func();audio();} lcd.setCursor(0,0);lcd.print(F("Bass ")); lcd.print(" ");lcd.print(bass*2);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");bass_d=bass*2+15; if(w2==1){ for(z=0,z0=0,z1=0;z<=bass_d;z++,z1++){if(z1>2){z1=0;z0++;} if(z1==1){lcd.setCursor(z0+3,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1+3,1);lcd.print(" ");}} if(z1==3){lcd.setCursor(z0+3,1);lcd.write((uint8_t)1);} if(z1==2){lcd.setCursor(z0+3,1);lcd.write((uint8_t)2);}w2=0;}} ///////////////// TREBLE ////////////////// if(menu==2){ if(ir.value==TREB_MAX || ir.value==RIGHT || k4==1){treb++;k4=0;gr1=1;gr2=0;cl1();time=millis();w=1;w2=1;treb_func();audio();}// кнопка > if((ir.value==0xFFFFFFFF || k3==1) and gr1==1){treb++;k3=0;gr2=0;cl1();time=millis();w=1;w2=1;treb_func();audio();}// кнопка >>>>>> if(ir.value==TREB_MIN || ir.value==LEFT || k3==1){treb--;k3=0;gr1=0;gr2=1;cl1();time=millis();w=1;w2=1;treb_func();audio();}// кнопка < if((ir.value==0xFFFFFFFF || k4==1) and gr2==1){treb--;k4=0;gr1=0;cl1();time=millis();w=1;w2=1;treb_func();audio();}// кнопка <<<<<< if (newPosition != oldPosition) { oldPosition = newPosition; treb=treb+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;treb_func();audio();} lcd.setCursor(0,0);lcd.print(F("Treble ")); lcd.print(" ");lcd.print(treb*2);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");treb_d=treb*2+15; if(w2==1){ for(z=0,z0=0,z1=0;z<=treb_d;z++,z1++){if(z1>2){z1=0;z0++;} if(z1==1){lcd.setCursor(z0+3,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1+3,1);lcd.print(" ");}} if(z1==3){lcd.setCursor(z0+3,1);lcd.write((uint8_t)1);} if(z1==2){lcd.setCursor(z0+3,1);lcd.write((uint8_t)2);}w2=0;}} //////////////// BALANSE +\- 4 dB ///////////// if(menu==3){ if(ir.value==BALL_R || ir.value==RIGHT || k4==1){balans++;k4=0;gr1=1;gr2=0;cl();time=millis();w=1;balans_func();audio();}// кнопка > if(ir.value==BALL_L || ir.value==LEFT || k3==1){balans--;k3=0;gr1=0;gr2=1;cl();time=millis();w=1;balans_func();audio();}// кнопка < if (newPosition != oldPosition) { oldPosition = newPosition; balans=balans+newPosition;myEnc.write(0);newPosition=0;lcd.clear();time=millis();w=1;balans_func();audio();} lcd.setCursor(0,0); if(balans>=0){lcd.print("-");}else{lcd.print("+");} lcd.print(abs(balans));lcd.print(" dB "); if(balans==0){lcd.print(" <> ");} if(balans<0){lcd.print(" < ");} if(balans>0){lcd.print(" > ");} if(balans>=0){lcd.print("+");}else{lcd.print("-");} lcd.print(abs(balans));lcd.print(" dB "); lcd.setCursor(0,1);lcd.print("L"); lcd.setCursor(15,1);lcd.print("R"); if(balans<0){lcd.setCursor(balans+7,1);lcd.write((uint8_t)0);} if(balans>0){lcd.setCursor(balans+8,1);lcd.write((uint8_t)0);} if(balans==0){lcd.setCursor(7,1);lcd.write((uint8_t)0);lcd.setCursor(8,1);lcd.write((uint8_t)0);}} ///////////////////////////////////////////////////////////// /////////// input + gain ///////////////////////////////////////// if(menu==4){ switch(in){ case 0: gain = gain0;break; case 1: gain = gain1;break; case 2: gain = gain2;break; } if(ir.value==RIGHT || k4==1){gain++;k4=0;gr1=1;gr2=0;cl1();time=millis();w=1;w2=1;gain_func();audio();}// кнопка > if(ir.value==LEFT || k3==1){gain--;k3=0;gr1=0;gr2=1;cl1();time=millis();w=1;w2=1;gain_func();audio();}// кнопка < if (newPosition != oldPosition) { oldPosition = newPosition; gain=gain+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;gain_func();audio();} switch(in){ case 0: gain0 = gain;break; case 1: gain1 = gain;break; case 2: gain2 = gain;break; } lcd.setCursor(0,0);lcd.print(" INPUT ");lcd.print(in+1); lcd.setCursor(0,1);lcd.print(" GAIN "); switch(gain){ case 3: lcd.print(" +11.25 dB");break; case 2: lcd.print(" +7.5 dB");break; case 1: lcd.print(" +3.75 dB");break; case 0: lcd.print(" 0 dB");break; } } ///////////////////////////////////////////////////////////// // запись всех настроек в EEPROM если кнопки + и - не нажимались в течении 10 сек // если настройки тембра, баланса и номер входа не менялись в течении 10 сек, переход в рег. Громкости if(millis()-time>10000 && w==1 && power==0 && mute==0){ EEPROM.update(0,vol); EEPROM.update(4,balans+4); EEPROM.update(1,bass+7); EEPROM.update(3,treb+7); EEPROM.update(5,in); EEPROM.update(6,gain0); EEPROM.update(7,gain1); EEPROM.update(8,gain2); EEPROM.update(9,loud); menu=100;lcd.clear();w=0;w2=1;cl();spek=1; } if(spek==1){ analyzeAudio(); // функция FHT, забивает массив fht_log_out[] величинами по спектру for (int pos = 0; pos < 16; pos++) { // для окошек дисплея с 0 по 15 // найти максимум из пачки тонов if (fht_log_out[posOffset[pos]] > maxValue) maxValue = fht_log_out[posOffset[pos]]; lcd.setCursor(pos, 0); // преобразовать значение величины спектра в диапазон 0..15 с учётом настроек int posLevel = map(fht_log_out[posOffset[pos]], LOW_PASS, gain_sp, 0, 15); posLevel = constrain(posLevel, 0, 15); while(yyy<2){yyy++; if (posLevel > 7) { // если значение больше 7 (значит нижний квадратик будет полный) lcd.write((uint8_t)posLevel - 8); // верхний квадратик залить тем что осталось lcd.setCursor(pos, 1); // перейти на нижний квадратик lcd.write((uint8_t)7); // залить его полностью } else { // если значение меньше 8 lcd.print(" "); // верхний квадратик пустой lcd.setCursor(pos, 1); // нижний квадратик lcd.write((uint8_t)posLevel); // залить полосками }} yyy=0; } if (AUTO_GAIN) { maxValue_f = maxValue * k + maxValue_f * (1 - k); if (millis() - gainTimer > 1500) { // каждые 1500 мс // если максимальное значение больше порога, взять его как максимум для отображения if (maxValue_f > VOL_THR) gain_sp = maxValue_f; // если нет, то взять порог побольше, чтобы шумы вообще не проходили else gain_sp = 100; gainTimer = millis(); } }else{gain_sp = DEF_GAIN;} } ////////////////////////////////// }// LOOP void audio(){ audioChip.source(in);//select your source 1...3 вход 3...1 audioChip.volume(vol);//Vol 0...62 шаг 1 дБ audioChip.gain(gain);//gain 0...3 шаг 3.75 дБ audioChip.bass(bass);//bass -7...+7 шаг 2 дБ audioChip.treble(treb);//treble -7...+7 шаг 2 дБ audioChip.balance(balans);//-31...+31 программно ограничено до +\-8 дБ audioChip.loudness(loud);//true or false // тонкомпенсация } void gain_func(){if(gain<0){gain=3;}if(gain>3){gain=0;}} void balans_func(){if(balans>4){balans=4;}if(balans<-4){balans=-4;}} void treb_func(){if(treb>7){treb=7;}if(treb<-7){treb=-7;}} void bass_func(){if(bass>7){bass=7;}if(bass<-7){bass=-7;}} void vol_func(){if(vol<0){vol=0;}if(vol>62){vol=62;}} void cl(){ir.value=0;delay(300);spek=0;lcd.clear();} void cl1(){ir.value=0;delay(300);spek=0;} void to_Timer(){newPosition = myEnc.read()/4;} void analyzeAudio() { cli(); while( i1 < FHT_N ) { i1++; do{ADCSRA |= (1 << ADSC);} while((ADCSRA & (1 << ADIF)) == 0); fht_input[i1] = (ADCL|ADCH << 8); //fht_input[i1] = ADCH; }i1=0; fht_window(); // window the data for better frequency response fht_reorder(); // reorder the data before doing the fht fht_run(); // process the data in the fht fht_mag_log(); // take the output of the fht sei(); }
В порте мусор
Не могу понять в чем причина, у меня отлично определяется код кнопок:
У Вас ИК датчик в виде модуля?
У Вас ИК датчик в виде модуля?
У меня ИК датчик на проводах к плате через разъём подключен , на плате разводка выполнена .
Может надо подтяжку сделать на D12 ? Как на энкодере , по 10к Ом стоят сопротивления .
Да, подтягивающий резистор нужен.
Да, подтягивающий резистор нужен.
поставил на 3.3к и впаял провода ИК на плату ардуино , добавил на 100 Ом в разрыв GND . В порте мусор
Загрузите тестовый скетч ИК
#include <IRremote.h>
int RECV_PIN = 12;
IRrecv irrecv(RECV_PIN);
decode_results results;
void setup()
{
Serial.begin(9600);
// In case the interrupt driver crashes on setup, give a clue
// to the user what's going on.
Serial.println("Enabling IRin");
irrecv.enableIRIn(); // Start the receiver
Serial.println("Enabled IRin");
}
void loop() {
if (irrecv.decode(&results)) {
Serial.println(results.value, HEX);
irrecv.resume(); // Receive the next value
}
delay(100);
}
Так же проверьте установлена ли верная библиотека ИК, библиотека должна быть установлена с этого источника - http://rcl-radio.ru/wp-content/uploads/ … remote.zip
Загрузите тестовый скетч ИК
#include <IRremote.h> int RECV_PIN = 12; IRrecv irrecv(RECV_PIN); decode_results results; void setup() { Serial.begin(9600); // In case the interrupt driver crashes on setup, give a clue // to the user what's going on. Serial.println("Enabling IRin"); irrecv.enableIRIn(); // Start the receiver Serial.println("Enabled IRin"); } void loop() { if (irrecv.decode(&results)) { Serial.println(results.value, HEX); irrecv.resume(); // Receive the next value } delay(100); }
Так же проверьте установлена ли верная библиотека ИК, библиотека должна быть установлена с этого источника - http://rcl-radio.ru/wp-content/uploads/ … remote.zip
Проскакивает мусор , библиотека установлена эта .
Что не то с датчиком или пульты не поддерживают протокол NEC (стартовые импульсы у разных протоков разные, данные передаются с другой частотой следования импульсов, протокол NEC это самый распространенный протокол который используется в бытовой аппаратуре)
Тестовый скетч 100 % рабочий (он расположен в библиотеке как пример).
Возможно что то по питанию не то, Вы подключали через транзисторные ключи реле?
Возможно вход d12 немного подпален, перенесите его на d11 в тестовом скетче
int RECV_PIN = 11;
Что не то с датчиком или пульты не поддерживают протокол NEC (стартовые импульсы у разных протоков разные, данные передаются с другой частотой следования импульсов, протокол NEC это самый распространенный протокол который используется в бытовой аппаратуре)
Тестовый скетч 100 % рабочий (он расположен в библиотеке как пример).
Возможно что то по питанию не то, Вы подключали через транзисторные ключи реле?
Я ужэ убрал пин с реле , запитал от лбп . Повторил обвязку как на картинке . Но в порт показывает
0x3FD0
0xFFFFFFFF
0xFFA05
0xFFFFFFFF
0xFFA05F
0xFFFFFFFF
Правильное предпоследнее.
А если пульт использовать на расстоянии 2 метра от датчика?
А если пульт использовать на расстоянии 2 метра от датчика?
Видимо подпален , на 11 пине работает без мусора , но как ? Ведь на другом скетче работал на 12
Скорее всего в коде опроса было несколько операций чтения ИК датчика, что вызывало временную задержку при которой вход более менее нормально работал.
Перенесите датчик на вход датчика на D16, это вход A2, вроде он не занят
IRrecv irrecv(16); // указываем вывод модуля IR приемника
или
IRrecv irrecv(A2);
Скорее всего в коде опроса было несколько операций чтения ИК датчика, что вызывало временную задержку при которой вход более менее нормально работал.
Перенесите датчик на вход датчика на D16, это вход A2, вроде он не занят
IRrecv irrecv(16); // указываем вывод модуля IR приемника
или
IRrecv irrecv(A2);
0xFF
0xFFFFFFFF
0xFD04F
0xFFFFFFFF
0xFFB07
0xEE02AEEC
0xFF
0xFFFFFFFF
0xFFB04
0x8E3A8FA
0xF0C41643
Все получено когда на дисплее анализатор . Когда в меню то мусорный код редко проскакивает
замените код
void analyzeAudio() {
cli();
while( i1 < FHT_N ) { i1++;
do{ADCSRA |= (1 << ADSC);}
while((ADCSRA & (1 << ADIF)) == 0);
fht_input[i1] = (ADCL|ADCH << 8);
//fht_input[i1] = ADCH;
}i1=0;
fht_window(); // window the data for better frequency response
fht_reorder(); // reorder the data before doing the fht
fht_run(); // process the data in the fht
fht_mag_log(); // take the output of the fht
sei();
}
на
void analyzeAudio() {
while( i1 < FHT_N ) { i1++;
do{ADCSRA |= (1 << ADSC);}
while((ADCSRA & (1 << ADIF)) == 0);
fht_input[i1] = (ADCL|ADCH << 8);
//fht_input[i1] = ADCH;
}i1=0;
fht_window(); // window the data for better frequency response
fht_reorder(); // reorder the data before doing the fht
fht_run(); // process the data in the fht
fht_mag_log(); // take the output of the fht
}
замените код
void analyzeAudio() { cli(); while( i1 < FHT_N ) { i1++; do{ADCSRA |= (1 << ADSC);} while((ADCSRA & (1 << ADIF)) == 0); fht_input[i1] = (ADCL|ADCH << 8); //fht_input[i1] = ADCH; }i1=0; fht_window(); // window the data for better frequency response fht_reorder(); // reorder the data before doing the fht fht_run(); // process the data in the fht fht_mag_log(); // take the output of the fht sei(); }
на
void analyzeAudio() { while( i1 < FHT_N ) { i1++; do{ADCSRA |= (1 << ADSC);} while((ADCSRA & (1 << ADIF)) == 0); fht_input[i1] = (ADCL|ADCH << 8); //fht_input[i1] = ADCH; }i1=0; fht_window(); // window the data for better frequency response fht_reorder(); // reorder the data before doing the fht fht_run(); // process the data in the fht fht_mag_log(); // take the output of the fht }
Вполне хорошо работает , срабатывает нажатие и все нужное вызывает сразу.
После заливки скетча впорте был мусор 0xFAE26E38
0xFFFFFFFF
0xFF40BF
0xFFFFFFFF
0xFF8877
0xA3C8EDDB
0xFF
0xFFFFFFFF
0xFFA857
0xFFA857
0xA3C8EDDB
0xFFFFFFFF
0xFFA857
Но потом все стабилизировалось , возможно не прямой угол был между ИК .
0xFF08F7
0xFFFFFFFF
0xFF28D7
0xFFFFFFFF
0xFFA05F
0xF0C41643
0xFFFFFFFF
0xFFB04F
0xFFFFFFFF
0xFF08F7
0xFF
0xFFFFFFFF
0xFF08F7
0x13549BDF
0xFFFFFFFF
0xFF28D7
0xFFFFFFFF
0xFF8877
0xFFFFFFFF
0xFFA857
0xFFFFFFFF
На D11 еще проверю , возможно лучше будет .
Выхода можно и переназначить , это не сложно . Вместо 11 сделать 12 , если он подпален то для вывода 1 он же сгодится ?
На 11 пине работает аналогично А2 , мусор возникает только если нет прямой видимости , изменяя угол можно это обнаружить.
Использовать реле плохая идея , от включения\выключения щелчёк в одном канале . Лучше мощный полевик .
Если нажать IN 1 с пульта , потом LOUDLESS есть баг отображения. После автоматической перехода в меню IN останется ss OFF
Еще вот что заметил , микросхема пропускает звук когда POWER OFF , в этом случае лучше использовать еще и MUTE или выдавать лог. 1 с выхода D11 . За счет ключей происходит замыкание GND на OUT микросхемы . По Факту там вход УНЧ замыкает на землю и это создает тишину.
У вас анализатор работает ?
Еще вот что заметил , микросхема пропускает звук когда POWER OFF ,
В режиме MUTE и POWER OFF звук должен устанавливать на 0. У Вас происходит в этих режимах снижение уровня громкости?
Если нажать IN 1 с пульта , потом LOUDLESS есть баг отображения. После автоматической перехода в меню IN останется ss OFF
Исправил
#define VOLUME_MAX 0xFF50AF // громкость прибавить
#define VOLUME_MIN 0xFF10EF // громкость убавить
#define BASS_MAX 0xFF8877 // НЧ прибавить
#define BASS_MIN 0xFFA857 // НЧ убавить
#define TREB_MAX 0xFF08F7 // ВЧ прибавить
#define TREB_MIN 0xFF28D7 // ВЧ убавить
#define BALL_R 0xFF40BF // баланс вправо
#define BALL_L 0xFF807F // баланс влево
#define IN1 0xFF20DF // выбор вход 1
#define IN2 0xFF609F // выбор вход 2
#define IN3 0xFF30CF // выбор вход 3
#define LEFT 0xFF6897 // убавить в любом меню
#define RIGHT 0xFF48B7 // прибавить в любом меню
#define MENU_DOWN 0xFFB04F // навигация по меню
#define MENU_UP 0xFFA05F // навигация по меню
#define LOUD 0xFF708F // Loudness
#define POWER 0xFF00FF // POWER
#define MUTE 0xFF906F // MUTE
/*
#define MUTE 0x33B8946B // MUTE
#define POWER 0x33B800FF // STANDBY
#define VOLUME_MAX 0x33B85AA5 // громкость прибавить
#define VOLUME_MIN 0x33B8D42B // громкость убавить
#define BASS_MAX 0x33B87A85 // НЧ прибавить
#define BASS_MIN 0x33B854AB // НЧ убавить
#define TREB_MAX 0x33B8BA45 // ВЧ прибавить
#define TREB_MIN 0x33B832CD // ВЧ убавить
#define BALL_R 0x33B83AC5 // баланс вправо
#define BALL_L 0x33B8827D // баланс влево
#define IN1 0x33B88877 // выбор вход 1
#define IN2 0x33B848B7 // выбор вход 2
#define IN3 0x33B8C837 // выбор вход 3
#define LEFT 0x33B8E01F // убавить в любом меню
#define RIGHT 0x33B810EF // прибавить в любом меню
#define MENU_DOWN 0x33B8609F // навигация по меню
#define MENU_UP 0x33B8A05F // навигация по меню
#define LOUD 0x33B844BB // Loudness
*/
#define AUTO_GAIN 1 // автонастройка по громкости
#define VOL_THR 25 // порог тишины (ниже него отображения на матрице не будет)
#define LOW_PASS 20 // нижний порог чувствительности шумов (нет скачков при отсутствии звука)
#define DEF_GAIN 85 // максимальный порог по умолчанию
#define FHT_N 256 // ширина спектра х2
#define LOG_OUT 1
#include <FHT.h>
#include <Wire.h>
#include <PT2313.h>
//#include <LiquidCrystal_I2C.h>
#include <LiquidCrystal.h>
#include <Encoder.h>
#include <MsTimer2.h>
#include <boarddefs.h>
#include <IRremote.h>
#include <EEPROM.h>
//LiquidCrystal_I2C lcd(0x27,16,2);
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);// RS,E,D4,D5,D6,D7
PT2313 audioChip;
IRrecv irrecv(12); // указываем вывод модуля IR приемника
Encoder myEnc(9, 8);//CLK, DT
decode_results ir;
byte posOffset[16] = {2, 3, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30}; // вч выше
byte in,w,w2,gr1,gr2,www,z,z0,z1;
int vol,vol_d,bass,bass_d,treb,treb_d,balans,gain,gain0,gain1,gain2;
unsigned long time,oldPosition = -999,newPosition;
unsigned long gainTimer;
byte maxValue, maxValue_f,spek;
float k = 0.1;
byte gain_sp = DEF_GAIN;
int i1,yyy,vol_old;
bool loud,k1,k2,k3,k4,k5,power,mute;
int menu, a3;
void setup(){
Serial.begin(9600);Wire.begin();
//lcd.init();lcd.backlight();
lcd.begin(16, 2);
irrecv.enableIRIn(); // запускаем модуль IR
audioChip.initialize(0,true);
pinMode(10,INPUT_PULLUP);// МЕНЮ КНОПКА SW энкодера
pinMode(11,OUTPUT);// OUTPUT MUTE
pinMode(13,OUTPUT);// OUTPUT STANDBY
pinMode(A3,INPUT);// 5 BUTTON
ADMUX = 0b01100000; ADCSRA = 0b11010100; // http://rcl-radio.ru/?p=57478
MsTimer2::set(3, to_Timer);MsTimer2::start(); // АКТИВИРУЕМ ПРЕРЫВАНИЯ ДЛЯ ЭНКОДЕРА
vol = EEPROM.read(0);// vol eeprom
bass = EEPROM.read(1)-7;// bass eeprom
treb = EEPROM.read(3)-7;// treb eeprom
balans = EEPROM.read(4)-4;// balans eeprom
in = EEPROM.read(5);// in eeprom
gain0 = EEPROM.read(6);
gain1 = EEPROM.read(7);
gain2 = EEPROM.read(8);
loud = EEPROM.read(9);
switch(in){
case 0: gain = gain0;break;
case 1: gain = gain1;break;
case 2: gain = gain2;break;
}
audio();
}
void loop(){
////////////////// ИК приемник - обработка кодов кнопок ///////////////////////////////////////
if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);irrecv.resume();time=millis();w=1;delay(200);
if(spek==1 && (ir.value==MENU_DOWN||ir.value==MENU_UP)){cl();menu=0;}
}// IR приемник - чтение, в мониторе порта отображаются коды кнопок
if(ir.value==0){gr1=0;gr2=0;}// запрет нажатий не активных кнопок пульта
/////////////// POWER //////////////////////////////////////////////
if(ir.value==POWER&&power==0){power=1;gr1=0;gr2=0;w=1;w2=1;menu=100;cl();myEnc.write(0);vol_old=vol;vol=0;
lcd.setCursor(3,0);lcd.print(F("POWER OFF"));audio();delay(2000);}
if(ir.value==POWER&&power==1){power=0;gr1=0;gr2=0;cl();w=1;w2=1;menu=0;myEnc.write(0);vol=vol_old;
lcd.setCursor(3,0);lcd.print(F("POWER ON"));audio();delay(2000);cl();}
if(power==0){digitalWrite(13,HIGH);}else{digitalWrite(13,LOW);}
if(mute==1){digitalWrite(11,HIGH);}else{digitalWrite(11,LOW);}
////////////// MUTE /////////////////////////////////////////////////
if(power==0){
if(ir.value==MUTE && mute==0){mute=1;gr1=0;gr2=0;w=1;w2=1;menu=100;cl();myEnc.write(0);vol_old=vol;vol=0;
lcd.setCursor(3,0);lcd.print(F(" MUTE "));audio();}
if(ir.value==MUTE && mute==1){mute=0;gr1=0;gr2=0;w=1;w2=1;menu=0;cl();myEnc.write(0);vol=vol_old;audio();}
}
////////////////////////////////////////////////////////////////////
// a3 = 1023;
a3 = (analogRead(A3));
if(a3 < 50){k1=1;}
if(a3 > 50 && a3 < 150){k2=1;}
if(a3 > 150 && a3 < 250){k3=1;}
if(a3 > 250 && a3 < 350){k4=1;}
if(a3 > 350 && a3 < 500){k5=1;}
if (newPosition != oldPosition) {if(spek==1){cl();menu=0;}}
if(spek==0){
byte a1[8] = {0b00000,0b10101,0b10101,0b10101,0b10101,0b10101,0b10101,0b00000};
byte a2[8] = {0b00000,0b10100,0b10100,0b10100,0b10100,0b10100,0b10100,0b00000};
byte a3[8] = {0b00000,0b10000,0b10000,0b10000,0b10000,0b10000,0b10000,0b00000};
lcd.createChar(0,a1);lcd.createChar(1,a2);lcd.createChar(2,a3);
}else{
byte v1[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b01110};
byte v2[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b01110, 0b01110};
byte v3[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b01110, 0b01110, 0b01110};
byte v4[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b01110, 0b01110, 0b01110, 0b01110};
byte v5[8] = {0b00000, 0b00000, 0b00000, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110};
byte v6[8] = {0b00000, 0b00000, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110};
byte v7[8] = {0b00000, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110};
byte v8[8] = {0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110};
lcd.createChar(0, v1);lcd.createChar(1, v2);lcd.createChar(2, v3);lcd.createChar(3, v4);lcd.createChar(4, v5);lcd.createChar(5, v6);lcd.createChar(6, v7);lcd.createChar(7, v8);
}
///////////////////// управление ////////////////////////////////////////////////////
if(power==0){
if(digitalRead(10)==LOW){menu++;cl();;time=millis();w=1;w2=1;if(menu>3){menu=0;}}// меню
if(k5==1){in++;k5=0;;cl();delay(200);time=millis()-7000;w=1;w2=1;www=1;menu=4;if(in>2){in=0;};audio();}// КНОПКА ВЫБОРА ВХОДА IN
if(ir.value==VOLUME_MAX && menu!=0){vol++;menu=0;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;vol_func();audio();}// vol_max
if(ir.value==VOLUME_MIN && menu!=0){vol--;menu=0;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;vol_func();audio();}// vol_min
if(ir.value==BASS_MAX && menu!=1){bass++;menu=1;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;bass_func();audio();}// bass_max
if(ir.value==BASS_MIN && menu!=1){bass--;menu=1;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;bass_func();audio();}// bass_min
if(ir.value==TREB_MAX && menu!=2){treb++;menu=2;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;treb_func();audio();}// treb_max
if(ir.value==TREB_MIN && menu!=2){treb--;menu=2;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;treb_func();audio();}// treb_min
if(ir.value==BALL_R && menu!=3){balans++;menu=3;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;balans_func();audio();}// balans_right
if(ir.value==BALL_L && menu!=3){balans--;menu=3;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;balans_func();audio();}// balans_left
if(ir.value==IN1){in=0;cl();time=millis()-7000;w=1;time=millis();w=1;w2=1;www=1;menu=4;gr1=0;gr2=0;audio();}// IN1
if(ir.value==IN2){in=1;cl();time=millis()-7000;w=1;time=millis();w=1;w2=1;www=1;menu=4;gr1=0;gr2=0;audio();}// IN2
if(ir.value==IN3){in=2;cl();time=millis()-7000;w=1;time=millis();w=1;w2=1;www=1;menu=4;gr1=0;gr2=0;audio();}// IN3
if(ir.value==MENU_DOWN || k1==1){menu++;k1=0;cl();time=millis();w=1;w2=1;if(menu>3){menu=0;}}// menu_down
if(ir.value==MENU_UP || k2==1){menu--;k2=0;cl();time=millis();w=1;w2=1;if(menu<0||menu>3){menu=3;}}// menu_up
if(ir.value==LOUD && loud==0){loud=1;cl();time=millis();w=1;w2=1;lcd.setCursor(2,0);lcd.print("Loudness ON");audio();delay(2000);cl();}// loud_on
if(ir.value==LOUD && loud==1){loud=0;cl();time=millis();w=1;w2=1;lcd.setCursor(2,0);lcd.print("Loudness OFF");audio();delay(2000);cl();}// loud_off
}
/////////////////////// VOLUME //////////////
if(menu==0){
if(ir.value==VOLUME_MAX || ir.value==RIGHT || k4==1){vol++;k4=0;gr1=1;gr2=0;cl1();time=millis();w=1;w2=1;vol_func();audio();}// кнопка >
if((ir.value==0xFFFFFFFF || k3==1) and gr1==1){vol++;k3=0;gr2=0;cl1();time=millis();w=1;w2=1;vol_func();audio();}// кнопка >>>>>>
if(ir.value==VOLUME_MIN || ir.value==LEFT || k3==1){vol--;k3=0;gr1=0;gr2=1;cl1();time=millis();w=1;w2=1;vol_func();audio();}// кнопка <
if((ir.value==0xFFFFFFFF || k4==1) and gr2==1){vol--;k4=0;gr1=0;cl1();time=millis();w=1;w2=1;vol_func();audio();}// кнопка <<<<<<
if (newPosition != oldPosition){oldPosition = newPosition;
vol=vol+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;vol_func();audio();}
lcd.setCursor(0,0);lcd.print(F("Volume "));
lcd.print(" ");lcd.print(-62+vol);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");vol_d=vol-14;
if(w2==1){
for(z=0,z0=0,z1=0;z<=vol_d;z++,z1++){if(z1>2){z1=0;z0++;}
if(z1==1){lcd.setCursor(z0,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1,1);lcd.print(" ");}}
if(z1==3){lcd.setCursor(z0,1);lcd.write((uint8_t)1);}
if(z1==2){lcd.setCursor(z0,1);lcd.write((uint8_t)2);}w2=0;}}
/////////////////// BASS //////////////
if(menu==1){
if(ir.value==BASS_MAX || ir.value==RIGHT || k4==1){bass++;k4=0;gr1=1;gr2=0;cl1();time=millis();w=1;w2=1;bass_func();audio();}// кнопка >
if((ir.value==0xFFFFFFFF || k3==1) and gr1==1){bass++;k3=0;gr2=0;cl1();time=millis();w=1;w2=1;bass_func();audio();}// кнопка >>>>>>
if(ir.value==BASS_MIN || ir.value==LEFT || k3==1){bass--;k3=0;gr1=0;gr2=1;cl1();time=millis();w=1;w2=1;bass_func();audio();}// кнопка <
if((ir.value==0xFFFFFFFF || k4==1) and gr2==1){bass--;k4=0;gr1=0;cl1();time=millis();w=1;w2=1;bass_func();audio();}// кнопка <<<<<<
if (newPosition != oldPosition) {
oldPosition = newPosition;
bass=bass+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;bass_func();audio();}
lcd.setCursor(0,0);lcd.print(F("Bass "));
lcd.print(" ");lcd.print(bass*2);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");bass_d=bass*2+15;
if(w2==1){
for(z=0,z0=0,z1=0;z<=bass_d;z++,z1++){if(z1>2){z1=0;z0++;}
if(z1==1){lcd.setCursor(z0+3,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1+3,1);lcd.print(" ");}}
if(z1==3){lcd.setCursor(z0+3,1);lcd.write((uint8_t)1);}
if(z1==2){lcd.setCursor(z0+3,1);lcd.write((uint8_t)2);}w2=0;}}
///////////////// TREBLE //////////////////
if(menu==2){
if(ir.value==TREB_MAX || ir.value==RIGHT || k4==1){treb++;k4=0;gr1=1;gr2=0;cl1();time=millis();w=1;w2=1;treb_func();audio();}// кнопка >
if((ir.value==0xFFFFFFFF || k3==1) and gr1==1){treb++;k3=0;gr2=0;cl1();time=millis();w=1;w2=1;treb_func();audio();}// кнопка >>>>>>
if(ir.value==TREB_MIN || ir.value==LEFT || k3==1){treb--;k3=0;gr1=0;gr2=1;cl1();time=millis();w=1;w2=1;treb_func();audio();}// кнопка <
if((ir.value==0xFFFFFFFF || k4==1) and gr2==1){treb--;k4=0;gr1=0;cl1();time=millis();w=1;w2=1;treb_func();audio();}// кнопка <<<<<<
if (newPosition != oldPosition) {
oldPosition = newPosition;
treb=treb+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;treb_func();audio();}
lcd.setCursor(0,0);lcd.print(F("Treble "));
lcd.print(" ");lcd.print(treb*2);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");treb_d=treb*2+15;
if(w2==1){
for(z=0,z0=0,z1=0;z<=treb_d;z++,z1++){if(z1>2){z1=0;z0++;}
if(z1==1){lcd.setCursor(z0+3,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1+3,1);lcd.print(" ");}}
if(z1==3){lcd.setCursor(z0+3,1);lcd.write((uint8_t)1);}
if(z1==2){lcd.setCursor(z0+3,1);lcd.write((uint8_t)2);}w2=0;}}
//////////////// BALANSE +\- 4 dB /////////////
if(menu==3){
if(ir.value==BALL_R || ir.value==RIGHT || k4==1){balans++;k4=0;gr1=1;gr2=0;cl();time=millis();w=1;balans_func();audio();}// кнопка >
if(ir.value==BALL_L || ir.value==LEFT || k3==1){balans--;k3=0;gr1=0;gr2=1;cl();time=millis();w=1;balans_func();audio();}// кнопка <
if (newPosition != oldPosition) {
oldPosition = newPosition;
balans=balans+newPosition;myEnc.write(0);newPosition=0;lcd.clear();time=millis();w=1;balans_func();audio();}
lcd.setCursor(0,0);
if(balans>=0){lcd.print("-");}else{lcd.print("+");}
lcd.print(abs(balans));lcd.print(" dB ");
if(balans==0){lcd.print(" <> ");}
if(balans<0){lcd.print(" < ");}
if(balans>0){lcd.print(" > ");}
if(balans>=0){lcd.print("+");}else{lcd.print("-");}
lcd.print(abs(balans));lcd.print(" dB ");
lcd.setCursor(0,1);lcd.print("L");
lcd.setCursor(15,1);lcd.print("R");
if(balans<0){lcd.setCursor(balans+7,1);lcd.write((uint8_t)0);}
if(balans>0){lcd.setCursor(balans+8,1);lcd.write((uint8_t)0);}
if(balans==0){lcd.setCursor(7,1);lcd.write((uint8_t)0);lcd.setCursor(8,1);lcd.write((uint8_t)0);}}
/////////////////////////////////////////////////////////////
/////////// input + gain /////////////////////////////////////////
if(menu==4){
switch(in){
case 0: gain = gain0;break;
case 1: gain = gain1;break;
case 2: gain = gain2;break;
}
if(ir.value==RIGHT || k4==1){gain++;k4=0;gr1=1;gr2=0;cl1();time=millis();w=1;w2=1;gain_func();audio();}// кнопка >
if(ir.value==LEFT || k3==1){gain--;k3=0;gr1=0;gr2=1;cl1();time=millis();w=1;w2=1;gain_func();audio();}// кнопка <
if (newPosition != oldPosition) {
oldPosition = newPosition;
gain=gain+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;gain_func();audio();}
switch(in){
case 0: gain0 = gain;break;
case 1: gain1 = gain;break;
case 2: gain2 = gain;break;
}
lcd.setCursor(0,0);lcd.print(" INPUT ");lcd.print(in+1);
lcd.setCursor(0,1);lcd.print(" GAIN ");
switch(gain){
case 3: lcd.print(" +11.25 dB");break;
case 2: lcd.print(" +7.5 dB");break;
case 1: lcd.print(" +3.75 dB");break;
case 0: lcd.print(" 0 dB");break;
}
}
/////////////////////////////////////////////////////////////
// запись всех настроек в EEPROM если кнопки + и - не нажимались в течении 10 сек
// если настройки тембра, баланса и номер входа не менялись в течении 10 сек, переход в рег. Громкости
if(millis()-time>10000 && w==1 && power==0 && mute==0){
EEPROM.update(0,vol);
EEPROM.update(4,balans+4);
EEPROM.update(1,bass+7);
EEPROM.update(3,treb+7);
EEPROM.update(5,in);
EEPROM.update(6,gain0); EEPROM.update(7,gain1); EEPROM.update(8,gain2);
EEPROM.update(9,loud);
menu=100;lcd.clear();w=0;w2=1;cl();spek=1;
}
if(spek==1){
analyzeAudio(); // функция FHT, забивает массив fht_log_out[] величинами по спектру
for (int pos = 0; pos < 16; pos++) { // для окошек дисплея с 0 по 15
// найти максимум из пачки тонов
if (fht_log_out[posOffset[pos]] > maxValue) maxValue = fht_log_out[posOffset[pos]];
lcd.setCursor(pos, 0);
// преобразовать значение величины спектра в диапазон 0..15 с учётом настроек
int posLevel = map(fht_log_out[posOffset[pos]], LOW_PASS, gain_sp, 0, 15);
posLevel = constrain(posLevel, 0, 15);
while(yyy<2){yyy++;
if (posLevel > 7) { // если значение больше 7 (значит нижний квадратик будет полный)
lcd.write((uint8_t)posLevel - 8); // верхний квадратик залить тем что осталось
lcd.setCursor(pos, 1); // перейти на нижний квадратик
lcd.write((uint8_t)7); // залить его полностью
}
else { // если значение меньше 8
lcd.print(" "); // верхний квадратик пустой
lcd.setCursor(pos, 1); // нижний квадратик
lcd.write((uint8_t)posLevel); // залить полосками
}} yyy=0;
}
if (AUTO_GAIN) {
maxValue_f = maxValue * k + maxValue_f * (1 - k);
if (millis() - gainTimer > 1500) { // каждые 1500 мс
// если максимальное значение больше порога, взять его как максимум для отображения
if (maxValue_f > VOL_THR) gain_sp = maxValue_f;
// если нет, то взять порог побольше, чтобы шумы вообще не проходили
else gain_sp = 100;
gainTimer = millis();
}
}else{gain_sp = DEF_GAIN;}
}
//////////////////////////////////
}// LOOP
void audio(){
audioChip.source(in);//select your source 1...3 вход 3...1
audioChip.volume(vol);//Vol 0...62 шаг 1 дБ
audioChip.gain(gain);//gain 0...3 шаг 3.75 дБ
audioChip.bass(bass);//bass -7...+7 шаг 2 дБ
audioChip.treble(treb);//treble -7...+7 шаг 2 дБ
audioChip.balance(balans);//-31...+31 программно ограничено до +\-8 дБ
audioChip.loudness(loud);//true or false // тонкомпенсация
}
void gain_func(){if(gain<0){gain=3;}if(gain>3){gain=0;}}
void balans_func(){if(balans>4){balans=4;}if(balans<-4){balans=-4;}}
void treb_func(){if(treb>7){treb=7;}if(treb<-7){treb=-7;}}
void bass_func(){if(bass>7){bass=7;}if(bass<-7){bass=-7;}}
void vol_func(){if(vol<0){vol=0;}if(vol>62){vol=62;}}
void cl(){ir.value=0;delay(300);spek=0;lcd.clear();}
void cl1(){ir.value=0;delay(300);spek=0;}
void to_Timer(){newPosition = myEnc.read()/4;}
void analyzeAudio() {
while( i1 < FHT_N ) { i1++;
do{ADCSRA |= (1 << ADSC);}
while((ADCSRA & (1 << ADIF)) == 0);
fht_input[i1] = (ADCL|ADCH << 8);
//fht_input[i1] = ADCH;
}i1=0;
fht_window(); // window the data for better frequency response
fht_reorder(); // reorder the data before doing the fht
fht_run(); // process the data in the fht
fht_mag_log(); // take the output of the fht
}
У вас анализатор работает ?
Работает, но звук я на вход анализатора не подаю, просто шум и видны полосы
Страницы Назад 1 … 4 5 6 7 8 … 11 Далее
Чтобы отправить ответ, вы должны войти или зарегистрироваться
forum.rcl-radio.ru → Тестирование скетчей → PT2313 + энкодер + ИК пульт + анализатор спектра
Форум работает на PunBB, при поддержке Informer Technologies, Inc
|