76

Re: TDA8425 + энкодер + пульт + STANDBY

Все конденсаторы надо проверить, на правильное подключение

http://forum.rcl-radio.ru/uploads/images/2024/03/076e958cab924860049d046f9c2a4248.png

77

Re: TDA8425 + энкодер + пульт + STANDBY

http://forum.rcl-radio.ru/uploads/images/2024/03/c2b2a9bac138de4a8dfa9ed76ec9325f.png

78

Re: TDA8425 + энкодер + пульт + STANDBY

с5 с6 с8 с9? ща доберусь проверю

79

Re: TDA8425 + энкодер + пульт + STANDBY

по вч стоят а вот по нч видать не было и не поставил а которые 33нФ чем можно заменить

80

Re: TDA8425 + энкодер + пульт + STANDBY

0,022-0,1 мкФ

81

Re: TDA8425 + энкодер + пульт + STANDBY

высокие тоже на всякий заменил но вч не добавляется ну и хр... на эти вч
тут еще анализатор криво показываетhttp://forum.rcl-radio.ru/uploads/images/2024/03/7f933513bbd1e54576d495c87b72fa2a.jpeg

82

Re: TDA8425 + энкодер + пульт + STANDBY

это даже  бе входящего сигнала

83

Re: TDA8425 + энкодер + пульт + STANDBY

шумы ловит
В анализаторе есть система усиления сигнала, для выравнивания спектра для разной громкости. При КЗ входа, анализатор должен показывать по нулям все полосы.

84

Re: TDA8425 + энкодер + пульт + STANDBY

от куда? дс дс преобразователь с али может давать шумы по питанию? кондер стоит на а0 и на входной сигнал

85

Re: TDA8425 + энкодер + пульт + STANDBY

Дополнительно во второе меню (нажать и удерживать кнопку энкодера) добавлены настройки анализатора спектра:

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.

86

Re: TDA8425 + энкодер + пульт + STANDBY

понял спасибо я кнопки не припаивал думал без них

87

Re: TDA8425 + энкодер + пульт + STANDBY

а где в прошивке указан пин а0 для анализатора может ардуинка кривая попалась хочу попробовать поменять пин

88

Re: TDA8425 + энкодер + пульт + STANDBY

ADMUX  = 0b11100001; // a1

89

Re: TDA8425 + энкодер + пульт + STANDBY

спасибо

90 (2024-09-04 14:36:55 отредактировано msanfelipe133)

Re: TDA8425 + энкодер + пульт + STANDBY

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);*/
 
}

91 (2024-09-04 18:24:40 отредактировано Karl2233)

Re: TDA8425 + энкодер + пульт + STANDBY

Cual sera el error de programacion ?.

Разводка земли, помехи от индикатора?

92

Re: TDA8425 + энкодер + пульт + STANDBY

Cambie el codificador, continua el ruido. El cableado a tierra parece correcto. !

93

Re: TDA8425 + энкодер + пульт + STANDBY

Здравствуйте уважаемый 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);
 }}
}