51

Re: PT2258 + LCD2004_I2C + IR + DS3231

Примерно так:

 //Новые переменные
 int pin7=0;
 int x_timer;
 
 void setup(){pinMode(7,OUTPUT);}

 
 void loop(){
 
 if (digitalRead(10) == LOW){delay(200);x_timer++;}// держим кнопку, идет счет x_timer

 if (digitalRead(10) == HIGH) {x_timer=0;} // если отпустить кнопку то x_timer сбрасывается

 if (x_timer > 25 && pin7==0) {digitalWrite(7,HIGH);pin7=1;x_timer=0;} // 25*200 мс = 5с включаем пин 7 если он был выключен
 if (x_timer > 25 && pin7==1) {digitalWrite(7,LOW);pin7=0;x_timer=0;} // 25*200 мс = 5с выключаем пин 7 если он был включен

 }

Но при удержании кнопки энкодера будут перебираться пункты меню.

52

Re: PT2258 + LCD2004_I2C + IR + DS3231

liman324 пишет:

Примерно так:

 //Новые переменные
 int pin7=0;
 int x_timer;
 
 void setup(){pinMode(7,OUTPUT);}

 
 void loop(){
 
 if (digitalRead(10) == LOW){delay(200);x_timer++;}// держим кнопку, идет счет x_timer

 if (digitalRead(10) == HIGH) {x_timer=0;} // если отпустить кнопку то x_timer сбрасывается

 if (x_timer > 25 && pin7==0) {digitalWrite(7,HIGH);pin7=1;x_timer=0;} // 25*200 мс = 5с включаем пин 7 если он был выключен
 if (x_timer > 25 && pin7==1) {digitalWrite(7,LOW);pin7=0;x_timer=0;} // 25*200 мс = 5с выключаем пин 7 если он был включен

 }

Но при удержании кнопки энкодера будут перебираться пункты меню.

Здесь пунктов меню как раз нету, только совместное нажатие энкодера с кнопкой SET для коррекции времени.

Попробую сейчас.......

53

Re: PT2258 + LCD2004_I2C + IR + DS3231

СУПЕР!!! Работает!!!
Только подогнал счетчик до 12, с 25 в нашем конкретном случае получается больше 8 секунд из за времени работы самого цикла......
Пойдет.....
А вот для чего это нужно???
В процессе работы над проектом возникал вопрос про анализатор спектра....
Ардуина не резиновая, понимаю.
А очень хочется))))) анализатор.....
По вашему проекту http://rcl-radio.ru/?p=42903
На экране 2004 с паралельным интерфейсом.....
Потому решил разбить  проект на две ардуины и два экрана.
С зависимым включением.
Для того, чтобы если анализатор надоел, его можно погасить(отключить)))).
Вот для включения/выключения решил  7 пин использовать......
Там у анализатора своя кнопка эффектов, сюда уже нет смысла лепить, да и некуда уже.....
Прикрутим как есть, нормально будет, только включение от энкодера....
А анализировать мы будем два передних канала и сабвуфер , слепим сумматор на ОУ....
На резисторах не пойдет- будет взаимное проникновение каналов, хоть и небольшое, но все же.....
Если без сумматора, то  в некоторых записях есть разброс уровней по каналам.
И отображаемый общий спектр будет немного отличатся.
И в передних каналах может не хватать сигнала НЧ....
Может сумматор и лишний.....но поглядим...........

Продолжаем работу))))

А В какой программе Вы рисуете схемы?
как тут http://forum.rcl-radio.ru/uploads/images/2022/07/6f7972ca84546f94624484ba05f13c7c.jpg

Я бы полную схему к нашему общему проекту накидал.
Однотипно и чтобы понятнее было, что куда  и как подключать.....

54 (2022-07-12 23:49:13 отредактировано niko00780)

Re: PT2258 + LCD2004_I2C + IR + DS3231

Снял ролик работы (на тапок, без претензий)

Пояснения.
По входам/выходам.
К оригинальной схеме добавлено/изменено:

Фотоприемник пульта pin 11
POWER ON -pin12 включение питания (оригинал-pin5)
POWER ON DELAY -pin13 софтстарт- читаем 34 пост выше
Термодатчик 18B20 -pin 5
Сигнал включения анализатора спектра pin 7 читаем 54 пост выше.
Аналоговые входы pin14,15,16,17 и  20,21(А0, А1, А2, А3, А6, А7) используются
как входы для индикации аварий каналов.Кому не надо, не используем.

Изменил экран STANDBY.
Часы без секунд. Цифры по центру экрана.
Анимация снежинок по периметру, совместно с морганием точек между часами и минутами.
По мне, так интереснее.
Кому не нравится,стираем и возвращаем оригинал.
Код конечно -жесть, но как мог...)))

Плавное увеличение/уменьшение уровня подсветки при включении и отключении

Автоматическое уменьшение уровня подсветки при неактивных кнопках, энкодере и пульте.
При активации любой команды яркость увеличивается

На основном экране:
Немного подправил VOLUME...
Громкость увеличивается к 0 дб! от МИНУС 64 дБ к 0 дб. Минус при 0 исчезает.
В третьей строке снежинки вместо полосок.
Под ними прячутся индикаторы аварии каналов.
При аварии канала(лов) снежинки гаснут на аварийном канале и моргает индикатор "DC"---"ИМЯ КАНАЛА"
В каждом канале отдельно.....
Яркость подсветки при этом возрастает.
Добавлен контроль температуры радиатора с принудительным режимом MUTE .
Пока в скейче стоит 30 С, меняйте под себя.
При срабатывании термозащиты включается MUTE и в 4 строке экрана вместо часов моргает сообщение.
Яркость подсветки при этом возрастает.
Меню аттенюаторов добавлен минус к цифрам, при 0 исчезает.
Меню коррекции часов без изменений.

скейч

 //#define POWER     0x33B800FF
//#define VOLUME_UP 0x33B8E01F
//#define VOLUME_DW 0x33B810EF
//#define MUT       0x33B8946B
#define SET       0x42BD48B7
#define OK        0x42BD08F7


#define POWER     0x42BD50AF
#define VOLUME_UP 0x42BD6897
#define VOLUME_DW 0x42BDE01F
#define MUT       0x42BD609F

#include <Wire.h>
#include <LiquidCrystal_I2C.h> // http://forum.rcl-radio.ru/misc.php?action=pan_download&item=45&download=1
#include <Encoder.h>           // http://rcl-radio.ru/wp-content/uploads/2019/05/Encoder.zip       
#include <EEPROM.h>
#include <MsTimer2.h>          // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip 
#include <boarddefs.h>         // входит в состав библиотеки IRremote
#include <IRremote.h>          // http://rcl-radio.ru/wp-content/uploads/2019/06/IRremote.zip
#include <PT2258.h> // https://github.com/liman324/PT2258.git
#include <DS3231.h>

#include <microDS18B20.h>

PT2258 pt;
LiquidCrystal_I2C lcd(0x3F, 20, 4); // Устанавливаем дисплей
Encoder myEnc(9, 8);// DT, CLK
IRrecv irrecv(11); // указываем вывод модуля IR приемника
decode_results ir;
DS3231 clock; RTCDateTime DateTime;

MicroDS18B20<5> sensor;

//запись кодов символов в экран
byte v1[8] = {B00111,B01111,B11111,B11111,B11111,B11111,B11111,B11111};
byte v2[8] = {B11111,B11111,B11111,B00000,B00000,B00000,B00000,B00000};      
byte v3[8] = {B11100,B11110,B11111,B11111,B11111,B11111,B11111,B11111};
byte v4[8] = {B11111,B11111,B11111,B11111,B11111,B11111,B01111,B00111};
byte v5[8] = {B00000,B00000,B00000,B00000,B00000,B11111,B11111,B11111};
byte v6[8] = {B11111,B11111,B11111,B11111,B11111,B11111,B11110,B11100};
byte v7[8] = {B11111,B11111,B11111,B00000,B00000,B00000,B11111,B11111};
byte v8[8] = {B11111,B11111,B11111,B11111,B11111,B11111,B11111,B11111}; 
//обьявление переменных
unsigned long times,oldPosition  = -999,newPosition; 
int vol, ch1, ch2, ch3, ch4, ch5, ch6, menu, menu1, menu2, brig, brig0, brig1, temp0, i;
bool mute, power, w, w1, gr1, gr2,termo;
byte a[6], d1, d2, d3, d4, d5, d6, e1, e2, e3, x, www, tim_w;
int hour, minut, secon, data, mon, year, time_temp;
byte mesto2[8] = {0, 10, 0, 10, 0, 10, 0, 10};
byte mesto3[8] = {0, 0, 1, 1, 2, 2, 3, 3};
int hh, mm, ss, dd, mn, gg;
byte standby = 1;
int pin7=0;
int x_timer;

//приготовились.....
void setup() {
  irrecv.enableIRIn(); lcd.init(); lcd.backlight(); Wire.begin(); clock.begin(); Serial.begin(9600);
  MsTimer2::set(1, to_Timer); MsTimer2::start();
  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);
  if (EEPROM.read(100) != 0) {
    for (int i = 0; i < 101; i++) {
      EEPROM.update(i, 0); // очистка памяти при первом включении
    }
  }

//объявление входов,выходов

//pinMode(0)                    //serial port
//pinMode(1)                    //serial port
  pinMode(2, INPUT_PULLUP);     // КНОПКА SET
  pinMode(3, INPUT_PULLUP);     // КНОПКА MUTE
  pinMode(4, INPUT_PULLUP);     // КНОПКА POWER
//pinMode(5)                    // термодатчик 18B20
  pinMode(6, OUTPUT);           // ВЫХОД УПРАВЛЕНИЯ ПОДСВЕТКОЙ
  pinMode(7, OUTPUT);           // ВЫХОД АКТИВАЦИИ АНАЛИЗАТОРА СПЕКТРА
//pinMode(8) Encoder myEnc(8);  //CLK
//pinMode(9) Encoder myEnc(9);  //DT
  pinMode(10, INPUT);           // МЕНЮ КНОПКА SW энкодера
//pinMode(11) IRrecv irrecv(11);// указываем вывод модуля IR приемника
  pinMode(12, OUTPUT);          // Выход управления STANDBY - реле включения усилителя
  pinMode(13, OUTPUT);          // Выход управления STANDBY--- c задержкой для реле софтстарта усилителя

//входы для индикации аварий каналов, кому не надо можете удалить от этого места....

  pinMode(14, INPUT_PULLUP);          //вход аварии левый  передний   /норма +5 вольт, авария 0 вольт/ замыкаем на землю при аварии
  pinMode(15, INPUT_PULLUP);          //вход аварии левый  задний     /норма +5 вольт, авария 0 вольт/ замыкаем на землю при аварии
  pinMode(16, INPUT_PULLUP);          //вход аварии центральный канал /норма +5 вольт, авария 0 вольт/ замыкаем на землю при аварии
  pinMode(17, INPUT_PULLUP);          //вход аварии сабвуфера          /норма +5 вольт, авария 0 вольт/ замыкаем на землю при аварии
  
  pinMode(A6, INPUT);                 //вход аварии правый передний   /норма +5 вольт, авария 0 вольт/ замыкаем на землю при аварии
  //чисто аналоговый вход             //вот тут вход привязываем к +5 вольт через резистор 10 кОм, обязательно,да програмно пробовал
                                      //ловит наводки, лучше железно, рядом с ардуиной, так надежнее
                                      
  pinMode(A7, INPUT);                 //вход аварии правый задний     /норма +5 вольт, авария 0 вольт/ замыкаем на землю при аварии
  //чисто аналоговый вход             //вот тут вход привязываем к +5 вольт через резистор 10 кОм, обязательно,да программно пробовал
                                      //ловит наводки, лучше железно, рядом с ардуиной, так надежнее
///....до этого......
  clock.setDateTime(__DATE__, __TIME__); // Устанавливаем время на часах, основываясь на времени компиляции скетча
  vol = EEPROM.read(0); ch1 = EEPROM.read(1); ch2 = EEPROM.read(2); ch3 = EEPROM.read(3);
  ch4 = EEPROM.read(4); ch5 = EEPROM.read(5); ch6 = EEPROM.read(6);
  brig0 = EEPROM.read(7); brig1 = EEPROM.read(8);
  analogWrite(6, brig0 * 25);

  digitalWrite(12, LOW);
  digitalWrite(13, LOW);
  delay(500);
  audio();
       
}
/////////////////поехали/////////////////////////////////////////////
void loop() {
  /// READ TIME /////////////////////////////////
  DateTime = clock.getDateTime(); hour = DateTime.hour; minut = DateTime.minute; secon = DateTime.second;
  data = DateTime.day; mon = DateTime.month; year = DateTime.year;
  

  /// BUTTON ////////////////////////////////////
  //// МЕНЮ КНОПКА c энкодера
  if (power == 0) {
    if ((digitalRead(10) == LOW || ir.value == OK) && menu == 1) {menu1++;delay(200);times = millis();cl1();w = 1;w1 = 1;
      if (menu1 > 7) {menu1 = 0;}
    }
    if (digitalRead(10) == LOW && menu == 2) {menu2++;delay(200);times = millis();w = 1;w1 = 1;
      if (menu2 > 5) {menu2 = 0;}
    }
/////////////Долгое нажатие кнопки энкодера(больше 5 секунд)
////////////---включение/отключение АНАЛИЗАТОРА СПЕКТРА  на втором экране/////////////////
    
    if (digitalRead(10) == LOW && menu==0){delay(200);x_timer++;}// держим кнопку, идет счет x_timer
    if (digitalRead(10) == HIGH) {x_timer=0;} // если отпустить кнопку то x_timer сбрасывается
    if (x_timer > 12 && pin7==0) {digitalWrite(7,HIGH);pin7=1;x_timer=0;} // 12*200 мс + время работы цикла = 5с включаем пин 7 если он был выключен
    if (x_timer > 12 && pin7==1) {digitalWrite(7,LOW);pin7=0;x_timer=0;} //  12*200 мс + время работы цикла = 5с выключаем пин 7 если он был включен
     
    // МЕНЮ КНОПКА SET
    if ((digitalRead(2) == LOW || ir.value == SET) && digitalRead(10) == HIGH) {menu++;delay(200);times = millis();cl();w = 1;w1 = 1;menu1 = 0;
      if (menu > 1) {menu = 0; }
    }
    // МЕНЮ КНОПКА SET time(нажатие одновременно кнопки энкодера и кнопкиSET)
    if (digitalRead(2) == LOW && digitalRead(10) == LOW) {menu = 2;delay(200);times = millis();cl();w = 1;w1 = 1;lcd.setCursor(2, 1);
    lcd.print("TIME CORRECTION");delay(1000);
    }
    // МЕНЮ КНОПКА MUTE - mute on
    if ((digitalRead(3) == LOW || ir.value == MUT) && mute == 0) {mute = 1;cl();audio();menu = 100;brig=brig1;analogWrite(6, brig * 25);
    //слово MUTE//да, охренеть! можно проще? и круче --- поправляйте!(просто "MUTE" не прет!!!)(и массивы ниасилил йа......)
   
   //1 символ "М"+пробел"
    lcd.setCursor(1,0);lcd.write(3);lcd.print("  ");lcd.write(1);lcd.print(" ");
    lcd.setCursor(1,1);lcd.write(8);lcd.write(3);lcd.write(1);lcd.write(8);lcd.print(" ");
    lcd.setCursor(1,2);lcd.write(8);lcd.print("  ");lcd.write(8);lcd.print(" ");
   
    //2 символ "U"+пробел"
    lcd.setCursor(6,0);lcd.write(3);lcd.print("  ");lcd.write(1);lcd.print(" ");  
    lcd.setCursor(6,1);lcd.write(8);lcd.print("  ");lcd.write(8);lcd.print(" ");
    lcd.setCursor(6,2);lcd.write(4);lcd.write(8);lcd.write(8);lcd.write(6);lcd.print(" ");
    
     //3 символ "T"+пробел"
    
    lcd.setCursor(11,0);lcd.write(8);lcd.write(8);lcd.write(8);lcd.print(" ");
    lcd.setCursor(11,1);lcd.print(" ");lcd.write(8);lcd.print("  ");
    lcd.setCursor(11,2);lcd.print(" ");lcd.write(8);lcd.print("  ");
    
    //4 символ "E"+пробел"

    lcd.setCursor(15,0);lcd.write(1);lcd.write(2);lcd.write(2);lcd.write(2);
    lcd.setCursor(15,1);lcd.write(8);lcd.write(2);lcd.write(2);
    lcd.setCursor(15,2);lcd.write(4);lcd.write(5);lcd.write(5);lcd.write(5);

    
            
    delay(500);
    }
     // МЕНЮ КНОПКА MUTE - mute off
    if ((digitalRead(3) == LOW || ir.value == MUT) && mute == 1) {mute = 0;cl();times = millis();w = 1;w1 = 1;menu = 0;menu1 = 0;myEnc.write(0);newPosition = 0;brig=brig0;analogWrite(6, brig * 25);audio();}
    }
   // МЕНЮ КНОПКА POWER
   //сначала ВЫКЛЮЧЕНИЕ
    if (((digitalRead(4) == LOW || ir.value == POWER) && power == 0) || standby == 1)  {menu1 = 0;  mute = 1; audio();
    power = 1; standby = 0;//сначала вырубаем звук....
/////    в цикле плавное снижение уровня подсветки.....
    for (i = 1; i <=10 ; i++) {
     switch (i) {
      case 0:brig = 10;analogWrite(6, brig * 25); break;
      case 1:brig = 9; analogWrite(6, brig * 25); break;
      case 2:brig = 8; analogWrite(6, brig * 25); break;
      case 3:brig = 7; analogWrite(6, brig * 25); break;
      case 4:brig = 6; analogWrite(6, brig * 25); break;
      case 5:brig = 5; analogWrite(6, brig * 25); break;
      case 6:brig = 4; analogWrite(6, brig * 25); break;
      case 7:brig = 3; analogWrite(6, brig * 25); break;
      case 8:brig = 2; analogWrite(6, brig * 25); break;
      case 9:brig = 1; analogWrite(6, brig * 25); break;
      }
          cl();times = millis(); w = 1; w1 = 1; menu = 100; //выключаем все и врубаем меню STANDBY.....
   
    }
    }
    
  // power on- ЭКРАН ПРИ ВКЛЮЧЕНИИ
  //потом ВКЛЮЧЕНИЕ
    if ((digitalRead(4) == LOW || ir.value == POWER) && power == 1) {
    power = 0; cl();times = millis(); w = 1; w1 = 1; menu = 0; menu1 = 0;myEnc.write(0);newPosition = 0; brig = brig0;
    digitalWrite(12, HIGH);//включение питания 1й выход
    lcd.setCursor(0, 0); lcd.print("  BU DIGITAL SARAY  ");//1 строка    
    lcd.setCursor(0, 1); lcd.print("POWER AMPLIFIER  5.1");//2 строка
    lcd.setCursor(0, 2); lcd.print("   SYSTEM LOADING   ");//3 строка
    for(int i=1;i<=10;i++){ brig=i; analogWrite(6, brig * 25);delay(200);//плавное включение подсветки при ВКЛЮЧЕНИИ
    }
    //дальше полоса загрузки
    lcd.setCursor(0, 3); lcd.write(5); delay(200); lcd.write(2); delay(200); lcd.write(5); delay(200); lcd.write(2); delay(200);
                         lcd.write(5); delay(200); lcd.write(2); delay(200); lcd.write(5); delay(200); lcd.write(2); delay(200);
                         lcd.write(5); delay(200); lcd.write(2); delay(200);//бегущая полоска загрузки 4 строка
                         digitalWrite(13, HIGH); //включение питания с задержкой(софтстарт) 2й выход
                         //можно ставить в любое место,в строку загрузки, в зависимости  от величины задержки включения 2го выхода
                         lcd.write(5); delay(200); lcd.write(2); delay(200); lcd.write(5); delay(200); lcd.write(2); delay(200);                         
                         lcd.write(5); delay(150); lcd.write(2); delay(150); lcd.write(5); delay(150); lcd.write(2); delay(150);
                         lcd.write(5); delay(100); lcd.write(2); delay(100);//бегущая полоска загрузки 4 строка    
    
    
    mute = 0; audio(); cl();//команда MUTE при включении снимается после полной загрузки экрана
    
  } 
  // power off//выключение
  if (power == 1) {digitalWrite(12, LOW);} // output standby
   
  else {digitalWrite(12, HIGH);}
 
  if (power == 1) {digitalWrite(13, LOW);} // output standby delay
  
  /// IR ////////////////////////////////////////
  if ( irrecv.decode( &ir )) {
    Serial.print("0x");  // IR приемник - чтение, в мониторе порта отображаются коды кнопок
    Serial.println( ir.value, HEX);
    //Serial.println (sensor_Alarm_1);
    //Serial.println (sensor_Alarm_2);
    irrecv.resume();
    times = millis();
    w = 1;
    w1 = 1;
  }
  if (ir.value == 0) {
    gr1 = 0;  // запрет нажатий не активных кнопок пульта
    gr2 = 0;
  }

  ////////////// VOLUME ///////////////////////////////////////////////////////////////////
  
  if (menu == 0) {
    // кнопка >
    if (ir.value == VOLUME_UP && mute == 0 && power == 0) {vol++;gr1 = 1;gr2 = 0;cl1();times = millis();w = 1;vol_func();audio();}
    // кнопка >>>>>>
    if (ir.value == 0xFFFFFFFF and gr1 == 1) {vol++;gr2 = 0;cl1();times = millis();;w = 1;vol_func();audio();}
    // кнопка <
    if (ir.value == VOLUME_DW) {vol--;gr1 = 0;gr2 = 1;cl1();times = millis();;w = 1;vol_func();audio();}
    // кнопка <<<<<<
    if (ir.value == 0xFFFFFFFF and gr2 == 1) {vol--;gr1 = 0;cl1();times = millis();w = 1;vol_func();audio();}

    if (newPosition != oldPosition) {oldPosition = newPosition;vol = vol + newPosition;
        myEnc.write(0);newPosition = 0; times = millis();w = 1;w1 = 1;vol_func();audio();}
        
    a[0] = (vol) / 10; a[1] = (vol) % 10;
    for (x = 0; x < 2; x++) {
      switch (x) {
        case 0: e1 = 10, e2 = 11, e3 = 12;break;
        case 1: e1 = 14, e2 = 15, e3 = 16;break;} 
        digit();
    }
    //Минус (гаснущий при нуле) перед цифрами уровня громкости
    lcd.setCursor(8, 0); if (vol > 0) {lcd.write(5);} else {lcd.print(" ");//{lcd.write(5);---какой символ отображать----из таблички  в начале скейча
    }
    ////Вывод температуры на основной экран///////
    static uint32_t timTemp;
    if (millis() - timTemp >= 800) {
    timTemp = millis();  ///время опроса датчика
    // читаем прошлое значение
    if (sensor.readTemp()) {lcd.setCursor(16, 3);lcd.print(sensor.getTemp(),0);lcd.write(223);lcd.print("C");}//выводим на экран
    else {lcd.setCursor(16, 3);lcd.print("--ER");delay(250);lcd.setCursor(16, 3);lcd.print("    ");}//если обрыв датчика пишем error
    // запрашиваем новое измерение
    sensor.requestTemp();
    
    //термозащита //4 строка
    
    //вот тут меняем уставку защиты.....50...90 градусов....или 100))))
    //если температура превышает уставку.....
    if ((sensor.getTemp())>30){mute = 1; audio(); termo=1;//вырубаем звук
    //вместо часов выводим сообщение....
    lcd.setCursor(0, 3);lcd.print("TERMO  OVERLOAD ");delay(450);   
    //тут пишем максимальную температуру, как в уставке       
    lcd.setCursor(0, 3);lcd.print("   MAX t 30");lcd.write(223);lcd.print("C   ");delay(450);  
    lcd.setCursor(0, 3);lcd.print("     !MUTE!     ");delay(450);
             
    }   //если температура в норме.....   
      else { mute = 0; audio();termo=0;//врубаем звук    
      //возвращаем часы .....
      lcd.setCursor(0, 3);
      lcd.print(hour / 10); lcd.print(hour % 10); lcd.print(":");
      lcd.print(minut / 10); lcd.print(minut % 10); lcd.print(":");
      lcd.print(secon / 10); lcd.print(secon % 10); lcd.print("       ");}
    }
   
    //надписи основного экрана/ индикация аварии каналов
   //1 строка
        lcd.setCursor(0, 0); lcd.print(" VOLUME ");
   //2 строка начало
        lcd.setCursor(0, 1); lcd.print(" 5.1 CH ");
   //2 строка в конце 
        lcd.setCursor(18,1); lcd.print("dB");//2 строка после цифр уровня громкости

    // индикаторы неисправности каналов// кому не нужно раскоментируйте строку ниже
    //lcd.setCursor(0, 2); lcd.print("--------------------");//3 строка
        //и все остальное можете удалить, от этого места.......
    int sensor_Alarm_1 = analogRead(A6);//считываем сигнал аварии правого переднего канала
    int sensor_Alarm_2 = analogRead(A7);//считываем сигнал аварии правого заднего канала
       
    //левый передний
   if (digitalRead(14) == HIGH)                                                              
       {lcd.setCursor(0, 2);lcd.write(42);lcd.write(42);lcd.write(42);}                      
   if (digitalRead(14) == LOW ) {if ((millis() % 1000) > 500)                                
       {lcd.setCursor(0, 2); lcd.print("FL ");}
   else{lcd.setCursor(0, 2); lcd.print("DC ");}
    }
    //левый задний
   if (digitalRead(15) == HIGH)
       {lcd.setCursor(3, 2);lcd.write(42);lcd.write(42);lcd.write(42);}
   if (digitalRead(15) == LOW) {if ((millis() % 1000) > 500) 
       {lcd.setCursor(3, 2); lcd.print("RL ");}
   else{lcd.setCursor(3, 2); lcd.print("DC ");}
    }
    //центральный
   if (digitalRead(16) == HIGH)
       {lcd.setCursor(6, 2);lcd.write(42);lcd.write(42);lcd.write(42);lcd.write(42);}
   if (digitalRead(16) == LOW) {if ((millis() % 1000) > 500)
       {lcd.setCursor(6, 2); lcd.print("CNTR");}
   else{lcd.setCursor(6, 2); lcd.print(" DC ");}
    }
    //сабвуфер
   if (digitalRead(17) == HIGH) 
       {lcd.setCursor(10, 2);lcd.write(42);lcd.write(42);lcd.write(42);lcd.write(42);}
   if (digitalRead(17) == LOW) {if ((millis() % 1000) > 500) 
       {lcd.setCursor(10, 2); lcd.print(" SUB");}
   else{lcd.setCursor(10, 2); lcd.print(" D C");}
    }
     //правый  передний/// тут пришлось поковыряться......вход А6 чисто аналоговый
   if (sensor_Alarm_1 > 500) 
       {lcd.setCursor(14, 2);lcd.write(42);lcd.write(42);lcd.write(42);}
   if (sensor_Alarm_1 < 10) {if ((millis() % 1000) > 500) 
       {lcd.setCursor(14, 2); lcd.print(" FR");}
   else{lcd.setCursor(14, 2); lcd.print(" DC");}
   } 
    //правый  задний /// и тут тоже пришлось поковыряться......вход А7 чисто аналоговый
   if (sensor_Alarm_2 > 500) 
       {lcd.setCursor(17, 2);lcd.write(42);lcd.write(42);lcd.write(42);}
   if (sensor_Alarm_2 < 10) {if ((millis() % 1000) > 500) 
       {lcd.setCursor(17, 2); lcd.print(" RR");}
   else{lcd.setCursor(17, 2); lcd.print(" DC");}

   ////до сюда.....
   }    
    //яркость подсветки.... автоматическое снижение при неактивных кнопках.....
    //  ждем 10 сек и выключаем подсветку
     static uint32_t times_led;
     if (millis() - times_led >= 10000){ brig = brig1;analogWrite(6, brig * 25);}
    // если кнопка нажата, то включаем подсветку и обнуляем переменную times_led
     if(digitalRead(2)==LOW || digitalRead(3)==LOW || digitalRead(4)==LOW ||
       digitalRead(8)==LOW || digitalRead(9)==LOW || digitalRead(10)==LOW ||
       digitalRead(14) == LOW||digitalRead(15) == LOW||digitalRead(16) == LOW||
       digitalRead(17) == LOW||sensor_Alarm_1 < 10||sensor_Alarm_2 < 10||
       ir.value == OK || ir.value == SET || ir.value == MUT || ir.value == POWER ||
       termo == 1 || gr1==1 || gr2==1)
       { times_led=millis(); brig = brig0;analogWrite(6, brig * 25); }
       
   }
  ///////// ATT //////////////////////////////////////////////////////////////////////////////
      if (menu == 1) {
      switch (menu1) {
      case 0: temp0 = ch1; break;
      case 1: temp0 = ch2; break;
      case 2: temp0 = ch3; break;
      case 3: temp0 = ch4; break;
      case 4: temp0 = ch5; break;
      case 5: temp0 = ch6; break;
      case 6: temp0 = brig0; break;
      case 7: temp0 = brig1; break;
    }
    // кнопка >
    if (ir.value == VOLUME_UP) {temp0--; gr1 = 1;gr2 = 0;cl1();times = millis();w = 1;www = 1;}
    // кнопка >>>>>>
    if (ir.value == 0xFFFFFFFF and gr1 == 1) {temp0--;gr2 = 0;cl1();times = millis();;w = 1;w = 1;www = 1;}
    // кнопка <
    if (ir.value == VOLUME_DW) {temp0++; gr1 = 0;gr2 = 1;cl1();times = millis();;w = 1;w = 1;www = 1;
    }
    // кнопка <<<<<<
    if (ir.value == 0xFFFFFFFF and gr2 == 1) {temp0++;gr1 = 0;cl1();times = millis();w = 1;w = 1;www = 1;}

    if (newPosition != oldPosition) {oldPosition = newPosition;temp0 = temp0 - newPosition; myEnc.write(0); newPosition = 0; times = millis(); w = 1; www = 1;
    }

    switch (menu1) {
      case 0: ch1 = temp0; if (ch1 < 0) {ch1 = 0;} if (ch1 > 15) {ch1 = 15;} break;
      case 1: ch2 = temp0; if (ch2 < 0) {ch2 = 0;} if (ch2 > 15) {ch2 = 15;} break;
      case 2: ch3 = temp0; if (ch3 < 0) {ch3 = 0;} if (ch3 > 15) {ch3 = 15;} break;
      case 3: ch4 = temp0; if (ch4 < 0) {ch4 = 0;} if (ch4 > 15) {ch4 = 15;} break;
      case 4: ch5 = temp0; if (ch5 < 0) {ch5 = 0;} if (ch5 > 15) {ch5 = 15;} break;
      case 5: ch6 = temp0; if (ch6 < 0) {ch6 = 0;} if (ch6 > 15) {ch6 = 15;} break;
      case 6: brig0 = temp0; brig0_func(); break;
      case 7: brig1 = temp0; brig1_func(); break;
    }

    au();
    if (menu1 < 7) {brig = brig0;}
    if (menu1 == 7) {brig = brig1;}
    analogWrite(6, brig * 25);

    for (i = 0; i < 8; i++) {
      if (menu1 == i) {
        lcd.setCursor(mesto2[i], mesto3[i]);
        lcd.print(char(126));
      } else {
        lcd.setCursor(mesto2[i], mesto3[i]);
        lcd.print(" ");
      }
    }

    lcd.setCursor(1, 0); lcd.print("Lfront"); if (ch1 == 0) {
      lcd.print(" ");
    } lcd.print(-ch1); if (ch1 < 10) {
      lcd.print(" ");
    }
    lcd.setCursor(11, 0); lcd.print("Rfront"); if (ch2 == 0) {
      lcd.print(" ");
    } lcd.print(-ch2); if (ch2 < 10) {
      lcd.print(" ");
    }
    lcd.setCursor(1, 1); lcd.print("L rear"); if (ch3 == 0) {
      lcd.print(" ");
    } lcd.print(-ch3); if (ch3 < 10) {
      lcd.print(" ");
    }
    lcd.setCursor(11, 1); lcd.print("R rear"); if (ch4 == 0) {
      lcd.print(" ");
    } lcd.print(-ch4); if (ch4 < 10) {
      lcd.print(" ");
    }
    lcd.setCursor(1, 2); lcd.print("Center"); if (ch5 == 0) {
      lcd.print(" ");
    } lcd.print(-ch5); if (ch5 < 10) {
      lcd.print(" ");
    }
    lcd.setCursor(11, 2); lcd.print("SubW  "); if (ch6 == 0) {
      lcd.print(" ");
    } lcd.print(-ch6); if (ch6 < 10) {
      lcd.print(" ");
    }
    lcd.setCursor(1, 3); lcd.print("BR ON "); lcd.print(brig0); lcd.print(" ");
    lcd.setCursor(11, 3); lcd.print("BR OFF "); lcd.print(brig1); lcd.print(" ");
  }

  //////// menu set time /////////////////////////////////////
  if (menu == 2) {
    hh = DateTime.hour; mm = DateTime.minute; ss = DateTime.second; dd = DateTime.day; mn = DateTime.month; gg = DateTime.year;
    switch (menu2) {
      case 0: time_temp = hh; break;
      case 1: time_temp = mm; break;
      case 2: time_temp = ss; break;
      case 3: time_temp = dd; break;
      case 4: time_temp = mn; break;
      case 5: time_temp = gg; break;
    }


    if (newPosition != oldPosition) {
      oldPosition = newPosition;
      time_temp = time_temp - newPosition; myEnc.write(0); newPosition = 0; times = millis(); w = 1; tim_w = 1;
    }

    switch (menu2) {
      case 0: hh = time_temp; 
      if (hh < 0) {hh = 0;} 
      if (hh > 23) {hh = 23;} break;
      case 1: mm = time_temp; 
      if (mm < 0) {mm = 0;} 
      if (mm > 59) {mm = 59;} break;
      case 2: ss = time_temp; 
      if (ss < 0) {ss = 0;} 
      if (ss > 59) {ss = 59;} break;
      case 3: dd = time_temp; 
      if (dd < 1) {dd = 1;}
      if (dd > 31) {dd = 31;} break;
      case 4: mn = time_temp;
      if (mn < 1) {mn = 1;} 
      if (mn > 12) {mn = 12;} break;
      case 5: gg = time_temp; 
      if (gg < 2022) {gg = 2022;} 
      if (gg > 2100) {gg = 2100;} break;
    }

    lcd.setCursor(0, 0); lcd.print("TIME CORRECTION");
    lcd.setCursor(0, 1); lcd.print("--------------------");
    lcd.setCursor(0, 2);
    if (menu2 == 0) {
      lcd.print("set hour   ");
    }
    if (menu2 == 1) {
      lcd.print("set minute ");
    }
    if (menu2 == 2) {
      lcd.print("set seconds");
    }
    if (menu2 == 3) {
      lcd.print("set date   ");
    }
    if (menu2 == 4) {
      lcd.print("set month  ");
    }
    if (menu2 == 5) {
      lcd.print("set year   ");
    }

    lcd.setCursor(0, 3);
    lcd.print(hour / 10); lcd.print(hour % 10); lcd.print(":");
    lcd.print(minut / 10); lcd.print(minut % 10); lcd.print(":");
    lcd.print(secon / 10); lcd.print(secon % 10); lcd.print(" ");
    lcd.print(data / 10); lcd.print(data % 10); lcd.print("-");
    lcd.print(mon / 10); lcd.print(mon % 10); lcd.print("-");
    lcd.print(year);


    if (tim_w == 1) {
      tim_w = 0;
      clock.setDateTime(gg, mn, dd, hh, mm, ss);
      delay(100);
    }
  }

  /////// EEPROM //////////////////////////////////////
  if (millis() - times > 5000 && w1 == 1 && mute == 0 && power == 0) {
    w1 = 0;
    EEPROM.update(0, vol); EEPROM.update(1, ch1); EEPROM.update(2, ch2); EEPROM.update(3, ch3);
    EEPROM.update(4, ch4); EEPROM.update(5, ch5); EEPROM.update(6, ch6);
    EEPROM.update(7, brig0); EEPROM.update(8, brig1);
  if(menu!=0){cl();}
  }

  if (power == 1) {
   
    a[0] = DateTime.hour / 10;
    a[1] = DateTime.hour % 10;
    a[2] = DateTime.minute / 10;
    a[3] = DateTime.minute % 10;
    //a[4] = DateTime.second / 10;
    //a[5] = DateTime.second % 10;

    //for (i = 0; i < 6; i++) {
    for (i = 0; i < 4; i++) {
      switch (i) {
        case 0: e1 = 1, e2 = 2, e3 = 3; break;//десятки часов
        case 1: e1 = 5, e2 = 6, e3 = 7; break;//единицы часов
        case 2: e1 = 12, e2 = 13, e3 = 14; break;//десятки минут
        case 3: e1 = 16, e2 = 17, e3 = 18; break;//единицы минут
        //case 4: e1 = 14, e2 = 15, e3 = 16; break;//не надо
       // case 5: e1 = 17, e2 = 18, e3 = 19; break;//не надо
      }
      switch (a[i]) {
        case 0: d1=1,d2=2,d3=3,d4=4,d5=5,d6=6;break;
        case 1: d1=2,d2=3,d3=32,d4=5,d5=8,d6=5;break;
        case 2: d1=7,d2=7,d3=3,d4=8,d5=5,d6=5;break;
        case 3: d1=7,d2=7,d3=3,d4=5,d5=5,d6=6;break;
        case 4: d1=4,d2=5,d3=8,d4=32,d5=32,d6=8;break;
        case 5: d1=8,d2=7,d3=7,d4=5,d5=5,d6=6;break;
        case 6: d1=1,d2=7,d3=7,d4=4,d5=5,d6=6;break;
        case 7: d1=2,d2=2,d3=3,d4=32,d5=32,d6=8;break;
        case 8: d1=1,d2=7,d3=3,d4=4,d5=5,d6=6;break;
        case 9: d1=1,d2=7,d3=3,d4=5,d5=5,d6=6;break;
      }
///////////////положение цифр на экране///сейчас 2я и 3я строка..........
      lcd.setCursor(e1, 1); lcd.write((uint8_t)d1); lcd.setCursor(e2, 1); lcd.write((uint8_t)d2); lcd.setCursor(e3, 1); lcd.write((uint8_t)d3);
      lcd.setCursor(e1, 2); lcd.write((uint8_t)d4); lcd.setCursor(e2, 2); lcd.write((uint8_t)d5); lcd.setCursor(e3, 2); lcd.write((uint8_t)d6);
    }
  

//точки между цифр
      //lcd.setCursor(9,1);lcd.write(2);lcd.setCursor(10,1);lcd.write(2);
      //lcd.setCursor(9,2);lcd.write(5);lcd.setCursor(10,2);lcd.write(5);
       if(secon % 10 == 1||secon % 10 == 3||secon % 10 == 5||secon % 10 == 7||secon % 10 == 9)
       {lcd.setCursor(9,1) ;lcd.write(2);  lcd.print(" ");
        lcd.setCursor(9,2);lcd.print(" ");lcd.write(5);}
      //четное - точки2( можно пробелы вставить---lcd.print(" ");---)
      if(secon % 10 == 0||secon % 10 == 2||secon % 10 == 4||secon % 10 == 6||secon % 10 == 8)
       {lcd.setCursor(9,1) ;lcd.print(" ");lcd.write(2);
        lcd.setCursor(9,2);lcd.write(5);  lcd.print(" ");}
//перемещение снежинок......////много кода......много...........//аааааааааааааааааааа////кто может лучше и проще, меняйте.............   
  
      if(secon % 10 == 0&&secon / 10 == 0||secon % 10 == 0&&secon / 10 == 2||secon % 10 == 0&&secon / 10 == 4)
           {lcd.setCursor(0,0);lcd.write(42);lcd.setCursor(19,3);lcd.write(42);}
      else {lcd.setCursor(0,0);lcd.print(" ");lcd.setCursor(19,3);lcd.print(" ");}
      
      if(secon % 10 == 1&&secon / 10 == 0||secon % 10 == 1&&secon / 10 == 2||secon % 10 == 1&&secon / 10 == 4)
           {lcd.setCursor(1,0);lcd.write(42);lcd.setCursor(18,3);lcd.write(42);}
      else {lcd.setCursor(1,0);lcd.print(" ");lcd.setCursor(18,3);lcd.print(" ");}  
        
      if(secon % 10 == 2&&secon / 10 == 0||secon % 10 == 2&&secon / 10 == 2||secon % 10 == 2&&secon / 10 == 4)
           {lcd.setCursor(2,0);lcd.write(42);lcd.setCursor(17,3);lcd.write(42);}
      else {lcd.setCursor(2,0);lcd.print(" ");lcd.setCursor(17,3);lcd.print(" ");} 
          
      if(secon % 10 == 3&&secon / 10 == 0||secon % 10 == 3&&secon / 10 == 2||secon % 10 == 3&&secon / 10 == 4)
           {lcd.setCursor(3,0);lcd.write(42);lcd.setCursor(16,3);lcd.write(42);}
      else {lcd.setCursor(3,0);lcd.print(" ");lcd.setCursor(16,3);lcd.print(" ");}  
         
      if(secon % 10 == 4&&secon / 10 == 0||secon % 10 == 4&&secon / 10 == 2||secon % 10 == 4&&secon / 10 == 4)
           {lcd.setCursor(4,0);lcd.write(42);lcd.setCursor(15,3);lcd.write(42);}
      else {lcd.setCursor(4,0);lcd.print(" ");lcd.setCursor(15,3);lcd.print(" ");}

      if(secon % 10 == 5&&secon / 10 == 0||secon % 10 == 5&&secon / 10 == 2||secon % 10 == 5&&secon / 10 == 4)
           {lcd.setCursor(5,0);lcd.write(42);lcd.setCursor(14,3);lcd.write(42);}
      else {lcd.setCursor(5,0);lcd.print(" ");lcd.setCursor(14,3);lcd.print(" ");} 
      
      if(secon % 10 == 6&&secon / 10 == 0||secon % 10 == 6&&secon / 10 == 2||secon % 10 == 6&&secon / 10 == 4)
           {lcd.setCursor(6,0);lcd.write(42);lcd.setCursor(13,3);lcd.write(42);}
      else {lcd.setCursor(6,0);lcd.print(" ");lcd.setCursor(13,3);lcd.print(" ");} 

      if(secon % 10 == 7&&secon / 10 == 0||secon % 10 == 7&&secon / 10 == 2||secon % 10 == 7&&secon / 10 == 4)
           {lcd.setCursor(7,0);lcd.write(42);lcd.setCursor(12,3);lcd.write(42);}
      else {lcd.setCursor(7,0);lcd.print(" ");lcd.setCursor(12,3);lcd.print(" ");} 

      if(secon % 10 == 8&&secon / 10 == 0||secon % 10 == 8&&secon / 10 == 2||secon % 10 == 8&&secon / 10 == 4)
           {lcd.setCursor(8,0);lcd.write(42);lcd.setCursor(11,3);lcd.write(42);}
      else {lcd.setCursor(8,0);lcd.print(" ");lcd.setCursor(11,3);lcd.print(" ");} 

      if(secon % 10 == 9&&secon / 10 == 0||secon % 10 == 9&&secon / 10 == 2||secon % 10 == 9&&secon / 10 == 4)
           {lcd.setCursor(9,0);lcd.write(42);lcd.setCursor(10,3);lcd.write(42);}
      else {lcd.setCursor(9,0);lcd.print(" ");lcd.setCursor(10,3);lcd.print(" ");} 
      
      ///////////////////////ааааааааааааааааааааааа///////////////////////////////////////////////
      
      if(secon % 10 == 0&&secon / 10 == 1||secon % 10 == 0&&secon / 10 == 3||secon % 10 == 0&&secon / 10 == 5)
           {lcd.setCursor(10,0);lcd.write(42);lcd.setCursor(9,3);lcd.write(42);}
      else {lcd.setCursor(10,0);lcd.print(" ");lcd.setCursor(9,3);lcd.print(" ");}
      
      if(secon % 10 == 1&&secon / 10 == 1||secon % 10 == 1&&secon / 10 == 3||secon % 10 == 1&&secon / 10 == 5)
           {lcd.setCursor(11,0);lcd.write(42);lcd.setCursor(8,3);lcd.write(42);}
      else {lcd.setCursor(11,0);lcd.print(" ");lcd.setCursor(8,3);lcd.print(" ");}  
        
      if(secon % 10 == 2&&secon / 10 == 1||secon % 10 == 2&&secon / 10 == 3||secon % 10 == 2&&secon / 10 == 5)
           {lcd.setCursor(12,0);lcd.write(42);lcd.setCursor(7,3);lcd.write(42);}
      else {lcd.setCursor(12,0);lcd.print(" ");lcd.setCursor(7,3);lcd.print(" ");} 
          
      if(secon % 10 == 3&&secon / 10 == 1||secon % 10 == 3&&secon / 10 == 3||secon % 10 == 3&&secon / 10 == 5)
           {lcd.setCursor(13,0);lcd.write(42);lcd.setCursor(6,3);lcd.write(42);}
      else {lcd.setCursor(13,0);lcd.print(" ");lcd.setCursor(6,3);lcd.print(" ");}  
         
      if(secon % 10 == 4&&secon / 10 == 1||secon % 10 == 4&&secon / 10 == 3||secon % 10 == 4&&secon / 10 == 5)
           {lcd.setCursor(14,0);lcd.write(42);lcd.setCursor(5,3);lcd.write(42);}
      else {lcd.setCursor(14,0);lcd.print(" ");lcd.setCursor(5,3);lcd.print(" ");}

      if(secon % 10 == 5&&secon / 10 == 1||secon % 10 == 5&&secon / 10 == 3||secon % 10 == 5&&secon / 10 == 5)
           {lcd.setCursor(15,0);lcd.write(42);lcd.setCursor(4,3);lcd.write(42);}
      else {lcd.setCursor(15,0);lcd.print(" ");lcd.setCursor(4,3);lcd.print(" ");} 
      
      if(secon % 10 == 6&&secon / 10 == 1||secon % 10 == 6&&secon / 10 == 3||secon % 10 == 6&&secon / 10 == 5)
           {lcd.setCursor(16,0);lcd.write(42);lcd.setCursor(3,3);lcd.write(42);}
      else {lcd.setCursor(16,0);lcd.print(" ");lcd.setCursor(3,3);lcd.print(" ");} 

      if(secon % 10 == 7&&secon / 10 == 1||secon % 10 == 7&&secon / 10 == 3||secon % 10 == 7&&secon / 10 == 5)
           {lcd.setCursor(17,0);lcd.write(42);lcd.setCursor(2,3);lcd.write(42);}
      else {lcd.setCursor(17,0);lcd.print(" ");lcd.setCursor(2,3);lcd.print(" ");} 

      if(secon % 10 == 8&&secon / 10 == 1||secon % 10 == 8&&secon / 10 == 3||secon % 10 == 8&&secon / 10 == 5)
           {lcd.setCursor(18,0);lcd.write(42);lcd.setCursor(1,3);lcd.write(42);}
      else {lcd.setCursor(18,0);lcd.print(" ");lcd.setCursor(1,3);lcd.print(" ");} 

      if(secon % 10 == 9&&secon / 10 == 1||secon % 10 == 9&&secon / 10 == 3||secon % 10 == 9&&secon / 10 == 5)
           {lcd.setCursor(19,0);lcd.write(42);lcd.setCursor(0,3);lcd.write(42);}
      else {lcd.setCursor(19,0);lcd.print(" ");lcd.setCursor(0,3);lcd.print(" ");}
      
      ////////////////////всеееееееееееееееееееееее///////////////////////////////
        
      //if(secon % 10 == 1||secon % 10 == 3||secon % 10 == 5||secon % 10 == 7||secon % 10 == 9)
      // {lcd.setCursor(9,0);lcd.write(2);lcd.setCursor(9,1);lcd.write(5);
       // lcd.setCursor(10,0);lcd.write(2);lcd.setCursor(10,1);lcd.write(5);}
      //четное - точки 2( можно пробелы вставить---lcd.print(" ");---)
     // if(secon % 10 == 0||secon % 10 == 2||secon % 10 == 4||secon % 10 == 6||secon % 10 == 8)
      //  {lcd.setCursor(9,0);lcd.write(5);lcd.setCursor(9,1);lcd.write(2);
     //   lcd.setCursor(10,0);lcd.write(5);lcd.setCursor(10,1);lcd.write(2);}
    
      //lcd.setCursor(0, 2); lcd.print("--------------------");
      //lcd.setCursor(6, 3); lcd.print("STAND BY");
  }


}  /// END LOOP


