Re: TDA8425 + энкодер + пульт + STANDBY
Все конденсаторы надо проверить, на правильное подключение
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
forum.rcl-radio.ru → Переделки → TDA8425 + энкодер + пульт + STANDBY
Все конденсаторы надо проверить, на правильное подключение
с5 с6 с8 с9? ща доберусь проверю
по вч стоят а вот по нч видать не было и не поставил а которые 33нФ чем можно заменить
0,022-0,1 мкФ
высокие тоже на всякий заменил но вч не добавляется ну и хр... на эти вч
тут еще анализатор криво показывает
это даже бе входящего сигнала
шумы ловит
В анализаторе есть система усиления сигнала, для выравнивания спектра для разной громкости. При КЗ входа, анализатор должен показывать по нулям все полосы.
от куда? дс дс преобразователь с али может давать шумы по питанию? кондер стоит на а0 и на входной сигнал
Дополнительно во второе меню (нажать и удерживать кнопку энкодера) добавлены настройки анализатора спектра:
AUTO_GAIN — автонастройка по громкости (0…1)
VOL_THR — порог тишины, ниже него отображения на экране не будет, это значение всегда должно быть быть меньше DEF_GAIN (10…100) (25-30 оптимально), параметр активен когда AUTO_GAIN = 1
LOW_PASS — нижний порог чувствительности шумов, нет скачков при отсутствии звука, это значение должно быть меньше DEF_GAIN (10..100) (35-40 оптимально)
DEF_GAIN — максимальный порог по умолчанию, это значение всегда должно быть выше VOL_THR и LOW_PASS (30…200)(80-120 оптимально), параметр активен когда AUTO_GAIN = 0
GRAPH_ATT — аттенюатор чувствительности (0,5…1,5), параметр активен когда AUTO_GAIN = 1
GRAPHICS — изменение вида графических полос (0…4)
Conv. speed — скорость преобразования для аналогового входа (чем больше значение тем более узкий частотный диапазон):
0 — CLK/4
1 — CLK/8 (оптимально)
2 — CLK/16
3 — CLK/32
4 — CLK/64
5 — CLK/128
Для перехода по параметрам настроек анализатора спектра необходимо нажимать кнопку MUTE.
понял спасибо я кнопки не припаивал думал без них
а где в прошивке указан пин а0 для анализатора может ардуинка кривая попалась хочу попробовать поменять пин
ADMUX = 0b11100001; // a1
спасибо
Hola , excelente foro. Estoy trabajando en este proyecto tda 8425 , arduino y amplificador tda 7297. Cada fuente esta separada con un modulo aislador dc dc. Funciona , pero observo de fondo un ruido que solo desaparece cuando el volumen es cero (0) dB. Hacia arriba o hacia abajo existe un ruido de fondo. Cual sera el error de programacion ?. Gracias
#include <Wire.h>
#include <TDA8425.h>
#include <Encoder.h>
#include <LiquidCrystal_I2C.h>
#include <EEPROM.h>
#include <MsTimer2.h>
#include <boarddefs.h>
#include <IRremote.h>
IRrecv irrecv(9); // указываем вывод модуля IR приемника
Encoder myEnc(11, 10);//CLK, DT
decode_results ir;
TDA8425 tda;
LiquidCrystal_I2C lcd(0x27,16,2);
byte a1[8]={0b10101,0b10101,0b10101,0b10101,0b10101,0b10101,0b10101,0b10101};
byte a2[8]={0b10100,0b10100,0b10100,0b10100,0b10100,0b10100,0b10100,0b10100};
byte a3[8]={0b10000,0b10000,0b10000,0b10000,0b10000,0b10000,0b10000,0b10000};
int menu,vol,vol_d,balans,bass,bass_d,treb,treb_d,in,mute,sss;
byte w,w2,standby=1,www,z,z0,z1,gr1,gr2;
unsigned long time,oldPosition = -999,newPosition;
void setup() {
Serial.begin(9600);lcd.begin(16, 2);lcd.clear();lcd.backlight();
irrecv.enableIRIn(); // запускаем модуль IR
pinMode(12,INPUT);// меню кнопка энкодера SW
pinMode(A0,INPUT);// кнопка POWER
pinMode(8,OUTPUT);// выход управления STANDBY
pinMode(A1,INPUT);// MUTE
digitalWrite(8,LOW);
lcd.createChar(0,a1);lcd.createChar(1,a2);lcd.createChar(2,a3);
vol = EEPROM.read(0);// vol eeprom
bass = EEPROM.read(1);// bass eeprom
treb = EEPROM.read(2);// treb eeprom
in = EEPROM.read(3);// in eeprom
balans = EEPROM.read(4)-4;// balans eeprom
lcd.setCursor(4,0);lcd.print("TDA8425");delay(1000);
MsTimer2::set(3, to_Timer);MsTimer2::start();
audio();
}
void loop() {delay(10);
if(standby==1){menu=100;lcd.setCursor(0,0);lcd.print(" POWER OFF ");}
if(analogRead(A0)>900&&standby==1){standby=0;lcd.clear();lcd.setCursor(0,0);lcd.print(" POWER ON ");digitalWrite(8,HIGH);delay(2000);menu=0;w2=1;}
if(analogRead(A0)>900&&standby==0){standby=1;lcd.clear();digitalWrite(8,LOW);delay(500);menu=100;}
if(analogRead(A1)>900&&mute==0&&standby==0){mute=1;cl();menu=100;lcd.setCursor(0,0);lcd.print(" MUTE ");delay(500);}
if(analogRead(A1)>900&&mute==1&&standby==0){mute=0;cl();delay(100);menu=0;w2=1;}
/*Busque las líneas
if(analogRead(A1)>900&&mute==0&&standby==0){mute=1;cl();menu=100;w=0;lcd.setCursor(0,0);lcd.print(" MUTE " );delay(500);}
if(analogRead(A1)>900&&mute==1&&standby==0){mute=0;cl();delay(100);menu=0;w2=1;}
reemplazar con
if ( analogRead(A1)>900&&mute==0&&standby==0{mute=1;audio();delay(500);cl();menu=100;w=0;lcd.setCursor(0,0);lcd. print (" MUTE ");}
if(analogRead(A1)>900&&mute==1&&standby==0){mute=0;audio();cl();delay(100);menu=0;w2=1;} */
if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);time=millis();w=1;w2=1;irrecv.resume();}// IR приемник
if(digitalRead(12)==LOW&&standby==0){menu++;cl();myEnc.write(0);time=millis();w=1;w2=1;if(menu>4){menu=0;}}// меню
if(ir.value==0xFF02FD&&standby==0){menu++;gr1=0;gr2=0;cl1();time=millis();w=1;w2=1;if(menu>4){menu=0;}}// IR меню кнопка вверх
if(ir.value==0xFF22DD&&standby==0){menu--;gr1=0;gr2=0;cl1();time=millis();w=1;w2=1;if(menu<0){menu=4;}}// IR меню кнопка вниз
if(ir.value==0xFFA25D&&standby==1){standby=0;gr1=0;gr2=0;cl();lcd.setCursor(0,0);lcd.print(" POWER ON ");digitalWrite(8,HIGH);delay(2000);menu=0;w2=1;}//IR power on
if(ir.value==0xFFA25D&&standby==0){standby=1;gr1=0;gr2=0;cl();digitalWrite(8,LOW);delay(500);menu=100;}//IR power off
if(ir.value==0xFFE21D&&mute==0&&standby==0){mute=1;cl();menu=100;lcd.setCursor(0,0);lcd.print(" MUTE ");delay(500);}// IR MUTE
if(ir.value==0xFFE21D&&mute==1&&standby==0){mute=0;cl();menu=0;w2=1;}//IR MUTE
/////////////////////// VOLUME ///////////////////////////////////
if(menu==0){
if(ir.value==0xFFA857){vol++;gr1=1;gr2=0;cl();w2=1;ogr_vol();audio();}// кнопка >
if(ir.value==0xFFFFFFFF and gr1==1){vol++;gr2=0;cl();w2=1;ogr_vol();audio();}// кнопка >>>>>>
if(ir.value==0xFFE01F){vol--;gr1=0;gr2=1;cl();w2=1;ogr_vol();audio();}// кнопка <
if(ir.value==0xFFFFFFFF and gr2==1){vol--;gr1=0;cl();w2=1;ogr_vol();audio();}// кнопка <<<<<<
if (newPosition != oldPosition){oldPosition = newPosition;
vol=vol+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;ogr_vol();audio();}
lcd.setCursor(0,0);lcd.print("VOLUME ");
lcd.print(" ");lcd.print((-60+vol)*2);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");vol_d=vol-15;
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==0xFFA857){bass++;gr1=1;gr2=0;cl();w2=1;ogr_bass();audio();}// кнопка >
if(ir.value==0xFFFFFFFF and gr1==1){bass++;gr2=0;cl();w2=1;ogr_bass();audio();}// кнопка >>>>>>
if(ir.value==0xFFE01F){bass--;gr1=0;gr2=1;cl();w2=1;ogr_bass();audio();}// кнопка <
if(ir.value==0xFFFFFFFF and gr2==1){bass--;gr1=0;cl();w2=1;ogr_bass();audio();}// кнопка <<<<<<
if (newPosition != oldPosition){oldPosition = newPosition;
bass=bass+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;ogr_bass();audio();}
lcd.setCursor(0,0);lcd.print("BASS ");
switch(bass){
case 11: bass_d=15;break;
case 10: bass_d=12;break;
case 9: bass_d=9;break;
case 8: bass_d=6;break;
case 7: bass_d=3;break;
case 6: bass_d=0;break;
case 5: bass_d=-3;break;
case 4: bass_d=-6;break;
case 3: bass_d=-9;break;
case 2: bass_d=-12;break;
}
if(bass_d>=0){lcd.print("+");}else{lcd.print("-");}
if(bass_d>-10&&bass_d<=0||bass_d<10&&bass_d>0){{lcd.print(" ");}}
lcd.print(abs(bass_d));lcd.print(" dB ");
if(w2==1){bass_d=bass_d+12;
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+3+1,1);lcd.print(" ");}}
if(bass_d==0){lcd.setCursor(0,1);lcd.print(" ");}w2=0;}}
/////////////////////// TREBLE //////////////////////////////////////////////////////
if(menu==2){
if(ir.value==0xFFA857){treb++;gr1=1;gr2=0;cl();w2=1;ogr_treb();audio();}// кнопка >
if(ir.value==0xFFFFFFFF and gr1==1){treb++;gr2=0;cl();w2=1;ogr_treb();audio();}// кнопка >>>>>>
if(ir.value==0xFFE01F){treb--;gr1=0;gr2=1;cl();w2=1;ogr_treb();audio();}// кнопка <
if(ir.value==0xFFFFFFFF and gr2==1){treb--;gr1=0;cl();w2=1;ogr_treb();audio();}// кнопка <<<<<<
if (newPosition != oldPosition){oldPosition = newPosition;
treb=treb+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;ogr_treb();audio();}
lcd.setCursor(0,0);lcd.print("TREBLE ");
switch(treb){
case 10: treb_d=12;break;
case 9: treb_d=9;break;
case 8: treb_d=6;break;
case 7: treb_d=3;break;
case 6: treb_d=0;break;
case 5: treb_d=-3;break;
case 4: treb_d=-6;break;
case 3: treb_d=-9;break;
case 2: treb_d=-12;break;
}
if(treb_d>=0){lcd.print("+");}else{lcd.print("-");}
if(treb_d>-10&&treb_d<=0||treb_d<10&&treb_d>0){{lcd.print(" ");}}
lcd.print(abs(treb_d));lcd.print(" dB ");
if(w2==1){treb_d=treb_d+12;
for(z=0,z0=0,z1=0;z<=treb_d;z++,z1++){if(z1>2){z1=0;z0++;}
if(z1==1){lcd.setCursor(z0+4,1);lcd.write((uint8_t)0);lcd.setCursor(z0+4+1,1);lcd.print(" ");}}
if(treb_d==0){lcd.setCursor(0,1);lcd.print(" ");}w2=0;}}
//////////////// BALANCE /////////////////////////////////////
if(menu==3){
if(ir.value==0xFFA857){balans++;gr1=1;gr2=0;cl();w2=1;ogr_balans();audio();}// кнопка >
if(ir.value==0xFFFFFFFF and gr1==1){balans++;gr2=0;cl();w2=1;ogr_balans();audio();}// кнопка >>>>>>
if(ir.value==0xFFE01F){balans--;gr1=0;gr2=1;cl();w2=1;ogr_balans();audio();}// кнопка <
if(ir.value==0xFFFFFFFF and gr2==1){balans--;gr1=0;cl();w2=1;ogr_balans();audio();}// кнопка <<<<<<
if (newPosition != oldPosition){oldPosition = newPosition;
balans=balans+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;lcd.clear();ogr_balans();audio();}
lcd.setCursor(0,0);
if(balans*2>=0){lcd.print("-");}else{lcd.print("+");}
lcd.print(abs(balans*2));lcd.print(" dB ");
lcd.print(" <> ");
if(balans*2>=0){lcd.print("+");}else{lcd.print("-");}
lcd.print(abs(balans*2));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 /////////////////////////////
if(menu==4){
if(ir.value==0xFFA857){in++;gr1=1;gr2=0;cl1();w2=1;ogr_in();audio();}// кнопка >
if(ir.value==0xFFFFFFFF and gr1==1){in++;gr2=0;cl1();w2=1;ogr_in();audio();}// кнопка >>>>>>
if(ir.value==0xFFE01F){in--;gr1=0;gr2=1;cl1();w2=1;ogr_in();audio();}// кнопка <
if(ir.value==0xFFFFFFFF and gr2==1){in--;gr1=0;cl1();w2=1;ogr_in();audio();}// кнопка <<<<<<
if (newPosition != oldPosition) {
oldPosition = newPosition;
in=in+newPosition;myEnc.write(0);newPosition=0;audio();lcd.clear();time=millis();w=1;ogr_in();audio();}
lcd.setCursor(0,0);lcd.print("Source selector");
lcd.setCursor(0,1);lcd.print("INPUT: ");lcd.print(in);
}
////////////////////////////////////////////////////////////////
if(millis()-time>10000 && w==1){// сохранение всех настроек в eeprom через 10 сек неактивности
EEPROM.update(0,vol);
EEPROM.update(4,balans+4);
EEPROM.update(1,bass);
EEPROM.update(2,treb);
EEPROM.update(3,in);
w=0;w2=1;menu=0;cl(); }
}//loop
void ogr_in(){if(in>1){in=0;}if(in<0){in=1;}}
void ogr_balans(){if(balans>4){balans=4;}if(balans<-4){balans=-4;}}
void ogr_treb(){if(treb>10){treb=10;}if(treb<2){treb=2;}}
void ogr_bass(){if(bass>11){bass=11;}if(bass<2){bass=2;}}
void ogr_vol(){if(vol<0){vol=0;}if(vol>63){vol=63;}}
void cl(){ir.value=0;delay(200);lcd.clear();}
void cl1(){ir.value=0;delay(400);lcd.clear();}
void to_Timer(){newPosition = myEnc.read()/4;}
void audio(){
tda.setVolumeL(vol+balans);
tda.setVolumeR(vol-balans);
tda.setBass(bass);
tda.setTreble(treb);
tda.setMute(mute);
tda.setSource(in);
/*Cambie las líneas:
tda.setVolumeL(vol+balans);
tda.setVolumeR(vol-balans);
en
tda.setVolumeL(vol+16+balans);
tda.setVolumeR(vol+16-balans);*/
}
Cual sera el error de programacion ?.
Разводка земли, помехи от индикатора?
Cambie el codificador, continua el ruido. El cableado a tierra parece correcto. !
Здравствуйте уважаемый liman324, спасибо за Ваши работы! На основе ваших статей попытался сделать свою, упрощенную версию темброблока для настольной микросистемы на TDA8425! В этой версии отсутствует управление пультом, анализатор спектра заменен на индикатор уровня сигнала, немного изменен интерфейс контроля темброблока, и добавлено светодиодное кольцо, для отображения регулировки уровня громкости и индикации уровня сигнала.
Прощу меня простить, я совсем не разбираюсь в программировании, свою версию сделал на основе анализа написанного кода, в основном из Ваших статей, и примеров из интернета, поэтому там, наверное, все криво - косо соединено, не судите строго! Код вроде бы работает, проверил на Ардуино Нано, и на LGT8F328P Нано, поэтому оставлю код в этой теме, может быть кому-нибудь пригодится!
Собственно, сам код!
#define LED_PIN 13 // пин светодиодного кольца
#define NUMPIXELS 12 // кол-во светодиодов
#define DELAYPIXEL 500 // время (в миллисекундах) для паузы между пикселями
#define GAIN 14 // усиление 0...50
#define STEP 2 // плавность полос 0...20
#define RL 1 // RL - горизонт, вертикаль 0...1
#define SW 10 // пин кнопки энкодера
#define CLK 11 // пин CLK энкодера
#define DT 12 // пин DT энкодера
#define MUT 9 // пин кнопки mute
#define DB 8 // пин кнопки -20 dB
#define EE_DATA_ADDR 1 // Адрес хранения настроек
#define EE_KEY_ADDR 0 // Адрес Хранения ключа ЕЕПРОМ
#define EE_KEY 0xBE // Ключ
#include <LiquidCrystal.h>
#include <Wire.h>
#include <TDA8425.h>
#include <Encoder.h>
#include <EEPROM.h>
// #include <EEPROMex.h>
#include <MsTimer2.h>
#include <Adafruit_NeoPixel.h>
#include <FastLED.h>
LiquidCrystal lcd(7, 6, 2, 3, 4, 5); // активация RS,E,D4,D5,D6,D7 LCD
Encoder myEnc(CLK, DT); // активация CLK, DT энкодера
TDA8425 tda;
int a[2];
unsigned long oldPosition = -999,newPosition,time;
uint8_t d1,d2,d3,d4,d5,d6,e1,e2,e3;
int ur, ul, urr, ull, urrr, ulll, x, i, is, u_maxr, u_maxl, u_l0[20], u_r0[20];
int z, vol_d, bass_d, treb_d, sss, sp, db;
uint8_t zy, zy0, zy1, w;
uint8_t www, www1, spek, menu, w1, w2, mute, y;
struct { // Структура с переменными - параметрами звука и стилями шрифтов
int sped = 0;
int vol = 40;
int8_t bass = 0;
int8_t treb = 0;
int8_t balans = 0;
uint8_t graf = 0;
uint8_t in = 0;
uint8_t font = 0;
} data;
void to_Timer() { //функция таймера
newPosition = myEnc.read() / 6;
}
Adafruit_NeoPixel pixels(NUMPIXELS, LED_PIN, NEO_GRB + NEO_KHZ800); //параметры светодиодной ленты
void setup() {
Serial.begin(9600);
lcd.begin(16, 2); // LCD 16X2
lcd.clear(); // Очистка дисплея
ADMUX = 0b11100000;
//ADCSRA = 0b11110011;
if (EEPROM.read(EE_KEY_ADDR) != EE_KEY) { // Проверяем ключ ЕЕПРОМ, и если не совпадает
EEPROM.put(EE_DATA_ADDR, data); // Это - первый запуск, установка всех настроек по умолчанию
EEPROM.write(EE_KEY_ADDR, EE_KEY); // Пишем ключ
}
// byte znak_r[8] = { 0b00000, 0b00000, 0b11111, 0b00101, 0b00101, 0b11010, 0b00000, 0b00000 };
// byte znak_l[8] = { 0b00000, 0b00000, 0b11111, 0b10000, 0b10000, 0b10000, 0b00000, 0b00000 };
// lcd.createChar(4, znak_r);
// lcd.createChar(5, znak_l);
pinMode(A0, INPUT); // A0 - аналоговый вход R
pinMode(A1, INPUT); // A1 - аналоговый вход L
pinMode(SW, INPUT); // Меню кнопка энкодера SW
pinMode(9, INPUT); // Кнопка mute
pinMode(8, INPUT); // Кнопка -20 dB
EEPROM.get(EE_DATA_ADDR, data); // Читаем ЕЕПРОМ настройки
audio();
pixels.begin(); // Инициализируем объект NeoPixel
pixels.setBrightness(5);
pixels.clear();
// The first NeoPixel in a strand is #0, second is 1, all the way up
// to the count of pixels minus one.
lcd.setCursor(1, 0);
lcd.print(F("| ELECTRONIC |"));
lcd.setCursor(1, 1);
lcd.print(F("| KETTLE |"));
pixelStart();
MsTimer2::set(1, to_Timer);
MsTimer2::start();
lcd.clear();
}
void loop() {
if (spek == 1) {
if (www == 1) {
if (data.graf == 0) {
byte a1[8] = { 0b10101, 0b10101, 0b10101, 0b10101, 0b10101, 0b10101, 0b10101, 0b10101 };
byte a2[8] = { 0b10100, 0b10100, 0b10100, 0b10100, 0b10100, 0b10100, 0b10100, 0b10100 };
byte a3[8] = { 0b10000, 0b10000, 0b10000, 0b10000, 0b10000, 0b10000, 0b10000, 0b10000 };
byte a4[8] = { 0b00100, 0b00100, 0b00100, 0b00100, 0b00100, 0b00100, 0b00100, 0b00100 };
lcd.createChar(0, a1);
lcd.createChar(1, a2);
lcd.createChar(2, a3);
lcd.createChar(6, a4);
}
if (data.graf == 1) {
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 };
byte a4[8] = { 0b00000, 0b00100, 0b00100, 0b00100, 0b00100, 0b00100, 0b00100, 0b00000 };
lcd.createChar(0, a1);
lcd.createChar(1, a2);
lcd.createChar(2, a3);
lcd.createChar(6, a4);
}
if (data.graf == 2) {
byte a1[8] = { 0b10101, 0b10101, 0b10101, 0b00000, 0b00000, 0b10101, 0b10101, 0b10101 };
byte a2[8] = { 0b10100, 0b10100, 0b10100, 0b00000, 0b00000, 0b10100, 0b10100, 0b10100 };
byte a3[8] = { 0b10000, 0b10000, 0b10000, 0b00000, 0b00000, 0b10000, 0b10000, 0b10000 };
byte a4[8] = { 0b00100, 0b00100, 0b00100, 0b00100, 0b00100, 0b00100, 0b00100, 0b00100 };
lcd.createChar(0, a1);
lcd.createChar(1, a2);
lcd.createChar(2, a3);
lcd.createChar(6, a4);
}
if (data.graf == 3) {
byte a1[8] = { 0b00000, 0b10101, 0b10101, 0b00000, 0b00000, 0b10101, 0b10101, 0b00000 };
byte a2[8] = { 0b00000, 0b10100, 0b10100, 0b00000, 0b00000, 0b10100, 0b10100, 0b00000 };
byte a3[8] = { 0b00000, 0b10000, 0b10000, 0b00000, 0b00000, 0b10000, 0b10000, 0b00000 };
byte a4[8] = { 0b00000, 0b00100, 0b00100, 0b00100, 0b00100, 0b00100, 0b00100, 0b00000 };
lcd.createChar(0, a1);
lcd.createChar(1, a2);
lcd.createChar(2, a3);
lcd.createChar(6, a4);
}
if (data.graf == 4) {
byte a1[8] = { 0b00000, 0b00000, 0b10101, 0b10101, 0b10101, 0b10101, 0b00000, 0b00000 };
byte a2[8] = { 0b00000, 0b00000, 0b10100, 0b10100, 0b10100, 0b10100, 0b00000, 0b00000 };
byte a3[8] = { 0b00000, 0b00000, 0b10000, 0b10000, 0b10000, 0b10000, 0b00000, 0b00000 };
byte a4[8] = { 0b00000, 0b00000, 0b00100, 0b00100, 0b00100, 0b00100, 0b00000, 0b00000 };
lcd.createChar(0, a1);
lcd.createChar(1, a2);
lcd.createChar(2, a3);
lcd.createChar(6, a4);
}
www = 0;
}
urr = log(analogRead(0)) * GAIN;
if (urr > 41) { urr = 41; }
ull = log(analogRead(1)) * GAIN;
if (ull > 41) { ull = 41; }
if (RL == 0) {
lcd.setCursor(0, 0);
lcd.write((uint8_t)4);
lcd.setCursor(0, 1);
lcd.write((uint8_t)5);
}
if (RL == 1) {
lcd.setCursor(0, 1);
lcd.print(F("L"));
lcd.setCursor(0, 0);
lcd.print(F("R"));
}
if (urr < ur) {
ur = ur - 1;
delay(STEP);
} else {
ur = urr;
}
for (zy = 0, zy0 = 0, zy1 = 0; zy <= ur; zy++, zy1++) {
if (zy1 > 2) {
zy1 = 0;
zy0++;
}
if (zy1 == 1) {
lcd.setCursor(zy0 + 1, 1);
lcd.write((uint8_t)0);
lcd.setCursor(zy0 + 2, 1);
if (ur < 39) { lcd.print(F(" ")); }
}
}
if (zy1 == 3) {
lcd.setCursor(zy0 + 1, 1);
lcd.write((uint8_t)1);
}
if (zy1 == 2) {
lcd.setCursor(zy0 + 1, 1);
lcd.write((uint8_t)2);
}
if (ull < ul) {
ul = ul - 1;
delay(STEP);
} else {
ul = ull;
}
for (zy = 0, zy0 = 0, zy1 = 0; zy <= ul; zy++, zy1++) {
if (zy1 > 2) {
zy1 = 0;
zy0++;
}
if (zy1 == 1) {
lcd.setCursor(zy0 + 1, 0);
lcd.write((uint8_t)0);
lcd.setCursor(zy0 + 2, 0);
if (ul < 39) { lcd.print(F(" ")); }
}
}
if (zy1 == 3) {
lcd.setCursor(zy0 + 1, 0);
lcd.write((uint8_t)1);
}
if (zy1 == 2) {
lcd.setCursor(zy0 + 1, 0);
lcd.write((uint8_t)2);
}
//////////////////////////////////////////////////////////
i++;
if (i < 19) {
u_l0[i] = abs(ull);
u_r0[i] = abs(urr);
} else {
i = 1;
}
if (i == 18) {
u_maxr = 0;
u_maxl = 0;
for (x = 1; x <= 15; x++) {
u_maxl = max(u_maxl, u_l0[x]);
u_maxr = max(u_maxr, u_r0[x]);
}
}
if (u_maxl < ulll) {
ulll = ulll - 1;
} else {
ulll = u_maxl;
}
if (u_maxr < urrr) {
urrr = urrr - 1;
} else {
urrr = u_maxr;
}
if (u_maxl <= ull) { u_maxl = ull + 1; }
if (u_maxr <= urr) { u_maxr = urr + 1; }
lcd.setCursor(ulll / 3 + 1, 0);
if (ulll / 3 > 2) { lcd.write((uint8_t)6); }
lcd.print(F(" "));
lcd.setCursor(urrr / 3 + 1, 1);
if (urrr / 3 > 2) { lcd.write((uint8_t)6); }
lcd.print(F(" "));
pixelVUmetr();
delay(3);
// spektr
}
if(digitalRead(SW)==LOW&&menu<6){sss++;if(spek==1){menu==0;lcd.clear();}else{menu++;lcd.clear();}www1=0;spek=0;myEnc.write(0);oldPosition = -999;delay(300);time=millis();w1=1;}if(menu>6){menu=0;lcd.clear();pixels.clear();}// меню
if(digitalRead(SW)==HIGH){sss=0;}
//if(menu==3&&digitalRead(12)==LOW&&sss==0){menu=4;oldPosition = -999;delay(300);time=millis();w1=1;lcd.clear();}
//if(menu==4&&digitalRead(12)==LOW&&sss==0){menu=5;oldPosition = -999;delay(300);time=millis();w1=1;lcd.clear();}
if(menu==6&&digitalRead(SW)==LOW){menu=0;time=millis();w1=1;delay(300);lcd.clear();pixels.clear();}
if(menu>6&&digitalRead(SW)==HIGH){menu=0;time=millis();w1=1;delay(300);lcd.clear();pixels.clear();}
if (newPosition != oldPosition&&spek==1) {oldPosition = newPosition;menu=0,www1=0;spek=0;w1=1;time=millis();lcd.clear();pixels.clear();}
if (spek == 0) {
if (www1 == 0) {
byte a1[8] = { 0b00000, 0b11011, 0b11011, 0b11011, 0b11011, 0b11011, 0b11011, 0b00000 };
byte a2[8] = { 0b00000, 0b11000, 0b11000, 0b11000, 0b11000, 0b11000, 0b11000, 0b00000 };
lcd.createChar(0, a1);
lcd.createChar(1, a2);
www1 = 1;
}
///////////////////////// громкость /////////////////////////////
if (menu == 0) {
if (newPosition != oldPosition) {
oldPosition = newPosition;
data.vol = data.vol + newPosition;
myEnc.write(0);
newPosition = 0;
audio();
lcd.clear();
pixels.clear();
time = millis();
w1 = 1;
if (data.vol > 63) { data.vol = 63; }
if (data.vol < 16) { data.vol = 16; }
}
/*byte a1[8] = { 0b00000, 0b11011, 0b11011, 0b11011, 0b11011, 0b11011, 0b11011, 0b00000 };
byte a2[8] = { 0b00000, 0b11000, 0b11000, 0b11000, 0b11000, 0b11000, 0b11000, 0b00000 };
lcd.createChar(0, a1);
lcd.createChar(1, a2);*/
lcd.setCursor(0, 0);
lcd.print(F("VOLUME "));
vol_d = data.vol * 2 - 120;
if (vol_d >= 0) {
lcd.setCursor(7, 1);
lcd.print(F("+"));
} else {
lcd.setCursor(7, 1);
lcd.print(F("-"));
}
/*if (vol_d > -10) {
lcd.print(F(" "));
}*/
//lcd.print(abs(vol_d));
fontDatabase();
a[0]=(abs(vol_d)/10)%10;a[1]=(abs(vol_d))%10;
lcd.setCursor(14, 1);
lcd.print(F("dB"));
// ползунок громкости начинает работать с -56 дБ
/*if (data.vol - 32 > 0) {
for (z = 0; z <= data.vol - 33; z++) {
lcd.setCursor(z / 2, 1);
lcd.write((uint8_t)0);
}
}
if ((data.vol - 32) % 2 == 0 && data.vol - 32 >= 0) {
lcd.setCursor(z / 2, 1);
lcd.write((uint8_t)1);
}*/
float z_gl;
if (data.vol - 32 > 0) {
if (z_gl + 1 > 7) {z_gl = 7;}
for (z_gl = 0; z_gl <= data.vol - 33; z_gl++) {
lcd.setCursor(z_gl / 4.57, 1);
lcd.write((uint8_t)161);
/*lcd.setCursor(z_gl / 4.57 + 1, 1);
lcd.write((uint8_t)32);*/
}
}
pixelVolume();
audio();
}
///////////////////////// баланс /////////////////////////////
if (menu == 1) {
if (newPosition != oldPosition) {
oldPosition = newPosition;
data.balans = data.balans + newPosition;
myEnc.write(0);
newPosition = 0;
audio();
pixelVUmetr();
lcd.clear();
time = millis();
w1 = 1;
if (data.balans > 4) { data.balans = 4; }
if (data.balans < -4) { data.balans = -4; }
}
lcd.setCursor(0, 0);
if (data.balans * 2 >= 0) {
lcd.print(F("-"));
} else {
lcd.print(F("+"));
}
lcd.print(abs(data.balans * 2));
lcd.print(F(" dB "));
lcd.print(F(" <> "));
if (data.balans * 2 >= 0) {
lcd.print(F("+"));
} else {
lcd.print(F("-"));
}
lcd.print(abs(data.balans * 2));
lcd.print(F(" dB "));
lcd.setCursor(0, 1);
lcd.print(F("L"));
lcd.setCursor(15, 1);
lcd.print(F("R"));
if (data.balans < 0) {
lcd.setCursor(data.balans + 7, 1);
lcd.write((uint8_t)161);
}
if (data.balans > 0) {
lcd.setCursor(data.balans + 8, 1);
lcd.write((uint8_t)161);
}
if (data.balans == 0) {
lcd.setCursor(7, 1);
lcd.write((uint8_t)0);
lcd.setCursor(8, 1);
lcd.write((uint8_t)0);
}
audio();
}
///////////////////////// тембр нч /////////////////////////////
if (menu == 2) {
if (newPosition != oldPosition) {
oldPosition = newPosition;
data.bass = data.bass + newPosition;
myEnc.write(0);
newPosition = 0;
audio();
//lcd.clear();
pixelVUmetr();
time = millis();
w1 = 1;
if (data.bass > 11) { data.bass = 11; }
if (data.bass < 2) { data.bass = 2; }
}
lcd.setCursor(0, 0);
lcd.print(F("BASS"));
bass_d = data.bass * 3 - 18;
if (bass_d >= 0) {
lcd.setCursor(7, 1);
lcd.print(F("+"));
} else {
lcd.setCursor(7, 1);
lcd.print(F("-"));
}
/*if (bass_d > -10 && bass_d <= 0 || bass_d < 10 && bass_d > 0) {
lcd.print(F(" "));
}*/
//lcd.print(abs(bass_d));
fontDatabase();
a[0]=(abs(bass_d)/10)%10;a[1]=(abs(bass_d))%10;
lcd.setCursor(14, 1);
lcd.print(F("dB"));
/*if (data.bass > 1) {
for (z = 3; z <= data.bass + 1; z++) {
lcd.setCursor(z, 1);
lcd.write((uint8_t)0);
}
}*/
audio();
}
///////////////////////// тембр вч /////////////////////////////
if (menu == 3) {
if (newPosition != oldPosition) {
oldPosition = newPosition;
data.treb = data.treb + newPosition;
myEnc.write(0);
newPosition = 0;
audio();
//lcd.clear();
pixelVUmetr();
time = millis();
w1 = 1;
if (data.treb > 11) { data.treb = 11; }
if (data.treb < 2) { data.treb = 2; }
}
if (data.treb > 10) { data.treb = 10; }
if (data.treb < 2 || data.treb == 255) { data.treb = 2; }
lcd.setCursor(0, 0);
lcd.print(F("TREBLE"));
treb_d = data.treb * 3 - 18;
if (treb_d >= 0) {
lcd.setCursor(7, 1);
lcd.print(F("+"));
} else {
lcd.setCursor(7, 1);
lcd.print(F("-"));
}
/*if (treb_d > -10 && treb_d <= 0 || treb_d < 10 && treb_d > 0) {
lcd.print(F(" "));
}*/
//lcd.print(abs(treb_d));
fontDatabase();
a[0]=(abs(treb_d)/10)%10;a[1]=(abs(treb_d))%10;
lcd.setCursor(14, 1);
lcd.print(F("dB"));
/*if (data.treb > 1) {
for (z = 3; z <= data.treb + 1; z++) {
lcd.setCursor(z, 1);
lcd.write((uint8_t)0);
}
}*/
audio();
}
///////////////////////// input /////////////////////////////
if (menu == 4) {
if (newPosition != oldPosition) {
oldPosition = newPosition;
data.in = data.in + newPosition;
myEnc.write(0);
newPosition = 0;
audio();
//lcd.clear();
pixelVUmetr();
time = millis();
w1 = 1;
if (data.in > 1) {
data.in = 0;
}
if (data.in < 0) {
data.in = 1;
}
}
lcd.setCursor(0, 0);
lcd.print(F("SOURCE"));
lcd.setCursor(0, 1);
lcd.print(F("Input: "));
if (data.in == 0) {
lcd.print(F("AUX "));
} else {
lcd.print(F("Bluetooth"));
}
audio();
}
///////////////////////// spectrum analyzer /////////////////////////////
if (menu == 5) {
if (newPosition != oldPosition) {
oldPosition = newPosition;
w1 = 0;
data.graf = data.graf + newPosition;
myEnc.write(0);
newPosition = 0;
audio();
//lcd.clear();
pixelVUmetr();
time = millis();
w1 = 1;
}
fontDatabase();
if (data.graf > 4) {
data.graf = 0;
}
if (data.graf < 0) {
data.graf = 4;
}
lcd.setCursor(0, 0);
lcd.print(F("VU MET"));
lcd.setCursor(0, 1);
lcd.print(F("Graph."));
a[0]=data.graf/10%10;a[1]=data.graf%10;
}
/////////////////////////////////////////////////////////////////////////
///////////////////////// Шрифт /////////////////////////////
if (menu == 6) {
if (newPosition != oldPosition) {
oldPosition = newPosition;
w1 = 0;
data.font = data.font + newPosition;
myEnc.write(0);
newPosition = 0;
audio();
//lcd.clear();
pixelVUmetr();
time = millis();
w1 = 1;
}
fontDatabase();
if (data.font > 1) {
data.font = 0;
}
if (data.font < 0) {
data.font = 1;
}
lcd.setCursor(0, 0);
lcd.print(F("FONT"));
a[0]=data.font/10%10;a[1]=data.font%10;
}
/////////////////////////////////////////////////////////////////////////
} // spek = 0
if (w2 == 0) {
switch (data.sped) {
case 0: ADCSRA = 0b11110010; break;
case 1: ADCSRA = 0b11110011; break;
case 2: ADCSRA = 0b11110100; break;
case 3: ADCSRA = 0b11110101; break;
case 4: ADCSRA = 0b11110110; break;
case 5: ADCSRA = 0b11110111; break;
}
w2 = 1;
}
////////////////// mute //////////////////////////////////
if (digitalRead(MUT) == HIGH && menu != 5) {
mute++;
if (mute > 1) {
mute = 0;
}
if (mute == 1) {
menu = -1;
w1 = 0;
spek = 0;
www1 = 0;
} else {
oldPosition = -999;
menu = 0;
}
audio();
delay(300);
lcd.clear();
lcd.setCursor(6, 0);
lcd.print(F("MUTE"));
}
///////////////////////////////////////////////////////////
/////////////////// -20 dB ///////////////////////////////
if (digitalRead(DB) == HIGH && db == 0) {
data.vol = data.vol - 10;
db = 1;
delay(500);
audio();
myEnc.write(0);
menu = 0;
lcd.clear();
}
if (digitalRead(8) == HIGH && db == 1) {
data.vol = data.vol + 10;
db = 0;
delay(500);
audio();
myEnc.write(0);
menu = 0;
lcd.clear();
}
//////////////////////////////////////////////////////////
if (millis() - time > 10000 && w1 == 1) { // сохранение всех настроек в eeprom через 10 сек неактивности
EEPROM.put(EE_DATA_ADDR, data); // Пишем настройки
w1 = 0;
menu = 0;
lcd.clear();
spek = 1;
www = 1;
sp = 0;
}
} // конец цикла loop
void audio() {
tda.setVolumeL(data.vol + data.balans);
tda.setVolumeR(data.vol - data.balans);
tda.setBass(data.bass);
tda.setTreble(data.treb);
tda.setMute(mute);
tda.setSource(data.in);
}
void pixelStart() {
for (int i = 0; i < NUMPIXELS; i++) { // Для каждого пикселя...
delay(DELAYPIXEL); // Пауза перед следующим проходом через цикл
// Pixels.Color() принимает значения RGB от 0,0,0 до 255,255,255
// Здесь мы используем голубой цвет:
pixels.setPixelColor(i, 0, 0, 250);
pixels.show(); // Отправляем информацию на ленту
if (i == NUMPIXELS - 1) break;
}
}
void pixelVolume() {
float z_pl;
if (newPosition != oldPosition) {
oldPosition = newPosition;
data.vol = data.vol + newPosition;
myEnc.write(0);
newPosition = 0;
time = millis();
}
if ((data.vol - 32) <= 0) {z_pl = 0;
pixels.setPixelColor(0, 0, 0, 250);
pixels.show();
delay(1);
}
if ((data.vol - 32) > 0) {
z_pl > 0;
for (z_pl = 0; z_pl <= (data.vol - 33); z_pl++) {
pixels.setPixelColor(z_pl / 2.6, 0, 0, 250);
pixels.show();
delay(1);
pixels.setPixelColor(z_pl / 2.6 + 1, 0, 0, 0);
pixels.show();
delay(1);
}
}
}
void pixelVUmetr() {
int ulp = ull / 4;
int ul_p;
if (ulp > 12) { ulp = 12; }
if (ulp < ul_p) {
ul_p = ul_p - 1;
} else {
ul_p = ulp;
}
for (zy = 0; zy <= ul_p; zy++) {
pixels.setPixelColor(zy + 1, 0, 0, 250);
pixels.show();
delay(STEP);
if (ul_p < 10) {
pixels.setPixelColor(zy + 2, 0, 0, 0);
pixels.show();
delay(STEP);
}
}
}
void fontDatabase (){ // база данных шрифтов
uint8_t customChar1[8] = {
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111
};
uint8_t customChar2[8] = {
B11111,
B11111,
B11111,
B00000,
B00000,
B00000,
B00000,
B00000
};
uint8_t customChar3[8] = {
B11111,
B11111,
B11111,
B00000,
B00000,
B00000,
B11111,
B11111
};
uint8_t customChar4[8] = {
B00000,
B00000,
B00000,
B00000,
B00000,
B11111,
B11111,
B11111
};
uint8_t customChar5[8] = {
B00111,
B01111,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111
};
uint8_t customChar6[8] = {
B11100,
B11110,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111
};
uint8_t customChar7[8] = {
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B01111,
B00111
};
uint8_t customChar8[8] = {
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B11110,
B11100
};
uint8_t v1[8] = {0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07};
uint8_t v2[8] = {0x07,0x07,0x00,0x00,0x00,0x00,0x00,0x00};
uint8_t v3[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x1F};
uint8_t v4[8] = {0x1F,0x1F,0x00,0x00,0x00,0x00,0x1F,0x1F};
uint8_t v5[8] = {0x1C,0x1C,0x00,0x00,0x00,0x00,0x1C,0x1C};
uint8_t v6[8] = {0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C};
uint8_t v7[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x07};
uint8_t v8[8] = {0x1F,0x1F,0x00,0x00,0x00,0x00,0x00,0x00};
if (data.font==0){lcd.createChar(1, customChar1);lcd.createChar(2, customChar2);lcd.createChar(3, customChar3);
lcd.createChar(4, customChar4);lcd.createChar(5, customChar5);lcd.createChar(6, customChar6);
lcd.createChar(7, customChar7);lcd.createChar(8, customChar8);
for(int is=0;is<3;is++){
switch(is){
case 0: e1=8,e2=9,e3=10;break; // столбец десятков
case 1: e1=11,e2=12,e3=13;break; // столбец едениц
}
switch(a[is]){
case 0: d1=5,d2=2,d3=6,
d4=7,d5=4,d6=8;break; // Цифра 0
case 1: d1=32,d2=2,d3=6,
d4=32,d5=32,d6=1;break; // Цифра 1
case 2: d1=3,d2=3,d3=6,
d4=7,d5=4,d6=4;break; // Цифра 2
case 3: d1=2,d2=3,d3=6,
d4=4,d5=4,d6=8;break; // Цифра 3
case 4: d1=7,d2=4,d3=1,
d4=32,d5=32,d6=1;break; // Цифра 4
case 5: d1=5,d2=3,d3=3,
d4=4,d5=4,d6=8;break; // Цифра 5
case 6: d1=5,d2=3,d3=3,
d4=7,d5=4,d6=8;break; // Цифра 6
case 7: d1=2,d2=2,d3=6,
d4=32,d5=32,d6=1;break; // Цифра 7
case 8: d1=5,d2=3,d3=6,
d4=7,d5=4,d6=8;break; // Цифра 8
case 9: d1=5,d2=3,d3=6,
d4=4,d5=4,d6=8;break; // Цифра 9
}
lcd.setCursor(e1,0);lcd.write((uint8_t)d1);lcd.setCursor(e2,0);lcd.write((uint8_t)d2);lcd.setCursor(e3,0);lcd.write((uint8_t)d3);
lcd.setCursor(e1,1);lcd.write((uint8_t)d4);lcd.setCursor(e2,1);lcd.write((uint8_t)d5);lcd.setCursor(e3,1);lcd.write((uint8_t)d6);}
}
else {
lcd.createChar(1, v1);lcd.createChar(2, v2);lcd.createChar(3, v3);
lcd.createChar(4, v4);lcd.createChar(5, v5);lcd.createChar(6, v6);
lcd.createChar(7, v7);lcd.createChar(8, v8);
for(int is=0;is<3;is++){
switch(is){
case 0: e1=8,e2=9,e3=10;break; // столбец десятков
case 1: e1=11,e2=12,e3=13;break; // столбец едениц
}
switch(a[is]){
case 0: d1=1,d2=8,d3=6,d4=1,d5=3,d6=6;break; // цифры 1-9
case 1: d1=32,d2=2,d3=6,d4=32,d5=32,d6=6;break;
case 2: d1=2,d2=8,d3=6,d4=1,d5=4,d6=5;break;
case 3: d1=2,d2=4,d3=6,d4=7,d5=3,d6=6;break;
case 4: d1=1,d2=3,d3=6,d4=32,d5=32,d6=6;break;
case 5: d1=1,d2=4,d3=5,d4=7,d5=3,d6=6;break;
case 6: d1=1,d2=4,d3=5,d4=1,d5=3,d6=6;break;
case 7: d1=1,d2=8,d3=6,d4=32,d5=32,d6=6;break;
case 8: d1=1,d2=4,d3=6,d4=1,d5=3,d6=6;break;
case 9: d1=1,d2=4,d3=6,d4=7,d5=3,d6=6;break;
}
lcd.setCursor(e1,0);lcd.write((uint8_t)d1);lcd.setCursor(e2,0);lcd.write((uint8_t)d2);lcd.setCursor(e3,0);lcd.write((uint8_t)d3);
lcd.setCursor(e1,1);lcd.write((uint8_t)d4);lcd.setCursor(e2,1);lcd.write((uint8_t)d5);lcd.setCursor(e3,1);lcd.write((uint8_t)d6);
}}
}
forum.rcl-radio.ru → Переделки → TDA8425 + энкодер + пульт + STANDBY
Форум работает на PunBB, при поддержке Informer Technologies, Inc
|