void au() {
  if (www == 1) {
    audio();
    www = 0;
  }
}
void cl() {
  ir.value = 0;
  delay(300);
  lcd.clear();
}
void cl1() {
  ir.value = 0;
  delay(200);
}
void brig1_func() {
  if (brig1 > 10) {
    brig1 = 10;
  } if (brig1 < 0) {
    brig1 = 0;
  }
}
void brig0_func() {
  if (brig0 > 10) {
    brig0 = 10;
  } if (brig0 < 0) {
    brig0 = 0;
  }
}
void audio() {
  pt.clear();
  //  pt.setVolume(75); //  int 0...79
  pt.setVol1(79 - (vol + ch1)); //  int 0...79
  pt.setVol2(79 - (vol + ch2)); //  int 0...79
  pt.setVol3(79 - (vol + ch3)); //  int 0...79
  pt.setVol4(79 - (vol + ch4)); //  int 0...79
  pt.setVol5(79 - (vol + ch5)); //  int 0...79
  pt.setVol6(79 - (vol + ch6)); //  int 0...79
  pt.setMute(mute); // mute 0 - off / 1 - on
}

void to_Timer() {
  newPosition = myEnc.read() / 4;
}
void vol_func() {
  if (0 > vol) {
    vol = 0;
  } if (64 < vol) {
    vol = 64;
  }
}

void digit() {
  switch (a[x]) {
    case 0: d1=1,d2=2,d3=3,d4=4,d5=5,d6=6;break;
    case 1: d1=2,d2=3,d3=32,d4=5,d5=8,d6=5;break;
    case 2: d1=7,d2=7,d3=3,d4=8,d5=5,d6=5;break;
    case 3: d1=7,d2=7,d3=3,d4=5,d5=5,d6=6;break;
    case 4: d1=4,d2=5,d3=8,d4=32,d5=32,d6=8;break;
    case 5: d1=8,d2=7,d3=7,d4=5,d5=5,d6=6;break;
    case 6: d1=1,d2=7,d3=7,d4=4,d5=5,d6=6;break;
    case 7: d1=2,d2=2,d3=3,d4=32,d5=32,d6=8;break;
    case 8: d1=1,d2=7,d3=3,d4=4,d5=5,d6=6;break;
    case 9: d1=1,d2=7,d3=3,d4=5,d5=5,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);
}

55

Re: PT2258 + LCD2004_I2C + IR + DS3231

А В какой программе Вы рисуете схемы?

Splan 7

56

Re: PT2258 + LCD2004_I2C + IR + DS3231

liman324 пишет:

А В какой программе Вы рисуете схемы?

Splan 7

Знакомая программка. Поделитесь файликом схемки данного проекта, чтобы с нуля не рисовать. А я внесу изменения согласно последнего скейча и сюда выложу картинку))))

57

Re: PT2258 + LCD2004_I2C + IR + DS3231

Данный контент доступен только зарегистрированным пользователям.

58

Re: PT2258 + LCD2004_I2C + IR + DS3231

liman324 пишет:

Данный контент доступен только зарегистрированным пользователям.

Спасибо.Работаю)http://forum.rcl-radio.ru/uploads/images/2022/07/ddf338105fdd00ef7f2cc7b92b84144a.jpg

Попутно проверял все функции в нашем скейче......
Ну не получается у меня пока с таймерами и задержками))))
Вот в этой конструкции

 //яркость подсветки.... автоматическое снижение при неактивных кнопках.....
    //  ждем 10 сек и выключаем подсветку
     static uint32_t times_led;
    if (millis() - times_led >= 10000) {brig = brig1;analogWrite(6, brig * 25);}
    // если кнопка нажата, то включаем подсветку и обнуляем переменную times_led
     if(digitalRead(2)  == LOW || digitalRead(3)  == LOW || digitalRead(4)  == LOW ||
        digitalRead(8)  == LOW || digitalRead(9)  == LOW || digitalRead(10) == LOW ||
        digitalRead(14) == LOW || digitalRead(15) == LOW || digitalRead(16) == LOW ||
        digitalRead(17) == LOW ||   sensor_Alarm_1 < 10  || sensor_Alarm_2 < 10    ||
        ir.value == OK || ir.value == SET || ir.value == MUT || ir.value == POWER  ||
        termo == 1 ||  gr1==1 || gr2==1 )
       { times_led=millis(); brig = brig0;analogWrite(6, brig * 25); }

Вроде все работает, таймер перезапускается при активации кнопок, аварийных сигналах, но....
При включении и выходе из режима STANDBY  на основной экран , подсветка рандомно гаснет....
Не через 10 секунд, как задумывалось. Может и сразу гаснуть после появления  основного экрана......
Как сделать, чтобы подсветка гасла  к примеру ЧЕРЕЗ 10 секунд ПОСЛЕ ПОЯВЛЕНИЯ ОСНОВНОГО ЭКРАНА
И потом при активации кнопок загоралась и опять гасла через 10 секунд.....
Подскажите, где, что добавить)))))или убрать....)))).
Да, в самом скейче чуть уменьшил задержки   на плавное увеличение/уменьшение яркости при вкл/выкл....

скейч целиком.....

//#define POWER     0x33B800FF
//#define VOLUME_UP 0x33B8E01F
//#define VOLUME_DW 0x33B810EF
//#define MUT       0x33B8946B
#define SET       0x42BD48B7
#define OK        0x42BD08F7


#define POWER     0x42BD50AF
#define VOLUME_UP 0x42BD6897
#define VOLUME_DW 0x42BDE01F
#define MUT       0x42BD609F

#include <Wire.h>
#include <LiquidCrystal_I2C.h> // http://forum.rcl-radio.ru/misc.php?action=pan_download&item=45&download=1
#include <Encoder.h>           // http://rcl-radio.ru/wp-content/uploads/2019/05/Encoder.zip       
#include <EEPROM.h>
#include <MsTimer2.h>          // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip 
#include <boarddefs.h>         // входит в состав библиотеки IRremote
#include <IRremote.h>          // http://rcl-radio.ru/wp-content/uploads/2019/06/IRremote.zip
#include <PT2258.h> // https://github.com/liman324/PT2258.git
#include <DS3231.h>

#include <microDS18B20.h>

PT2258 pt;
LiquidCrystal_I2C lcd(0x3F, 20, 4); // Устанавливаем дисплей
Encoder myEnc(9, 8);// DT, CLK
IRrecv irrecv(11); // указываем вывод модуля IR приемника
decode_results ir;
DS3231 clock; RTCDateTime DateTime;

MicroDS18B20<5> sensor;

//запись кодов символов в экран
byte v1[8] = {B00111,B01111,B11111,B11111,B11111,B11111,B11111,B11111};
byte v2[8] = {B11111,B11111,B11111,B00000,B00000,B00000,B00000,B00000};      
byte v3[8] = {B11100,B11110,B11111,B11111,B11111,B11111,B11111,B11111};
byte v4[8] = {B11111,B11111,B11111,B11111,B11111,B11111,B01111,B00111};
byte v5[8] = {B00000,B00000,B00000,B00000,B00000,B11111,B11111,B11111};
byte v6[8] = {B11111,B11111,B11111,B11111,B11111,B11111,B11110,B11100};
byte v7[8] = {B11111,B11111,B11111,B00000,B00000,B00000,B11111,B11111};
byte v8[8] = {B11111,B11111,B11111,B11111,B11111,B11111,B11111,B11111}; 
//обьявление переменных
unsigned long times,oldPosition  = -999,newPosition; 
int vol, ch1, ch2, ch3, ch4, ch5, ch6, menu, menu1, menu2, brig, brig0=10, brig1, temp0, i;
bool mute, power, w, w1, gr1, gr2,termo;
byte a[6], d1, d2, d3, d4, d5, d6, e1, e2, e3, x, www, tim_w;
int hour, minut, secon, data, mon, year, time_temp;
byte mesto2[8] = {0, 10, 0, 10, 0, 10, 0, 10};
byte mesto3[8] = {0, 0, 1, 1, 2, 2, 3, 3};
int hh, mm, ss, dd, mn, gg;
byte standby = 1;
int pin7=0;
int x_timer;

//приготовились.....
void setup() {
  irrecv.enableIRIn(); lcd.init(); lcd.backlight(); Wire.begin(); clock.begin(); Serial.begin(9600);
  MsTimer2::set(1, to_Timer); MsTimer2::start();
  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);
  if (EEPROM.read(100) != 0) {
    for (int i = 0; i < 101; i++) {
      EEPROM.update(i, 0); // очистка памяти при первом включении
    }
  }

//объявление входов,выходов

//pinMode(0)                    //serial port
//pinMode(1)                    //serial port
  pinMode(2, INPUT_PULLUP);     // КНОПКА SET
  pinMode(3, INPUT_PULLUP);     // КНОПКА MUTE
  pinMode(4, INPUT_PULLUP);     // КНОПКА POWER
//pinMode(5)                    // термодатчик 18B20
  pinMode(6, OUTPUT);           // ВЫХОД УПРАВЛЕНИЯ ПОДСВЕТКОЙ
  pinMode(7, OUTPUT);           // ВЫХОД АКТИВАЦИИ АНАЛИЗАТОРА СПЕКТРА
//pinMode(8) Encoder myEnc(8);  //CLK
//pinMode(9) Encoder myEnc(9);  //DT
  pinMode(10, INPUT);           // МЕНЮ КНОПКА SW энкодера
//pinMode(11) IRrecv irrecv(11);// указываем вывод модуля IR приемника
  pinMode(12, OUTPUT);          // Выход управления STANDBY - реле включения усилителя
  pinMode(13, OUTPUT);          // Выход управления STANDBY--- c задержкой для реле софтстарта усилителя

//входы для индикации аварий каналов, кому не надо можете удалить от этого места....

  pinMode(14, INPUT_PULLUP);          //вход аварии левый  передний   /норма +5 вольт, авария 0 вольт/ замыкаем на землю при аварии
  pinMode(15, INPUT_PULLUP);          //вход аварии левый  задний     /норма +5 вольт, авария 0 вольт/ замыкаем на землю при аварии
  pinMode(16, INPUT_PULLUP);          //вход аварии центральный канал /норма +5 вольт, авария 0 вольт/ замыкаем на землю при аварии
  pinMode(17, INPUT_PULLUP);          //вход аварии сабвуфера          /норма +5 вольт, авария 0 вольт/ замыкаем на землю при аварии
  
  pinMode(A6, INPUT);                 //вход аварии правый передний   /норма +5 вольт, авария 0 вольт/ замыкаем на землю при аварии
  //чисто аналоговый вход             //вот тут вход привязываем к +5 вольт через резистор 10 кОм, обязательно,да програмно пробовал
                                      //ловит наводки, лучше железно, рядом с ардуиной, так надежнее
                                      
  pinMode(A7, INPUT);                 //вход аварии правый задний     /норма +5 вольт, авария 0 вольт/ замыкаем на землю при аварии
  //чисто аналоговый вход             //вот тут вход привязываем к +5 вольт через резистор 10 кОм, обязательно,да программно пробовал
                                      //ловит наводки, лучше железно, рядом с ардуиной, так надежнее
///....до этого......
  clock.setDateTime(__DATE__, __TIME__); // Устанавливаем время на часах, основываясь на времени компиляции скетча
  vol = EEPROM.read(0); ch1 = EEPROM.read(1); ch2 = EEPROM.read(2); ch3 = EEPROM.read(3);
  ch4 = EEPROM.read(4); ch5 = EEPROM.read(5); ch6 = EEPROM.read(6);
  brig0 = EEPROM.read(7); brig1 = EEPROM.read(8);
  analogWrite(6, brig0 * 25);

  digitalWrite(12, LOW);
  digitalWrite(13, LOW);
  delay(500);
  audio();
       
}
/////////////////поехали/////////////////////////////////////////////
void loop() {
  /// READ TIME /////////////////////////////////
  DateTime = clock.getDateTime(); hour = DateTime.hour; minut = DateTime.minute; secon = DateTime.second;
  data = DateTime.day; mon = DateTime.month; year = DateTime.year;
  

  /// BUTTON ////////////////////////////////////
  //// МЕНЮ КНОПКА c энкодера
  if (power == 0) {
    if ((digitalRead(10) == LOW || ir.value == OK) && menu == 1) {menu1++;delay(200);times = millis();cl1();w = 1;w1 = 1;
      if (menu1 > 7) {menu1 = 0;}
    }
    if (digitalRead(10) == LOW && menu == 2) {menu2++;delay(200);times = millis();w = 1;w1 = 1;
      if (menu2 > 5) {menu2 = 0;}
    }
/////////////Долгое нажатие кнопки энкодера(больше 5 секунд)
////////////---включение/отключение АНАЛИЗАТОРА СПЕКТРА  на втором экране/////////////////
    
    if (digitalRead(10) == LOW && menu==0){delay(200);x_timer++;}// держим кнопку, идет счет x_timer
    if (digitalRead(10) == HIGH) {x_timer=0;} // если отпустить кнопку то x_timer сбрасывается
    if (x_timer > 12 && pin7==0) {digitalWrite(7,HIGH);pin7=1;x_timer=0;} // 12*200 мс + время работы цикла = 5с включаем пин 7 если он был выключен
    if (x_timer > 12 && pin7==1) {digitalWrite(7,LOW);pin7=0;x_timer=0;} //  12*200 мс + время работы цикла = 5с выключаем пин 7 если он был включен
     
    // МЕНЮ КНОПКА SET
    if ((digitalRead(2) == LOW || ir.value == SET) && digitalRead(10) == HIGH) {menu++;delay(200);times = millis();cl();w = 1;w1 = 1;menu1 = 0;
      if (menu > 1) {menu = 0; }
    }
    // МЕНЮ КНОПКА SET time(нажатие одновременно кнопки энкодера и кнопкиSET)
    if (digitalRead(2) == LOW && digitalRead(10) == LOW) {menu = 2;delay(200);times = millis();cl();w = 1;w1 = 1;lcd.setCursor(2, 1);
    lcd.print("TIME CORRECTION");delay(1000);
    }
    // МЕНЮ КНОПКА MUTE - mute on
    if ((digitalRead(3) == LOW || ir.value == MUT) && mute == 0) {mute = 1;cl();audio();menu = 100;brig=brig1;analogWrite(6, brig * 25);
    //слово MUTE//да, охренеть! можно проще? и круче --- поправляйте!(просто "MUTE" не прет!!!)(и массивы ниасилил йа......)
   
   //1 символ "М"+пробел"
    lcd.setCursor(1,0);lcd.write(3);lcd.print("  ");lcd.write(1);lcd.print(" ");
    lcd.setCursor(1,1);lcd.write(8);lcd.write(3);lcd.write(1);lcd.write(8);lcd.print(" ");
    lcd.setCursor(1,2);lcd.write(8);lcd.print("  ");lcd.write(8);lcd.print(" ");
   
    //2 символ "U"+пробел"
    lcd.setCursor(6,0);lcd.write(3);lcd.print("  ");lcd.write(1);lcd.print(" ");  
    lcd.setCursor(6,1);lcd.write(8);lcd.print("  ");lcd.write(8);lcd.print(" ");
    lcd.setCursor(6,2);lcd.write(4);lcd.write(8);lcd.write(8);lcd.write(6);lcd.print(" ");
    
     //3 символ "T"+пробел"
    
    lcd.setCursor(11,0);lcd.write(8);lcd.write(8);lcd.write(8);lcd.print(" ");
    lcd.setCursor(11,1);lcd.print(" ");lcd.write(8);lcd.print("  ");
    lcd.setCursor(11,2);lcd.print(" ");lcd.write(8);lcd.print("  ");
    
    //4 символ "E"+пробел"

    lcd.setCursor(15,0);lcd.write(1);lcd.write(2);lcd.write(2);lcd.write(2);
    lcd.setCursor(15,1);lcd.write(8);lcd.write(2);lcd.write(2);
    lcd.setCursor(15,2);lcd.write(4);lcd.write(5);lcd.write(5);lcd.write(5);

    
            
    delay(500);
    }
     // МЕНЮ КНОПКА MUTE - mute off
    if ((digitalRead(3) == LOW || ir.value == MUT) && mute == 1) {mute = 0;cl();times = millis();w = 1;w1 = 1;menu = 0;menu1 = 0;myEnc.write(0);newPosition = 0;brig=brig0;analogWrite(6, brig * 25);audio();}
    }
   // МЕНЮ КНОПКА POWER
   //сначала ВЫКЛЮЧЕНИЕ
    if (((digitalRead(4) == LOW || ir.value == POWER) && power == 0) || standby == 1)  {menu1 = 0;  mute = 1; audio();
    power = 1; standby = 0;cl();times = millis(); w = 1; w1 = 1; menu = 100;//сначала вырубаем звук....
/////    в цикле плавное снижение уровня подсветки.....
    for (i = 1; i <=10 ; i++) {
     switch (i) {
      case 0:brig = 10;analogWrite(6, brig * 25); break;
      case 1:brig = 9; analogWrite(6, brig * 25); break;
      case 2:brig = 8; analogWrite(6, brig * 25); break;
      case 3:brig = 7; analogWrite(6, brig * 25); break;
      case 4:brig = 6; analogWrite(6, brig * 25); break;
      case 5:brig = 5; analogWrite(6, brig * 25); break;
      case 6:brig = 4; analogWrite(6, brig * 25); break;
      case 7:brig = 3; analogWrite(6, brig * 25); break;
      case 8:brig = 2; analogWrite(6, brig * 25); break;
      case 9:brig = 1; analogWrite(6, brig * 25); break;
      }
         delay(100);  //выключаем все и врубаем меню STANDBY.....
   
    }
    }
    
  // power on- ЭКРАН ПРИ ВКЛЮЧЕНИИ
  //потом ВКЛЮЧЕНИЕ
    if ((digitalRead(4) == LOW || ir.value == POWER) && power == 1) {
    power = 0; cl();times = millis(); w = 1; w1 = 1; menu = 0; menu1 = 0;myEnc.write(0);newPosition = 0; brig = brig0;
    digitalWrite(12, HIGH);//включение питания 1й выход
    lcd.setCursor(0, 0); lcd.print("  BU DIGITAL SARAY  ");//1 строка    
    lcd.setCursor(0, 1); lcd.print("POWER AMPLIFIER  5.1");//2 строка
    lcd.setCursor(0, 2); lcd.print("   SYSTEM LOADING   ");//3 строка
    for(int i=1;i<=10;i++){ brig=i; analogWrite(6, brig * 25);delay(150);//плавное включение подсветки при ВКЛЮЧЕНИИ
    }
    //дальше полоса загрузки
    lcd.setCursor(0, 3); lcd.write(5); delay(100); lcd.write(2); delay(100); lcd.write(5); delay(100); lcd.write(2); delay(100);
                         lcd.write(5); delay(100); lcd.write(2); delay(100); lcd.write(5); delay(100); lcd.write(2); delay(100);
                         lcd.write(5); delay(100); lcd.write(2); delay(100);//бегущая полоска загрузки 4 строка
                         digitalWrite(13, HIGH); //включение питания с задержкой(софтстарт) 2й выход
                         //можно ставить в любое место,в строку загрузки, в зависимости  от величины задержки включения 2го выхода
                         lcd.write(5); delay(100); lcd.write(2); delay(100); lcd.write(5); delay(100); lcd.write(2); delay(100);                         
                         lcd.write(5); delay(100); lcd.write(2); delay(100); lcd.write(5); delay(100); lcd.write(2); delay(100);
                         lcd.write(5); delay(100); lcd.write(2); delay(100);//бегущая полоска загрузки 4 строка    
    
    
    mute = 0; audio(); cl();//команда MUTE при включении снимается после полной загрузки экрана
    
  } 
  // power off//выключение
  if (power == 1) {digitalWrite(12, LOW);} // output standby
   
  else {digitalWrite(12, HIGH);}
 
  if (power == 1) {digitalWrite(13, LOW);} // output standby delay
  
  /// IR ////////////////////////////////////////
  if ( irrecv.decode( &ir )) {
    Serial.print("0x");  // IR приемник - чтение, в мониторе порта отображаются коды кнопок
    Serial.println( ir.value, HEX);
    //Serial.println (sensor_Alarm_1);
    //Serial.println (sensor_Alarm_2);
    irrecv.resume();
    times = millis();
    w = 1;
    w1 = 1;
  }
  if (ir.value == 0) {
    gr1 = 0;  // запрет нажатий не активных кнопок пульта
    gr2 = 0;
  }

  ////////////// VOLUME ///////////////////////////////////////////////////////////////////
  
  if (menu == 0) {
    // кнопка >
    if (ir.value == VOLUME_UP && mute == 0 && power == 0) {vol++;gr1 = 1;gr2 = 0;cl1();times = millis();w = 1;vol_func();audio();}
    // кнопка >>>>>>
    if (ir.value == 0xFFFFFFFF and gr1 == 1) {vol++;gr2 = 0;cl1();times = millis();;w = 1;vol_func();audio();}
    // кнопка <
    if (ir.value == VOLUME_DW) {vol--;gr1 = 0;gr2 = 1;cl1();times = millis();;w = 1;vol_func();audio();}
    // кнопка <<<<<<
    if (ir.value == 0xFFFFFFFF and gr2 == 1) {vol--;gr1 = 0;cl1();times = millis();w = 1;vol_func();audio();}

    if (newPosition != oldPosition) {oldPosition = newPosition;vol = vol + newPosition;
        myEnc.write(0);newPosition = 0; times = millis();w = 1;w1 = 1;vol_func();audio();}
        
    a[0] = (vol) / 10; a[1] = (vol) % 10;
    for (x = 0; x < 2; x++) {
      switch (x) {
        case 0: e1 = 10, e2 = 11, e3 = 12;break;
        case 1: e1 = 14, e2 = 15, e3 = 16;break;} 
        digit();
    }
    //Минус (гаснущий при нуле) перед цифрами уровня громкости
    lcd.setCursor(8, 0); if (vol > 0) {lcd.write(5);} else {lcd.print(" ");//{lcd.write(5);---какой символ отображать----из таблички  в начале скейча
    }
    ////Вывод температуры на основной экран///////
    static uint32_t timTemp;
    if (millis() - timTemp >= 800) {
    timTemp = millis();  ///время опроса датчика
    // читаем прошлое значение
    if (sensor.readTemp()) {lcd.setCursor(16, 3);lcd.print(sensor.getTemp(),0);lcd.write(223);lcd.print("C");}//выводим на экран
    else {lcd.setCursor(16, 3);lcd.print("--ER");delay(250);lcd.setCursor(16, 3);lcd.print("    ");}//если обрыв датчика пишем error
    // запрашиваем новое измерение
    sensor.requestTemp();
    
    //термозащита //4 строка
    
    //вот тут меняем уставку защиты.....50...90 градусов....или 100))))
    //если температура превышает уставку.....
    if ((sensor.getTemp())>30){mute = 1; audio(); termo=1;//вырубаем звук
    //вместо часов выводим сообщение....
    lcd.setCursor(0, 3);lcd.print("TERMO  OVERLOAD ");delay(450);   
    //тут пишем максимальную температуру, как в уставке       
    lcd.setCursor(0, 3);lcd.print("   MAX t 30");lcd.write(223);lcd.print("C   ");delay(450);  
    lcd.setCursor(0, 3);lcd.print("     !MUTE!     ");delay(450);
             
    }   //если температура в норме.....   
      else { mute = 0; audio();termo=0;//врубаем звук    
      //возвращаем часы .....
      lcd.setCursor(0, 3);
      lcd.print(hour / 10); lcd.print(hour % 10); lcd.print(":");
      lcd.print(minut / 10); lcd.print(minut % 10); lcd.print(":");
      lcd.print(secon / 10); lcd.print(secon % 10); lcd.print("       ");}
    }
   
    //надписи основного экрана/ индикация аварии каналов
   //1 строка
        lcd.setCursor(0, 0); lcd.print(" VOLUME ");
   //2 строка начало
        lcd.setCursor(0, 1); lcd.print(" 5.1 CH ");
   //2 строка в конце 
        lcd.setCursor(18,1); lcd.print("dB");//2 строка после цифр уровня громкости

    // индикаторы неисправности каналов// кому не нужно раскоментируйте строку ниже
    //lcd.setCursor(0, 2); lcd.print("--------------------");//3 строка
        //и все остальное можете удалить, от этого места.......
    int sensor_Alarm_1 = analogRead(A6);//считываем сигнал аварии правого переднего канала
    int sensor_Alarm_2 = analogRead(A7);//считываем сигнал аварии правого заднего канала
       
    //левый передний
   if (digitalRead(14) == HIGH)                                                              
       {lcd.setCursor(0, 2);lcd.write(42);lcd.write(42);lcd.write(42);}                      
   if (digitalRead(14) == LOW ) {if ((millis() % 1000) > 500)                                
       {lcd.setCursor(0, 2); lcd.print("FL ");}
   else{lcd.setCursor(0, 2); lcd.print("DC ");}
    }
    //левый задний
   if (digitalRead(15) == HIGH)
       {lcd.setCursor(3, 2);lcd.write(42);lcd.write(42);lcd.write(42);}
   if (digitalRead(15) == LOW) {if ((millis() % 1000) > 500) 
       {lcd.setCursor(3, 2); lcd.print("RL ");}
   else{lcd.setCursor(3, 2); lcd.print("DC ");}
    }
    //центральный
   if (digitalRead(16) == HIGH)
       {lcd.setCursor(6, 2);lcd.write(42);lcd.write(42);lcd.write(42);lcd.write(42);}
   if (digitalRead(16) == LOW) {if ((millis() % 1000) > 500)
       {lcd.setCursor(6, 2); lcd.print("CNTR");}
   else{lcd.setCursor(6, 2); lcd.print(" DC ");}
    }
    //сабвуфер
   if (digitalRead(17) == HIGH) 
       {lcd.setCursor(10, 2);lcd.write(42);lcd.write(42);lcd.write(42);lcd.write(42);}
   if (digitalRead(17) == LOW) {if ((millis() % 1000) > 500) 
       {lcd.setCursor(10, 2); lcd.print(" SUB");}
   else{lcd.setCursor(10, 2); lcd.print(" D C");}
    }
     //правый  передний/// тут пришлось поковыряться......вход А6 чисто аналоговый
   if (sensor_Alarm_1 > 500) 
       {lcd.setCursor(14, 2);lcd.write(42);lcd.write(42);lcd.write(42);}
   if (sensor_Alarm_1 < 10) {if ((millis() % 1000) > 500) 
       {lcd.setCursor(14, 2); lcd.print(" FR");}
   else{lcd.setCursor(14, 2); lcd.print(" DC");}
   } 
    //правый  задний /// и тут тоже пришлось поковыряться......вход А7 чисто аналоговый
   if (sensor_Alarm_2 > 500) 
       {lcd.setCursor(17, 2);lcd.write(42);lcd.write(42);lcd.write(42);}
   if (sensor_Alarm_2 < 10) {if ((millis() % 1000) > 500) 
       {lcd.setCursor(17, 2); lcd.print(" RR");}
   else{lcd.setCursor(17, 2); lcd.print(" DC");}

   ////до сюда.....
   }    
    //яркость подсветки.... автоматическое снижение при неактивных кнопках.....
    //  ждем 10 сек и выключаем подсветку
     static uint32_t times_led;
    if (millis() - times_led >= 10000) {brig = brig1;analogWrite(6, brig * 25);}
    // если кнопка нажата, то включаем подсветку и обнуляем переменную times_led
     if(digitalRead(2)  == LOW || digitalRead(3)  == LOW || digitalRead(4)  == LOW ||
        digitalRead(8)  == LOW || digitalRead(9)  == LOW || digitalRead(10) == LOW ||
        digitalRead(14) == LOW || digitalRead(15) == LOW || digitalRead(16) == LOW ||
        digitalRead(17) == LOW ||   sensor_Alarm_1 < 10  || sensor_Alarm_2 < 10    ||
        ir.value == OK || ir.value == SET || ir.value == MUT || ir.value == POWER  ||
        termo == 1 ||  gr1==1 || gr2==1 )
       { times_led=millis(); brig = brig0;analogWrite(6, brig * 25); }
       
   }
  ///////// ATT //////////////////////////////////////////////////////////////////////////////
      if (menu == 1) {
      switch (menu1) {
      case 0: temp0 = ch1; break;
      case 1: temp0 = ch2; break;
      case 2: temp0 = ch3; break;
      case 3: temp0 = ch4; break;
      case 4: temp0 = ch5; break;
      case 5: temp0 = ch6; break;
      case 6: temp0 = brig0; break;
      case 7: temp0 = brig1; break;
    }
    // кнопка >
    if (ir.value == VOLUME_UP) {temp0--; gr1 = 1;gr2 = 0;cl1();times = millis();w = 1;www = 1;}
    // кнопка >>>>>>
    if (ir.value == 0xFFFFFFFF and gr1 == 1) {temp0--;gr2 = 0;cl1();times = millis();;w = 1;w = 1;www = 1;}
    // кнопка <
    if (ir.value == VOLUME_DW) {temp0++; gr1 = 0;gr2 = 1;cl1();times = millis();;w = 1;w = 1;www = 1;
    }
    // кнопка <<<<<<
    if (ir.value == 0xFFFFFFFF and gr2 == 1) {temp0++;gr1 = 0;cl1();times = millis();w = 1;w = 1;www = 1;}

    if (newPosition != oldPosition) {oldPosition = newPosition;temp0 = temp0 - newPosition; myEnc.write(0); newPosition = 0; times = millis(); w = 1; www = 1;
    }

    switch (menu1) {
      case 0: ch1 = temp0; if (ch1 < 0) {ch1 = 0;} if (ch1 > 15) {ch1 = 15;} break;
      case 1: ch2 = temp0; if (ch2 < 0) {ch2 = 0;} if (ch2 > 15) {ch2 = 15;} break;
      case 2: ch3 = temp0; if (ch3 < 0) {ch3 = 0;} if (ch3 > 15) {ch3 = 15;} break;
      case 3: ch4 = temp0; if (ch4 < 0) {ch4 = 0;} if (ch4 > 15) {ch4 = 15;} break;
      case 4: ch5 = temp0; if (ch5 < 0) {ch5 = 0;} if (ch5 > 15) {ch5 = 15;} break;
      case 5: ch6 = temp0; if (ch6 < 0) {ch6 = 0;} if (ch6 > 15) {ch6 = 15;} break;
      case 6: brig0 = temp0; brig0_func(); break;
      case 7: brig1 = temp0; brig1_func(); break;
    }

    au();
    if (menu1 < 7) {brig = brig0;}
    if (menu1 == 7) {brig = brig1;}
    analogWrite(6, brig * 25);

    for (i = 0; i < 8; i++) {
      if (menu1 == i) {
        lcd.setCursor(mesto2[i], mesto3[i]);
        lcd.print(char(126));
      } else {
        lcd.setCursor(mesto2[i], mesto3[i]);
        lcd.print(" ");
      }
    }

    lcd.setCursor(1, 0); lcd.print("Lfront"); if (ch1 == 0) {
      lcd.print(" ");
    } lcd.print(-ch1); if (ch1 < 10) {
      lcd.print(" ");
    }
    lcd.setCursor(11, 0); lcd.print("Rfront"); if (ch2 == 0) {
      lcd.print(" ");
    } lcd.print(-ch2); if (ch2 < 10) {
      lcd.print(" ");
    }
    lcd.setCursor(1, 1); lcd.print("L rear"); if (ch3 == 0) {
      lcd.print(" ");
    } lcd.print(-ch3); if (ch3 < 10) {
      lcd.print(" ");
    }
    lcd.setCursor(11, 1); lcd.print("R rear"); if (ch4 == 0) {
      lcd.print(" ");
    } lcd.print(-ch4); if (ch4 < 10) {
      lcd.print(" ");
    }
    lcd.setCursor(1, 2); lcd.print("Center"); if (ch5 == 0) {
      lcd.print(" ");
    } lcd.print(-ch5); if (ch5 < 10) {
      lcd.print(" ");
    }
    lcd.setCursor(11, 2); lcd.print("SubW  "); if (ch6 == 0) {
      lcd.print(" ");
    } lcd.print(-ch6); if (ch6 < 10) {
      lcd.print(" ");
    }
    lcd.setCursor(1, 3); lcd.print("BR ON "); lcd.print(brig0); lcd.print(" ");
    lcd.setCursor(11, 3); lcd.print("BR OFF "); lcd.print(brig1); lcd.print(" ");
  }

  //////// menu set time /////////////////////////////////////
  if (menu == 2) {
    hh = DateTime.hour; mm = DateTime.minute; ss = DateTime.second; dd = DateTime.day; mn = DateTime.month; gg = DateTime.year;
    switch (menu2) {
      case 0: time_temp = hh; break;
      case 1: time_temp = mm; break;
      case 2: time_temp = ss; break;
      case 3: time_temp = dd; break;
      case 4: time_temp = mn; break;
      case 5: time_temp = gg; break;
    }


    if (newPosition != oldPosition) {
      oldPosition = newPosition;
      time_temp = time_temp - newPosition; myEnc.write(0); newPosition = 0; times = millis(); w = 1; tim_w = 1;
    }

    switch (menu2) {
      case 0: hh = time_temp; 
      if (hh < 0) {hh = 0;} 
      if (hh > 23) {hh = 23;} break;
      case 1: mm = time_temp; 
      if (mm < 0) {mm = 0;} 
      if (mm > 59) {mm = 59;} break;
      case 2: ss = time_temp; 
      if (ss < 0) {ss = 0;} 
      if (ss > 59) {ss = 59;} break;
      case 3: dd = time_temp; 
      if (dd < 1) {dd = 1;}
      if (dd > 31) {dd = 31;} break;
      case 4: mn = time_temp;
      if (mn < 1) {mn = 1;} 
      if (mn > 12) {mn = 12;} break;
      case 5: gg = time_temp; 
      if (gg < 2022) {gg = 2022;} 
      if (gg > 2100) {gg = 2100;} break;
    }

    lcd.setCursor(0, 0); lcd.print("TIME CORRECTION");
    lcd.setCursor(0, 1); lcd.print("--------------------");
    lcd.setCursor(0, 2);
    if (menu2 == 0) {
      lcd.print("set hour   ");
    }
    if (menu2 == 1) {
      lcd.print("set minute ");
    }
    if (menu2 == 2) {
      lcd.print("set seconds");
    }
    if (menu2 == 3) {
      lcd.print("set date   ");
    }
    if (menu2 == 4) {
      lcd.print("set month  ");
    }
    if (menu2 == 5) {
      lcd.print("set year   ");
    }

    lcd.setCursor(0, 3);
    lcd.print(hour / 10); lcd.print(hour % 10); lcd.print(":");
    lcd.print(minut / 10); lcd.print(minut % 10); lcd.print(":");
    lcd.print(secon / 10); lcd.print(secon % 10); lcd.print(" ");
    lcd.print(data / 10); lcd.print(data % 10); lcd.print("-");
    lcd.print(mon / 10); lcd.print(mon % 10); lcd.print("-");
    lcd.print(year);


    if (tim_w == 1) {
      tim_w = 0;
      clock.setDateTime(gg, mn, dd, hh, mm, ss);
      delay(100);
    }
  }

  /////// EEPROM //////////////////////////////////////
  if (millis() - times > 5000 && w1 == 1 && mute == 0 && power == 0) {
    w1 = 0;
    EEPROM.update(0, vol); EEPROM.update(1, ch1); EEPROM.update(2, ch2); EEPROM.update(3, ch3);
    EEPROM.update(4, ch4); EEPROM.update(5, ch5); EEPROM.update(6, ch6);
    EEPROM.update(7, brig0); EEPROM.update(8, brig1);
  if(menu!=0){cl();}
  }

  if (power == 1) {
   
    a[0] = DateTime.hour / 10;
    a[1] = DateTime.hour % 10;
    a[2] = DateTime.minute / 10;
    a[3] = DateTime.minute % 10;
    //a[4] = DateTime.second / 10;
    //a[5] = DateTime.second % 10;

    //for (i = 0; i < 6; i++) {
    for (i = 0; i < 4; i++) {
      switch (i) {
        case 0: e1 = 1, e2 = 2, e3 = 3; break;//десятки часов
        case 1: e1 = 5, e2 = 6, e3 = 7; break;//единицы часов
        case 2: e1 = 12, e2 = 13, e3 = 14; break;//десятки минут
        case 3: e1 = 16, e2 = 17, e3 = 18; break;//единицы минут
        //case 4: e1 = 14, e2 = 15, e3 = 16; break;//не надо
       // case 5: e1 = 17, e2 = 18, e3 = 19; break;//не надо
      }
      switch (a[i]) {
        case 0: d1=1,d2=2,d3=3,d4=4,d5=5,d6=6;break;
        case 1: d1=2,d2=3,d3=32,d4=5,d5=8,d6=5;break;
        case 2: d1=7,d2=7,d3=3,d4=8,d5=5,d6=5;break;
        case 3: d1=7,d2=7,d3=3,d4=5,d5=5,d6=6;break;
        case 4: d1=4,d2=5,d3=8,d4=32,d5=32,d6=8;break;
        case 5: d1=8,d2=7,d3=7,d4=5,d5=5,d6=6;break;
        case 6: d1=1,d2=7,d3=7,d4=4,d5=5,d6=6;break;
        case 7: d1=2,d2=2,d3=3,d4=32,d5=32,d6=8;break;
        case 8: d1=1,d2=7,d3=3,d4=4,d5=5,d6=6;break;
        case 9: d1=1,d2=7,d3=3,d4=5,d5=5,d6=6;break;
      }
///////////////положение цифр на экране///сейчас 2я и 3я строка..........
      lcd.setCursor(e1, 1); lcd.write((uint8_t)d1); lcd.setCursor(e2, 1); lcd.write((uint8_t)d2); lcd.setCursor(e3, 1); lcd.write((uint8_t)d3);
      lcd.setCursor(e1, 2); lcd.write((uint8_t)d4); lcd.setCursor(e2, 2); lcd.write((uint8_t)d5); lcd.setCursor(e3, 2); lcd.write((uint8_t)d6);
    }
  

//точки между цифр
      //lcd.setCursor(9,1);lcd.write(2);lcd.setCursor(10,1);lcd.write(2);
      //lcd.setCursor(9,2);lcd.write(5);lcd.setCursor(10,2);lcd.write(5);
       if(secon % 10 == 1||secon % 10 == 3||secon % 10 == 5||secon % 10 == 7||secon % 10 == 9)
       {lcd.setCursor(9,1) ;lcd.write(2);  lcd.print(" ");
        lcd.setCursor(9,2);lcd.print(" ");lcd.write(5);}
      //четное - точки2( можно пробелы вставить---lcd.print(" ");---)
      if(secon % 10 == 0||secon % 10 == 2||secon % 10 == 4||secon % 10 == 6||secon % 10 == 8)
       {lcd.setCursor(9,1) ;lcd.print(" ");lcd.write(2);
        lcd.setCursor(9,2);lcd.write(5);  lcd.print(" ");}
//перемещение снежинок......////много кода......много...........//аааааааааааааааааааа////кто может лучше и проще, меняйте.............   
  
      if(secon % 10 == 0&&secon / 10 == 0||secon % 10 == 0&&secon / 10 == 2||secon % 10 == 0&&secon / 10 == 4)
           {lcd.setCursor(0,0);lcd.write(42);lcd.setCursor(19,3);lcd.write(42);}
      else {lcd.setCursor(0,0);lcd.print(" ");lcd.setCursor(19,3);lcd.print(" ");}
      
      if(secon % 10 == 1&&secon / 10 == 0||secon % 10 == 1&&secon / 10 == 2||secon % 10 == 1&&secon / 10 == 4)
           {lcd.setCursor(1,0);lcd.write(42);lcd.setCursor(18,3);lcd.write(42);}
      else {lcd.setCursor(1,0);lcd.print(" ");lcd.setCursor(18,3);lcd.print(" ");}  
        
      if(secon % 10 == 2&&secon / 10 == 0||secon % 10 == 2&&secon / 10 == 2||secon % 10 == 2&&secon / 10 == 4)
           {lcd.setCursor(2,0);lcd.write(42);lcd.setCursor(17,3);lcd.write(42);}
      else {lcd.setCursor(2,0);lcd.print(" ");lcd.setCursor(17,3);lcd.print(" ");} 
          
      if(secon % 10 == 3&&secon / 10 == 0||secon % 10 == 3&&secon / 10 == 2||secon % 10 == 3&&secon / 10 == 4)
           {lcd.setCursor(3,0);lcd.write(42);lcd.setCursor(16,3);lcd.write(42);}
      else {lcd.setCursor(3,0);lcd.print(" ");lcd.setCursor(16,3);lcd.print(" ");}  
         
      if(secon % 10 == 4&&secon / 10 == 0||secon % 10 == 4&&secon / 10 == 2||secon % 10 == 4&&secon / 10 == 4)
           {lcd.setCursor(4,0);lcd.write(42);lcd.setCursor(15,3);lcd.write(42);}
      else {lcd.setCursor(4,0);lcd.print(" ");lcd.setCursor(15,3);lcd.print(" ");}

      if(secon % 10 == 5&&secon / 10 == 0||secon % 10 == 5&&secon / 10 == 2||secon % 10 == 5&&secon / 10 == 4)
           {lcd.setCursor(5,0);lcd.write(42);lcd.setCursor(14,3);lcd.write(42);}
      else {lcd.setCursor(5,0);lcd.print(" ");lcd.setCursor(14,3);lcd.print(" ");} 
      
      if(secon % 10 == 6&&secon / 10 == 0||secon % 10 == 6&&secon / 10 == 2||secon % 10 == 6&&secon / 10 == 4)
           {lcd.setCursor(6,0);lcd.write(42);lcd.setCursor(13,3);lcd.write(42);}
      else {lcd.setCursor(6,0);lcd.print(" ");lcd.setCursor(13,3);lcd.print(" ");} 

      if(secon % 10 == 7&&secon / 10 == 0||secon % 10 == 7&&secon / 10 == 2||secon % 10 == 7&&secon / 10 == 4)
           {lcd.setCursor(7,0);lcd.write(42);lcd.setCursor(12,3);lcd.write(42);}
      else {lcd.setCursor(7,0);lcd.print(" ");lcd.setCursor(12,3);lcd.print(" ");} 

      if(secon % 10 == 8&&secon / 10 == 0||secon % 10 == 8&&secon / 10 == 2||secon % 10 == 8&&secon / 10 == 4)
           {lcd.setCursor(8,0);lcd.write(42);lcd.setCursor(11,3);lcd.write(42);}
      else {lcd.setCursor(8,0);lcd.print(" ");lcd.setCursor(11,3);lcd.print(" ");} 

      if(secon % 10 == 9&&secon / 10 == 0||secon % 10 == 9&&secon / 10 == 2||secon % 10 == 9&&secon / 10 == 4)
           {lcd.setCursor(9,0);lcd.write(42);lcd.setCursor(10,3);lcd.write(42);}
      else {lcd.setCursor(9,0);lcd.print(" ");lcd.setCursor(10,3);lcd.print(" ");} 
      
      ///////////////////////ааааааааааааааааааааааа///////////////////////////////////////////////
      
      if(secon % 10 == 0&&secon / 10 == 1||secon % 10 == 0&&secon / 10 == 3||secon % 10 == 0&&secon / 10 == 5)
           {lcd.setCursor(10,0);lcd.write(42);lcd.setCursor(9,3);lcd.write(42);}
      else {lcd.setCursor(10,0);lcd.print(" ");lcd.setCursor(9,3);lcd.print(" ");}
      
      if(secon % 10 == 1&&secon / 10 == 1||secon % 10 == 1&&secon / 10 == 3||secon % 10 == 1&&secon / 10 == 5)
           {lcd.setCursor(11,0);lcd.write(42);lcd.setCursor(8,3);lcd.write(42);}
      else {lcd.setCursor(11,0);lcd.print(" ");lcd.setCursor(8,3);lcd.print(" ");}  
        
      if(secon % 10 == 2&&secon / 10 == 1||secon % 10 == 2&&secon / 10 == 3||secon % 10 == 2&&secon / 10 == 5)
           {lcd.setCursor(12,0);lcd.write(42);lcd.setCursor(7,3);lcd.write(42);}
      else {lcd.setCursor(12,0);lcd.print(" ");lcd.setCursor(7,3);lcd.print(" ");} 
          
      if(secon % 10 == 3&&secon / 10 == 1||secon % 10 == 3&&secon / 10 == 3||secon % 10 == 3&&secon / 10 == 5)
           {lcd.setCursor(13,0);lcd.write(42);lcd.setCursor(6,3);lcd.write(42);}
      else {lcd.setCursor(13,0);lcd.print(" ");lcd.setCursor(6,3);lcd.print(" ");}  
         
      if(secon % 10 == 4&&secon / 10 == 1||secon % 10 == 4&&secon / 10 == 3||secon % 10 == 4&&secon / 10 == 5)
           {lcd.setCursor(14,0);lcd.write(42);lcd.setCursor(5,3);lcd.write(42);}
      else {lcd.setCursor(14,0);lcd.print(" ");lcd.setCursor(5,3);lcd.print(" ");}

      if(secon % 10 == 5&&secon / 10 == 1||secon % 10 == 5&&secon / 10 == 3||secon % 10 == 5&&secon / 10 == 5)
           {lcd.setCursor(15,0);lcd.write(42);lcd.setCursor(4,3);lcd.write(42);}
      else {lcd.setCursor(15,0);lcd.print(" ");lcd.setCursor(4,3);lcd.print(" ");} 
      
      if(secon % 10 == 6&&secon / 10 == 1||secon % 10 == 6&&secon / 10 == 3||secon % 10 == 6&&secon / 10 == 5)
           {lcd.setCursor(16,0);lcd.write(42);lcd.setCursor(3,3);lcd.write(42);}
      else {lcd.setCursor(16,0);lcd.print(" ");lcd.setCursor(3,3);lcd.print(" ");} 

      if(secon % 10 == 7&&secon / 10 == 1||secon % 10 == 7&&secon / 10 == 3||secon % 10 == 7&&secon / 10 == 5)
           {lcd.setCursor(17,0);lcd.write(42);lcd.setCursor(2,3);lcd.write(42);}
      else {lcd.setCursor(17,0);lcd.print(" ");lcd.setCursor(2,3);lcd.print(" ");} 

      if(secon % 10 == 8&&secon / 10 == 1||secon % 10 == 8&&secon / 10 == 3||secon % 10 == 8&&secon / 10 == 5)
           {lcd.setCursor(18,0);lcd.write(42);lcd.setCursor(1,3);lcd.write(42);}
      else {lcd.setCursor(18,0);lcd.print(" ");lcd.setCursor(1,3);lcd.print(" ");} 

      if(secon % 10 == 9&&secon / 10 == 1||secon % 10 == 9&&secon / 10 == 3||secon % 10 == 9&&secon / 10 == 5)
           {lcd.setCursor(19,0);lcd.write(42);lcd.setCursor(0,3);lcd.write(42);}
      else {lcd.setCursor(19,0);lcd.print(" ");lcd.setCursor(0,3);lcd.print(" ");}
      
      ////////////////////всеееееееееееееееееееееее///////////////////////////////
        
      //if(secon % 10 == 1||secon % 10 == 3||secon % 10 == 5||secon % 10 == 7||secon % 10 == 9)
      // {lcd.setCursor(9,0);lcd.write(2);lcd.setCursor(9,1);lcd.write(5);
       // lcd.setCursor(10,0);lcd.write(2);lcd.setCursor(10,1);lcd.write(5);}
      //четное - точки 2( можно пробелы вставить---lcd.print(" ");---)
     // if(secon % 10 == 0||secon % 10 == 2||secon % 10 == 4||secon % 10 == 6||secon % 10 == 8)
      //  {lcd.setCursor(9,0);lcd.write(5);lcd.setCursor(9,1);lcd.write(2);
     //   lcd.setCursor(10,0);lcd.write(5);lcd.setCursor(10,1);lcd.write(2);}
    
      //lcd.setCursor(0, 2); lcd.print("--------------------");
      //lcd.setCursor(6, 3); lcd.print("STAND BY");
  }


}  /// END LOOP


void au() {
  if (www == 1) {
    audio();
    www = 0;
  }
}
void cl() {
  ir.value = 0;
  delay(300);
  lcd.clear();
}
void cl1() {
  ir.value = 0;
  delay(200);
}
void brig1_func() {
  if (brig1 > 10) {
    brig1 = 10;
  } if (brig1 < 0) {
    brig1 = 0;
  }
}
void brig0_func() {
  if (brig0 > 10) {
    brig0 = 10;
  } if (brig0 < 0) {
    brig0 = 0;
  }
}
void audio() {
  pt.clear();
  //  pt.setVolume(75); //  int 0...79
  pt.setVol1(79 - (vol + ch1)); //  int 0...79
  pt.setVol2(79 - (vol + ch2)); //  int 0...79
  pt.setVol3(79 - (vol + ch3)); //  int 0...79
  pt.setVol4(79 - (vol + ch4)); //  int 0...79
  pt.setVol5(79 - (vol + ch5)); //  int 0...79
  pt.setVol6(79 - (vol + ch6)); //  int 0...79
  pt.setMute(mute); // mute 0 - off / 1 - on
}

void to_Timer() {
  newPosition = myEnc.read() / 4;
}
void vol_func() {
  if (0 > vol) {
    vol = 0;
  } if (64 < vol) {
    vol = 64;
  }
}

void digit() {
  switch (a[x]) {
    case 0: d1=1,d2=2,d3=3,d4=4,d5=5,d6=6;break;
    case 1: d1=2,d2=3,d3=32,d4=5,d5=8,d6=5;break;
    case 2: d1=7,d2=7,d3=3,d4=8,d5=5,d6=5;break;
    case 3: d1=7,d2=7,d3=3,d4=5,d5=5,d6=6;break;
    case 4: d1=4,d2=5,d3=8,d4=32,d5=32,d6=8;break;
    case 5: d1=8,d2=7,d3=7,d4=5,d5=5,d6=6;break;
    case 6: d1=1,d2=7,d3=7,d4=4,d5=5,d6=6;break;
    case 7: d1=2,d2=2,d3=3,d4=32,d5=32,d6=8;break;
    case 8: d1=1,d2=7,d3=3,d4=4,d5=5,d6=6;break;
    case 9: d1=1,d2=7,d3=3,d4=5,d5=5,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);
}

59

Re: PT2258 + LCD2004_I2C + IR + DS3231

я победил подсветку!!!!!!!!!! С помощью FLprog. Вот такого кода выданного ей

bool _gtv1 = 0;
bool _gtv2 = 0;
bool _gtv3 = 0;
bool _tim1I = 0;
bool _tim1O = 0;
unsigned long _tim1P = 0UL;
bool _trgrt1 = 0;
bool _trgrt1I = 0;
void setup()
{
}
void loop()
{

//Плата:1
if (_gtv1) { if (_trgrt1I) { _trgrt1 = 0;} else {_trgrt1 = 1; _trgrt1I = 1;} } else {_trgrt1 = 0; _trgrt1I = 0;}; 
 if(( (_trgrt1) || (_gtv2) )) {_tim1O = 1; _tim1I = 1;} else { if(_tim1I) {_tim1I = 0; _tim1P = millis();} else { if (_tim1O) {if ( _isTimer(_tim1P, 10000)) _tim1O = 0;}}}
_gtv3 = !(_tim1O);
_gtv3 = _tim1O;
}
bool _isTimer(unsigned long startTime, unsigned long period )
  {
  unsigned long currentTime;
currentTime = millis();
if (currentTime>= startTime) {return (currentTime>=(startTime + period));} else {return (currentTime >=(4294967295-startTime+period));}
  }

и кривых рук)))
Картинка из этой программы, по чем она код делает.....
http://forum.rcl-radio.ru/uploads/images/2022/07/fc0563088aa9d32615b0629c47631108.jpg

Мне схемы проще рисовать, а программа сама код компилирует.
Были бы блоки под аудиопроцессоры для этой программы, я бы сам управление давно написал....))))

60

Re: PT2258 + LCD2004_I2C + IR + DS3231

Вот такой "костыль".... с кучей переменных
начало....

////переменные для автоматического снижения яркости на основном экране......
bool _tim1I = 0;
bool _tim1O = 0;
unsigned long _tim1P = 0UL;
bool _trgrt1 = 0;
bool _trgrt1I = 0;
bool _start=0;

сам "костыль"

  //яркость подсветки.... автоматическое снижение при неактивных кнопках.....
    //  ждем 10 сек и выключаем подсветку
 if (_start==1) { if (_trgrt1I) { _trgrt1 = 0;} else {_trgrt1 = 1; _trgrt1I = 1;} } else {_trgrt1 = 0; _trgrt1I = 0;}; 
 if ( (_trgrt1) || digitalRead(2)  == LOW || digitalRead(3)  == LOW || digitalRead(4)  == LOW ||
        digitalRead(8)  == LOW || digitalRead(9)  == LOW || digitalRead(10) == LOW ||
        digitalRead(14) == LOW || digitalRead(15) == LOW || digitalRead(16) == LOW ||
        digitalRead(17) == LOW ||   sensor_Alarm_1 < 10  || sensor_Alarm_2 < 10    ||
        ir.value == OK || ir.value == SET || ir.value == MUT || ir.value == POWER  ||                                                       
        termo == 1 ||  gr1==1 || gr2==1) {_tim1O = 1; _tim1I = 1;} else { if(_tim1I) {_tim1I = 0; _tim1P = millis();} else { if (_tim1O) {if ( _isTimer(_tim1P, 10000)) _tim1O = 0;}}}
 if (!( _tim1O ) ) {brig = brig1;analogWrite(6, brig * 25);}                                  //////////////вот тут меняем время задержки отключения  подсветки ↑↑↑↑↑↑
 if ( _tim1O ){brig = brig0;analogWrite(6, brig * 25);}

переменные после LOOPa

bool _isTimer(unsigned long startTime, unsigned long period )
  {
  unsigned long currentTime;
currentTime = millis();
if (currentTime>= startTime) {return (currentTime>=(startTime + period));} else {return (currentTime >=(4294967295-startTime+period));}
  }

И полный скеч. Проверил. У меня работает)))))))

//#define POWER     0x33B800FF
//#define VOLUME_UP 0x33B8E01F
//#define VOLUME_DW 0x33B810EF
//#define MUT       0x33B8946B
#define SET       0x42BD48B7
#define OK        0x42BD08F7


#define POWER     0x42BD50AF
#define VOLUME_UP 0x42BD6897
#define VOLUME_DW 0x42BDE01F
#define MUT       0x42BD609F

#include <Wire.h>
#include <LiquidCrystal_I2C.h> // http://forum.rcl-radio.ru/misc.php?action=pan_download&item=45&download=1
#include <Encoder.h>           // http://rcl-radio.ru/wp-content/uploads/2019/05/Encoder.zip       
#include <EEPROM.h>
#include <MsTimer2.h>          // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip 
#include <boarddefs.h>         // входит в состав библиотеки IRremote
#include <IRremote.h>          // http://rcl-radio.ru/wp-content/uploads/2019/06/IRremote.zip
#include <PT2258.h> // https://github.com/liman324/PT2258.git
#include <DS3231.h>

#include <microDS18B20.h>

PT2258 pt;
LiquidCrystal_I2C lcd(0x3F, 20, 4); // Устанавливаем дисплей
Encoder myEnc(9, 8);// DT, CLK
IRrecv irrecv(11); // указываем вывод модуля IR приемника
decode_results ir;
DS3231 clock; RTCDateTime DateTime;

MicroDS18B20<5> sensor;

//запись кодов символов в экран
byte v1[8] = {B00111,B01111,B11111,B11111,B11111,B11111,B11111,B11111};
byte v2[8] = {B11111,B11111,B11111,B00000,B00000,B00000,B00000,B00000};      
byte v3[8] = {B11100,B11110,B11111,B11111,B11111,B11111,B11111,B11111};
byte v4[8] = {B11111,B11111,B11111,B11111,B11111,B11111,B01111,B00111};
byte v5[8] = {B00000,B00000,B00000,B00000,B00000,B11111,B11111,B11111};
byte v6[8] = {B11111,B11111,B11111,B11111,B11111,B11111,B11110,B11100};
byte v7[8] = {B11111,B11111,B11111,B00000,B00000,B00000,B11111,B11111};
byte v8[8] = {B11111,B11111,B11111,B11111,B11111,B11111,B11111,B11111}; 

//обьявление переменных

static uint32_t timTemp;
unsigned long times,oldPosition  = -999,newPosition; 
int vol, ch1, ch2, ch3, ch4, ch5, ch6, menu, menu1, menu2, brig, brig0=10, brig1, temp0, i;
bool mute, power, w, w1, gr1, gr2,termo;
byte a[6], d1, d2, d3, d4, d5, d6, e1, e2, e3, x, www, tim_w;
int hour, minut, secon, data, mon, year, time_temp;
byte mesto2[8] = {0, 10, 0, 10, 0, 10, 0, 10};
byte mesto3[8] = {0, 0, 1, 1, 2, 2, 3, 3};
int hh, mm, ss, dd, mn, gg;
byte standby = 1;
int pin7=0;
int x_timer;
////переменные для автоматического снижения яркости на основном экране......
bool _tim1I = 0;
bool _tim1O = 0;
unsigned long _tim1P = 0UL;
bool _trgrt1 = 0;
bool _trgrt1I = 0;
bool _start=0;

//приготовились.....
void setup() {
  irrecv.enableIRIn(); lcd.init(); lcd.backlight(); Wire.begin(); clock.begin(); Serial.begin(9600);
  MsTimer2::set(1, to_Timer); MsTimer2::start();
  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);
  if (EEPROM.read(100) != 0) {
    for (int i = 0; i < 101; i++) {
      EEPROM.update(i, 0); // очистка памяти при первом включении
    }
  }

//объявление входов,выходов

//pinMode(0)                    //serial port
//pinMode(1)                    //serial port
  pinMode(2, INPUT_PULLUP);     // КНОПКА SET
  pinMode(3, INPUT_PULLUP);     // КНОПКА MUTE
  pinMode(4, INPUT_PULLUP);     // КНОПКА POWER
//pinMode(5)                    // термодатчик 18B20
  pinMode(6, OUTPUT);           // ВЫХОД УПРАВЛЕНИЯ ПОДСВЕТКОЙ
  pinMode(7, OUTPUT);           // ВЫХОД АКТИВАЦИИ АНАЛИЗАТОРА СПЕКТРА
//pinMode(8) Encoder myEnc(8);  //CLK
//pinMode(9) Encoder myEnc(9);  //DT
  pinMode(10, INPUT);           // МЕНЮ КНОПКА SW энкодера
//pinMode(11) IRrecv irrecv(11);// указываем вывод модуля IR приемника
  pinMode(12, OUTPUT);          // Выход управления STANDBY - реле включения усилителя
  pinMode(13, OUTPUT);          // Выход управления STANDBY--- c задержкой для реле софтстарта усилителя

//входы для индикации аварий каналов, кому не надо можете удалить от этого места....

  pinMode(14, INPUT_PULLUP);          //вход аварии левый  передний   /норма +5 вольт, авария 0 вольт/ замыкаем на землю при аварии
  pinMode(15, INPUT_PULLUP);          //вход аварии левый  задний     /норма +5 вольт, авария 0 вольт/ замыкаем на землю при аварии
  pinMode(16, INPUT_PULLUP);          //вход аварии центральный канал /норма +5 вольт, авария 0 вольт/ замыкаем на землю при аварии
  pinMode(17, INPUT_PULLUP);          //вход аварии сабвуфера          /норма +5 вольт, авария 0 вольт/ замыкаем на землю при аварии
  
  pinMode(A6, INPUT);                 //вход аварии правый передний   /норма +5 вольт, авария 0 вольт/ замыкаем на землю при аварии
  //чисто аналоговый вход             //вот тут вход привязываем к +5 вольт через резистор 10 кОм, обязательно,да програмно пробовал
                                      //ловит наводки, лучше железно, рядом с ардуиной, так надежнее
                                      
  pinMode(A7, INPUT);                 //вход аварии правый задний     /норма +5 вольт, авария 0 вольт/ замыкаем на землю при аварии
  //чисто аналоговый вход             //вот тут вход привязываем к +5 вольт через резистор 10 кОм, обязательно,да программно пробовал
                                      //ловит наводки, лучше железно, рядом с ардуиной, так надежнее
///....до этого......
  clock.setDateTime(__DATE__, __TIME__); // Устанавливаем время на часах, основываясь на времени компиляции скетча
  vol = EEPROM.read(0); ch1 = EEPROM.read(1); ch2 = EEPROM.read(2); ch3 = EEPROM.read(3);
  ch4 = EEPROM.read(4); ch5 = EEPROM.read(5); ch6 = EEPROM.read(6);
  brig0 = EEPROM.read(7); brig1 = EEPROM.read(8);
  analogWrite(6, brig0 * 25);

  digitalWrite(12, LOW);
  digitalWrite(13, LOW);
  delay(500);
  audio();
       
}
/////////////////поехали/////////////////////////////////////////////
void loop() {
  /// READ TIME /////////////////////////////////
  DateTime = clock.getDateTime(); hour = DateTime.hour; minut = DateTime.minute; secon = DateTime.second;
  data = DateTime.day; mon = DateTime.month; year = DateTime.year;
  

  /// BUTTON ////////////////////////////////////
  //// МЕНЮ КНОПКА c энкодера
  if (power == 0) {
    if ((digitalRead(10) == LOW || ir.value == OK) && menu == 1) {menu1++;delay(200);times = millis();cl1();w = 1;w1 = 1;
      if (menu1 > 7) {menu1 = 0;}
    }
    if (digitalRead(10) == LOW && menu == 2) {menu2++;delay(200);times = millis();w = 1;w1 = 1;
      if (menu2 > 5) {menu2 = 0;}
    }
/////////////Долгое нажатие кнопки энкодера(больше 5 секунд)
////////////---включение/отключение АНАЛИЗАТОРА СПЕКТРА  на втором экране/////////////////
    
    if (digitalRead(10) == LOW && menu==0){delay(200);x_timer++;}// держим кнопку, идет счет x_timer
    if (digitalRead(10) == HIGH) {x_timer=0;} // если отпустить кнопку то x_timer сбрасывается
    if (x_timer > 12 && pin7==0) {digitalWrite(7,HIGH);pin7=1;x_timer=0;} // 12*200 мс + время работы цикла = 5с включаем пин 7 если он был выключен
    if (x_timer > 12 && pin7==1) {digitalWrite(7,LOW);pin7=0;x_timer=0;} //  12*200 мс + время работы цикла = 5с выключаем пин 7 если он был включен
     
    // МЕНЮ КНОПКА SET
    if ((digitalRead(2) == LOW || ir.value == SET) && digitalRead(10) == HIGH) {menu++;delay(200);times = millis();cl();w = 1;w1 = 1;menu1 = 0;
      if (menu > 1) {menu = 0; }
    }
    // МЕНЮ КНОПКА SET time(нажатие одновременно кнопки энкодера и кнопкиSET)
    if (digitalRead(2) == LOW && digitalRead(10) == LOW) {menu = 2;delay(200);times = millis();cl();w = 1;w1 = 1;lcd.setCursor(2, 1);
    lcd.print("TIME CORRECTION");delay(1000);
    }
    // МЕНЮ КНОПКА MUTE - mute on
    if ((digitalRead(3) == LOW || ir.value == MUT) && mute == 0) {mute = 1;cl();audio();menu = 100;brig=brig1;analogWrite(6, brig * 25);
    
    //слово MUTE//да, охренеть! можно проще? и круче? --- поправляйте!(просто "MUTE" не прет!!!)(и массивы ниасилил йа......)
   
   //1 символ "М"+пробел"
    lcd.setCursor(1,0);lcd.write(3);lcd.print("  ");lcd.write(1);lcd.print(" ");
    lcd.setCursor(1,1);lcd.write(8);lcd.write(3);lcd.write(1);lcd.write(8);lcd.print(" ");
    lcd.setCursor(1,2);lcd.write(8);lcd.print("  ");lcd.write(8);lcd.print(" ");
   
    //2 символ "U"+пробел"
    lcd.setCursor(6,0);lcd.write(3);lcd.print("  ");lcd.write(1);lcd.print(" ");  
    lcd.setCursor(6,1);lcd.write(8);lcd.print("  ");lcd.write(8);lcd.print(" ");
    lcd.setCursor(6,2);lcd.write(4);lcd.write(8);lcd.write(8);lcd.write(6);lcd.print(" ");
    
     //3 символ "T"+пробел"
    
    lcd.setCursor(11,0);lcd.write(8);lcd.write(8);lcd.write(8);lcd.print(" ");
    lcd.setCursor(11,1);lcd.print(" ");lcd.write(8);lcd.print("  ");
    lcd.setCursor(11,2);lcd.print(" ");lcd.write(8);lcd.print("  ");
    
    //4 символ "E"+пробел"

    lcd.setCursor(15,0);lcd.write(1);lcd.write(2);lcd.write(2);lcd.write(2);
    lcd.setCursor(15,1);lcd.write(8);lcd.write(2);lcd.write(2);
    lcd.setCursor(15,2);lcd.write(4);lcd.write(5);lcd.write(5);lcd.write(5);

    
            
    delay(500);
    }
     // МЕНЮ КНОПКА MUTE - mute off
    if ((digitalRead(3) == LOW || ir.value == MUT) && mute == 1) {mute = 0;cl();times = millis();w = 1;w1 = 1;menu = 0;menu1 = 0;myEnc.write(0);newPosition = 0;brig=brig0;analogWrite(6, brig * 25);audio();}
    }
   // МЕНЮ КНОПКА POWER
   //сначала ВЫКЛЮЧЕНИЕ
    if (((digitalRead(4) == LOW || ir.value == POWER) && power == 0) || standby == 1)  {menu1 = 0;  mute = 1; audio();
    power = 1; standby = 0;cl();times = millis(); w = 1; w1 = 1; menu = 100;//сначала вырубаем звук....
/////    в цикле плавное снижение уровня подсветки.....
    for (i = 1; i <=10 ; i++) {
     switch (i) {
      case 0:brig = 10;analogWrite(6, brig * 25); break;
      case 1:brig = 9; analogWrite(6, brig * 25); break;
      case 2:brig = 8; analogWrite(6, brig * 25); break;
      case 3:brig = 7; analogWrite(6, brig * 25); break;
      case 4:brig = 6; analogWrite(6, brig * 25); break;
      case 5:brig = 5; analogWrite(6, brig * 25); break;
      case 6:brig = 4; analogWrite(6, brig * 25); break;
      case 7:brig = 3; analogWrite(6, brig * 25); break;
      case 8:brig = 2; analogWrite(6, brig * 25); break;
      case 9:brig = 1; analogWrite(6, brig * 25); break;
      }
         delay(100);  //выключаем все и врубаем меню STANDBY.....
   
    }
    }
    
  // power on- ЭКРАН ПРИ ВКЛЮЧЕНИИ
  //потом ВКЛЮЧЕНИЕ
    if ((digitalRead(4) == LOW || ir.value == POWER) && power == 1) {
    power = 0; cl();times = millis(); w = 1; w1 = 1; menu = 0; menu1 = 0;myEnc.write(0);newPosition = 0; brig = brig0;
    digitalWrite(12, HIGH);//включение питания 1й выход
    lcd.setCursor(0, 0); lcd.print("  BU DIGITAL SARAY  ");//1 строка    
    lcd.setCursor(0, 1); lcd.print("POWER AMPLIFIER  5.1");//2 строка
    lcd.setCursor(0, 2); lcd.print("   SYSTEM LOADING   ");//3 строка
    for(int i=1;i<=10;i++){ brig=i; analogWrite(6, brig * 25);delay(150);//плавное включение подсветки при ВКЛЮЧЕНИИ
    }
    //дальше полоса загрузки
    lcd.setCursor(0, 3); lcd.write(5); delay(100); lcd.write(2); delay(100); lcd.write(5); delay(100); lcd.write(2); delay(100);
                         lcd.write(5); delay(100); lcd.write(2); delay(100); lcd.write(5); delay(100); lcd.write(2); delay(100);
                         lcd.write(5); delay(100); lcd.write(2); delay(100);//бегущая полоска загрузки 4 строка
                         digitalWrite(13, HIGH); //включение питания с задержкой(софтстарт) 2й выход
                         //можно ставить в любое место,в строку загрузки, в зависимости  от величины задержки включения 2го выхода
                         lcd.write(5); delay(100); lcd.write(2); delay(100); lcd.write(5); delay(100); lcd.write(2); delay(100);                         
                         lcd.write(5); delay(100); lcd.write(2); delay(100); lcd.write(5); delay(100); lcd.write(2); delay(100);
                         lcd.write(5); delay(100); lcd.write(2); delay(100);_start=1;//бегущая полоска загрузки 4 строка    
    
    
    mute = 0; audio(); cl();//команда MUTE при включении снимается после полной загрузки экрана
    
  } 
  // power off//выключение
  if (power == 1) {digitalWrite(12, LOW);} // output standby
   
  else {digitalWrite(12, HIGH);}
 
  if (power == 1) {digitalWrite(13, LOW);} // output standby delay
  
  /// IR ////////////////////////////////////////
  if ( irrecv.decode( &ir )) {
    Serial.print("0x");  // IR приемник - чтение, в мониторе порта отображаются коды кнопок
    Serial.println( ir.value, HEX);
    //Serial.println (sensor_Alarm_1);
    //Serial.println (sensor_Alarm_2);
    irrecv.resume();
    times = millis();
    w = 1;
    w1 = 1;
  }
  if (ir.value == 0) {
    gr1 = 0;  // запрет нажатий не активных кнопок пульта
    gr2 = 0;
  }

  ////////////// VOLUME ///////////////////////////////////////////////////////////////////
  
  if (menu == 0) {
    // кнопка >
    if (ir.value == VOLUME_UP && mute == 0 && power == 0) {vol++;gr1 = 1;gr2 = 0;cl1();times = millis();w = 1;vol_func();audio();}
    // кнопка >>>>>>
    if (ir.value == 0xFFFFFFFF and gr1 == 1) {vol++;gr2 = 0;cl1();times = millis();;w = 1;vol_func();audio();}
    // кнопка <
    if (ir.value == VOLUME_DW) {vol--;gr1 = 0;gr2 = 1;cl1();times = millis();;w = 1;vol_func();audio();}
    // кнопка <<<<<<
    if (ir.value == 0xFFFFFFFF and gr2 == 1) {vol--;gr1 = 0;cl1();times = millis();w = 1;vol_func();audio();}

    if (newPosition != oldPosition) {oldPosition = newPosition;vol = vol + newPosition;
        myEnc.write(0);newPosition = 0; times = millis();w = 1;w1 = 1;vol_func();audio();}
        
    a[0] = (vol) / 10; a[1] = (vol) % 10;
    for (x = 0; x < 2; x++) {
      switch (x) {
        case 0: e1 = 10, e2 = 11, e3 = 12;break;
        case 1: e1 = 14, e2 = 15, e3 = 16;break;} 
        digit();
    }
    //Минус (гаснущий при нуле) перед цифрами уровня громкости
    lcd.setCursor(8, 0); if (vol > 0) {lcd.write(5);} else {lcd.print(" ");//{lcd.write(5);---какой символ отображать----из таблички  в начале скейча
    }
    
    ////Вывод температуры на основной экран///////
    
    if (millis() - timTemp >= 800) {
    timTemp = millis();  ///время опроса датчика
    // читаем прошлое значение
    if (sensor.readTemp()) {lcd.setCursor(16, 3);lcd.print(sensor.getTemp(),0);lcd.write(223);lcd.print("C");}//выводим на экран
    else {lcd.setCursor(16, 3);lcd.print("--ER");delay(250);lcd.setCursor(16, 3);lcd.print("    ");}//если обрыв датчика пишем error
    // запрашиваем новое измерение
    sensor.requestTemp();
    
    //термозащита //4 строка
    
    //вот тут меняем уставку защиты.....50...90 градусов....или 100))))
    //если температура превышает уставку.....
    if ((sensor.getTemp())>=30){mute = 1; audio(); termo=1;//вырубаем звук
    //вместо часов выводим сообщение....
    lcd.setCursor(0, 3);lcd.print("TERMO  OVERLOAD ");delay(450);   
    //тут пишем максимальную температуру, как в уставке       
    lcd.setCursor(0, 3);lcd.print("   MAX t 30");lcd.write(223);lcd.print("C   ");delay(450);  
    lcd.setCursor(0, 3);lcd.print("     !MUTE!     ");delay(450);
             
    }   //если температура в норме.....   
      else { mute = 0; audio();termo=0;//врубаем звук    
      //возвращаем часы .....
      lcd.setCursor(0, 3);
      lcd.print(hour / 10); lcd.print(hour % 10); lcd.print(":");
      lcd.print(minut / 10); lcd.print(minut % 10); lcd.print(":");
      lcd.print(secon / 10); lcd.print(secon % 10); lcd.print("       ");}
    }
   
    //надписи основного экрана/ индикация аварии каналов
   //1 строка
        lcd.setCursor(0, 0); lcd.print(" VOLUME ");
   //2 строка начало
        lcd.setCursor(0, 1); lcd.print(" 5.1 CH ");
   //2 строка в конце 
        lcd.setCursor(18,1); lcd.print("dB");//2 строка после цифр уровня громкости

    // индикаторы неисправности каналов// кому не нужно раскоментируйте строку ниже
    //lcd.setCursor(0, 2); lcd.print("--------------------");//3 строка
        //и все остальное можете удалить, от этого места.......
    int sensor_Alarm_1 = analogRead(A6);//считываем сигнал аварии правого переднего канала
    int sensor_Alarm_2 = analogRead(A7);//считываем сигнал аварии правого заднего канала
       
    //левый передний
   if (digitalRead(14) == HIGH)                                                              
       {lcd.setCursor(0, 2);lcd.write(42);lcd.write(42);lcd.write(42);}                      
   if (digitalRead(14) == LOW ) {if ((millis() % 1000) > 500)                                
       {lcd.setCursor(0, 2); lcd.print("FL ");}
   else{lcd.setCursor(0, 2); lcd.print("DC ");}
    }
    //левый задний
   if (digitalRead(15) == HIGH)
       {lcd.setCursor(3, 2);lcd.write(42);lcd.write(42);lcd.write(42);}
   if (digitalRead(15) == LOW) {if ((millis() % 1000) > 500) 
       {lcd.setCursor(3, 2); lcd.print("RL ");}
   else{lcd.setCursor(3, 2); lcd.print("DC ");}
    }
    //центральный
   if (digitalRead(16) == HIGH)
       {lcd.setCursor(6, 2);lcd.write(42);lcd.write(42);lcd.write(42);lcd.write(42);}
   if (digitalRead(16) == LOW) {if ((millis() % 1000) > 500)
       {lcd.setCursor(6, 2); lcd.print("CNTR");}
   else{lcd.setCursor(6, 2); lcd.print(" DC ");}
    }
    //сабвуфер
   if (digitalRead(17) == HIGH) 
       {lcd.setCursor(10, 2);lcd.write(42);lcd.write(42);lcd.write(42);lcd.write(42);}
   if (digitalRead(17) == LOW) {if ((millis() % 1000) > 500) 
       {lcd.setCursor(10, 2); lcd.print(" SUB");}
   else{lcd.setCursor(10, 2); lcd.print(" D C");}
    }
     //правый  передний/// тут пришлось поковыряться......вход А6 чисто аналоговый
   if (sensor_Alarm_1 > 500) 
       {lcd.setCursor(14, 2);lcd.write(42);lcd.write(42);lcd.write(42);}
   if (sensor_Alarm_1 < 10) {if ((millis() % 1000) > 500) 
       {lcd.setCursor(14, 2); lcd.print(" FR");}
   else{lcd.setCursor(14, 2); lcd.print(" DC");}
   } 
    //правый  задний /// и тут тоже пришлось поковыряться......вход А7 чисто аналоговый
   if (sensor_Alarm_2 > 500) 
       {lcd.setCursor(17, 2);lcd.write(42);lcd.write(42);lcd.write(42);}
   if (sensor_Alarm_2 < 10) {if ((millis() % 1000) > 500) 
       {lcd.setCursor(17, 2); lcd.print(" RR");}
   else{lcd.setCursor(17, 2); lcd.print(" DC");}

   ////до сюда.....
   }    
    //яркость подсветки.... автоматическое снижение при неактивных кнопках.....
    //  ждем 10 сек и выключаем подсветку
 if (_start==1) { if (_trgrt1I) { _trgrt1 = 0;} else {_trgrt1 = 1; _trgrt1I = 1;} } else {_trgrt1 = 0; _trgrt1I = 0;}; 
 if ( (_trgrt1) || digitalRead(2)  == LOW || digitalRead(3)  == LOW || digitalRead(4)  == LOW ||
        digitalRead(8)  == LOW || digitalRead(9)  == LOW || digitalRead(10) == LOW ||
        digitalRead(14) == LOW || digitalRead(15) == LOW || digitalRead(16) == LOW ||
        digitalRead(17) == LOW ||   sensor_Alarm_1 < 10  || sensor_Alarm_2 < 10    ||
        ir.value == OK || ir.value == SET || ir.value == MUT || ir.value == POWER  ||                                                       
        termo == 1 ||  gr1==1 || gr2==1) {_tim1O = 1; _tim1I = 1;} else { if(_tim1I) {_tim1I = 0; _tim1P = millis();} else { if (_tim1O) {if ( _isTimer(_tim1P, 10000)) _tim1O = 0;}}}
 if (!( _tim1O ) ) {brig = brig1;analogWrite(6, brig * 25);}                                  //////////////вот тут меняем время задержки отключения  подсветки ↑↑↑↑↑↑
 if ( _tim1O ){brig = brig0;analogWrite(6, brig * 25);}


       
   }
  ///////// ATT //////////////////////////////////////////////////////////////////////////////
      if (menu == 1) {
      switch (menu1) {
      case 0: temp0 = ch1; break;
      case 1: temp0 = ch2; break;
      case 2: temp0 = ch3; break;
      case 3: temp0 = ch4; break;
      case 4: temp0 = ch5; break;
      case 5: temp0 = ch6; break;
      case 6: temp0 = brig0; break;
      case 7: temp0 = brig1; break;
    }
    // кнопка >
    if (ir.value == VOLUME_UP) {temp0--; gr1 = 1;gr2 = 0;cl1();times = millis();w = 1;www = 1;}
    // кнопка >>>>>>
    if (ir.value == 0xFFFFFFFF and gr1 == 1) {temp0--;gr2 = 0;cl1();times = millis();;w = 1;w = 1;www = 1;}
    // кнопка <
    if (ir.value == VOLUME_DW) {temp0++; gr1 = 0;gr2 = 1;cl1();times = millis();;w = 1;w = 1;www = 1;
    }
    // кнопка <<<<<<
    if (ir.value == 0xFFFFFFFF and gr2 == 1) {temp0++;gr1 = 0;cl1();times = millis();w = 1;w = 1;www = 1;}

    if (newPosition != oldPosition) {oldPosition = newPosition;temp0 = temp0 - newPosition; myEnc.write(0); newPosition = 0; times = millis(); w = 1; www = 1;
    }

    switch (menu1) {
      case 0: ch1 = temp0; if (ch1 < 0) {ch1 = 0;} if (ch1 > 15) {ch1 = 15;} break;
      case 1: ch2 = temp0; if (ch2 < 0) {ch2 = 0;} if (ch2 > 15) {ch2 = 15;} break;
      case 2: ch3 = temp0; if (ch3 < 0) {ch3 = 0;} if (ch3 > 15) {ch3 = 15;} break;
      case 3: ch4 = temp0; if (ch4 < 0) {ch4 = 0;} if (ch4 > 15) {ch4 = 15;} break;
      case 4: ch5 = temp0; if (ch5 < 0) {ch5 = 0;} if (ch5 > 15) {ch5 = 15;} break;
      case 5: ch6 = temp0; if (ch6 < 0) {ch6 = 0;} if (ch6 > 15) {ch6 = 15;} break;
      case 6: brig0 = temp0; brig0_func(); break;
      case 7: brig1 = temp0; brig1_func(); break;
    }

    au();
    if (menu1 < 7) {brig = brig0;}
    if (menu1 == 7) {brig = brig1;}
    analogWrite(6, brig * 25);

    for (i = 0; i < 8; i++) {
      if (menu1 == i) {
        lcd.setCursor(mesto2[i], mesto3[i]);
        lcd.print(char(126));
      } else {
        lcd.setCursor(mesto2[i], mesto3[i]);
        lcd.print(" ");
      }
    }

    lcd.setCursor(1, 0); lcd.print("Lfront"); if (ch1 == 0) {
      lcd.print(" ");
    } lcd.print(-ch1); if (ch1 < 10) {
      lcd.print(" ");
    }
    lcd.setCursor(11, 0); lcd.print("Rfront"); if (ch2 == 0) {
      lcd.print(" ");
    } lcd.print(-ch2); if (ch2 < 10) {
      lcd.print(" ");
    }
    lcd.setCursor(1, 1); lcd.print("L rear"); if (ch3 == 0) {
      lcd.print(" ");
    } lcd.print(-ch3); if (ch3 < 10) {
      lcd.print(" ");
    }
    lcd.setCursor(11, 1); lcd.print("R rear"); if (ch4 == 0) {
      lcd.print(" ");
    } lcd.print(-ch4); if (ch4 < 10) {
      lcd.print(" ");
    }
    lcd.setCursor(1, 2); lcd.print("Center"); if (ch5 == 0) {
      lcd.print(" ");
    } lcd.print(-ch5); if (ch5 < 10) {
      lcd.print(" ");
    }
    lcd.setCursor(11, 2); lcd.print("SubW  "); if (ch6 == 0) {
      lcd.print(" ");
    } lcd.print(-ch6); if (ch6 < 10) {
      lcd.print(" ");
    }
    lcd.setCursor(1, 3); lcd.print("BR ON "); lcd.print(brig0); lcd.print(" ");
    lcd.setCursor(11, 3); lcd.print("BR OFF "); lcd.print(brig1); lcd.print(" ");
  }

  //////// menu set time /////////////////////////////////////
  if (menu == 2) {
    hh = DateTime.hour; mm = DateTime.minute; ss = DateTime.second; dd = DateTime.day; mn = DateTime.month; gg = DateTime.year;
    switch (menu2) {
      case 0: time_temp = hh; break;
      case 1: time_temp = mm; break;
      case 2: time_temp = ss; break;
      case 3: time_temp = dd; break;
      case 4: time_temp = mn; break;
      case 5: time_temp = gg; break;
    }


    if (newPosition != oldPosition) {
      oldPosition = newPosition;
      time_temp = time_temp - newPosition; myEnc.write(0); newPosition = 0; times = millis(); w = 1; tim_w = 1;
    }

    switch (menu2) {
      case 0: hh = time_temp; 
      if (hh < 0) {hh = 0;} 
      if (hh > 23) {hh = 23;} break;
      case 1: mm = time_temp; 
      if (mm < 0) {mm = 0;} 
      if (mm > 59) {mm = 59;} break;
      case 2: ss = time_temp; 
      if (ss < 0) {ss = 0;} 
      if (ss > 59) {ss = 59;} break;
      case 3: dd = time_temp; 
      if (dd < 1) {dd = 1;}
      if (dd > 31) {dd = 31;} break;
      case 4: mn = time_temp;
      if (mn < 1) {mn = 1;} 
      if (mn > 12) {mn = 12;} break;
      case 5: gg = time_temp; 
      if (gg < 2022) {gg = 2022;} 
      if (gg > 2100) {gg = 2100;} break;
    }

    lcd.setCursor(0, 0); lcd.print("TIME CORRECTION");
    lcd.setCursor(0, 1); lcd.print("--------------------");
    lcd.setCursor(0, 2);
    if (menu2 == 0) {
      lcd.print("set hour   ");
    }
    if (menu2 == 1) {
      lcd.print("set minute ");
    }
    if (menu2 == 2) {
      lcd.print("set seconds");
    }
    if (menu2 == 3) {
      lcd.print("set date   ");
    }
    if (menu2 == 4) {
      lcd.print("set month  ");
    }
    if (menu2 == 5) {
      lcd.print("set year   ");
    }

    lcd.setCursor(0, 3);
    lcd.print(hour / 10); lcd.print(hour % 10); lcd.print(":");
    lcd.print(minut / 10); lcd.print(minut % 10); lcd.print(":");
    lcd.print(secon / 10); lcd.print(secon % 10); lcd.print(" ");
    lcd.print(data / 10); lcd.print(data % 10); lcd.print("-");
    lcd.print(mon / 10); lcd.print(mon % 10); lcd.print("-");
    lcd.print(year);


    if (tim_w == 1) {
      tim_w = 0;
      clock.setDateTime(gg, mn, dd, hh, mm, ss);
      delay(100);
    }
  }

  /////// EEPROM //////////////////////////////////////
  if (millis() - times > 5000 && w1 == 1 && mute == 0 && power == 0) {
    w1 = 0;
    EEPROM.update(0, vol); EEPROM.update(1, ch1); EEPROM.update(2, ch2); EEPROM.update(3, ch3);
    EEPROM.update(4, ch4); EEPROM.update(5, ch5); EEPROM.update(6, ch6);
    EEPROM.update(7, brig0); EEPROM.update(8, brig1);
  if(menu!=0){cl();}
  }

  if (power == 1) {
   
    a[0] = DateTime.hour / 10;
    a[1] = DateTime.hour % 10;
    a[2] = DateTime.minute / 10;
    a[3] = DateTime.minute % 10;
    //a[4] = DateTime.second / 10;
    //a[5] = DateTime.second % 10;

    //for (i = 0; i < 6; i++) {
    for (i = 0; i < 4; i++) {
      switch (i) {
        case 0: e1 = 1, e2 = 2, e3 = 3; break;//десятки часов
        case 1: e1 = 5, e2 = 6, e3 = 7; break;//единицы часов
        case 2: e1 = 12, e2 = 13, e3 = 14; break;//десятки минут
        case 3: e1 = 16, e2 = 17, e3 = 18; break;//единицы минут
        //case 4: e1 = 14, e2 = 15, e3 = 16; break;//не надо
       // case 5: e1 = 17, e2 = 18, e3 = 19; break;//не надо
      }
      switch (a[i]) {
        case 0: d1=1,d2=2,d3=3,d4=4,d5=5,d6=6;break;
        case 1: d1=2,d2=3,d3=32,d4=5,d5=8,d6=5;break;
        case 2: d1=7,d2=7,d3=3,d4=8,d5=5,d6=5;break;
        case 3: d1=7,d2=7,d3=3,d4=5,d5=5,d6=6;break;
        case 4: d1=4,d2=5,d3=8,d4=32,d5=32,d6=8;break;
        case 5: d1=8,d2=7,d3=7,d4=5,d5=5,d6=6;break;
        case 6: d1=1,d2=7,d3=7,d4=4,d5=5,d6=6;break;
        case 7: d1=2,d2=2,d3=3,d4=32,d5=32,d6=8;break;
        case 8: d1=1,d2=7,d3=3,d4=4,d5=5,d6=6;break;
        case 9: d1=1,d2=7,d3=3,d4=5,d5=5,d6=6;break;
      }
///////////////положение цифр на экране///сейчас 2я и 3я строка..........
      lcd.setCursor(e1, 1); lcd.write((uint8_t)d1); lcd.setCursor(e2, 1); lcd.write((uint8_t)d2); lcd.setCursor(e3, 1); lcd.write((uint8_t)d3);
      lcd.setCursor(e1, 2); lcd.write((uint8_t)d4); lcd.setCursor(e2, 2); lcd.write((uint8_t)d5); lcd.setCursor(e3, 2); lcd.write((uint8_t)d6);
    }
  

//точки между цифр
      //lcd.setCursor(9,1);lcd.write(2);lcd.setCursor(10,1);lcd.write(2);
      //lcd.setCursor(9,2);lcd.write(5);lcd.setCursor(10,2);lcd.write(5);
       if(secon % 10 == 1||secon % 10 == 3||secon % 10 == 5||secon % 10 == 7||secon % 10 == 9)
       {lcd.setCursor(9,1) ;lcd.write(2);  lcd.print(" ");
        lcd.setCursor(9,2);lcd.print(" ");lcd.write(5);}
      //четное - точки2( можно пробелы вставить---lcd.print(" ");---)
      if(secon % 10 == 0||secon % 10 == 2||secon % 10 == 4||secon % 10 == 6||secon % 10 == 8)
       {lcd.setCursor(9,1) ;lcd.print(" ");lcd.write(2);
        lcd.setCursor(9,2);lcd.write(5);  lcd.print(" ");}
//перемещение снежинок......////много кода......много...........//аааааааааааааааааааа////кто может лучше и проще, меняйте.............   
  
      if(secon % 10 == 0&&secon / 10 == 0||secon % 10 == 0&&secon / 10 == 2||secon % 10 == 0&&secon / 10 == 4)
           {lcd.setCursor(0,0);lcd.write(42);lcd.setCursor(19,3);lcd.write(42);}
      else {lcd.setCursor(0,0);lcd.print(" ");lcd.setCursor(19,3);lcd.print(" ");}
      
      if(secon % 10 == 1&&secon / 10 == 0||secon % 10 == 1&&secon / 10 == 2||secon % 10 == 1&&secon / 10 == 4)
           {lcd.setCursor(1,0);lcd.write(42);lcd.setCursor(18,3);lcd.write(42);}
      else {lcd.setCursor(1,0);lcd.print(" ");lcd.setCursor(18,3);lcd.print(" ");}  
        
      if(secon % 10 == 2&&secon / 10 == 0||secon % 10 == 2&&secon / 10 == 2||secon % 10 == 2&&secon / 10 == 4)
           {lcd.setCursor(2,0);lcd.write(42);lcd.setCursor(17,3);lcd.write(42);}
      else {lcd.setCursor(2,0);lcd.print(" ");lcd.setCursor(17,3);lcd.print(" ");} 
          
      if(secon % 10 == 3&&secon / 10 == 0||secon % 10 == 3&&secon / 10 == 2||secon % 10 == 3&&secon / 10 == 4)
           {lcd.setCursor(3,0);lcd.write(42);lcd.setCursor(16,3);lcd.write(42);}
      else {lcd.setCursor(3,0);lcd.print(" ");lcd.setCursor(16,3);lcd.print(" ");}  
         
      if(secon % 10 == 4&&secon / 10 == 0||secon % 10 == 4&&secon / 10 == 2||secon % 10 == 4&&secon / 10 == 4)
           {lcd.setCursor(4,0);lcd.write(42);lcd.setCursor(15,3);lcd.write(42);}
      else {lcd.setCursor(4,0);lcd.print(" ");lcd.setCursor(15,3);lcd.print(" ");}

      if(secon % 10 == 5&&secon / 10 == 0||secon % 10 == 5&&secon / 10 == 2||secon % 10 == 5&&secon / 10 == 4)
           {lcd.setCursor(5,0);lcd.write(42);lcd.setCursor(14,3);lcd.write(42);}
      else {lcd.setCursor(5,0);lcd.print(" ");lcd.setCursor(14,3);lcd.print(" ");} 
      
      if(secon % 10 == 6&&secon / 10 == 0||secon % 10 == 6&&secon / 10 == 2||secon % 10 == 6&&secon / 10 == 4)
           {lcd.setCursor(6,0);lcd.write(42);lcd.setCursor(13,3);lcd.write(42);}
      else {lcd.setCursor(6,0);lcd.print(" ");lcd.setCursor(13,3);lcd.print(" ");} 

      if(secon % 10 == 7&&secon / 10 == 0||secon % 10 == 7&&secon / 10 == 2||secon % 10 == 7&&secon / 10 == 4)
           {lcd.setCursor(7,0);lcd.write(42);lcd.setCursor(12,3);lcd.write(42);}
      else {lcd.setCursor(7,0);lcd.print(" ");lcd.setCursor(12,3);lcd.print(" ");} 

      if(secon % 10 == 8&&secon / 10 == 0||secon % 10 == 8&&secon / 10 == 2||secon % 10 == 8&&secon / 10 == 4)
           {lcd.setCursor(8,0);lcd.write(42);lcd.setCursor(11,3);lcd.write(42);}
      else {lcd.setCursor(8,0);lcd.print(" ");lcd.setCursor(11,3);lcd.print(" ");} 

      if(secon % 10 == 9&&secon / 10 == 0||secon % 10 == 9&&secon / 10 == 2||secon % 10 == 9&&secon / 10 == 4)
           {lcd.setCursor(9,0);lcd.write(42);lcd.setCursor(10,3);lcd.write(42);}
      else {lcd.setCursor(9,0);lcd.print(" ");lcd.setCursor(10,3);lcd.print(" ");} 
      
      ///////////////////////ааааааааааааааааааааааа///////////////////////////////////////////////
      
      if(secon % 10 == 0&&secon / 10 == 1||secon % 10 == 0&&secon / 10 == 3||secon % 10 == 0&&secon / 10 == 5)
           {lcd.setCursor(10,0);lcd.write(42);lcd.setCursor(9,3);lcd.write(42);}
      else {lcd.setCursor(10,0);lcd.print(" ");lcd.setCursor(9,3);lcd.print(" ");}
      
      if(secon % 10 == 1&&secon / 10 == 1||secon % 10 == 1&&secon / 10 == 3||secon % 10 == 1&&secon / 10 == 5)
           {lcd.setCursor(11,0);lcd.write(42);lcd.setCursor(8,3);lcd.write(42);}
      else {lcd.setCursor(11,0);lcd.print(" ");lcd.setCursor(8,3);lcd.print(" ");}  
        
      if(secon % 10 == 2&&secon / 10 == 1||secon % 10 == 2&&secon / 10 == 3||secon % 10 == 2&&secon / 10 == 5)
           {lcd.setCursor(12,0);lcd.write(42);lcd.setCursor(7,3);lcd.write(42);}
      else {lcd.setCursor(12,0);lcd.print(" ");lcd.setCursor(7,3);lcd.print(" ");} 
          
      if(secon % 10 == 3&&secon / 10 == 1||secon % 10 == 3&&secon / 10 == 3||secon % 10 == 3&&secon / 10 == 5)
           {lcd.setCursor(13,0);lcd.write(42);lcd.setCursor(6,3);lcd.write(42);}
      else {lcd.setCursor(13,0);lcd.print(" ");lcd.setCursor(6,3);lcd.print(" ");}  
         
      if(secon % 10 == 4&&secon / 10 == 1||secon % 10 == 4&&secon / 10 == 3||secon % 10 == 4&&secon / 10 == 5)
           {lcd.setCursor(14,0);lcd.write(42);lcd.setCursor(5,3);lcd.write(42);}
      else {lcd.setCursor(14,0);lcd.print(" ");lcd.setCursor(5,3);lcd.print(" ");}

      if(secon % 10 == 5&&secon / 10 == 1||secon % 10 == 5&&secon / 10 == 3||secon % 10 == 5&&secon / 10 == 5)
           {lcd.setCursor(15,0);lcd.write(42);lcd.setCursor(4,3);lcd.write(42);}
      else {lcd.setCursor(15,0);lcd.print(" ");lcd.setCursor(4,3);lcd.print(" ");} 
      
      if(secon % 10 == 6&&secon / 10 == 1||secon % 10 == 6&&secon / 10 == 3||secon % 10 == 6&&secon / 10 == 5)
           {lcd.setCursor(16,0);lcd.write(42);lcd.setCursor(3,3);lcd.write(42);}
      else {lcd.setCursor(16,0);lcd.print(" ");lcd.setCursor(3,3);lcd.print(" ");} 

      if(secon % 10 == 7&&secon / 10 == 1||secon % 10 == 7&&secon / 10 == 3||secon % 10 == 7&&secon / 10 == 5)
           {lcd.setCursor(17,0);lcd.write(42);lcd.setCursor(2,3);lcd.write(42);}
      else {lcd.setCursor(17,0);lcd.print(" ");lcd.setCursor(2,3);lcd.print(" ");} 

      if(secon % 10 == 8&&secon / 10 == 1||secon % 10 == 8&&secon / 10 == 3||secon % 10 == 8&&secon / 10 == 5)
           {lcd.setCursor(18,0);lcd.write(42);lcd.setCursor(1,3);lcd.write(42);}
      else {lcd.setCursor(18,0);lcd.print(" ");lcd.setCursor(1,3);lcd.print(" ");} 

      if(secon % 10 == 9&&secon / 10 == 1||secon % 10 == 9&&secon / 10 == 3||secon % 10 == 9&&secon / 10 == 5)
           {lcd.setCursor(19,0);lcd.write(42);lcd.setCursor(0,3);lcd.write(42);}
      else {lcd.setCursor(19,0);lcd.print(" ");lcd.setCursor(0,3);lcd.print(" ");}
      
      ////////////////////всеееееееееееееееееееееее///////////////////////////////
        
      //if(secon % 10 == 1||secon % 10 == 3||secon % 10 == 5||secon % 10 == 7||secon % 10 == 9)
      // {lcd.setCursor(9,0);lcd.write(2);lcd.setCursor(9,1);lcd.write(5);
       // lcd.setCursor(10,0);lcd.write(2);lcd.setCursor(10,1);lcd.write(5);}
      //четное - точки 2( можно пробелы вставить---lcd.print(" ");---)
     // if(secon % 10 == 0||secon % 10 == 2||secon % 10 == 4||secon % 10 == 6||secon % 10 == 8)
      //  {lcd.setCursor(9,0);lcd.write(5);lcd.setCursor(9,1);lcd.write(2);
     //   lcd.setCursor(10,0);lcd.write(5);lcd.setCursor(10,1);lcd.write(2);}
    
      //lcd.setCursor(0, 2); lcd.print("--------------------");
      //lcd.setCursor(6, 3); lcd.print("STAND BY");
  }


}  /// END LOOP

bool _isTimer(unsigned long startTime, unsigned long period )
  {
  unsigned long currentTime;
currentTime = millis();
if (currentTime>= startTime) {return (currentTime>=(startTime + period));} else {return (currentTime >=(4294967295-startTime+period));}
  }







void au() {
  if (www == 1) {
    audio();
    www = 0;
  }
}
void cl() {
  ir.value = 0;
  delay(300);
  lcd.clear();
}
void cl1() {
  ir.value = 0;
  delay(200);
}
void brig1_func() {
  if (brig1 > 10) {
    brig1 = 10;
  } if (brig1 < 0) {
    brig1 = 0;
  }
}
void brig0_func() {
  if (brig0 > 10) {
    brig0 = 10;
  } if (brig0 < 0) {
    brig0 = 0;
  }
}
void audio() {
  pt.clear();
  //  pt.setVolume(75); //  int 0...79
  pt.setVol1(79 - (vol + ch1)); //  int 0...79
  pt.setVol2(79 - (vol + ch2)); //  int 0...79
  pt.setVol3(79 - (vol + ch3)); //  int 0...79
  pt.setVol4(79 - (vol + ch4)); //  int 0...79
  pt.setVol5(79 - (vol + ch5)); //  int 0...79
  pt.setVol6(79 - (vol + ch6)); //  int 0...79
  pt.setMute(mute); // mute 0 - off / 1 - on
}

void to_Timer() {
  newPosition = myEnc.read() / 4;
}
void vol_func() {
  if (0 > vol) {
    vol = 0;
  } if (64 < vol) {
    vol = 64;
  }
}

void digit() {
  switch (a[x]) {
    case 0: d1=1,d2=2,d3=3,d4=4,d5=5,d6=6;break;
    case 1: d1=2,d2=3,d3=32,d4=5,d5=8,d6=5;break;
    case 2: d1=7,d2=7,d3=3,d4=8,d5=5,d6=5;break;
    case 3: d1=7,d2=7,d3=3,d4=5,d5=5,d6=6;break;
    case 4: d1=4,d2=5,d3=8,d4=32,d5=32,d6=8;break;
    case 5: d1=8,d2=7,d3=7,d4=5,d5=5,d6=6;break;
    case 6: d1=1,d2=7,d3=7,d4=4,d5=5,d6=6;break;
    case 7: d1=2,d2=2,d3=3,d4=32,d5=32,d6=8;break;
    case 8: d1=1,d2=7,d3=3,d4=4,d5=5,d6=6;break;
    case 9: d1=1,d2=7,d3=3,d4=5,d5=5,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);
}

И еще вопрос. А две подряд  точки с запятыми  ;;  это так надо? или это опечатка....???
убрать можно? а вдруг надо??? )))
встречается в 4х местах.....
вот тут....
if (menu == 0) {
    // кнопка >
    if (ir.value == VOLUME_UP && mute == 0 && power == 0) {vol++;gr1 = 1;gr2 = 0;cl1();times = millis();w = 1;vol_func();audio();}
    // кнопка >>>>>>
    if (ir.value == 0xFFFFFFFF and gr1 == 1) {vol++;gr2 = 0;cl1();times = millis()   

;;

     w = 1;vol_func();audio();}
    // кнопка <
    if (ir.value == VOLUME_DW) {vol--;gr1 = 0;gr2 = 1;cl1();times = millis() 

;;

    w = 1;vol_func();audio();}
    // кнопка <<<<<<
    if (ir.value == 0xFFFFFFFF and gr2 == 1) {vol--;gr1 = 0;cl1();times = millis();w = 1;vol_func();audio();}

и вот тут....
  ///////// ATT //////////////////////////////////////////////////////////////////////////////
      if (menu == 1) {
      switch (menu1) {
      case 0: temp0 = ch1; break;
      case 1: temp0 = ch2; break;
      case 2: temp0 = ch3; break;
      case 3: temp0 = ch4; break;
      case 4: temp0 = ch5; break;
      case 5: temp0 = ch6; break;
      case 6: temp0 = brig0; break;
      case 7: temp0 = brig1; break;
    }
    // кнопка >
    if (ir.value == VOLUME_UP) {temp0--; gr1 = 1;gr2 = 0;cl1();times = millis();w = 1;www = 1;}
    // кнопка >>>>>>
    if (ir.value == 0xFFFFFFFF and gr1 == 1) {temp0--;gr2 = 0;cl1();times = millis()   

;;

   w = 1;w = 1;www = 1;}
    // кнопка <
    if (ir.value == VOLUME_DW) {temp0++; gr1 = 0;gr2 = 1;cl1();times = millis()   

;;

     w = 1;w = 1;www = 1;
    }
    // кнопка <<<<<<
    if (ir.value == 0xFFFFFFFF and gr2 == 1) {temp0++;gr1 = 0;cl1();times = millis();w = 1;w = 1;www = 1;}

61

Re: PT2258 + LCD2004_I2C + IR + DS3231

;; просто опечатка, на исполнение кода она не влияет.

62 (2022-07-13 21:31:21 отредактировано sanj76a)

Re: PT2258 + LCD2004_I2C + IR + DS3231

Не потеме.
FLprog первый раз слышу. Очень интересно! Дай ссылку на рабочую версию.
Нашел это. https://flprog.ru

63 (2022-07-15 00:10:15 отредактировано niko00780)

Re: PT2258 + LCD2004_I2C + IR + DS3231

sanj76a пишет:

Не потеме.
FLprog первый раз слышу. Очень интересно! Дай ссылку на рабочую версию.
Нашел это. https://flprog.ru

Да эта программа. Я больше в релейной логике разбираюсь, киповец я. Мне в этой проге проще, чем код писать. Особенно что то не сложное, схема рисуется быстро. Программа сама код компилирует. https://flprog.ru/downloads/distrutives … rog-3-0-3/  вроде тут скачать можно. В ней нету конечно многих блоков, те-же аудио процессоры).... Я в этой программе делал часы с термометрами дом-улица.  Станок намоточный тоже программировал)....

64 (2022-07-20 01:11:31 отредактировано niko00780)

Re: PT2258 + LCD2004_I2C + IR + DS3231

Пришли оранжевые экраны. Символы оранжевые, фон черный. Они реально круче смотрятся чем синие и зеленые!!!
http://forum.rcl-radio.ru/uploads/images/2022/07/8b6adb9d8da3fcbb018b8b6a7ffdef78.jpg
http://forum.rcl-radio.ru/uploads/images/2022/07/dbaff37ab8297dca6ce4124914be1157.jpg
http://forum.rcl-radio.ru/uploads/images/2022/07/5fa38b31b29918cf5a71c856c374fcc2.jpg
http://forum.rcl-radio.ru/uploads/images/2022/07/1ca9ad09960f1d1c65dbddaf2cfacf0c.jpg
http://forum.rcl-radio.ru/uploads/images/2022/07/983abbbba401e6bf23c97305a8d989bd.jpg
http://forum.rcl-radio.ru/uploads/images/2022/07/6ee0c32246729242822a0a9ed19bf4ab.jpg
http://forum.rcl-radio.ru/uploads/images/2022/07/7066e0897a5261e549875ee0f919f70e.jpg
http://forum.rcl-radio.ru/uploads/images/2022/07/e3079dab6cea53c043d473d565a4739d.jpg
http://forum.rcl-radio.ru/uploads/images/2022/07/7fab72fb665fe64c5430ede0e81085cd.jpg

Над схемой работаю))))медленно, но верно))))скрин работы)))))......все впереди!!!

http://forum.rcl-radio.ru/uploads/images/2022/07/dbe089d90f750085b618fdacac319844.jpg

Внес изменения в скейч. Снова.

7 выход не выключался в режиме STANDBY. Исправил.

Убрал показания температуры  с главного экрана. Чтоб глаз не дергался)))
Текущая температура показывается только в режиме перегрева.
В режиме перегрева моргает сообщение в нижней строке.
При перегреве убрал режим MUTE, сделал ограничение громкости, пока до - 35 дБ.
Яркость подсветки в этом режиме максимальная.

Часы на главном экране поставил посередине строки.
Убрал из них секунды, добавил моргающие точки.

Вместо снежинок на главном экране  в третьей строке встроил ПОЛОСКУ уровня громкости.
Изменяет свою длину в зависимости от уровня дБ...

Эта полоса пропадает при неисправности каналов
На ее месте моргает название неисправного канала и символ"DC"- постоянный ток на выходе,
(я знаю что напряжение, DC интереснее)
Яркость подсветки в этом режиме максимальная.



Да по снежинкам, может можно как то по проще код написать??? а то очень коряво  и громоздко у меня вышло)))

И вот еще задумка. Можно как то добавить к кнопке SET еще одно меню.
Обозвать меню "Prog remote control" (программирование кнопок пульта)
Ну чтобы коды кнопок пульта не только через компьютер забивать.
А чтобы в устройстве автономно.
Вдруг пульт запрограммированный потеряется или сломается и будет другой пульт.....))))))

Скейтч с последними изменениями.....
Да там адресок экрана тоже поменялся.....27 вместо 3F.....

//#define POWER     0x33B800FF
//#define VOLUME_UP 0x33B8E01F
//#define VOLUME_DW 0x33B810EF
//#define MUT       0x33B8946B
//-----------------------------------------------------------------------------------------------------------
#define SET       0x42BD48B7
#define OK        0x42BD08F7
#define POWER     0x42BD50AF
#define VOLUME_UP 0x42BD6897
#define VOLUME_DW 0x42BDE01F
#define MUT       0x42BD609F

#include <Wire.h>
#include <LiquidCrystal_I2C.h> // http://forum.rcl-radio.ru/misc.php?action=pan_download&item=45&download=1
#include <Encoder.h>           // http://rcl-radio.ru/wp-content/uploads/2019/05/Encoder.zip       
#include <EEPROM.h>
#include <MsTimer2.h>          // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip 
#include <boarddefs.h>         // входит в состав библиотеки IRremote
#include <IRremote.h>          // http://rcl-radio.ru/wp-content/uploads/2019/06/IRremote.zip
#include <PT2258.h> // https://github.com/liman324/PT2258.git
#include <DS3231.h>
#include <microDS18B20.h>
PT2258 pt;
//-----------------------------------------------------------------------------------------------------------
LiquidCrystal_I2C lcd(0x27, 20, 4); // Устанавливаем дисплей
Encoder myEnc(9, 8);// DT, CLK
IRrecv irrecv(11); // указываем вывод модуля IR приемника
decode_results ir;
DS3231 clock; RTCDateTime DateTime;
MicroDS18B20<5> sensor;
//-----------------------------------------------------------------------------------------------------------
//запись кодов символов в экран
byte v1[8] = {B00111,B01111,B11111,B11111,B11111,B11111,B11111,B11111};
byte v2[8] = {B11111,B11111,B11111,B00000,B00000,B00000,B00000,B00000};      
byte v3[8] = {B11100,B11110,B11111,B11111,B11111,B11111,B11111,B11111};
byte v4[8] = {B11111,B11111,B11111,B11111,B11111,B11111,B01111,B00111};
byte v5[8] = {B00000,B00000,B00000,B00000,B00000,B11111,B11111,B11111};
byte v6[8] = {B11111,B11111,B11111,B11111,B11111,B11111,B11110,B11100};
byte v7[8] = {B11111,B11111,B11111,B00000,B00000,B00000,B11111,B11111};
byte v8[8] = {B11111,B11111,B11111,B11111,B11111,B11111,B11111,B11111}; 
//-----------------------------------------------------------------------------------------------------------
//обьявление переменных
static uint32_t timTemp;
unsigned long times,oldPosition  = -999,newPosition; 
int vol, ch1, ch2, ch3, ch4, ch5, ch6, menu, menu1, menu2, brig, brig0=10, brig1, temp0, i;
bool mute, power, w, w1, gr1, gr2,termo;
byte a[6], d1, d2, d3, d4, d5, d6, e1, e2, e3, x, www, tim_w;
int hour, minut, secon, data, mon, year, time_temp;
byte mesto2[8] = {0, 10, 0, 10, 0, 10, 0, 10};
byte mesto3[8] = {0, 0, 1, 1, 2, 2, 3, 3};
int hh, mm, ss, dd, mn, gg;
byte standby = 1;
int pin7=0;
int x_timer;
int perc;
//-----------------------------------------------------------------------------------------------------------


////переменные для автоматического снижения яркости на основном экране......
bool _tim1I = 0;
bool _tim1O = 0;
unsigned long _tim1P = 0UL;
bool _trgrt1 = 0;
bool _trgrt1I = 0;
bool _start=0;
//-----------------------------------------------------------------------------------------------------------

//приготовились.....

void setup() {
  
    irrecv.enableIRIn(); lcd.init(); lcd.backlight(); Wire.begin(); clock.begin(); Serial.begin(9600);
    MsTimer2::set(1, to_Timer); MsTimer2::start();
    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);
    if (EEPROM.read(100) != 0) {
       for (int i = 0; i < 101; i++) {
      EEPROM.update(i, 0); // очистка памяти при первом включении
    }
    }
//-----------------------------------------------------------------------------------------------------------
    //объявление входов,выходов
    //pinMode(0)                    //serial port
    //pinMode(1)                    //serial port
    pinMode(2, INPUT_PULLUP);     // КНОПКА SET
    pinMode(3, INPUT_PULLUP);     // КНОПКА MUTE
    pinMode(4, INPUT_PULLUP);     // КНОПКА POWER
    //pinMode(5)                    // термодатчик 18B20
    pinMode(6, OUTPUT);           // ВЫХОД УПРАВЛЕНИЯ ПОДСВЕТКОЙ
    pinMode(7, OUTPUT);           // ВЫХОД АКТИВАЦИИ АНАЛИЗАТОРА СПЕКТРА
    //pinMode(8) Encoder myEnc(8);  //CLK
    //pinMode(9) Encoder myEnc(9);  //DT
    pinMode(10, INPUT);           // МЕНЮ КНОПКА SW энкодера
    //pinMode(11) IRrecv irrecv(11);// указываем вывод модуля IR приемника
    pinMode(12, OUTPUT);          // Выход управления STANDBY - реле включения усилителя
    pinMode(13, OUTPUT);          // Выход управления STANDBY--- c задержкой для реле софтстарта усилителя
//-----------------------------------------------------------------------------------------------------------
    //входы для индикации аварий каналов, кому не надо можете удалить от этого места....

    pinMode(14, INPUT_PULLUP);          //вход аварии левый  передний   /норма +5 вольт, авария 0 вольт/ замыкаем на землю при аварии
    pinMode(15, INPUT_PULLUP);          //вход аварии левый  задний     /норма +5 вольт, авария 0 вольт/ замыкаем на землю при аварии
    pinMode(16, INPUT_PULLUP);          //вход аварии центральный канал /норма +5 вольт, авария 0 вольт/ замыкаем на землю при аварии
    pinMode(17, INPUT_PULLUP);          //вход аварии сабвуфера          /норма +5 вольт, авария 0 вольт/ замыкаем на землю при аварии
  
    pinMode(A6, INPUT);                 //вход аварии правый передний   /норма +5 вольт, авария 0 вольт/ замыкаем на землю при аварии
    //чисто аналоговый вход             //вот тут вход привязываем к +5 вольт через резистор 10 кОм, обязательно,да програмно пробовал
                                      //ловит наводки, лучше железно, рядом с ардуиной, так надежнее
                                      
    pinMode(A7, INPUT);                 //вход аварии правый задний     /норма +5 вольт, авария 0 вольт/ замыкаем на землю при аварии
    //чисто аналоговый вход             //вот тут вход привязываем к +5 вольт через резистор 10 кОм, обязательно,да программно пробовал
                                      //ловит наводки, лучше железно, рядом с ардуиной, так надежнее
    ///....до этого......
//-----------------------------------------------------------------------------------------------------------    
    clock.setDateTime(__DATE__, __TIME__); // Устанавливаем время на часах, основываясь на времени компиляции скетча
    vol = EEPROM.read(0); 
    ch1 = EEPROM.read(1); ch2 = EEPROM.read(2); ch3 = EEPROM.read(3);
    ch4 = EEPROM.read(4); ch5 = EEPROM.read(5); ch6 = EEPROM.read(6);
    brig0 = EEPROM.read(7); brig1 = EEPROM.read(8);
    analogWrite(6, brig0 * 25);

    digitalWrite(12, LOW);
    digitalWrite(13, LOW);
    delay(500);
    audio();  
   }
//-----------------------------------------------------------------------------------------------------------
   /////////////////поехали/////////////////////////////////////////////
   
void loop() {
  
   /// READ TIME /////////////////////////////////
    DateTime = clock.getDateTime(); hour = DateTime.hour; minut = DateTime.minute; secon = DateTime.second;
    data = DateTime.day; mon = DateTime.month; year = DateTime.year;
   
  
   
//----------------------------------------------------------------------------------------------------------- 

    /// BUTTON ////////////////////////////////////
    //// МЕНЮ КНОПКА  энкодера
    if (power == 0) {
    if ((digitalRead(10) == LOW || ir.value == OK) && menu == 1) {menu1++;delay(200);times = millis();cl1();w = 1;w1 = 1;
    if (menu1 > 7) {menu1 = 0;}
    }
    if (digitalRead(10) == LOW && menu == 2) {menu2++;delay(200);times = millis();w = 1;w1 = 1;
    if (menu2 > 5) {menu2 = 0;}
    }
//-----------------------------------------------------------------------------------------------------------
    /////////////Долгое нажатие кнопки энкодера(больше 5 секунд)
    ////////////---включение/отключение АНАЛИЗАТОРА СПЕКТРА  на втором экране LCD 2004/////////////////
    
    if (digitalRead(10) == LOW && menu==0){delay(200);x_timer++;}// держим кнопку, идет счет x_timer
    if (digitalRead(10) == HIGH) {x_timer=0;} // если отпустить кнопку то x_timer сбрасывается
    if (x_timer > 12 && pin7==0) {digitalWrite(7,HIGH);pin7=1;x_timer=0;} // 12*200 мс + время работы цикла = 5с включаем пин 7 если он был выключен
    if (x_timer > 12 && pin7==1 ) {digitalWrite(7,LOW);pin7=0;x_timer=0;} //  12*200 мс + время работы цикла = 5с выключаем пин 7 если он был включен
//-----------------------------------------------------------------------------------------------------------     
    // МЕНЮ КНОПКА SET
    if ((digitalRead(2) == LOW || ir.value == SET)  && digitalRead(10) == HIGH) {menu++;delay(200);times = millis();cl();w = 1;w1 = 1;menu1 = 0;
      if (menu > 1) {menu = 0; }
    }
//-----------------------------------------------------------------------------------------------------------    
    // МЕНЮ КНОПКА SET time(нажатие одновременно кнопки энкодера и кнопкиSET)
    if (digitalRead(2) == LOW && digitalRead(10) == LOW) {menu = 2;delay(200);times = millis();cl();w = 1;w1 = 1;lcd.setCursor(2, 1);
    lcd.print("TIME CORRECTION");delay(1000);
    }
//-----------------------------------------------------------------------------------------------------------
    // МЕНЮ КНОПКА MUTE - mute on
    if ((digitalRead(3) == LOW || ir.value == MUT) && mute == 0) {mute = 1;cl();audio();menu = 100;brig=brig1;analogWrite(6, brig * 25);
//-----------------------------------------------------------------------------------------------------------   
    //слово MUTE//да, охренеть! можно проще? и круче? --- поправляйте!(просто "MUTE" не прет!!!)(и массивы ниасилил йа......)
   
    //1 символ "М"+пробел"
    lcd.setCursor(1,0);lcd.write(3);lcd.print("  ");lcd.write(1);lcd.print(" ");
    lcd.setCursor(1,1);lcd.write(8);lcd.write(3);lcd.write(1);lcd.write(8);lcd.print(" ");
    lcd.setCursor(1,2);lcd.write(8);lcd.print("  ");lcd.write(8);lcd.print(" ");
   
    //2 символ "U"+пробел"
    lcd.setCursor(6,0);lcd.write(3);lcd.print("  ");lcd.write(1);lcd.print(" ");  
    lcd.setCursor(6,1);lcd.write(8);lcd.print("  ");lcd.write(8);lcd.print(" ");
    lcd.setCursor(6,2);lcd.write(4);lcd.write(8);lcd.write(8);lcd.write(6);lcd.print(" ");
    
     //3 символ "T"+пробел"
    
    lcd.setCursor(11,0);lcd.write(8);lcd.write(8);lcd.write(8);lcd.print(" ");
    lcd.setCursor(11,1);lcd.print(" ");lcd.write(8);lcd.print("  ");
    lcd.setCursor(11,2);lcd.print(" ");lcd.write(8);lcd.print("  ");
    
    //4 символ "E"+пробел"

    lcd.setCursor(15,0);lcd.write(1);lcd.write(2);lcd.write(2);lcd.write(2);
    lcd.setCursor(15,1);lcd.write(8);lcd.write(2);lcd.write(2);
    lcd.setCursor(15,2);lcd.write(4);lcd.write(5);lcd.write(5);lcd.write(5);
          
    delay(500);
    }
//-----------------------------------------------------------------------------------------------------------
     // МЕНЮ КНОПКА MUTE - mute off
    if ((digitalRead(3) == LOW || ir.value == MUT) && mute == 1) {mute = 0;cl();times = millis();w = 1;w1 = 1;menu = 0;menu1 = 0;myEnc.write(0);newPosition = 0;brig=brig0;analogWrite(6, brig * 25);audio();}
    }
//-----------------------------------------------------------------------------------------------------------
   // МЕНЮ STANDBY
   //КНОПКА POWER ON/OFF
    
   //КНОПКА POWER
   // POWER O F F 
   //сначала  ВЫКЛЮЧЕНИЕ 
    if (((digitalRead(4) == LOW || ir.value == POWER) && power == 0) || standby == 1)  {menu1 = 0;  mute = 1; audio();
    power = 1; standby = 0;cl();times = millis(); w = 1; w1 = 1; menu = 100;//сначала вырубаем звук,выключаем все и врубаем меню STANDBY.....
    /////    в цикле плавное снижение уровня подсветки.....
    for (i = 1; i <=10 ; i++) {
     switch (i) {
      case 0:brig = 10;analogWrite(6, brig * 25); break;
      case 1:brig = 9; analogWrite(6, brig * 25); break;
      case 2:brig = 8; analogWrite(6, brig * 25); break;
      case 3:brig = 7; analogWrite(6, brig * 25); break;
      case 4:brig = 6; analogWrite(6, brig * 25); break;
      case 5:brig = 5; analogWrite(6, brig * 25); break;
      case 6:brig = 4; analogWrite(6, brig * 25); break;
      case 7:brig = 3; analogWrite(6, brig * 25); break;
      case 8:brig = 2; analogWrite(6, brig * 25); break;
      case 9:brig = 1; analogWrite(6, brig * 25); break;
    }
      delay(100);  
    }
    }
//-----------------------------------------------------------------------------------------------------------    
    
    //КНОПКА POWER
    // POWER O N 
     
    if ((digitalRead(4) == LOW || ir.value == POWER) && power == 1 ) {
       power = 0; cl();times = millis(); w = 1; w1 = 1; menu = 0; menu1 = 0;myEnc.write(0);newPosition = 0; 
       digitalWrite(12, HIGH);//включение питания 1й выход
                                        
    // ЭКРАН ПРИ ВКЛЮЧЕНИИ 
    lcd.setCursor(0, 0); lcd.print("  BU DIGITAL SARAY  ");//1 строка    
    lcd.setCursor(0, 1); lcd.print("POWER AMPLIFIER  5.1");//2 строка
    lcd.setCursor(0, 2); lcd.print("   SYSTEM LOADING   ");//3 строка
    for(int i=1;i<=10;i++){ brig=i; analogWrite(6, brig * 25);delay(200);//плавное включение подсветки при ВКЛЮЧЕНИИ
    } 
    digitalWrite(13, HIGH); //включение питания 2й выход  
   // стрелки загрузки >>>>>>>>>>>>>>>>>>>>
    lcd.setCursor(0, 3);
    for (int thisChar = 0; thisChar < 10; thisChar++) {lcd.write(5);delay(75);lcd.write(2);delay(75);}
                                         
   
  cl();_start=1; mute = 0; audio();  //очистка экрана, отключение mute.....слушаем музыку))))
    } 
 //-----------------------------------------------------------------------------------------------------------    
    // power off//выключение усилителя(реле)
    if (power == 1) {digitalWrite(12, LOW);} // выход standby
    else {digitalWrite(12, HIGH);} 
    if (power == 1) {digitalWrite(13, LOW);digitalWrite(7,LOW);} // выход standby delay, выход отключения АНАЛИЗАТОРА СПЕКТРА
    
//-----------------------------------------------------------------------------------------------------------  
     /// IR ////////////////////////////////////////
    if ( irrecv.decode( &ir )) {
      Serial.print("0x");  // IR приемник - чтение, в мониторе порта отображаются коды кнопок
      Serial.println( ir.value, HEX);
    //Serial.println (sensor_Alarm_1);
    //Serial.println (sensor_Alarm_2);
      irrecv.resume();
      times = millis();
      w = 1;
      w1 = 1;
    }
    if (ir.value == 0) {
      gr1 = 0;  // запрет нажатий не активных кнопок пульта
      gr2 = 0;
    }
//-----------------------------------------------------------------------------------------------------------
  

  ////////////// VOLUME ///////////////////////////////////////////////////////////////////
  
    if (menu == 0) {
    // кнопка >
    if (ir.value == VOLUME_UP && mute == 0 && power == 0) {vol++;gr1 = 1;gr2 = 0;cl1();times = millis();w = 1;vol_func();audio();}
    // кнопка >>>>>>
    if (ir.value == 0xFFFFFFFF and gr1 == 1) {vol++;gr2 = 0;cl1();times = millis();w = 1;vol_func();audio();}
    // кнопка <
    if (ir.value == VOLUME_DW) {vol--;gr1 = 0;gr2 = 1;cl1();times = millis();w = 1;vol_func();audio();}
    // кнопка <<<<<<
    if (ir.value == 0xFFFFFFFF and gr2 == 1) {vol--;gr1 = 0;cl1();times = millis();w = 1;vol_func();audio();}

    if (newPosition != oldPosition) {oldPosition = newPosition;vol = vol + newPosition;
        myEnc.write(0);newPosition = 0; times = millis();w = 1;w1 = 1;vol_func();audio();}
//-----------------------------------------------------------------------------------------------------------
// цифры громкости       
    a[0] = (vol) / 10; a[1] = (vol) % 10;
    for (x = 0; x < 2; x++) {
      switch (x) {
        case 0: e1 = 10, e2 = 11, e3 = 12;break;
        case 1: e1 = 14, e2 = 15, e3 = 16;break;} 
        digit();
    }
//-----------------------------------------------------------------------------------------------------------    
    //Минус (гаснущий при нуле) перед цифрами уровня громкости
    lcd.setCursor(8, 0); if (vol > 0) {lcd.write(5);} else {lcd.print(" ");//{lcd.write(5);---какой символ отображать----из таблички  в начале скейча
    }
//-----------------------------------------------------------------------------------------------------------
    ////Вывод температуры на основной экран///////
    if (millis() - timTemp >= 800) {         ///время опроса датчика
       timTemp = millis();  
    // читаем прошлое значение
    //значение температуры выводится только при срабатывании термозащиты,у нас усилитель, а не термометр)))))))) 
    if (termo == 1) {if (sensor.readTemp()) {lcd.setCursor(17, 3);lcd.print(sensor.getTemp(),0);lcd.write(223);}//выводим на экран
    else {lcd.setCursor(17, 3);lcd.print("ERR");delay(250);lcd.setCursor(17, 3);lcd.print("   ");}//если обрыв датчика пишем error
    }
    // запрашиваем новое измерение
       sensor.requestTemp();
//-----------------------------------------------------------------------------------------------------------    
    
    //термозащита //4 строка
    
    //вот тут меняем уставку защиты.....50...90 градусов....или 100))))
    //если температура превышает уставку.....
    if ((sensor.getTemp())>=30){vol = 35; audio(); termo=1;//гасим часы, снижаем уровень до -35 дБ.....врубаем подсветку на максимум.....
    //вместо часов выводим сообщение....
       if (secon & 1){ lcd.setCursor(0, 3);lcd.print(">TERMO OVERLOAD< ");}  
                   //                                 01234567890123456  это символы в строке считаю, чтоб не промазать)))
      else { lcd.setCursor(0, 3);lcd.print(" >70");lcd.write(223);lcd.print(" MAX TEMP<  ");}//тут пишем максимальную температуру, как в уставке   
                   //                       0123              4              567890123456  это символы в строке считаю, чтоб не промазать))           
    }  
        //если температура в норме..... 
    else {audio();termo=0;//гасим подсветку и возвращаем часы .....  
        lcd.setCursor(0, 3);lcd.print("        ");
        lcd.print(hour / 10); lcd.print(hour % 10);// lcd.print(":");
    if (secon & 1)
         {lcd.write(165);}                                          //secon - нечетное
    else {lcd.write(58);}                                           //secon - четное
        lcd.print(minut / 10); lcd.print(minut % 10);lcd.print("       "); 
    }  
    }
    
//-----------------------------------------------------------------------------------------------------------  
    //надписи основного экрана
    //1 строка
                  lcd.setCursor(0, 0); lcd.print(" VOLUME ");
    //2 строка начало
    if (termo==0){lcd.setCursor(0, 1); lcd.print(" 5.1 CH ");}
       else      {lcd.setCursor(0, 1); lcd.print(" LIMIT  ");}//если сработала термозащита выводим слово---лимит---
    //2 строка в конце 
        lcd.setCursor(18,1); lcd.print("dB");//2 строка после цифр уровня громкости
//-----------------------------------------------------------------------------------------------------------
    // индикаторы неисправности каналов
    // кому не нужно раскоментируйте строку ниже
    //lcd.setCursor(0, 2); lcd.print("--------------------");//3 строка
    //и все остальное можете удалить, от этого места.......
    //переменные аварии правого переднего канала и правого заднего канала
   int sensor_Alarm_3 = analogRead(A6);//считываем сигнал аварии правого переднего канала
   int sensor_Alarm_4 = analogRead(A7);//считываем сигнал аварии правого заднего канала
    
    if (digitalRead(14) == LOW || digitalRead(15) == LOW ||digitalRead(16) == LOW ||digitalRead(17) == LOW 
          ||sensor_Alarm_3 < 10||sensor_Alarm_4 < 10){
    //левый передний
    if (digitalRead(14) == HIGH)                                                              
         {lcd.setCursor(0, 2);lcd.print("   ");}                      
    if (digitalRead(14) == LOW ) {if ((millis() % 1000) > 500)                                
        {lcd.setCursor(0, 2); lcd.print("FL ");}
    else{lcd.setCursor(0, 2); lcd.print("DC ");}
    }
    //левый задний
    if (digitalRead(15) == HIGH)
        {lcd.setCursor(3, 2); lcd.print("   ");}
    if (digitalRead(15) == LOW) {if ((millis() % 1000) > 500) 
        {lcd.setCursor(3, 2); lcd.print("RL ");}
    else{lcd.setCursor(3, 2); lcd.print("DC ");}
    }
    //центральный
    if (digitalRead(16) == HIGH)
         {lcd.setCursor(6, 2);lcd.print("    ");}
    if (digitalRead(16) == LOW) {if ((millis() % 1000) > 500)
        {lcd.setCursor(6, 2); lcd.print("CNTR");}
    else{lcd.setCursor(6, 2); lcd.print(" DC ");}
    }
    //сабвуфер
    if (digitalRead(17) == HIGH) 
         {lcd.setCursor(10, 2);lcd.print("    ");}
    if (digitalRead(17) == LOW) {if ((millis() % 1000) > 500) 
        {lcd.setCursor(10, 2); lcd.print(" SUB");}
    else{lcd.setCursor(10, 2); lcd.print(" D C");}
    }
     //правый  передний/// тут пришлось поковыряться......вход А6 чисто аналоговый
    if (sensor_Alarm_3 >= 500) 
         {lcd.setCursor(14, 2);lcd.print("   ");}
    if (sensor_Alarm_3 <= 10) {if ((millis() % 1000) > 500) 
        {lcd.setCursor(14, 2); lcd.print(" FR");}
    else{lcd.setCursor(14, 2); lcd.print(" DC");}
    } 
    //правый  задний /// и тут тоже пришлось поковыряться......вход А7 чисто аналоговый
    if (sensor_Alarm_4 >= 500) 
         {lcd.setCursor(17, 2);lcd.print("   ");}
    if (sensor_Alarm_4 <= 10) {if ((millis() % 1000) > 500) 
        {lcd.setCursor(17, 2); lcd.print(" RR");}
    else{lcd.setCursor(17, 2); lcd.print(" DC");}
    
    }
    }
    else {int perc = map(vol, 64, 0, 0, 100);
    //fillBar0 принимает аргументы (столбец, строка, длина полосы, значение в % (0 - 100) )
    fillBar0(0, 2, 20, perc);
    delay(50);}
    ////до сюда.....
    
       
//-----------------------------------------------------------------------------------------------------------    
    //яркость подсветки.... автоматическое снижение при неактивных кнопках.....
    //  ждем 10 сек и выключаем подсветку
    if (_start==1) { if (_trgrt1I) { _trgrt1 = 0;} else {_trgrt1 = 1; _trgrt1I = 1;} } else {_trgrt1 = 0; _trgrt1I = 0;}; 
    if ( (_trgrt1) || digitalRead(2)  == LOW || digitalRead(3)  == LOW || digitalRead(4)  == LOW ||
        digitalRead(8)  == LOW || digitalRead(9)  == LOW || digitalRead(10) == LOW ||
        digitalRead(14) == LOW || digitalRead(15) == LOW || digitalRead(16) == LOW ||
        digitalRead(17) == LOW ||   sensor_Alarm_3 < 10  || sensor_Alarm_4 < 10    ||
        ir.value == OK || ir.value == SET || ir.value == MUT || ir.value == POWER  ||                                                       
        termo == 1 ||  gr1==1 || gr2==1) {_tim1O = 1; _tim1I = 1;} else { if(_tim1I) {_tim1I = 0; _tim1P = millis();} else { if (_tim1O) {if ( _isTimer(_tim1P, 10000)) _tim1O = 0;}}}
    if (!( _tim1O ) ) {brig = brig1;analogWrite(6, brig * 25);}                                  //////////////вот тут меняем время задержки отключения  подсветки ↑↑↑↑↑↑
    if ( _tim1O ){brig = brig0;analogWrite(6, brig * 25);}
   }
//-----------------------------------------------------------------------------------------------------------    
     ///////// ATT //////////////////////////////////////////////////////////////////////////////
     //Меню аттенюаторов
    if (menu == 1) {
      switch (menu1) {
      case 0: temp0 = ch1; break;
      case 1: temp0 = ch2; break;
      case 2: temp0 = ch3; break;
      case 3: temp0 = ch4; break;
      case 4: temp0 = ch5; break;
      case 5: temp0 = ch6; break;
      case 6: temp0 = brig0; break;
      case 7: temp0 = brig1; break;
    }
    // кнопка >
    if (ir.value == VOLUME_UP) {temp0--; gr1 = 1;gr2 = 0;cl1();times = millis();w = 1;www = 1;}
    // кнопка >>>>>>
    if (ir.value == 0xFFFFFFFF and gr1 == 1) {temp0--;gr2 = 0;cl1();times = millis();w = 1;w = 1;www = 1;}
    // кнопка <
    if (ir.value == VOLUME_DW) {temp0++; gr1 = 0;gr2 = 1;cl1();times = millis(); w = 1;w = 1;www = 1;
    }
    // кнопка <<<<<<
    if (ir.value == 0xFFFFFFFF and gr2 == 1) {temp0++;gr1 = 0;cl1();times = millis(); w = 1;w = 1;www = 1;}

    if (newPosition != oldPosition) {oldPosition = newPosition;temp0 = temp0 - newPosition; myEnc.write(0); newPosition = 0; times = millis(); w = 1; www = 1;
    }

    switch (menu1) {
      case 0: ch1 = temp0; if (ch1 < 0) {ch1 = 0;} if (ch1 > 15) {ch1 = 15;} break;
      case 1: ch2 = temp0; if (ch2 < 0) {ch2 = 0;} if (ch2 > 15) {ch2 = 15;} break;
      case 2: ch3 = temp0; if (ch3 < 0) {ch3 = 0;} if (ch3 > 15) {ch3 = 15;} break;
      case 3: ch4 = temp0; if (ch4 < 0) {ch4 = 0;} if (ch4 > 15) {ch4 = 15;} break;
      case 4: ch5 = temp0; if (ch5 < 0) {ch5 = 0;} if (ch5 > 15) {ch5 = 15;} break;
      case 5: ch6 = temp0; if (ch6 < 0) {ch6 = 0;} if (ch6 > 15) {ch6 = 15;} break;
      case 6: brig0 = temp0; brig0_func(); break;
      case 7: brig1 = temp0; brig1_func(); break;
    }
//----------------------------------------------------------------------------------------------------------- 
    
    au();
    if (menu1 < 7) {brig = brig0;}
    if (menu1 == 7) {brig = brig1;}
    analogWrite(6, brig * 25);

    for (i = 0; i < 8; i++) {
      if (menu1 == i) {
        lcd.setCursor(mesto2[i], mesto3[i]);
        lcd.print(char(126));
      } else {
        lcd.setCursor(mesto2[i], mesto3[i]);
        lcd.print(" ");
      }
    }

    lcd.setCursor(1, 0); lcd.print("Lfront"); if (ch1 == 0) {
      lcd.print(" ");
    } lcd.print(-ch1); if (ch1 < 10) {
      lcd.print(" ");
    }
    lcd.setCursor(11, 0); lcd.print("Rfront"); if (ch2 == 0) {
      lcd.print(" ");
    } lcd.print(-ch2); if (ch2 < 10) {
      lcd.print(" ");
    }
    lcd.setCursor(1, 1); lcd.print("L rear"); if (ch3 == 0) {
      lcd.print(" ");
    } lcd.print(-ch3); if (ch3 < 10) {
      lcd.print(" ");
    }
    lcd.setCursor(11, 1); lcd.print("R rear"); if (ch4 == 0) {
      lcd.print(" ");
    } lcd.print(-ch4); if (ch4 < 10) {
      lcd.print(" ");
    }
    lcd.setCursor(1, 2); lcd.print("Center"); if (ch5 == 0) {
      lcd.print(" ");
    } lcd.print(-ch5); if (ch5 < 10) {
      lcd.print(" ");
    }
    lcd.setCursor(11, 2); lcd.print("SubW  "); if (ch6 == 0) {
      lcd.print(" ");
    } lcd.print(-ch6); if (ch6 < 10) {
      lcd.print(" ");
    }
    lcd.setCursor(1, 3); lcd.print("BR ON "); lcd.print(brig0); lcd.print(" ");
    lcd.setCursor(11, 3); lcd.print("BR OFF "); lcd.print(brig1); lcd.print(" ");
    }
//----------------------------------------------------------------------------------------------------------- 
    //////// Меню коррекции времени ..............menu set time /////////////////////////////////////
    if (menu == 2) {
      hh = DateTime.hour; mm = DateTime.minute; ss = DateTime.second; dd = DateTime.day; mn = DateTime.month; gg = DateTime.year;
      switch (menu2) {
        case 0: time_temp = hh; break;
        case 1: time_temp = mm; break;
        case 2: time_temp = ss; break;
        case 3: time_temp = dd; break;
        case 4: time_temp = mn; break;
        case 5: time_temp = gg; break;
    }
    if (newPosition != oldPosition) {
      oldPosition = newPosition;
      time_temp = time_temp - newPosition; myEnc.write(0); newPosition = 0; times = millis(); w = 1; tim_w = 1;
    }
    switch (menu2) {
      case 0: hh = time_temp; 
      if (hh < 0) {hh = 0;} 
      if (hh > 23) {hh = 23;} break;
      case 1: mm = time_temp; 
      if (mm < 0) {mm = 0;} 
      if (mm > 59) {mm = 59;} break;
      case 2: ss = time_temp; 
      if (ss < 0) {ss = 0;} 
      if (ss > 59) {ss = 59;} break;
      case 3: dd = time_temp; 
      if (dd < 1) {dd = 1;}
      if (dd > 31) {dd = 31;} break;
      case 4: mn = time_temp;
      if (mn < 1) {mn = 1;} 
      if (mn > 12) {mn = 12;} break;
      case 5: gg = time_temp; 
      if (gg < 2022) {gg = 2022;} 
      if (gg > 2100) {gg = 2100;} break;
    }

    lcd.setCursor(0, 0); lcd.print("TIME CORRECTION");
    lcd.setCursor(0, 1); lcd.print("--------------------");
    lcd.setCursor(0, 2);
    if (menu2 == 0) {
      lcd.print("set hour   ");
    }
    if (menu2 == 1) {
      lcd.print("set minute ");
    }
    if (menu2 == 2) {
      lcd.print("set seconds");
    }
    if (menu2 == 3) {
      lcd.print("set date   ");
    }
    if (menu2 == 4) {
      lcd.print("set month  ");
    }
    if (menu2 == 5) {
      lcd.print("set year   ");
    }

    lcd.setCursor(0, 3);
    lcd.print(hour / 10); lcd.print(hour % 10); lcd.print(":");
    lcd.print(minut / 10); lcd.print(minut % 10); lcd.print(":");
    lcd.print(secon / 10); lcd.print(secon % 10); lcd.print(" ");
    lcd.print(data / 10); lcd.print(data % 10); lcd.print("-");
    lcd.print(mon / 10); lcd.print(mon % 10); lcd.print("-");
    lcd.print(year);


    if (tim_w == 1) {
      tim_w = 0;
      clock.setDateTime(gg, mn, dd, hh, mm, ss);
      delay(100);
   }
   }
//----------------------------------------------------------------------------------------------------------- 
/////Запись в память настроек
    /////// EEPROM //////////////////////////////////////
    if (millis() - times > 10000 && w1 == 1 && mute == 0 && power == 0) {
       w1 = 0;
    EEPROM.update(0, vol); EEPROM.update(1, ch1); EEPROM.update(2, ch2); EEPROM.update(3, ch3);
    EEPROM.update(4, ch4); EEPROM.update(5, ch5); EEPROM.update(6, ch6);
    EEPROM.update(7, brig0); EEPROM.update(8, brig1);
   if(menu!=0){cl();}
   }
//----------------------------------------------------------------------------------------------------------- 
///////////Экран STANDBY
   if (power == 1) {
   
    a[0] = DateTime.hour / 10;
    a[1] = DateTime.hour % 10;
    a[2] = DateTime.minute / 10;
    a[3] = DateTime.minute % 10;
    //a[4] = DateTime.second / 10;//десятки секунд///секунды закомментированы/если нужны секунды, раскомминтируем это
    //a[5] = DateTime.second % 10;//единицы секунд///секунды закомментированы/если нужны секунды, раскомминтируем это

    //for (i = 0; i < 6; i++) {//если нужны секунды, раскомминтируем это
    //что показывать. в данном случае часы и минуты,секунды закомментированы
    for (i = 0; i < 4; i++) { //если НЕ нужны секунды, это закомментируем
      switch (i) {
        case 0: e1 = 1, e2 = 2, e3 = 3; break;//десятки часов
        case 1: e1 = 5, e2 = 6, e3 = 7; break;//единицы часов
        case 2: e1 = 12, e2 = 13, e3 = 14; break;//десятки минут
        case 3: e1 = 16, e2 = 17, e3 = 18; break;//единицы минут
        //case 4: e1 = 14, e2 = 15, e3 = 16; break;//не надо//секунды закомментированы
       // case 5: e1 = 17, e2 = 18, e3 = 19; break;//не надо//секунды закомментированы
      }
      ///////маска цифр, ДЛЯ ЧАСОВ.....какая цифра из каких символов состоит....
      ///d1,d2,d3-верхняя часть цифры;d4,d5,d6-нижняя часть цифры;
      switch (a[i]) {
        //1 набор, 2,4,5 прямые// елсли нравится, оставляем, а нижний комментируем/*   */
        /*case 0: d1=1,d2=2,d3=3,d4=4,d5=5,d6=6;break;
        case 1: d1=2,d2=3,d3=32,d4=5,d5=8,d6=5;break;
        case 2: d1=7,d2=7,d3=3,d4=8,d5=5,d6=5;break;
        case 3: d1=7,d2=7,d3=3,d4=5,d5=5,d6=6;break;
        case 4: d1=4,d2=5,d3=8,d4=32,d5=32,d6=8;break;
        case 5: d1=8,d2=7,d3=7,d4=5,d5=5,d6=6;break;
        case 6: d1=1,d2=7,d3=7,d4=4,d5=5,d6=6;break;
        case 7: d1=2,d2=2,d3=3,d4=32,d5=32,d6=8;break;
        case 8: d1=1,d2=7,d3=3,d4=4,d5=5,d6=6;break;
        case 9: d1=1,d2=7,d3=3,d4=5,d5=5,d6=6;break;*/
        //2 набор, 2,4,5 закругленные// если нравится, оставляем, а верхний комментируем/*   */
        case 0: d1=1,d2=2,d3=3,d4=4,d5=5,d6=6;break;
        case 1: d1=2,d2=3,d3=32,d4=5,d5=8,d6=5;break;
        case 2: d1=7,d2=7,d3=3,d4=4,d5=5,d6=5;break;
        case 3: d1=7,d2=7,d3=3,d4=5,d5=5,d6=6;break;
        case 4: d1=4,d2=5,d3=3,d4=32,d5=32,d6=8;break;
        case 5: d1=1,d2=7,d3=7,d4=5,d5=5,d6=6;break;
        case 6: d1=1,d2=7,d3=7,d4=4,d5=5,d6=6;break;
        case 7: d1=2,d2=2,d3=3,d4=32,d5=32,d6=8;break;
        case 8: d1=1,d2=7,d3=3,d4=4,d5=5,d6=6;break;
        case 9: d1=1,d2=7,d3=3,d4=5,d5=5,d6=6;break;
    }
    ///////////////положение цифр ЧАСОВ на экране///сейчас 2я и 3я строка..........
      lcd.setCursor(e1, 1); lcd.write((uint8_t)d1); lcd.setCursor(e2, 1); lcd.write((uint8_t)d2); lcd.setCursor(e3, 1); lcd.write((uint8_t)d3);
      lcd.setCursor(e1, 2); lcd.write((uint8_t)d4); lcd.setCursor(e2, 2); lcd.write((uint8_t)d5); lcd.setCursor(e3, 2); lcd.write((uint8_t)d6);
    }
   /*//точки между цифр
   if(secon&1)                                           //secon - нечетное
      {lcd.setCursor(9,1) ;lcd.write(2);  lcd.print(" ");
      lcd.setCursor(9,2);lcd.print(" ");lcd.write(5);}
   else                                                 //secon - четное
      {lcd.setCursor(9,1) ;lcd.print(" ");lcd.write(2);
      lcd.setCursor(9,2);lcd.write(5);  lcd.print(" ");}*/

   //снежинки между цифр
   if(secon&1)                                           //secon - нечетное
      {lcd.setCursor(9,1) ;lcd.write(42);  lcd.print(" ");
      lcd.setCursor(9,2);lcd.print(" ");lcd.write(42);}
   else                                                 //secon - четное
      {lcd.setCursor(9,1) ;lcd.print(" ");lcd.write(42);
      lcd.setCursor(9,2);lcd.write(42);  lcd.print(" ");}   
 //-----------------------------------------------------------------------------------------------------------      
   //перемещение снежинок......////много кода......много...........//аааааааааааааааааааа////кто может лучше и проще, меняйте.............   
      if(secon % 10 == 0&&secon / 10 == 0||secon % 10 == 0&&secon / 10 == 2||secon % 10 == 0&&secon / 10 == 4)
           {lcd.setCursor(0,0);lcd.write(42);lcd.setCursor(19,3);lcd.write(42);}
      else {lcd.setCursor(0,0);lcd.print(" ");lcd.setCursor(19,3);lcd.print(" ");}
      
      if(secon % 10 == 1&&secon / 10 == 0||secon % 10 == 1&&secon / 10 == 2||secon % 10 == 1&&secon / 10 == 4)
           {lcd.setCursor(1,0);lcd.write(42);lcd.setCursor(18,3);lcd.write(42);}
      else {lcd.setCursor(1,0);lcd.print(" ");lcd.setCursor(18,3);lcd.print(" ");}  
        
      if(secon % 10 == 2&&secon / 10 == 0||secon % 10 == 2&&secon / 10 == 2||secon % 10 == 2&&secon / 10 == 4)
           {lcd.setCursor(2,0);lcd.write(42);lcd.setCursor(17,3);lcd.write(42);}
      else {lcd.setCursor(2,0);lcd.print(" ");lcd.setCursor(17,3);lcd.print(" ");} 
          
      if(secon % 10 == 3&&secon / 10 == 0||secon % 10 == 3&&secon / 10 == 2||secon % 10 == 3&&secon / 10 == 4)
           {lcd.setCursor(3,0);lcd.write(42);lcd.setCursor(16,3);lcd.write(42);}
      else {lcd.setCursor(3,0);lcd.print(" ");lcd.setCursor(16,3);lcd.print(" ");}  
         
      if(secon % 10 == 4&&secon / 10 == 0||secon % 10 == 4&&secon / 10 == 2||secon % 10 == 4&&secon / 10 == 4)
           {lcd.setCursor(4,0);lcd.write(42);lcd.setCursor(15,3);lcd.write(42);}
      else {lcd.setCursor(4,0);lcd.print(" ");lcd.setCursor(15,3);lcd.print(" ");}

      if(secon % 10 == 5&&secon / 10 == 0||secon % 10 == 5&&secon / 10 == 2||secon % 10 == 5&&secon / 10 == 4)
           {lcd.setCursor(5,0);lcd.write(42);lcd.setCursor(14,3);lcd.write(42);}
      else {lcd.setCursor(5,0);lcd.print(" ");lcd.setCursor(14,3);lcd.print(" ");} 
      
      if(secon % 10 == 6&&secon / 10 == 0||secon % 10 == 6&&secon / 10 == 2||secon % 10 == 6&&secon / 10 == 4)
           {lcd.setCursor(6,0);lcd.write(42);lcd.setCursor(13,3);lcd.write(42);}
      else {lcd.setCursor(6,0);lcd.print(" ");lcd.setCursor(13,3);lcd.print(" ");} 

      if(secon % 10 == 7&&secon / 10 == 0||secon % 10 == 7&&secon / 10 == 2||secon % 10 == 7&&secon / 10 == 4)
           {lcd.setCursor(7,0);lcd.write(42);lcd.setCursor(12,3);lcd.write(42);}
      else {lcd.setCursor(7,0);lcd.print(" ");lcd.setCursor(12,3);lcd.print(" ");} 

      if(secon % 10 == 8&&secon / 10 == 0||secon % 10 == 8&&secon / 10 == 2||secon % 10 == 8&&secon / 10 == 4)
           {lcd.setCursor(8,0);lcd.write(42);lcd.setCursor(11,3);lcd.write(42);}
      else {lcd.setCursor(8,0);lcd.print(" ");lcd.setCursor(11,3);lcd.print(" ");} 

      if(secon % 10 == 9&&secon / 10 == 0||secon % 10 == 9&&secon / 10 == 2||secon % 10 == 9&&secon / 10 == 4)
           {lcd.setCursor(9,0);lcd.write(42);lcd.setCursor(10,3);lcd.write(42);}
      else {lcd.setCursor(9,0);lcd.print(" ");lcd.setCursor(10,3);lcd.print(" ");} 
      
      ///////////////////////ааааааааааааааааааааааа///////////////////////////////////////////////
      
      if(secon % 10 == 0&&secon / 10 == 1||secon % 10 == 0&&secon / 10 == 3||secon % 10 == 0&&secon / 10 == 5)
           {lcd.setCursor(10,0);lcd.write(42);lcd.setCursor(9,3);lcd.write(42);}
      else {lcd.setCursor(10,0);lcd.print(" ");lcd.setCursor(9,3);lcd.print(" ");}
      
      if(secon % 10 == 1&&secon / 10 == 1||secon % 10 == 1&&secon / 10 == 3||secon % 10 == 1&&secon / 10 == 5)
           {lcd.setCursor(11,0);lcd.write(42);lcd.setCursor(8,3);lcd.write(42);}
      else {lcd.setCursor(11,0);lcd.print(" ");lcd.setCursor(8,3);lcd.print(" ");}  
        
      if(secon % 10 == 2&&secon / 10 == 1||secon % 10 == 2&&secon / 10 == 3||secon % 10 == 2&&secon / 10 == 5)
           {lcd.setCursor(12,0);lcd.write(42);lcd.setCursor(7,3);lcd.write(42);}
      else {lcd.setCursor(12,0);lcd.print(" ");lcd.setCursor(7,3);lcd.print(" ");} 
          
      if(secon % 10 == 3&&secon / 10 == 1||secon % 10 == 3&&secon / 10 == 3||secon % 10 == 3&&secon / 10 == 5)
           {lcd.setCursor(13,0);lcd.write(42);lcd.setCursor(6,3);lcd.write(42);}
      else {lcd.setCursor(13,0);lcd.print(" ");lcd.setCursor(6,3);lcd.print(" ");}  
         
      if(secon % 10 == 4&&secon / 10 == 1||secon % 10 == 4&&secon / 10 == 3||secon % 10 == 4&&secon / 10 == 5)
           {lcd.setCursor(14,0);lcd.write(42);lcd.setCursor(5,3);lcd.write(42);}
      else {lcd.setCursor(14,0);lcd.print(" ");lcd.setCursor(5,3);lcd.print(" ");}

      if(secon % 10 == 5&&secon / 10 == 1||secon % 10 == 5&&secon / 10 == 3||secon % 10 == 5&&secon / 10 == 5)
           {lcd.setCursor(15,0);lcd.write(42);lcd.setCursor(4,3);lcd.write(42);}
      else {lcd.setCursor(15,0);lcd.print(" ");lcd.setCursor(4,3);lcd.print(" ");} 
      
      if(secon % 10 == 6&&secon / 10 == 1||secon % 10 == 6&&secon / 10 == 3||secon % 10 == 6&&secon / 10 == 5)
           {lcd.setCursor(16,0);lcd.write(42);lcd.setCursor(3,3);lcd.write(42);}
      else {lcd.setCursor(16,0);lcd.print(" ");lcd.setCursor(3,3);lcd.print(" ");} 

      if(secon % 10 == 7&&secon / 10 == 1||secon % 10 == 7&&secon / 10 == 3||secon % 10 == 7&&secon / 10 == 5)
           {lcd.setCursor(17,0);lcd.write(42);lcd.setCursor(2,3);lcd.write(42);}
      else {lcd.setCursor(17,0);lcd.print(" ");lcd.setCursor(2,3);lcd.print(" ");} 

      if(secon % 10 == 8&&secon / 10 == 1||secon % 10 == 8&&secon / 10 == 3||secon % 10 == 8&&secon / 10 == 5)
           {lcd.setCursor(18,0);lcd.write(42);lcd.setCursor(1,3);lcd.write(42);}
      else {lcd.setCursor(18,0);lcd.print(" ");lcd.setCursor(1,3);lcd.print(" ");} 

      if(secon % 10 == 9&&secon / 10 == 1||secon % 10 == 9&&secon / 10 == 3||secon % 10 == 9&&secon / 10 == 5)
           {lcd.setCursor(19,0);lcd.write(42);lcd.setCursor(0,3);lcd.write(42);}
      else {lcd.setCursor(19,0);lcd.print(" ");lcd.setCursor(0,3);lcd.print(" ");}
      
      ////////////////////всеееееееееееееееееееееее///////////////////////////////
        
      //if(secon % 10 == 1||secon % 10 == 3||secon % 10 == 5||secon % 10 == 7||secon % 10 == 9)
      // {lcd.setCursor(9,0);lcd.write(2);lcd.setCursor(9,1);lcd.write(5);
       // lcd.setCursor(10,0);lcd.write(2);lcd.setCursor(10,1);lcd.write(5);}
      //четное - точки 2( можно пробелы вставить---lcd.print(" ");---)
     // if(secon % 10 == 0||secon % 10 == 2||secon % 10 == 4||secon % 10 == 6||secon % 10 == 8)
      //  {lcd.setCursor(9,0);lcd.write(5);lcd.setCursor(9,1);lcd.write(2);
     //   lcd.setCursor(10,0);lcd.write(5);lcd.setCursor(10,1);lcd.write(2);}
    
      //lcd.setCursor(0, 2); lcd.print("--------------------");
      //lcd.setCursor(6, 3); lcd.print("STAND BY");
   }
   }  
   /// END LOOP
//----------------------------------------------------------------------------------------------------------- 

/////
bool _isTimer(unsigned long startTime, unsigned long period )
  {
  unsigned long currentTime;
currentTime = millis();
if (currentTime>= startTime) {return (currentTime>=(startTime + period));} else {return (currentTime >=(4294967295-startTime+period));}
  }

void fillBar0(byte start_pos, byte row, byte bar_length, byte fill_percent) {
  byte infill = round((float)bar_length * fill_percent / 100);
  lcd.setCursor(start_pos, row);
  if (infill == 0) lcd.write(16);
  else lcd.write(5);
  for (int n = 1; n < bar_length - 1; n++) {
    if (n < infill) lcd.write(5);
    if (n >= infill) lcd.write(16);
  }
  if (infill == bar_length) lcd.write(5);
  else lcd.write(16);
}




  
void au() {
  if (www == 1) {
    audio();
    www = 0;
  }
}
void cl() {
  ir.value = 0;
  delay(100);
  lcd.clear();
}
void cl1() {
  ir.value = 0;
  delay(50);
}
void brig1_func() {
  if (brig1 > 10) {
    brig1 = 10;
  } if (brig1 < 0) {
    brig1 = 0;
  }
}
void brig0_func() {
  if (brig0 > 10) {
    brig0 = 10;
  } if (brig0 < 0) {
    brig0 = 0;
  }
}
void audio() {
  pt.clear();
  //  pt.setVolume(75); //  int 0...79
  pt.setVol1(79 - (vol + ch1)); //  int 0...79
  pt.setVol2(79 - (vol + ch2)); //  int 0...79
  pt.setVol3(79 - (vol + ch3)); //  int 0...79
  pt.setVol4(79 - (vol + ch4)); //  int 0...79
  pt.setVol5(79 - (vol + ch5)); //  int 0...79
  pt.setVol6(79 - (vol + ch6)); //  int 0...79
  pt.setMute(mute); // mute 0 - off / 1 - on
}

void to_Timer() {
  newPosition = myEnc.read() / 4;
}
void vol_func() {
  if (0 > vol) {
    vol = 0;
  } if (64 < vol) {
    vol = 64;
  }
}
//----------------------------------------------------------------------------------------------------------- 
       ///////маска цифр,ДЛЯ РЕГУЛЯТОРА ГРОМКОСТИ какая цифра из каких символов состоит....
      ///d1,d2,d3-верхняя часть цифры;d4,d5,d6-нижняя часть цифры;
void digit() {
  switch (a[x]) {
    //1 набор, 2,4,5 прямые// если нравится оставляем, а нижний комментируем/*   */
        /*case 0: d1=1,d2=2,d3=3,d4=4,d5=5,d6=6;break;
        case 1: d1=2,d2=3,d3=32,d4=5,d5=8,d6=5;break;
        case 2: d1=7,d2=7,d3=3,d4=8,d5=5,d6=5;break;
        case 3: d1=7,d2=7,d3=3,d4=5,d5=5,d6=6;break;
        case 4: d1=4,d2=5,d3=8,d4=32,d5=32,d6=8;break;
        case 5: d1=8,d2=7,d3=7,d4=5,d5=5,d6=6;break;
        case 6: d1=1,d2=7,d3=7,d4=4,d5=5,d6=6;break;
        case 7: d1=2,d2=2,d3=3,d4=32,d5=32,d6=8;break;
        case 8: d1=1,d2=7,d3=3,d4=4,d5=5,d6=6;break;
        case 9: d1=1,d2=7,d3=3,d4=5,d5=5,d6=6;break;*/
        //2 набор, 2,4,5 закругленные// елсли нравится оставляем, а верхий коментируем/*   */
        case 0: d1=1,d2=2,d3=3,d4=4,d5=5,d6=6;break;
        case 1: d1=2,d2=3,d3=32,d4=5,d5=8,d6=5;break;
        case 2: d1=7,d2=7,d3=3,d4=4,d5=5,d6=5;break;
        case 3: d1=7,d2=7,d3=3,d4=5,d5=5,d6=6;break;
        case 4: d1=4,d2=5,d3=3,d4=32,d5=32,d6=8;break;
        case 5: d1=1,d2=7,d3=7,d4=5,d5=5,d6=6;break;
        case 6: d1=1,d2=7,d3=7,d4=4,d5=5,d6=6;break;
        case 7: d1=2,d2=2,d3=3,d4=32,d5=32,d6=8;break;
        case 8: d1=1,d2=7,d3=3,d4=4,d5=5,d6=6;break;
        case 9: d1=1,d2=7,d3=3,d4=5,d5=5,d6=6;break;
  }
  ///////////////положение цифр ИНДИКАТОРА ГРОМКОСТИ на экране///сейчас 2я и 3я строка..........
    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);
}
   

65

Re: PT2258 + LCD2004_I2C + IR + DS3231

Этот код можно уменьшить

    for (i = 1; i <=10 ; i++) {
     switch (i) {
      case 0:brig = 10;analogWrite(6, brig * 25); break;
      case 1:brig = 9; analogWrite(6, brig * 25); break;
      case 2:brig = 8; analogWrite(6, brig * 25); break;
      case 3:brig = 7; analogWrite(6, brig * 25); break;
      case 4:brig = 6; analogWrite(6, brig * 25); break;
      case 5:brig = 5; analogWrite(6, brig * 25); break;
      case 6:brig = 4; analogWrite(6, brig * 25); break;
      case 7:brig = 3; analogWrite(6, brig * 25); break;
      case 8:brig = 2; analogWrite(6, brig * 25); break;
      case 9:brig = 1; analogWrite(6, brig * 25); break;
    }
      delay(100);  
    }
for (i = 10; i >=1 ; i--) {
   brig = i;analogWrite(6, brig * 25); 
      delay(100);  
    }

66

Re: PT2258 + LCD2004_I2C + IR + DS3231

liman324 пишет:
for (i = 10; i >=1 ; i--) {
   brig = i;analogWrite(6, brig * 25); 
      delay(100);  
    }

Изменил. Работает)

http://forum.rcl-radio.ru/uploads/images/2022/07/7bc4f85583f4691d88e35d3a20fc719f.jpg

67 (2022-07-21 00:05:36 отредактировано niko00780)

Re: PT2258 + LCD2004_I2C + IR + DS3231

Вот это безобразие как то можно окультурить?)))(я понимаю, рукожоп я, но зато сам))))))   (если сложно, пусть как есть.не главное....)

  //перемещение снежинок......////много кода......много...........//аааааааааааааааааааа////кто может лучше и проще, меняйте.............   
      if(secon % 10 == 0&&secon / 10 == 0||secon % 10 == 0&&secon / 10 == 2||secon % 10 == 0&&secon / 10 == 4)
           {lcd.setCursor(0,0);lcd.write(42);lcd.setCursor(19,3);lcd.write(42);}
      else {lcd.setCursor(0,0);lcd.print(" ");lcd.setCursor(19,3);lcd.print(" ");}
      
      if(secon % 10 == 1&&secon / 10 == 0||secon % 10 == 1&&secon / 10 == 2||secon % 10 == 1&&secon / 10 == 4)
           {lcd.setCursor(1,0);lcd.write(42);lcd.setCursor(18,3);lcd.write(42);}
      else {lcd.setCursor(1,0);lcd.print(" ");lcd.setCursor(18,3);lcd.print(" ");}  
        
      if(secon % 10 == 2&&secon / 10 == 0||secon % 10 == 2&&secon / 10 == 2||secon % 10 == 2&&secon / 10 == 4)
           {lcd.setCursor(2,0);lcd.write(42);lcd.setCursor(17,3);lcd.write(42);}
      else {lcd.setCursor(2,0);lcd.print(" ");lcd.setCursor(17,3);lcd.print(" ");} 
          
      if(secon % 10 == 3&&secon / 10 == 0||secon % 10 == 3&&secon / 10 == 2||secon % 10 == 3&&secon / 10 == 4)
           {lcd.setCursor(3,0);lcd.write(42);lcd.setCursor(16,3);lcd.write(42);}
      else {lcd.setCursor(3,0);lcd.print(" ");lcd.setCursor(16,3);lcd.print(" ");}  
         
      if(secon % 10 == 4&&secon / 10 == 0||secon % 10 == 4&&secon / 10 == 2||secon % 10 == 4&&secon / 10 == 4)
           {lcd.setCursor(4,0);lcd.write(42);lcd.setCursor(15,3);lcd.write(42);}
      else {lcd.setCursor(4,0);lcd.print(" ");lcd.setCursor(15,3);lcd.print(" ");}

      if(secon % 10 == 5&&secon / 10 == 0||secon % 10 == 5&&secon / 10 == 2||secon % 10 == 5&&secon / 10 == 4)
           {lcd.setCursor(5,0);lcd.write(42);lcd.setCursor(14,3);lcd.write(42);}
      else {lcd.setCursor(5,0);lcd.print(" ");lcd.setCursor(14,3);lcd.print(" ");} 
      
      if(secon % 10 == 6&&secon / 10 == 0||secon % 10 == 6&&secon / 10 == 2||secon % 10 == 6&&secon / 10 == 4)
           {lcd.setCursor(6,0);lcd.write(42);lcd.setCursor(13,3);lcd.write(42);}
      else {lcd.setCursor(6,0);lcd.print(" ");lcd.setCursor(13,3);lcd.print(" ");} 

      if(secon % 10 == 7&&secon / 10 == 0||secon % 10 == 7&&secon / 10 == 2||secon % 10 == 7&&secon / 10 == 4)
           {lcd.setCursor(7,0);lcd.write(42);lcd.setCursor(12,3);lcd.write(42);}
      else {lcd.setCursor(7,0);lcd.print(" ");lcd.setCursor(12,3);lcd.print(" ");} 

      if(secon % 10 == 8&&secon / 10 == 0||secon % 10 == 8&&secon / 10 == 2||secon % 10 == 8&&secon / 10 == 4)
           {lcd.setCursor(8,0);lcd.write(42);lcd.setCursor(11,3);lcd.write(42);}
      else {lcd.setCursor(8,0);lcd.print(" ");lcd.setCursor(11,3);lcd.print(" ");} 

      if(secon % 10 == 9&&secon / 10 == 0||secon % 10 == 9&&secon / 10 == 2||secon % 10 == 9&&secon / 10 == 4)
           {lcd.setCursor(9,0);lcd.write(42);lcd.setCursor(10,3);lcd.write(42);}
      else {lcd.setCursor(9,0);lcd.print(" ");lcd.setCursor(10,3);lcd.print(" ");} 
      
      ///////////////////////ааааааааааааааааааааааа///////////////////////////////////////////////
      
      if(secon % 10 == 0&&secon / 10 == 1||secon % 10 == 0&&secon / 10 == 3||secon % 10 == 0&&secon / 10 == 5)
           {lcd.setCursor(10,0);lcd.write(42);lcd.setCursor(9,3);lcd.write(42);}
      else {lcd.setCursor(10,0);lcd.print(" ");lcd.setCursor(9,3);lcd.print(" ");}
      
      if(secon % 10 == 1&&secon / 10 == 1||secon % 10 == 1&&secon / 10 == 3||secon % 10 == 1&&secon / 10 == 5)
           {lcd.setCursor(11,0);lcd.write(42);lcd.setCursor(8,3);lcd.write(42);}
      else {lcd.setCursor(11,0);lcd.print(" ");lcd.setCursor(8,3);lcd.print(" ");}  
        
      if(secon % 10 == 2&&secon / 10 == 1||secon % 10 == 2&&secon / 10 == 3||secon % 10 == 2&&secon / 10 == 5)
           {lcd.setCursor(12,0);lcd.write(42);lcd.setCursor(7,3);lcd.write(42);}
      else {lcd.setCursor(12,0);lcd.print(" ");lcd.setCursor(7,3);lcd.print(" ");} 
          
      if(secon % 10 == 3&&secon / 10 == 1||secon % 10 == 3&&secon / 10 == 3||secon % 10 == 3&&secon / 10 == 5)
           {lcd.setCursor(13,0);lcd.write(42);lcd.setCursor(6,3);lcd.write(42);}
      else {lcd.setCursor(13,0);lcd.print(" ");lcd.setCursor(6,3);lcd.print(" ");}  
         
      if(secon % 10 == 4&&secon / 10 == 1||secon % 10 == 4&&secon / 10 == 3||secon % 10 == 4&&secon / 10 == 5)
           {lcd.setCursor(14,0);lcd.write(42);lcd.setCursor(5,3);lcd.write(42);}
      else {lcd.setCursor(14,0);lcd.print(" ");lcd.setCursor(5,3);lcd.print(" ");}

      if(secon % 10 == 5&&secon / 10 == 1||secon % 10 == 5&&secon / 10 == 3||secon % 10 == 5&&secon / 10 == 5)
           {lcd.setCursor(15,0);lcd.write(42);lcd.setCursor(4,3);lcd.write(42);}
      else {lcd.setCursor(15,0);lcd.print(" ");lcd.setCursor(4,3);lcd.print(" ");} 
      
      if(secon % 10 == 6&&secon / 10 == 1||secon % 10 == 6&&secon / 10 == 3||secon % 10 == 6&&secon / 10 == 5)
           {lcd.setCursor(16,0);lcd.write(42);lcd.setCursor(3,3);lcd.write(42);}
      else {lcd.setCursor(16,0);lcd.print(" ");lcd.setCursor(3,3);lcd.print(" ");} 

      if(secon % 10 == 7&&secon / 10 == 1||secon % 10 == 7&&secon / 10 == 3||secon % 10 == 7&&secon / 10 == 5)
           {lcd.setCursor(17,0);lcd.write(42);lcd.setCursor(2,3);lcd.write(42);}
      else {lcd.setCursor(17,0);lcd.print(" ");lcd.setCursor(2,3);lcd.print(" ");} 

      if(secon % 10 == 8&&secon / 10 == 1||secon % 10 == 8&&secon / 10 == 3||secon % 10 == 8&&secon / 10 == 5)
           {lcd.setCursor(18,0);lcd.write(42);lcd.setCursor(1,3);lcd.write(42);}
      else {lcd.setCursor(18,0);lcd.print(" ");lcd.setCursor(1,3);lcd.print(" ");} 

      if(secon % 10 == 9&&secon / 10 == 1||secon % 10 == 9&&secon / 10 == 3||secon % 10 == 9&&secon / 10 == 5)
           {lcd.setCursor(19,0);lcd.write(42);lcd.setCursor(0,3);lcd.write(42);}
      else {lcd.setCursor(19,0);lcd.print(" ");lcd.setCursor(0,3);lcd.print(" ");}
      
      ////////////////////всеееееееееееееееееееееее///////////////////////////////

Как бы добавить меню настроек пультиков)))) Было бы шикарно))))

68

Re: PT2258 + LCD2004_I2C + IR + DS3231

niko00780 пишет:

Как бы добавить меню настроек пультиков)))) Было бы шикарно))))

Отвечу сам себе....идея шикарная.......но почитав форумы.....ужосссс....

Да и код уже в одну ардуину вряд ли влезет.....
Оно того не стоит.....проще у китайцев 5 пультов программируемых купить,
хоть таких
http://forum.rcl-radio.ru/uploads/images/2022/07/f2621e551110b94fdcb1ad431285f920.jpg
хоть таких
http://forum.rcl-radio.ru/uploads/images/2022/07/16d2927a2fad89ad4ff76ee310cb2ae2.jpg
и уже их запрограммировать одинаково....и их коды в скетч добавить......
Ну и как вариант в конечном устройстве предусмотреть порт для перепрошивки ардуины....)))

69

Re: PT2258 + LCD2004_I2C + IR + DS3231

  for(int i=0;i<=9;i++){
    if(secon % 10 == i && secon / 10 == i || secon % 10 == i && secon / 10 == 2||secon % 10 == i && secon / 10 == 4)
           {lcd.setCursor(0,0);lcd.write(42);lcd.setCursor(19-i,3);lcd.write(42);}
      else {lcd.setCursor(0,0);lcd.print(" ");lcd.setCursor(19-i,3);lcd.print(" ");}
    }
    
 ///////////////////////ааааааааааааааааааааааа///////////////////////////////////////////////

  for(int i=0;i<=9;i++){
    if(secon % 10 == i && secon / 10 == 1||secon % 10 == i && secon / 10 == 3||secon % 10 == i && secon / 10 == 5)
           {lcd.setCursor(10,0);lcd.write(42);lcd.setCursor(9-i,3);lcd.write(42);}
      else {lcd.setCursor(10,0);lcd.print(" ");lcd.setCursor(9-i,3);lcd.print(" ");}
    }

70

Re: PT2258 + LCD2004_I2C + IR + DS3231

Как бы добавить меню настроек пультиков)))) Было бы шикарно))))

Подумаю на выходных как это реализовать

71

Re: PT2258 + LCD2004_I2C + IR + DS3231

На счёт привязки любого пульта через меню было-бы круто. Да и в другие проекты по аудио процессорам при желании можно было бы добавить

72 (2022-07-23 00:55:03 отредактировано niko00780)

Re: PT2258 + LCD2004_I2C + IR + DS3231

liman324 пишет:
  for(int i=0;i<=9;i++){
    if(secon % 10 == i && secon / 10 == i || secon % 10 == i && secon / 10 == 2||secon % 10 == i && secon / 10 == 4)
           {lcd.setCursor(0,0);lcd.write(42);lcd.setCursor(19-i,3);lcd.write(42);}
      else {lcd.setCursor(0,0);lcd.print(" ");lcd.setCursor(19-i,3);lcd.print(" ");}
    }
    
 ///////////////////////ааааааааааааааааааааааа///////////////////////////////////////////////

  for(int i=0;i<=9;i++){
    if(secon % 10 == i && secon / 10 == 1||secon % 10 == i && secon / 10 == 3||secon % 10 == i && secon / 10 == 5)
           {lcd.setCursor(10,0);lcd.write(42);lcd.setCursor(9-i,3);lcd.write(42);}
      else {lcd.setCursor(10,0);lcd.print(" ");lcd.setCursor(9-i,3);lcd.print(" ");}
    }

Протестировал..... Почти получилось.......
В таком виде нижняя строчка работат как задумано, но в верхней строке  0й и 10й знак просто моргают каждых 10 секунд...
из за подобного кода в каждой строке
for(int i=0;i<=9;i++){
    if(secon % 10 == i && secon / 10 == i || secon % 10 == i && secon / 10 == 2||secon % 10 == i && secon / 10 == 4)
           {lcd.setCursor(0,0);lcd.write(42);lcd.setCursor(19-i,3);lcd.write(42);}
      else {lcd.setCursor(0,0);lcd.print(" ");lcd.setCursor(19-i,3);lcd.print(" ");}
    }
   
///////////////////////ааааааааааааааааааааааа///////////////////////////////////////////////

  for(int i=0;i<=9;i++){
    if(secon % 10 == i && secon / 10 == 1||secon % 10 == i && secon / 10 == 3||secon % 10 == i && secon / 10 == 5)
           {lcd.setCursor(10,0);lcd.write(42);lcd.setCursor(9-i,3);lcd.write(42);}
      else {lcd.setCursor(10,0);lcd.print(" ");lcd.setCursor(9-i,3);lcd.print(" ");}
    }


Чтобы верхняя строчка работала, да еще и в противоположную сторону, нужно в каждое выражение  добавить то же что и для нижней строки, изменив номер строки и к знакоместу прибавлять значение переменной.....0+i,0 .... 10+i,0

Вот кусок кода, с исправленной задумкой.......

//перемещение снежинок......первая и последняя строчки   
   
     //строчки с  четными секундами
    for(int i=0;i<=9;i++){
    if(secon % 10 == i && secon / 10 == 0 || secon % 10 == i && secon / 10 == 2||secon % 10 == i && secon / 10 == 4)
           {lcd.setCursor(0+i,0);lcd.write(42);/////чет,верхняя строка с 0го до 19го знака, сдвиг вправо, символ "*"
            lcd.setCursor(19-i,3);lcd.write(42);}///чет,нижняя строка  с 19го до 0го знака, сдвиг влево, символ "*"
      else {lcd.setCursor(0+i,0);lcd.print(" ");////чет,верхняя строка с 0го до 19го знака, сдвиг вправо, символ " "
            lcd.setCursor(19-i,3);lcd.print(" ");}//чет,нижняя строка  с 19го до 0го знака, сдвиг влево, символ " "
    }
    
     //строчки с  нечетными секундами
    for(int i=0;i<=9;i++){
    if(secon % 10 == i && secon / 10 == 1||secon % 10 == i && secon / 10 == 3||secon % 10 == i && secon / 10 == 5)
           {lcd.setCursor(10+i,0);lcd.write(42);////нечет,верхняя строка с 0го до 19го знака, сдвиг вправо, символ "*"
            lcd.setCursor(9-i,3);lcd.write(42);}///нечет,нижняя строка  с 19го до 0го знака, сдвиг влево, символ "*"
      else {lcd.setCursor(10+i,0);lcd.print(" ");//нечет,верхняя строка с 0го до 19го знака, сдвиг вправо, символ " "
            lcd.setCursor(9-i,3);lcd.print(" ");}//нечет,нижняя строка  с 19го до 0го знака, сдвиг влево, символ " "
    }

А вот полный скейч,    экономия памяти 7% !!!
(в сравнении с моим мега-огромным таким же кодом)

//#define POWER     0x33B800FF
//#define VOLUME_UP 0x33B8E01F
//#define VOLUME_DW 0x33B810EF
//#define MUT       0x33B8946B
//-----------------------------------------------------------------------------------------------------------
#define SET       0x42BD48B7
#define OK        0x42BD08F7
#define POWER     0x42BD50AF
#define VOLUME_UP 0x42BD6897
#define VOLUME_DW 0x42BDE01F
#define MUT       0x42BD609F

#include <Wire.h>
#include <LiquidCrystal_I2C.h> // http://forum.rcl-radio.ru/misc.php?action=pan_download&item=45&download=1
#include <Encoder.h>           // http://rcl-radio.ru/wp-content/uploads/2019/05/Encoder.zip       
#include <EEPROM.h>
#include <MsTimer2.h>          // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip 
#include <boarddefs.h>         // входит в состав библиотеки IRremote
#include <IRremote.h>          // http://rcl-radio.ru/wp-content/uploads/2019/06/IRremote.zip
#include <PT2258.h> // https://github.com/liman324/PT2258.git
#include <DS3231.h>
#include <microDS18B20.h>
PT2258 pt;
//-----------------------------------------------------------------------------------------------------------
LiquidCrystal_I2C lcd(0x27, 20, 4); // Устанавливаем дисплей
Encoder myEnc(9, 8);// DT, CLK
IRrecv irrecv(11); // указываем вывод модуля IR приемника
decode_results ir;
DS3231 clock; RTCDateTime DateTime;
MicroDS18B20<5> sensor;
//-----------------------------------------------------------------------------------------------------------
//запись кодов символов в экран
byte v1[8] = {B00111,B01111,B11111,B11111,B11111,B11111,B11111,B11111};
byte v2[8] = {B11111,B11111,B11111,B00000,B00000,B00000,B00000,B00000};      
byte v3[8] = {B11100,B11110,B11111,B11111,B11111,B11111,B11111,B11111};
byte v4[8] = {B11111,B11111,B11111,B11111,B11111,B11111,B01111,B00111};
byte v5[8] = {B00000,B00000,B00000,B00000,B00000,B11111,B11111,B11111};
byte v6[8] = {B11111,B11111,B11111,B11111,B11111,B11111,B11110,B11100};
byte v7[8] = {B11111,B11111,B11111,B00000,B00000,B00000,B11111,B11111};
byte v8[8] = {B11111,B11111,B11111,B11111,B11111,B11111,B11111,B11111}; 
//-----------------------------------------------------------------------------------------------------------
//обьявление переменных
static uint32_t timTemp;
unsigned long times,oldPosition  = -999,newPosition; 
int vol, ch1, ch2, ch3, ch4, ch5, ch6, menu, menu1, menu2, brig, brig0=10, brig1, temp0, i;
bool mute, power, w, w1, gr1, gr2,termo;
byte a[6], d1, d2, d3, d4, d5, d6, e1, e2, e3, x, www, tim_w;
int hour, minut, secon, data, mon, year, time_temp;
byte mesto2[8] = {0, 10, 0, 10, 0, 10, 0, 10};
byte mesto3[8] = {0, 0, 1, 1, 2, 2, 3, 3};
int hh, mm, ss, dd, mn, gg;
byte standby = 1;
int pin7=0;
int x_timer;
int perc;
//-----------------------------------------------------------------------------------------------------------


////переменные для автоматического снижения яркости на основном экране......
bool _tim1I = 0;
bool _tim1O = 0;
unsigned long _tim1P = 0UL;
bool _trgrt1 = 0;
bool _trgrt1I = 0;
bool _start=0;
//-----------------------------------------------------------------------------------------------------------

//приготовились.....

void setup() {
  
    irrecv.enableIRIn(); lcd.init(); lcd.backlight(); Wire.begin(); clock.begin(); Serial.begin(9600);
    MsTimer2::set(1, to_Timer); MsTimer2::start();
    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);
    if (EEPROM.read(100) != 0) {
       for (int i = 0; i < 101; i++) {
      EEPROM.update(i, 0); // очистка памяти при первом включении
    }
    }
//-----------------------------------------------------------------------------------------------------------
    //объявление входов,выходов
    //pinMode(0)                    //serial port
    //pinMode(1)                    //serial port
    pinMode(2, INPUT_PULLUP);     // КНОПКА SET
    pinMode(3, INPUT_PULLUP);     // КНОПКА MUTE
    pinMode(4, INPUT_PULLUP);     // КНОПКА POWER
    //pinMode(5)                    // термодатчик 18B20
    pinMode(6, OUTPUT);           // ВЫХОД УПРАВЛЕНИЯ ПОДСВЕТКОЙ
    pinMode(7, OUTPUT);           // ВЫХОД АКТИВАЦИИ АНАЛИЗАТОРА СПЕКТРА
    //pinMode(8) Encoder myEnc(8);  //CLK
    //pinMode(9) Encoder myEnc(9);  //DT
    pinMode(10, INPUT);           // МЕНЮ КНОПКА SW энкодера
    //pinMode(11) IRrecv irrecv(11);// указываем вывод модуля IR приемника
    pinMode(12, OUTPUT);          // Выход управления STANDBY - реле включения усилителя
    pinMode(13, OUTPUT);          // Выход управления STANDBY--- c задержкой для реле софтстарта усилителя
//-----------------------------------------------------------------------------------------------------------
    //входы для индикации аварий каналов, кому не надо можете удалить от этого места....

    pinMode(14, INPUT_PULLUP);          //вход аварии левый  передний   /норма +5 вольт, авария 0 вольт/ замыкаем на землю при аварии
    pinMode(15, INPUT_PULLUP);          //вход аварии левый  задний     /норма +5 вольт, авария 0 вольт/ замыкаем на землю при аварии
    pinMode(16, INPUT_PULLUP);          //вход аварии центральный канал /норма +5 вольт, авария 0 вольт/ замыкаем на землю при аварии
    pinMode(17, INPUT_PULLUP);          //вход аварии сабвуфера          /норма +5 вольт, авария 0 вольт/ замыкаем на землю при аварии
  
    pinMode(A6, INPUT);                 //вход аварии правый передний   /норма +5 вольт, авария 0 вольт/ замыкаем на землю при аварии
    //чисто аналоговый вход             //вот тут вход привязываем к +5 вольт через резистор 10 кОм, обязательно,да програмно пробовал
                                      //ловит наводки, лучше железно, рядом с ардуиной, так надежнее
                                      
    pinMode(A7, INPUT);                 //вход аварии правый задний     /норма +5 вольт, авария 0 вольт/ замыкаем на землю при аварии
    //чисто аналоговый вход             //вот тут вход привязываем к +5 вольт через резистор 10 кОм, обязательно,да программно пробовал
                                      //ловит наводки, лучше железно, рядом с ардуиной, так надежнее
    ///....до этого......
//-----------------------------------------------------------------------------------------------------------    
    clock.setDateTime(__DATE__, __TIME__); // Устанавливаем время на часах, основываясь на времени компиляции скетча
    vol = EEPROM.read(0); 
    ch1 = EEPROM.read(1); ch2 = EEPROM.read(2); ch3 = EEPROM.read(3);
    ch4 = EEPROM.read(4); ch5 = EEPROM.read(5); ch6 = EEPROM.read(6);
    brig0 = EEPROM.read(7); brig1 = EEPROM.read(8);
    analogWrite(6, brig0 * 25);

    digitalWrite(12, LOW);
    digitalWrite(13, LOW);
    delay(500);
    audio();  
   }
//-----------------------------------------------------------------------------------------------------------
   /////////////////поехали/////////////////////////////////////////////
   
void loop() {
  
   /// READ TIME /////////////////////////////////
    DateTime = clock.getDateTime(); hour = DateTime.hour; minut = DateTime.minute; secon = DateTime.second;
    data = DateTime.day; mon = DateTime.month; year = DateTime.year;
   
  
   
//----------------------------------------------------------------------------------------------------------- 

    /// BUTTON ////////////////////////////////////
    //// МЕНЮ КНОПКА  энкодера
    if (power == 0) {
    if ((digitalRead(10) == LOW || ir.value == OK) && menu == 1) {menu1++;delay(200);times = millis();cl1();w = 1;w1 = 1;
    if (menu1 > 7) {menu1 = 0;}
    }
    if (digitalRead(10) == LOW && menu == 2) {menu2++;delay(200);times = millis();w = 1;w1 = 1;
    if (menu2 > 5) {menu2 = 0;}
    }
//-----------------------------------------------------------------------------------------------------------
    /////////////Долгое нажатие кнопки энкодера(больше 5 секунд)
    ////////////---включение/отключение АНАЛИЗАТОРА СПЕКТРА  на втором экране LCD 2004/////////////////
    
    if (digitalRead(10) == LOW && menu==0){delay(200);x_timer++;}// держим кнопку, идет счет x_timer
    if (digitalRead(10) == HIGH) {x_timer=0;} // если отпустить кнопку то x_timer сбрасывается
    if (x_timer > 12 && pin7==0) {digitalWrite(7,HIGH);pin7=1;x_timer=0;} // 12*200 мс + время работы цикла = 5с включаем пин 7 если он был выключен
    if (x_timer > 12 && pin7==1 ) {digitalWrite(7,LOW);pin7=0;x_timer=0;} //  12*200 мс + время работы цикла = 5с выключаем пин 7 если он был включен
//-----------------------------------------------------------------------------------------------------------     
    // МЕНЮ КНОПКА SET
    if ((digitalRead(2) == LOW || ir.value == SET)  && digitalRead(10) == HIGH) {menu++;delay(200);times = millis();cl();w = 1;w1 = 1;menu1 = 0;
      if (menu > 1) {menu = 0; }
    }
//-----------------------------------------------------------------------------------------------------------    
    // МЕНЮ КНОПКА SET time(нажатие одновременно кнопки энкодера и кнопкиSET)
    if (digitalRead(2) == LOW && digitalRead(10) == LOW) {menu = 2;delay(200);times = millis();cl();w = 1;w1 = 1;lcd.setCursor(2, 1);
    lcd.print("TIME CORRECTION");delay(1000);
    }
//-----------------------------------------------------------------------------------------------------------
    // МЕНЮ КНОПКА MUTE - mute on
    if ((digitalRead(3) == LOW || ir.value == MUT) && mute == 0) {mute = 1;cl();audio();menu = 100;brig=brig1;analogWrite(6, brig * 25);
//-----------------------------------------------------------------------------------------------------------   
    //слово MUTE//да, охренеть! можно проще? и круче? --- поправляйте!(просто "MUTE" не прет!!!)(и массивы ниасилил йа......)
   
    //1 символ "М"+пробел"
    lcd.setCursor(1,0);lcd.write(3);lcd.print("  ");lcd.write(1);lcd.print(" ");
    lcd.setCursor(1,1);lcd.write(8);lcd.write(3);lcd.write(1);lcd.write(8);lcd.print(" ");
    lcd.setCursor(1,2);lcd.write(8);lcd.print("  ");lcd.write(8);lcd.print(" ");
   
    //2 символ "U"+пробел"
    lcd.setCursor(6,0);lcd.write(3);lcd.print("  ");lcd.write(1);lcd.print(" ");  
    lcd.setCursor(6,1);lcd.write(8);lcd.print("  ");lcd.write(8);lcd.print(" ");
    lcd.setCursor(6,2);lcd.write(4);lcd.write(8);lcd.write(8);lcd.write(6);lcd.print(" ");
    
     //3 символ "T"+пробел"
    
    lcd.setCursor(11,0);lcd.write(8);lcd.write(8);lcd.write(8);lcd.print(" ");
    lcd.setCursor(11,1);lcd.print(" ");lcd.write(8);lcd.print("  ");
    lcd.setCursor(11,2);lcd.print(" ");lcd.write(8);lcd.print("  ");
    
    //4 символ "E"+пробел"

    lcd.setCursor(15,0);lcd.write(1);lcd.write(2);lcd.write(2);lcd.write(2);
    lcd.setCursor(15,1);lcd.write(8);lcd.write(2);lcd.write(2);
    lcd.setCursor(15,2);lcd.write(4);lcd.write(5);lcd.write(5);lcd.write(5);
          
    delay(500);
    }
//-----------------------------------------------------------------------------------------------------------
     // МЕНЮ КНОПКА MUTE - mute off
    if ((digitalRead(3) == LOW || ir.value == MUT) && mute == 1) {mute = 0;cl();times = millis();w = 1;w1 = 1;menu = 0;menu1 = 0;myEnc.write(0);newPosition = 0;brig=brig0;analogWrite(6, brig * 25);audio();}
    }
//-----------------------------------------------------------------------------------------------------------
   // МЕНЮ STANDBY
   //КНОПКА POWER ON/OFF
    
   //КНОПКА POWER
   // POWER O F F 
   //сначала  ВЫКЛЮЧЕНИЕ 
    if (((digitalRead(4) == LOW || ir.value == POWER) && power == 0) || standby == 1)  {menu1 = 0;  mute = 1; audio();
    power = 1; standby = 0;cl();times = millis(); w = 1; w1 = 1; menu = 100;//сначала вырубаем звук,выключаем все и врубаем меню STANDBY.....
    /////    в цикле плавное снижение уровня подсветки.....
    for (i = 10; i >=1 ; i--) {
   brig = i;analogWrite(6, brig * 25); 
      delay(100);  
    }
    }
//-----------------------------------------------------------------------------------------------------------    
    
    //КНОПКА POWER
    // POWER O N 
     
    if ((digitalRead(4) == LOW || ir.value == POWER) && power == 1 ) {
       power = 0; cl();times = millis(); w = 1; w1 = 1; menu = 0; menu1 = 0;myEnc.write(0);newPosition = 0; 
       digitalWrite(12, HIGH);//включение питания 1й выход
                                        
    // ЭКРАН ПРИ ВКЛЮЧЕНИИ 
    lcd.setCursor(0, 0); lcd.print("  BU DIGITAL SARAY  ");//1 строка    
    lcd.setCursor(0, 1); lcd.print("POWER AMPLIFIER  5.1");//2 строка
    lcd.setCursor(0, 2); lcd.print("   SYSTEM LOADING   ");//3 строка
    for(int i=1;i<=10;i++){ brig=i; analogWrite(6, brig * 25);delay(200);//плавное включение подсветки при ВКЛЮЧЕНИИ
    } 
    digitalWrite(13, HIGH); //включение питания 2й выход  
   // квадратики загрузки _-_-_-_-_-_-_-_-_-_-_-
    lcd.setCursor(0, 3);
    for (int thisChar = 0; thisChar < 10; thisChar++) {lcd.write(5);delay(75);lcd.write(2);delay(75);}
                                         
   
  cl();_start=1; mute = 0; audio();  //очистка экрана, отключение mute.....слушаем музыку))))
    } 
 //-----------------------------------------------------------------------------------------------------------    
    // power off//выключение усилителя(реле)
    if (power == 1) {digitalWrite(12, LOW);} // выход standby
    else {digitalWrite(12, HIGH);} 
    if (power == 1) {digitalWrite(13, LOW);digitalWrite(7,LOW);} // выход standby delay, выход отключения АНАЛИЗАТОРА СПЕКТРА
    
//-----------------------------------------------------------------------------------------------------------  
     /// IR ////////////////////////////////////////
    if ( irrecv.decode( &ir )) {
      Serial.print("0x");  // IR приемник - чтение, в мониторе порта отображаются коды кнопок
      Serial.println( ir.value, HEX);
    //Serial.println (sensor_Alarm_1);
    //Serial.println (sensor_Alarm_2);
      irrecv.resume();
      times = millis();
      w = 1;
      w1 = 1;
    }
    if (ir.value == 0) {
      gr1 = 0;  // запрет нажатий не активных кнопок пульта
      gr2 = 0;
    }
//-----------------------------------------------------------------------------------------------------------
  

  ////////////// VOLUME ///////////////////////////////////////////////////////////////////
  //ОСНОВНОЙ ЭКРАН
    if (menu == 0) {
    // кнопка >
    if (ir.value == VOLUME_UP && mute == 0 && power == 0) {vol++;gr1 = 1;gr2 = 0;cl1();times = millis();w = 1;vol_func();audio();}
    // кнопка >>>>>>
    if (ir.value == 0xFFFFFFFF and gr1 == 1) {vol++;gr2 = 0;cl1();times = millis();w = 1;vol_func();audio();}
    // кнопка <
    if (ir.value == VOLUME_DW) {vol--;gr1 = 0;gr2 = 1;cl1();times = millis();w = 1;vol_func();audio();}
    // кнопка <<<<<<
    if (ir.value == 0xFFFFFFFF and gr2 == 1) {vol--;gr1 = 0;cl1();times = millis();w = 1;vol_func();audio();}

    if (newPosition != oldPosition) {oldPosition = newPosition;vol = vol + newPosition;
        myEnc.write(0);newPosition = 0; times = millis();w = 1;w1 = 1;vol_func();audio();}
//-----------------------------------------------------------------------------------------------------------
// цифры громкости       
    a[0] = (vol) / 10; a[1] = (vol) % 10;
    for (x = 0; x < 2; x++) {
      switch (x) {
        case 0: e1 = 10, e2 = 11, e3 = 12;break;
        case 1: e1 = 14, e2 = 15, e3 = 16;break;} 
        digit();
    }
//-----------------------------------------------------------------------------------------------------------    
    //Минус (гаснущий при нуле) перед цифрами уровня громкости
    lcd.setCursor(8, 0); if (vol > 0) {lcd.write(5);} else {lcd.print(" ");//{lcd.write(5);---какой символ отображать----из таблички  в начале скейча
    }
//-----------------------------------------------------------------------------------------------------------
    ////Вывод температуры на основной экран///////
    if (millis() - timTemp >= 800) {         ///время опроса датчика
       timTemp = millis();  
    // читаем прошлое значение
    //значение температуры выводится только при срабатывании термозащиты,у нас усилитель, а не термометр)))))))) 
    if (termo == 1) {if (sensor.readTemp()) {lcd.setCursor(17, 3);lcd.print(sensor.getTemp(),0);lcd.write(223);}//выводим на экран
    else {lcd.setCursor(17, 3);lcd.print("ERR");delay(250);lcd.setCursor(17, 3);lcd.print("   ");}//если обрыв датчика пишем error
    }
    // запрашиваем новое измерение
       sensor.requestTemp();
//-----------------------------------------------------------------------------------------------------------    
    
    //термозащита //4 строка
    
    //вот тут меняем уставку защиты.....50...90 градусов....или 100))))
    //если температура превышает уставку.....
    if ((sensor.getTemp())>=30){vol = 35; audio(); termo=1;//гасим часы, снижаем уровень до -35 дБ.....врубаем подсветку на максимум.....
    //вместо часов выводим сообщение....
       if (secon & 1){ lcd.setCursor(0, 3);lcd.print(">TERMO OVERLOAD< ");}  
                   //                                 01234567890123456  это символы в строке считаю, чтоб не промазать)))
      else { lcd.setCursor(0, 3);lcd.print(" >70");lcd.write(223);lcd.print(" MAX TEMP<  ");}//тут пишем максимальную температуру, как в уставке   
                   //                       0123              4              567890123456  это символы в строке считаю, чтоб не промазать))           
    }  
        //если температура в норме..... 
    else {audio();termo=0;//гасим подсветку и возвращаем часы .....  
        lcd.setCursor(0, 3);lcd.print("        ");
        lcd.print(hour / 10); lcd.print(hour % 10);// lcd.print(":");
    if (secon & 1)
         {lcd.write(165);}                                          //secon - нечетное
    else {lcd.write(58);}                                           //secon - четное
        lcd.print(minut / 10); lcd.print(minut % 10);lcd.print("       "); 
    }  
    }
    
//-----------------------------------------------------------------------------------------------------------  
    //надписи основного экрана
    //1 строка
                  lcd.setCursor(0, 0); lcd.print(" VOLUME ");
    //2 строка начало
    if (termo==0){lcd.setCursor(0, 1); lcd.print(" 5.1 CH ");}
       else      {lcd.setCursor(0, 1); lcd.print(" LIMIT  ");}//если сработала термозащита выводим слово---лимит---
    //2 строка в конце 
        lcd.setCursor(18,1); lcd.print("dB");//2 строка после цифр уровня громкости
//-----------------------------------------------------------------------------------------------------------
    // индикаторы неисправности каналов
    // кому не нужно раскоментируйте строку ниже
    //lcd.setCursor(0, 2); lcd.print("--------------------");//3 строка
    //и все остальное можете удалить, от этого места.......
    //переменные аварии правого переднего канала и правого заднего канала
   int sensor_Alarm_3 = analogRead(A6);//считываем сигнал аварии правого переднего канала
   int sensor_Alarm_4 = analogRead(A7);//считываем сигнал аварии правого заднего канала
    
    if (digitalRead(14) == LOW || digitalRead(15) == LOW ||digitalRead(16) == LOW ||digitalRead(17) == LOW 
          ||sensor_Alarm_3 < 10||sensor_Alarm_4 < 10){
    //левый передний
    if (digitalRead(14) == HIGH)                                                              
         {lcd.setCursor(0, 2);lcd.print("   ");}                      
    if (digitalRead(14) == LOW ) {if ((millis() % 1000) > 500)                                
        {lcd.setCursor(0, 2); lcd.print("FL ");}
    else{lcd.setCursor(0, 2); lcd.print("DC ");}
    }
    //левый задний
    if (digitalRead(15) == HIGH)
        {lcd.setCursor(3, 2); lcd.print("   ");}
    if (digitalRead(15) == LOW) {if ((millis() % 1000) > 500) 
        {lcd.setCursor(3, 2); lcd.print("RL ");}
    else{lcd.setCursor(3, 2); lcd.print("DC ");}
    }
    //центральный
    if (digitalRead(16) == HIGH)
         {lcd.setCursor(6, 2);lcd.print("    ");}
    if (digitalRead(16) == LOW) {if ((millis() % 1000) > 500)
        {lcd.setCursor(6, 2); lcd.print("CNTR");}
    else{lcd.setCursor(6, 2); lcd.print(" DC ");}
    }
    //сабвуфер
    if (digitalRead(17) == HIGH) 
         {lcd.setCursor(10, 2);lcd.print("    ");}
    if (digitalRead(17) == LOW) {if ((millis() % 1000) > 500) 
        {lcd.setCursor(10, 2); lcd.print(" SUB");}
    else{lcd.setCursor(10, 2); lcd.print(" D C");}
    }
     //правый  передний/// тут пришлось поковыряться......вход А6 чисто аналоговый
    if (sensor_Alarm_3 >= 500) 
         {lcd.setCursor(14, 2);lcd.print("   ");}
    if (sensor_Alarm_3 <= 10) {if ((millis() % 1000) > 500) 
        {lcd.setCursor(14, 2); lcd.print(" FR");}
    else{lcd.setCursor(14, 2); lcd.print(" DC");}
    } 
    //правый  задний /// и тут тоже пришлось поковыряться......вход А7 чисто аналоговый
    if (sensor_Alarm_4 >= 500) 
         {lcd.setCursor(17, 2);lcd.print("   ");}
    if (sensor_Alarm_4 <= 10) {if ((millis() % 1000) > 500) 
        {lcd.setCursor(17, 2); lcd.print(" RR");}
    else{lcd.setCursor(17, 2); lcd.print(" DC");}
    
    }
    }
    else {int perc = map(vol, 64, 0, 0, 100);
    //fillBar0 принимает аргументы (столбец, строка, длина полосы, значение в % (0 - 100) )
    fillBar0(0, 2, 20, perc);
    delay(50);}
    ////до сюда.....
    
       
//-----------------------------------------------------------------------------------------------------------    
    //яркость подсветки.... автоматическое снижение при неактивных кнопках.....
    //  ждем 10 сек и выключаем подсветку
    if (_start==1) { if (_trgrt1I) { _trgrt1 = 0;} else {_trgrt1 = 1; _trgrt1I = 1;} } else {_trgrt1 = 0; _trgrt1I = 0;}; 
    if ( (_trgrt1) || digitalRead(2)  == LOW || digitalRead(3)  == LOW || digitalRead(4)  == LOW ||
        digitalRead(8)  == LOW || digitalRead(9)  == LOW || digitalRead(10) == LOW ||
        digitalRead(14) == LOW || digitalRead(15) == LOW || digitalRead(16) == LOW ||
        digitalRead(17) == LOW ||   sensor_Alarm_3 < 10  || sensor_Alarm_4 < 10    ||
        ir.value == OK || ir.value == SET || ir.value == MUT || ir.value == POWER  ||                                                       
        termo == 1 ||  gr1==1 || gr2==1) {_tim1O = 1; _tim1I = 1;} else { if(_tim1I) {_tim1I = 0; _tim1P = millis();} else { if (_tim1O) {if ( _isTimer(_tim1P, 10000)) _tim1O = 0;}}}
    if (!( _tim1O ) ) {brig = brig1;analogWrite(6, brig * 25);}                                  //////////////вот тут меняем время задержки отключения  подсветки ↑↑↑↑↑↑
    if ( _tim1O ){brig = brig0;analogWrite(6, brig * 25);}
   }
//-----------------------------------------------------------------------------------------------------------    
     ///////// ATT //////////////////////////////////////////////////////////////////////////////
     //Меню аттенюаторов
    if (menu == 1) {
      switch (menu1) {
      case 0: temp0 = ch1; break;
      case 1: temp0 = ch2; break;
      case 2: temp0 = ch3; break;
      case 3: temp0 = ch4; break;
      case 4: temp0 = ch5; break;
      case 5: temp0 = ch6; break;
      case 6: temp0 = brig0; break;
      case 7: temp0 = brig1; break;
    }
    // кнопка >
    if (ir.value == VOLUME_UP) {temp0--; gr1 = 1;gr2 = 0;cl1();times = millis();w = 1;www = 1;}
    // кнопка >>>>>>
    if (ir.value == 0xFFFFFFFF and gr1 == 1) {temp0--;gr2 = 0;cl1();times = millis();w = 1;w = 1;www = 1;}
    // кнопка <
    if (ir.value == VOLUME_DW) {temp0++; gr1 = 0;gr2 = 1;cl1();times = millis(); w = 1;w = 1;www = 1;
    }
    // кнопка <<<<<<
    if (ir.value == 0xFFFFFFFF and gr2 == 1) {temp0++;gr1 = 0;cl1();times = millis(); w = 1;w = 1;www = 1;}

    if (newPosition != oldPosition) {oldPosition = newPosition;temp0 = temp0 - newPosition; myEnc.write(0); newPosition = 0; times = millis(); w = 1; www = 1;
    }

    switch (menu1) {
      case 0: ch1 = temp0; if (ch1 < 0) {ch1 = 0;} if (ch1 > 15) {ch1 = 15;} break;
      case 1: ch2 = temp0; if (ch2 < 0) {ch2 = 0;} if (ch2 > 15) {ch2 = 15;} break;
      case 2: ch3 = temp0; if (ch3 < 0) {ch3 = 0;} if (ch3 > 15) {ch3 = 15;} break;
      case 3: ch4 = temp0; if (ch4 < 0) {ch4 = 0;} if (ch4 > 15) {ch4 = 15;} break;
      case 4: ch5 = temp0; if (ch5 < 0) {ch5 = 0;} if (ch5 > 15) {ch5 = 15;} break;
      case 5: ch6 = temp0; if (ch6 < 0) {ch6 = 0;} if (ch6 > 15) {ch6 = 15;} break;
      case 6: brig0 = temp0; brig0_func(); break;
      case 7: brig1 = temp0; brig1_func(); break;
    }
//----------------------------------------------------------------------------------------------------------- 
    
    au();
    if (menu1 < 7) {brig = brig0;}
    if (menu1 == 7) {brig = brig1;}
    analogWrite(6, brig * 25);

    for (i = 0; i < 8; i++) {
      if (menu1 == i) {
        lcd.setCursor(mesto2[i], mesto3[i]);
        lcd.print(char(126));
      } else {
        lcd.setCursor(mesto2[i], mesto3[i]);
        lcd.print(" ");
      }
    }

    lcd.setCursor(1, 0); lcd.print("Lfront"); if (ch1 == 0) {
      lcd.print(" ");
    } lcd.print(-ch1); if (ch1 < 10) {
      lcd.print(" ");
    }
    lcd.setCursor(11, 0); lcd.print("Rfront"); if (ch2 == 0) {
      lcd.print(" ");
    } lcd.print(-ch2); if (ch2 < 10) {
      lcd.print(" ");
    }
    lcd.setCursor(1, 1); lcd.print("L rear"); if (ch3 == 0) {
      lcd.print(" ");
    } lcd.print(-ch3); if (ch3 < 10) {
      lcd.print(" ");
    }
    lcd.setCursor(11, 1); lcd.print("R rear"); if (ch4 == 0) {
      lcd.print(" ");
    } lcd.print(-ch4); if (ch4 < 10) {
      lcd.print(" ");
    }
    lcd.setCursor(1, 2); lcd.print("Center"); if (ch5 == 0) {
      lcd.print(" ");
    } lcd.print(-ch5); if (ch5 < 10) {
      lcd.print(" ");
    }
    lcd.setCursor(11, 2); lcd.print("SubW  "); if (ch6 == 0) {
      lcd.print(" ");
    } lcd.print(-ch6); if (ch6 < 10) {
      lcd.print(" ");
    }
    lcd.setCursor(1, 3); lcd.print("BR ON "); lcd.print(brig0); lcd.print(" ");
    lcd.setCursor(11, 3); lcd.print("BR OFF "); lcd.print(brig1); lcd.print(" ");
    }
//----------------------------------------------------------------------------------------------------------- 
    //////// Меню коррекции времени ..............menu set time /////////////////////////////////////
    if (menu == 2) {
      hh = DateTime.hour; mm = DateTime.minute; ss = DateTime.second; dd = DateTime.day; mn = DateTime.month; gg = DateTime.year;
      switch (menu2) {
        case 0: time_temp = hh; break;
        case 1: time_temp = mm; break;
        case 2: time_temp = ss; break;
        case 3: time_temp = dd; break;
        case 4: time_temp = mn; break;
        case 5: time_temp = gg; break;
    }
    if (newPosition != oldPosition) {
      oldPosition = newPosition;
      time_temp = time_temp - newPosition; myEnc.write(0); newPosition = 0; times = millis(); w = 1; tim_w = 1;
    }
    switch (menu2) {
      case 0: hh = time_temp; 
      if (hh < 0) {hh = 0;} 
      if (hh > 23) {hh = 23;} break;
      case 1: mm = time_temp; 
      if (mm < 0) {mm = 0;} 
      if (mm > 59) {mm = 59;} break;
      case 2: ss = time_temp; 
      if (ss < 0) {ss = 0;} 
      if (ss > 59) {ss = 59;} break;
      case 3: dd = time_temp; 
      if (dd < 1) {dd = 1;}
      if (dd > 31) {dd = 31;} break;
      case 4: mn = time_temp;
      if (mn < 1) {mn = 1;} 
      if (mn > 12) {mn = 12;} break;
      case 5: gg = time_temp; 
      if (gg < 2022) {gg = 2022;} 
      if (gg > 2100) {gg = 2100;} break;
    }

    lcd.setCursor(0, 0); lcd.print("TIME CORRECTION");
    lcd.setCursor(0, 1); lcd.print("--------------------");
    lcd.setCursor(0, 2);
    if (menu2 == 0) {
      lcd.print("set hour   ");
    }
    if (menu2 == 1) {
      lcd.print("set minute ");
    }
    if (menu2 == 2) {
      lcd.print("set seconds");
    }
    if (menu2 == 3) {
      lcd.print("set date   ");
    }
    if (menu2 == 4) {
      lcd.print("set month  ");
    }
    if (menu2 == 5) {
      lcd.print("set year   ");
    }

    lcd.setCursor(0, 3);
    lcd.print(hour / 10); lcd.print(hour % 10); lcd.print(":");
    lcd.print(minut / 10); lcd.print(minut % 10); lcd.print(":");
    lcd.print(secon / 10); lcd.print(secon % 10); lcd.print(" ");
    lcd.print(data / 10); lcd.print(data % 10); lcd.print("-");
    lcd.print(mon / 10); lcd.print(mon % 10); lcd.print("-");
    lcd.print(year);


    if (tim_w == 1) {
      tim_w = 0;
      clock.setDateTime(gg, mn, dd, hh, mm, ss);
      delay(100);
   }
   }
//----------------------------------------------------------------------------------------------------------- 
/////Запись в память настроек
    /////// EEPROM //////////////////////////////////////
    if (millis() - times > 10000 && w1 == 1 && mute == 0 && power == 0) {
       w1 = 0;
    EEPROM.update(0, vol); EEPROM.update(1, ch1); EEPROM.update(2, ch2); EEPROM.update(3, ch3);
    EEPROM.update(4, ch4); EEPROM.update(5, ch5); EEPROM.update(6, ch6);
    EEPROM.update(7, brig0); EEPROM.update(8, brig1);
   if(menu!=0){cl();}
   }
//----------------------------------------------------------------------------------------------------------- 
///////////Экран STANDBY
   if (power == 1) {
   
    a[0] = DateTime.hour / 10;
    a[1] = DateTime.hour % 10;
    a[2] = DateTime.minute / 10;
    a[3] = DateTime.minute % 10;
    //a[4] = DateTime.second / 10;//десятки секунд///секунды закомментированы/если нужны секунды, раскомминтируем это
    //a[5] = DateTime.second % 10;//единицы секунд///секунды закомментированы/если нужны секунды, раскомминтируем это

    //for (i = 0; i < 6; i++) {//если нужны секунды, раскомминтируем это
    //что показывать. в данном случае часы и минуты,секунды закомментированы
    for (i = 0; i < 4; i++) { //если НЕ нужны секунды, это закомментируем
      switch (i) {
        case 0: e1 = 1, e2 = 2, e3 = 3; break;//десятки часов
        case 1: e1 = 5, e2 = 6, e3 = 7; break;//единицы часов
        case 2: e1 = 12, e2 = 13, e3 = 14; break;//десятки минут
        case 3: e1 = 16, e2 = 17, e3 = 18; break;//единицы минут
        //case 4: e1 = 14, e2 = 15, e3 = 16; break;//не надо//секунды закомментированы
       // case 5: e1 = 17, e2 = 18, e3 = 19; break;//не надо//секунды закомментированы
      }
      ///////маска цифр, ДЛЯ ЧАСОВ.....какая цифра из каких символов состоит....
      ///d1,d2,d3-верхняя часть цифры;d4,d5,d6-нижняя часть цифры;
      switch (a[i]) {
        //1 набор, 2,4,5 прямые// елсли нравится, оставляем, а нижний комментируем/*   */
        /*case 0: d1=1,d2=2,d3=3,d4=4,d5=5,d6=6;break;
        case 1: d1=2,d2=3,d3=32,d4=5,d5=8,d6=5;break;
        case 2: d1=7,d2=7,d3=3,d4=8,d5=5,d6=5;break;
        case 3: d1=7,d2=7,d3=3,d4=5,d5=5,d6=6;break;
        case 4: d1=4,d2=5,d3=8,d4=32,d5=32,d6=8;break;
        case 5: d1=8,d2=7,d3=7,d4=5,d5=5,d6=6;break;
        case 6: d1=1,d2=7,d3=7,d4=4,d5=5,d6=6;break;
        case 7: d1=2,d2=2,d3=3,d4=32,d5=32,d6=8;break;
        case 8: d1=1,d2=7,d3=3,d4=4,d5=5,d6=6;break;
        case 9: d1=1,d2=7,d3=3,d4=5,d5=5,d6=6;break;*/
        //2 набор, 2,4,5 закругленные// если нравится, оставляем, а верхний комментируем/*   */
        case 0: d1=1,d2=2,d3=3,d4=4,d5=5,d6=6;break;
        case 1: d1=2,d2=3,d3=32,d4=5,d5=8,d6=5;break;
        case 2: d1=7,d2=7,d3=3,d4=4,d5=5,d6=5;break;
        case 3: d1=7,d2=7,d3=3,d4=5,d5=5,d6=6;break;
        case 4: d1=4,d2=5,d3=3,d4=32,d5=32,d6=8;break;
        case 5: d1=1,d2=7,d3=7,d4=5,d5=5,d6=6;break;
        case 6: d1=1,d2=7,d3=7,d4=4,d5=5,d6=6;break;
        case 7: d1=2,d2=2,d3=3,d4=32,d5=32,d6=8;break;
        case 8: d1=1,d2=7,d3=3,d4=4,d5=5,d6=6;break;
        case 9: d1=1,d2=7,d3=3,d4=5,d5=5,d6=6;break;
    }
    ///////////////положение цифр ЧАСОВ на экране///сейчас 2я и 3я строка..........
      lcd.setCursor(e1, 1); lcd.write((uint8_t)d1); lcd.setCursor(e2, 1); lcd.write((uint8_t)d2); lcd.setCursor(e3, 1); lcd.write((uint8_t)d3);
      lcd.setCursor(e1, 2); lcd.write((uint8_t)d4); lcd.setCursor(e2, 2); lcd.write((uint8_t)d5); lcd.setCursor(e3, 2); lcd.write((uint8_t)d6);
    }
   /*//точки между цифр
   if(secon&1)                                           //secon - нечетное
      {lcd.setCursor(9,1) ;lcd.write(2);  lcd.print(" ");
      lcd.setCursor(9,2);lcd.print(" ");lcd.write(5);}
   else                                                 //secon - четное
      {lcd.setCursor(9,1) ;lcd.print(" ");lcd.write(2);
      lcd.setCursor(9,2);lcd.write(5);  lcd.print(" ");}*/

   //снежинки между цифр
   if(secon&1)                                           //secon - нечетное
      {lcd.setCursor(9,1) ;lcd.write(42);  lcd.print(" ");
      lcd.setCursor(9,2);lcd.print(" ");lcd.write(42);}
   else                                                 //secon - четное
      {lcd.setCursor(9,1) ;lcd.print(" ");lcd.write(42);
      lcd.setCursor(9,2);lcd.write(42);  lcd.print(" ");}   
 //-----------------------------------------------------------------------------------------------------------      
   //перемещение снежинок......первая и последняя строчки   
   
     //строчки с  четными секундами
    for(int i=0;i<=9;i++){
    if(secon % 10 == i && secon / 10 == 0 || secon % 10 == i && secon / 10 == 2||secon % 10 == i && secon / 10 == 4)
           {lcd.setCursor(0+i,0);lcd.write(42);/////чет,верхняя строка с 0го до 19го знака, сдвиг вправо, символ "*"
            lcd.setCursor(19-i,3);lcd.write(42);}///чет,нижняя строка  с 19го до 0го знака, сдвиг влево, символ "*"
      else {lcd.setCursor(0+i,0);lcd.print(" ");////чет,верхняя строка с 0го до 19го знака, сдвиг вправо, символ " "
            lcd.setCursor(19-i,3);lcd.print(" ");}//чет,нижняя строка  с 19го до 0го знака, сдвиг влево, символ " "
    }
    
     //строчки с  нечетными секундами
    for(int i=0;i<=9;i++){
    if(secon % 10 == i && secon / 10 == 1||secon % 10 == i && secon / 10 == 3||secon % 10 == i && secon / 10 == 5)
           {lcd.setCursor(10+i,0);lcd.write(42);////нечет,верхняя строка с 0го до 19го знака, сдвиг вправо, символ "*"
            lcd.setCursor(9-i,3);lcd.write(42);}///нечет,нижняя строка  с 19го до 0го знака, сдвиг влево, символ "*"
      else {lcd.setCursor(10+i,0);lcd.print(" ");//нечет,верхняя строка с 0го до 19го знака, сдвиг вправо, символ " "
            lcd.setCursor(9-i,3);lcd.print(" ");}//нечет,нижняя строка  с 19го до 0го знака, сдвиг влево, символ " "
    }
      
     
      //lcd.setCursor(0, 2); lcd.print("--------------------");
      //lcd.setCursor(6, 3); lcd.print("STAND BY");
   }
   }  
   /// END LOOP
//----------------------------------------------------------------------------------------------------------- 

/////
bool _isTimer(unsigned long startTime, unsigned long period )
  {
  unsigned long currentTime;
currentTime = millis();
if (currentTime>= startTime) {return (currentTime>=(startTime + period));} else {return (currentTime >=(4294967295-startTime+period));}
  }

void fillBar0(byte start_pos, byte row, byte bar_length, byte fill_percent) {
  byte infill = round((float)bar_length * fill_percent / 100);
  lcd.setCursor(start_pos, row);
  if (infill == 0) lcd.write(16);
  else lcd.write(5);
  for (int n = 1; n < bar_length - 1; n++) {
    if (n < infill) lcd.write(5);
    if (n >= infill) lcd.write(16);
  }
  if (infill == bar_length) lcd.write(5);
  else lcd.write(16);
}




  
void au() {
  if (www == 1) {
    audio();
    www = 0;
  }
}
void cl() {
  ir.value = 0;
  delay(100);
  lcd.clear();
}
void cl1() {
  ir.value = 0;
  delay(50);
}
void brig1_func() {
  if (brig1 > 10) {
    brig1 = 10;
  } if (brig1 < 0) {
    brig1 = 0;
  }
}
void brig0_func() {
  if (brig0 > 10) {
    brig0 = 10;
  } if (brig0 < 0) {
    brig0 = 0;
  }
}
void audio() {
  pt.clear();
  //  pt.setVolume(75); //  int 0...79
  pt.setVol1(79 - (vol + ch1)); //  int 0...79
  pt.setVol2(79 - (vol + ch2)); //  int 0...79
  pt.setVol3(79 - (vol + ch3)); //  int 0...79
  pt.setVol4(79 - (vol + ch4)); //  int 0...79
  pt.setVol5(79 - (vol + ch5)); //  int 0...79
  pt.setVol6(79 - (vol + ch6)); //  int 0...79
  pt.setMute(mute); // mute 0 - off / 1 - on
}

void to_Timer() {
  newPosition = myEnc.read() / 4;
}
void vol_func() {
  if (0 > vol) {
    vol = 0;
  } if (64 < vol) {
    vol = 64;
  }
}
//----------------------------------------------------------------------------------------------------------- 
       ///////маска цифр,ДЛЯ РЕГУЛЯТОРА ГРОМКОСТИ какая цифра из каких символов состоит....
      ///d1,d2,d3-верхняя часть цифры;d4,d5,d6-нижняя часть цифры;
void digit() {
  switch (a[x]) {
    //1 набор, 2,4,5 прямые// если нравится оставляем, а нижний комментируем/*   */
        /*case 0: d1=1,d2=2,d3=3,d4=4,d5=5,d6=6;break;
        case 1: d1=2,d2=3,d3=32,d4=5,d5=8,d6=5;break;
        case 2: d1=7,d2=7,d3=3,d4=8,d5=5,d6=5;break;
        case 3: d1=7,d2=7,d3=3,d4=5,d5=5,d6=6;break;
        case 4: d1=4,d2=5,d3=8,d4=32,d5=32,d6=8;break;
        case 5: d1=8,d2=7,d3=7,d4=5,d5=5,d6=6;break;
        case 6: d1=1,d2=7,d3=7,d4=4,d5=5,d6=6;break;
        case 7: d1=2,d2=2,d3=3,d4=32,d5=32,d6=8;break;
        case 8: d1=1,d2=7,d3=3,d4=4,d5=5,d6=6;break;
        case 9: d1=1,d2=7,d3=3,d4=5,d5=5,d6=6;break;*/
        //2 набор, 2,4,5 закругленные// елсли нравится оставляем, а верхий коментируем/*   */
        case 0: d1=1,d2=2,d3=3,d4=4,d5=5,d6=6;break;
        case 1: d1=2,d2=3,d3=32,d4=5,d5=8,d6=5;break;
        case 2: d1=7,d2=7,d3=3,d4=4,d5=5,d6=5;break;
        case 3: d1=7,d2=7,d3=3,d4=5,d5=5,d6=6;break;
        case 4: d1=4,d2=5,d3=3,d4=32,d5=32,d6=8;break;
        case 5: d1=1,d2=7,d3=7,d4=5,d5=5,d6=6;break;
        case 6: d1=1,d2=7,d3=7,d4=4,d5=5,d6=6;break;
        case 7: d1=2,d2=2,d3=3,d4=32,d5=32,d6=8;break;
        case 8: d1=1,d2=7,d3=3,d4=4,d5=5,d6=6;break;
        case 9: d1=1,d2=7,d3=3,d4=5,d5=5,d6=6;break;
  }
  ///////////////положение цифр ИНДИКАТОРА ГРОМКОСТИ на экране///сейчас 2я и 3я строка..........
    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);
}
   

Спасибо за направление!!!
Продолжаем)))
Пробуем силы в меню настроек пультиков))))).....

73

Re: PT2258 + LCD2004_I2C + IR + DS3231

доброго времени суток.
Отдали устройство Elenberg CAS-5120, без пульта, динамика и части деталей. Все вроде восстановил, но низы зашкаливают, а настроить можно только с пульта(которого нет). В устройстве первичный выполнен на SJ2258, а управляет BT1610(на него даже даташита нет, но как я понял база Pic16Fххх).
Набрёл на ваш проект, шикарная работа, захотелось повторить в устройстве, но у меня проблема в коде "DS3231 clock;RTCDateTime DateTime;" матерится на эту часть, я так понимаю из-за библиотеки, но подобрать не смог.
Сразу скажу, с навыками программирования я не родился и умею только в качестве "примата".
Если можно, хотелось бы помощи. Спасибо.

74

Re: PT2258 + LCD2004_I2C + IR + DS3231

Используйте библиотеку для часов реального времени указанную в скетче в статье:
http://rcl-radio.ru/?p=128826

75

Re: PT2258 + LCD2004_I2C + IR + DS3231

liman324 пишет:

Используйте библиотеку для часов реального времени указанную в скетче в статье:
http://rcl-radio.ru/?p=128826

Спасибо вам огромное, буду дальше делать