26 (2022-07-03 14:20:21 отредактировано niko00780)

Re: PT2258 + LCD2004_I2C + IR + DS3231

Внес изменения в скейч. Изменены функции пинов( в скейче смотрим).
Пин 12 включение основного питания.
Пин 13 включение софтстарта
Задержка сейчас вроде 2 секунды, но в скейче можно поменять,кому не надо, можете не использовать.
Изменил надпись при загрузке(кому не нравится, меняем) Добавил полоску загрузки.
Громкость регулируется от МИНУС "-64 дБ" МИНИМУМ, к " 0 дБ" МАКСИМУМ.
Минус при"0" исчезает....))))
Как принято во всех усилителях и рессиверах.....
Добавил вывод температуры на главный экран. Датчик 18В20, пин 5.
"Температура радиатора усилителя".
Сделал "термозащиту"----в скече устанавливается  предел температуры,(в комментах подписано в каком месте)

//термозащита //4 строка
  if ((sensor.getTemp())>30)//вот тут меняем уставку защиты.....50...90 градусов....или 100))))
  {mute = 1; audio();
  lcd.setCursor(0, 3);lcd.print("HOT TEMP!");delay(250);lcd.print(" MUTE!");delay(250);
  lcd.setCursor(0, 3);lcd.print("               ");}//вместо часов выводм сообщение....
  else {lcd.setCursor(0, 3);
  mute = 0; audio();//или на это место выводим часы.....
    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("       ");}

Сейчас стоит +30градусов, для настроек так удобнее, потом можно и 60-70-80-90 выставить......
При достижении заданной температуры включается режим MUTE.
На главном экране вместо часов моргает надпись HOT TEMP! MUTE!
На экране  при обрыве датчика вместо температуры моргает "- - E R" ошибка датчика.
Часы на экране standby без секунд. ТОЧКИ(тире,кому как) МОРГАЮТ.
Символы циферок  чуть другие, мне так больше нравится.
В режиме mute изменена надпись(а может старую оставить???)
Подсветка экрана приглушается в режиме mute.


В планах-
----добавить ПЛАВНОЕ снижение яркости подсветки главного экрана, если  никакие кнопки  и пульт не активны.
Допустим через 30 секунд....
Мы же вроде музыку слушаем, а яркость на всю, если нет регулировок, это много)))

--- добавить индикацию срабатывания защиты АС от постоянки......на каждый из 6 каналов.....

-----по ходу может что добавится........

http://forum.rcl-radio.ru/uploads/images/2022/07/ea8499f69ef25a21752bb1abaf84bffa.jpg
http://forum.rcl-radio.ru/uploads/images/2022/07/a750884f0e32a4d7e45090104dc98fbe.jpg
http://forum.rcl-radio.ru/uploads/images/2022/07/98ad143f2b7be09572ecd3d5d432b243.jpg
http://forum.rcl-radio.ru/uploads/images/2022/07/e4bf48d8270354ea687812379a7dbfa4.jpg
http://forum.rcl-radio.ru/uploads/images/2022/07/87432dbd620b3c3f656e645e6f706b9e.jpg
http://forum.rcl-radio.ru/uploads/images/2022/07/006c221b70cde49d0b9cbd6bffddc091.jpg
http://forum.rcl-radio.ru/uploads/images/2022/07/82d7e458646dd2c5528836739551c4bb.jpg
http://forum.rcl-radio.ru/uploads/images/2022/07/7ecf38fc2e6a061426b6ebb6d67ca458.jpg
http://forum.rcl-radio.ru/uploads/images/2022/07/a90a64c22f2837b42afdf0387936a770.jpg

Скейч

//#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;
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;


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

  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 ////////////////////////////////////
  //// МЕНЮ КНОПКА SW энкодера
  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;}
    }
    // МЕНЮ КНОПКА 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" не прет!!!)(и массивы ниасилил йа......)
    lcd.setCursor(0,0);lcd.write(3);lcd.setCursor(4,0);lcd.write(1);lcd.write(3);lcd.setCursor(9,0);lcd.write(1);lcd.write(4);lcd.write(2);lcd.write(7);lcd.write(2);lcd.write(6);lcd.write(1);lcd.write(2);lcd.write(2);lcd.write(2);lcd.write(3);
    lcd.setCursor(0,1);lcd.write(8);lcd.write(3);lcd.setCursor(3,1);lcd.write(1);lcd.write(8);lcd.write(8);lcd.setCursor(9,1);lcd.write(8);lcd.setCursor(12,1);lcd.write(8);lcd.setCursor(15,1);lcd.write(8);lcd.write(5);lcd.write(5);lcd.write(5);
    lcd.setCursor(0,2);lcd.write(8);lcd.setCursor(2,2);lcd.write(7);lcd.setCursor(4,2);lcd.write(8);lcd.write(4);lcd.setCursor(9,2);lcd.write(6);lcd.setCursor(12,2);lcd.write(8);lcd.setCursor(15,2);lcd.write(8);
    lcd.setCursor(0,3);lcd.write(8);lcd.setCursor(4,3);lcd.write(8);lcd.setCursor(6,3);lcd.write(4);lcd.write(7);lcd.write(6);lcd.setCursor(12,3);lcd.write(8);lcd.setCursor(15,3);lcd.write(4);lcd.write(5);lcd.write(5);lcd.write(5);lcd.write(6);

    
    
    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;brig=brig0;analogWrite(6, brig * 25);audio();}
    }
   // МЕНЮ КНОПКА POWER
   if (((digitalRead(4) == LOW || ir.value == POWER) && power == 0) || standby == 1) {
    power = 1; standby = 0; cl();
    times = millis(); w = 1; w1 = 1; menu = 100; menu1 = 0; mute = 1; audio(); brig = brig1; analogWrite(6, brig * 25);
    } 
  // power on- ЭКРАН ПРИ ВКЛЮЧЕНИИ
    if ((digitalRead(4) == LOW || ir.value == POWER) && power == 1) {power = 0; cl();times = millis(); w = 1; w1 = 1; menu = 0; menu1 = 0; brig = brig0; 
    analogWrite(6, brig * 25);
    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 строка
    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 строка    
    delay(1000);mute = 0; audio(); cl();//задержка команды MUTE при включении, если не надо, задержку можно убрать.
    //-----mute = 0; audio(); cl();------это обязательно осавляем, иначе будут глюки....
  } 
  // 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);
    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) {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 tmr;
  if (millis() - tmr >= 800) {
    tmr = 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 строка
  if ((sensor.getTemp())>30)//вот тут меняем уставку защиты.....50...90 градусов....или 100))))
  {mute = 1; audio();
  lcd.setCursor(0, 3);lcd.print("HOT TEMP!");delay(250);lcd.print(" MUTE!");delay(250);
  lcd.setCursor(0, 3);lcd.print("               ");}//вместо часов выводм сообщение....
  else {lcd.setCursor(0, 3);
  mute = 0; audio();//или на это место выводим часы.....
    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.setCursor(0, 0); lcd.print("VOLUME");//1 строка
    lcd.setCursor(0, 1); lcd.print("CONTROL");//2 строка
    lcd.setCursor(18, 1); lcd.print("dB");//2строка после цифр уровня громкости
    lcd.setCursor(0, 2); lcd.print("--------------------");//3 строка
    //lcd.setCursor(0, 3);//4 строка
   
    // потом дата
    //lcd.print(data / 10); lcd.print(data % 10); lcd.print("-");
    //lcd.print(mon / 10); lcd.print(mon % 10); lcd.print("-");
    //lcd.print(year);

    
    //яркость подсветки....
     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);
    menu = 0; cl();
  }

  if (power == 1) {
    digitalWrite(7, LOW);
    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;
      }

      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);
    }
  
//мигание двух точек, которые разделяют час и минуты
//нечётное - точки1
      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);
}

27

Re: PT2258 + LCD2004_I2C + IR + DS3231

""----добавить ПЛАВНОЕ(ну на край, пусть от от уровня ON до уровня OFF) снижение яркости подсветки главного экрана, Если  никакие кнопки  и пульт ---НЕАКТИВНЫ. Кроме POWER.
Допустим через 30 секунд....""
И возврат яркости до прежнего уровня при активации любой кнопки.Кроме POWER.

Подскажите, как это реализовать???????))))

28

Re: PT2258 + LCD2004_I2C + IR + DS3231

Нужно отслеживать нажатие всех кнопок через digitalReag

Использовать millis()

Пример:
if(digitalRead(1)==HIGH && milllis()-times_led>10000){выключаем подсветку}// если не нажата кнопка ждем 10 сек и выключаем подсветку
f(digitalRead(1)==LOW){times_led=millis(); включаем подсветку}// если кнопка нажата, то включаем подсветку и обнуляем переменную times_led

29

Re: PT2258 + LCD2004_I2C + IR + DS3231

Менюшки классно все, но надпись MUTE, не то. На первый взгляд какая-то краказябра, пока не раздуплился, что это
MUTE. Нужно между буквами сделать пробелы (такое мое мнение).

30 (2022-07-03 16:10:04 отредактировано sanj76a)

Re: PT2258 + LCD2004_I2C + IR + DS3231

Все классно! Таки хочется все это, но 4 канала + САБ. (1 канал убрать)

31

Re: PT2258 + LCD2004_I2C + IR + DS3231

Вопрос, а вот здесь использование 7го выхода для чего??? он же вроде больше здесь нигде не используется....
можно его освободить для других целей????

if (power == 1) {
    digitalWrite(7, LOW);
    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;

MUTE поменял, теперь глаз не дергается??? )
http://forum.rcl-radio.ru/uploads/images/2022/07/69aa086505366c6f2828eb0b1998018c.jpg

скейч с новым MUTE.......

//#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;
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;


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

  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 ////////////////////////////////////
  //// МЕНЮ КНОПКА SW энкодера
  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;}
    }
    // МЕНЮ КНОПКА 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;brig=brig0;analogWrite(6, brig * 25);audio();}
    }
   // МЕНЮ КНОПКА POWER
   if (((digitalRead(4) == LOW || ir.value == POWER) && power == 0) || standby == 1) {
    power = 1; standby = 0; cl();
    times = millis(); w = 1; w1 = 1; menu = 100; menu1 = 0; mute = 1; audio(); brig = brig1; analogWrite(6, brig * 25);
    } 
  // power on- ЭКРАН ПРИ ВКЛЮЧЕНИИ
    if ((digitalRead(4) == LOW || ir.value == POWER) && power == 1) {power = 0; cl();times = millis(); w = 1; w1 = 1; menu = 0; menu1 = 0; brig = brig0; 
    analogWrite(6, brig * 25);
    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 строка
    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 строка    
    delay(1000);mute = 0; audio(); cl();//задержка команды MUTE при включении, если не надо, задержку можно убрать.
    //-----mute = 0; audio(); cl();------это обязательно осавляем, иначе будут глюки....
  } 
  // 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);
    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) {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 tmr;
  if (millis() - tmr >= 800) {
    tmr = 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 строка
  if ((sensor.getTemp())>30)//вот тут меняем уставку защиты.....50...90 градусов....или 100))))
  {mute = 1; audio();
  lcd.setCursor(0, 3);lcd.print("HOT TEMP!");delay(250);lcd.print(" MUTE!");delay(250);
  lcd.setCursor(0, 3);lcd.print("               ");}//вместо часов выводм сообщение....
  else {lcd.setCursor(0, 3);
  mute = 0; audio();//или на это место выводим часы.....
    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.setCursor(0, 0); lcd.print("VOLUME");//1 строка
    lcd.setCursor(0, 1); lcd.print("CONTROL");//2 строка
    lcd.setCursor(18, 1); lcd.print("dB");//2строка после цифр уровня громкости
    lcd.setCursor(0, 2); lcd.print("--------------------");//3 строка
    //lcd.setCursor(0, 3);//4 строка
   
    // потом дата
    //lcd.print(data / 10); lcd.print(data % 10); lcd.print("-");
    //lcd.print(mon / 10); lcd.print(mon % 10); lcd.print("-");
    //lcd.print(year);

    
    //яркость подсветки....
     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);
    menu = 0; cl();
  }

  if (power == 1) {
    digitalWrite(7, LOW);
    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;
      }

      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);
    }
  
//мигание двух точек, которые разделяют час и минуты
//нечётное - точки1
      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);
}

32 (2022-07-05 08:45:04 отредактировано sanj76a)

Re: PT2258 + LCD2004_I2C + IR + DS3231

теперь то что надо! Понятно что MUTE!

33

Re: PT2258 + LCD2004_I2C + IR + DS3231

pinMode(12, OUTPUT);        // Выход управления STANDBY - реле включения усилителя
  pinMode(13, OUTPUT);       // Выход управления STANDBY--- c задержкой для реле софтстарта усилителя

зачем это нужно, pinMode(13, OUTPUT ?

34 (2022-07-05 21:38:42 отредактировано niko00780)

Re: PT2258 + LCD2004_I2C + IR + DS3231

sanj76a пишет:

pinMode(12, OUTPUT);        // Выход управления STANDBY - реле включения усилителя
  pinMode(13, OUTPUT);       // Выход управления STANDBY--- c задержкой для реле софтстарта усилителя

зачем это нужно, pinMode(13, OUTPUT ?

Зачем 13 пин??? Если вам это не нужно, можете не использовать.
Для усилителей до 100 ватт не критично.
В моем случае, у меня 6 усилителей по 100 ватт, да, много, но мне так нужно.
Запитываются они от двух трансформаторов, каждый ватт по 300-400.....
На каждом канале усилителя свой двухполярный выпрямитель  с конденсаторами в фильтрах по 10 000 микрофарад, а в канале саба 20 000 микрофарад.
Итого на канал имеем 20 000 микрофарад х 5= 100 000 микрофарад + 40 000 микрофарад саб.
Итого 140 000 микрофарад Конденсаторов.
Вот чтобы ограничить токи зарядки всей этой батареи конденсаторов  в момент включения усилителя применяется СОФТСТАРТ(плавный пуск). Есть куча схем на рассыпухе. там сначала включается основное реле питания,и нагрузка(трансформатор(ы) питания усилителя включаются в сеть через низкоомный резистор(10-20-30 ом, зависит от токов запуска....).
А через некоторое время,1,2,3 секунды этот резистор закорачивается вторым реле и  трансформатор усилителя уже подключается напрямую к сети.
Я же для управления всем этим использую АРДУИНУ,
зачем мне лепить какие то схемы задержки на конденсаторах, и рассыпухе,когда можно сделать все програмно и на 2 реле с парой транзисторов....

ВОТ допустим в этой схеме остаются только реле, мощные резисторы и транзистор управления реле, все что левее не нужно. Работает ардуина..... Ну и чтобы не тянуть провода 220 на переднюю панель под кнопку POWER, используется пин 12 и общее реле...... как то так.....

http://forum.rcl-radio.ru/uploads/images/2022/07/b4f3f3d50a2b5ea726af3886a4c4e6ba.gif


Посмотрите здесь, или подобную тему...https://electroclub.info/articles/stati-punkt-3/softstart/

35

Re: PT2258 + LCD2004_I2C + IR + DS3231

Подскажите, как сделать плавное снижение(увеличение) яркости(громкости) по какому либо событию, допустим снижение громкости с установленного значения, к примеру 45, до допустим значения 8(не до минимума, именно до определённого значения)......(это в скейчн, где громкость от 0 - минимум, до 64- максимум). И с яркостью, допустим от значения 9 к значению 3....по событию опять же.... С авто уменьшением, увеличением, вроде бы разобрался, а вот с ограничением пределов как то не очень.....). Есть ещё мысли как улучшить контроллер...... Но все не получается...... 1. Сделать плавное нарастание уровня подсветки из режима standby, и такое же плавное снижение при выключении. 2.добавить фоторезистор и в автомате регулировать уровень подсветки, в зависимости от внешнего освещения. Допустим свет в комнате выключили и яркость подсветки плавно снизилась(это вместо снижения уровня при неактивных кнопках) 3. Громкость в режиме термозащиты не резко снижать через РЕЖИМ MUTE, а снизить уровень до какого то значения..... Смотрятся, (слушаются) эти функции очень эффектно)))

36

Re: PT2258 + LCD2004_I2C + IR + DS3231

http://forum.rcl-radio.ru/uploads/images/2022/07/1616a930de2ebb570772451e8f4f1cfb.jpg
7 выход для чего все таки?

37

Re: PT2258 + LCD2004_I2C + IR + DS3231

1. Сделать плавное нарастание уровня подсветки из режима standby, и такое же плавное снижение при выключении.

Не думаю что это можно реализовать, у Вас много функций исполняется в момент включения, много delay. Если бы было просто delay(2000) после вывода заставки на экран, то можно было в цикле вместо delay(2000) плавно поднять яркость:

for(int i=0;i<=10;i++){
brig=i;
analogWrite(6, brig * 25);
delay(200);
}

38

Re: PT2258 + LCD2004_I2C + IR + DS3231

7 выход для чего все таки?

Не нужен, как это сюда попало не помню, можно удалить

39

Re: PT2258 + LCD2004_I2C + IR + DS3231

2.добавить фоторезистор и в автомате регулировать уровень подсветки, в зависимости от внешнего освещения.

Это не сложно сделать:

pinMode(А2, INPUT_PULLUP); // подключаем фоторезистор к аналоговому входу с внутренним подтягивающим резистором ( INPUT_PULLUP), второй вывод фоторезистора на GND. В мониторе порта выводим показания аналогового входа, смотрим что выдает. Делим полученное значение чтобы получилась удобная для Вас цифра.

И подставляем эту цифру в analogWrite(6, brig * 25);

40

Re: PT2258 + LCD2004_I2C + IR + DS3231

Громкость в режиме термозащиты не резко снижать через РЕЖИМ MUTE, а снизить уровень до какого то значения....

просто вместо MUTE установите:

vol = нужный уровень громкости
audio();

41

Re: PT2258 + LCD2004_I2C + IR + DS3231

liman324 пишет:

1. Сделать плавное нарастание уровня подсветки из режима standby, и такое же плавное снижение при выключении.

Не думаю что это можно реализовать, у Вас много функций исполняется в момент включения, много delay. Если бы было просто delay(2000) после вывода заставки на экран, то можно было в цикле вместо delay(2000) плавно поднять яркость:

for(int i=0;i<=10;i++){
brig=i;
analogWrite(6, brig * 25);
delay(200);
}

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

Вот тут все влезло)))

 // power on- ЭКРАН ПРИ ВКЛЮЧЕНИИ
    if ((digitalRead(4) == LOW || ir.value == POWER) && power == 1) {for(int i=1;i<=10;i++){
    brig=i;
    analogWrite(6, brig * 25);
    delay(200);}


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

//#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;
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;

static uint32_t timTemp;


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

  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 ////////////////////////////////////
  //// МЕНЮ КНОПКА SW энкодера
  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;}
    }
    // МЕНЮ КНОПКА 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;brig=brig0;analogWrite(6, brig * 25);audio();}
    }
   // МЕНЮ КНОПКА POWER
   if (((digitalRead(4) == LOW || ir.value == POWER) && power == 0) || standby == 1) {
    power = 1; standby = 0; cl();
    times = millis(); w = 1; w1 = 1; menu = 100; menu1 = 0; mute = 1; audio(); brig = brig1; analogWrite(6, brig * 25);
    } 
  // power on- ЭКРАН ПРИ ВКЛЮЧЕНИИ
    if ((digitalRead(4) == LOW || ir.value == POWER) && power == 1) {for(int i=1;i<=10;i++){
    brig=i;
    analogWrite(6, brig * 25);
    delay(200);}
    power = 0; cl();times = millis(); w = 1; w1 = 1; menu = 0; menu1 = 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 строка
    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 при включении, если не надо, задержку можно убрать.
    //-----mute = 0; audio(); cl();------это обязательно оставляем, иначе будут глюки....
  } 
  // 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);
    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) {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 строка
  if ((sensor.getTemp())>30)//вот тут меняем уставку защиты.....50...90 градусов....или 100))))
  {mute = 1; audio();
  lcd.setCursor(0, 3);lcd.print("HOT TEMP!");delay(250);lcd.print(" MUTE!");delay(250);
  lcd.setCursor(0, 3);lcd.print("               ");}//вместо часов выводм сообщение....
  else {lcd.setCursor(0, 3);
  mute = 0; audio();//или на это место выводим часы.....
    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.setCursor(0, 0); lcd.print("VOLUME");//1 строка
    lcd.setCursor(0, 1); lcd.print("CONTROL");//2 строка
    lcd.setCursor(18, 1); lcd.print("dB");//2строка после цифр уровня громкости
    lcd.setCursor(0, 2); lcd.print("--------------------");//3 строка
    //lcd.setCursor(0, 3);//4 строка
   
    // потом дата
    //lcd.print(data / 10); lcd.print(data % 10); lcd.print("-");
    //lcd.print(mon / 10); lcd.print(mon % 10); lcd.print("-");
    //lcd.print(year);

    
    //яркость подсветки....
     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);
    menu = 0; cl();
  }

  if (power == 1) {
    digitalWrite(7, LOW);
    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;
      }

      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);
    }
  
//мигание двух точек, которые разделяют час и минуты
//нечётное - точки1
      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);
}

42 (2022-07-10 22:26:18 отредактировано niko00780)

Re: PT2258 + LCD2004_I2C + IR + DS3231

В скейче обнаружил, что в режиме MUTE и SNANDBY продолжает регулироваться громкость...
пробовал заблокировать энкодер в этих режимах, не получается.....подскажите как исправить.....

Какие переменные отвечают за регулировку громкости энкодером???

Поработал чуть над подсветкой. Как смог. Кто может лучше, пробуйте.

1.При включении яркость подсветки  плавно возрастает (первое включение после подачи питания не считаем,
как победить,пока не знаю, и нужно ли?)

2. При выключении яркость подсветки  плавно снижается, следом включаются часы, режим STANDBY.

3. После включения, если нет регулировки громкости и никакие кнопки не нажимаются, и на пульте тоже,  через 10 секунд подсветка гаснет до минимального режима.

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

4. Хоть и пины с кнопками 2,3,4 и подтянуты к питанию программно, подключил к кнопкам параллельно  по керамическому конденсатору 0,1 мкф, 1 нога - пин, вторая - на землю.
Так у меня стабильнее все нажимается, без них иногда бывают пропуски-срабатывает со 2го раза....
У вас не знаю, может и не надо конденсаторы....

Скейч

//#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;



//понеслось.......
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)                    //свободен
//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 задержкой для реле софтстарта усилителя

  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 ////////////////////////////////////
  //// МЕНЮ КНОПКА SW энкодера
  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;}
    }
    // МЕНЮ КНОПКА 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;brig=brig0;analogWrite(6, brig * 25);audio();}
    }
   // МЕНЮ КНОПКА POWER
   //сначала ВЫКЛЮЧЕНИЕ
    if (((digitalRead(4) == LOW || ir.value == POWER) && power == 0) || standby == 1)  { menu1 = 0; mute = 1; audio();//снача вырубаем звук....
    //в цикле плавное снижение уровня подсветки.....
       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;
        }
        power = 1; standby = 0; cl();times = millis(); w = 1; w1 = 1; menu = 100; //выключам все и врубаем меню STANDBY.....
   
    }
    }
  // power on- ЭКРАН ПРИ ВКЛЮЧЕНИИ
  //потом ВКЛЮЧЕНИЕ
    if ((digitalRead(4) == LOW || ir.value == POWER) && power == 1) {for(int i=1;i<=10;i++){ brig=i; analogWrite(6, brig * 25);delay(200);//плавное включение подсветки при ВКЛЮЧЕНИИ
    //дальше загрузочный экран
    }
    power = 0; cl();times = millis(); w = 1; w1 = 1; menu = 0; menu1 = 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 строка
    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 при включении, если не надо, задержку можно убрать.
    //-----mute = 0; audio(); cl();------это обязательно оставляем, иначе будут глюки....
  } 
  // 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);
    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("       ");}
    }
   
    //надписи основного экрана    
    lcd.setCursor(0, 0); lcd.print("VOLUME");//1 строка
    lcd.setCursor(0, 1); lcd.print("CONTROL");//2 строка
    lcd.setCursor(18, 1); lcd.print("dB");//2строка после цифр уровня громкости
    lcd.setCursor(0, 2); lcd.print("--------------------");//3 строка
    //lcd.setCursor(0, 3);//4 строка
   
    // потом дата
    //lcd.print(data / 10); lcd.print(data % 10); lcd.print("-");
    //lcd.print(mon / 10); lcd.print(mon % 10); lcd.print("-");
    //lcd.print(year);

    
    //яркость подсветки.... автоматическое снижение при неактивных кнопках.....
    //  ждем 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 || 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); }
   
    
    // 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);
    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;
      }

      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);
    }
  
//мигание двух точек, которые разделяют час и минуты
//нечётное - точки1
      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);
}

43

Re: PT2258 + LCD2004_I2C + IR + DS3231

В скейче обнаружил, что в режиме MUTE и SNANDBY продолжает регулироваться громкость...

После перехода в режимы MUTE или STANDBY у Вас в коде:
menu = 100;
Это должно блокировать меню 0 (громкость)

Выведите в монитор порта переменную menu, посмотрите состояние переменной в режимах MUTE или STANDBY

Добавьте в код выхода из режимов MUTE или STANDBY :

newPosition = 0;

Это обнулит состояние энкодера

44

Re: PT2258 + LCD2004_I2C + IR + DS3231

И можно как то по другому организовать сохранение настроек в память???
А то при каждом изменении громкости через 10 секунд"if (millis() - times > 10000" происходит перезагрузка
основного экрана "menu = 0; cl();" и картинка на экране моргает.
Можно как то обойтись без перезагрузки экрана???

/////// 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);
    menu = 0; cl();
  }

45

Re: PT2258 + LCD2004_I2C + IR + DS3231

cl();
заменить на:
if(menu!=0){cl();}

46

Re: PT2258 + LCD2004_I2C + IR + DS3231

liman324 пишет:

В скейче обнаружил, что в режиме MUTE и SNANDBY продолжает регулироваться громкость...

После перехода в режимы MUTE или STANDBY у Вас в коде:
menu = 100;
Это должно блокировать меню 0 (громкость)

Выведите в монитор порта переменную menu, посмотрите состояние переменной в режимах MUTE или STANDBY

Добавьте в код выхода из режимов MUTE или STANDBY :

newPosition = 0;

Это обнулит состояние энкодера


В мониторе порта вот----http://forum.rcl-radio.ru/uploads/images/2022/07/76e2e24e48bf56b151b4c0c158922bb0.jpg

Пробовал вставить newPosition = 0;

сюда

 // МЕНЮ КНОПКА MUTE - mute off
    if ((digitalRead(3) == LOW || ir.value == MUT) && mute == 1) {mute = 0;cl();newPosition = 0;times = millis();w = 1;w1 = 1;menu = 0;menu1 = 0;brig=brig0;analogWrite(6, brig * 25);audio();}

и сюда

//потом ВКЛЮЧЕНИЕ
    if ((digitalRead(4) == LOW || ir.value == POWER) && power == 1) {for(int i=1;i<=10;i++){ brig=i; analogWrite(6, brig * 25);delay(200);//плавное включение подсветки при ВКЛЮЧЕНИИ
    //дальше загрузочный экран
    }
    power = 0; cl(); newPosition = 0;times = millis(); w = 1; w1 = 1; menu = 0; menu1 = 0; brig = brig

не получается....энкодер продолжает работать в этих режимах.... может не туда вставляю???.......

47

Re: PT2258 + LCD2004_I2C + IR + DS3231

Замените
newPosition = 0;
на
myEnc.write(0);newPosition = 0;

48

Re: PT2258 + LCD2004_I2C + IR + DS3231

liman324 пишет:

cl();
заменить на:
if(menu!=0){cl();}

заменил. основной экран не моргает.Настройки запоминает.....

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

автоматический выхода из меню настроек атенюаторов пропал, ну как бы и не недо, можно кнопочку нажать.....

если менять только cl(); вот так

 /////// 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);
    menu = 0; if(menu!=0){cl();}
  }

автовыход из меню атенюаторов остается, основной экран не моргает, но при автоматическом выходе в основное меню происходит наложение двух меню друг на друга.......

49 (2022-07-11 01:06:34 отредактировано niko00780)

Re: PT2258 + LCD2004_I2C + IR + DS3231

liman324 пишет:

Замените
newPosition = 0;
на
myEnc.write(0);newPosition = 0;


Заменил.ОГОНЬ!!!! ВСЕ РАБОТАЕТ КАК НАДО!!!
тут

 power on- ЭКРАН ПРИ ВКЛЮЧЕНИИ
  //потом ВКЛЮЧЕНИЕ
    if ((digitalRead(4) == LOW || ir.value == POWER) && power == 1) {for(int i=1;i<=10;i++){ brig=i; analogWrite(6, brig * 25);delay(200);//плавное включение подсветки при ВКЛЮЧЕНИИ
    //дальше загрузочный экран
    }
    power = 0; cl();times = millis(); w = 1; w1 = 1; menu = 0; menu1 = 0;myEnc.write(0);newPosition = 0; brig = brig0;

и тут

 // МЕНЮ КНОПКА 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();}
    }

Скейч целиком.
Без моргающего экрана и  с  правильно работающим энкодером.

И уменьшил интервал записи в память до 5 секунд......
Хотя ... а как сделать чтобы запись значений в память была не по таймеру, а по нажатию энкодера в меню атенюаторов, а в основном экране при изменении громкости, допустим, как было через 5 секунд....??? так разве не правильнее????
Ладно.... пока что есть.....

//#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;



//понеслось.......
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)                    //свободен
//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 задержкой для реле софтстарта усилителя

  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 ////////////////////////////////////
  //// МЕНЮ КНОПКА SW энкодера
  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;}
    }
    // МЕНЮ КНОПКА 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();//сначала вырубаем звук....
    //в цикле плавное снижение уровня подсветки.....
       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;
        }
        power = 1; standby = 0; cl();times = millis(); w = 1; w1 = 1; menu = 100; //выключам все и врубаем меню STANDBY.....
   
    }
    }
  // power on- ЭКРАН ПРИ ВКЛЮЧЕНИИ
  //потом ВКЛЮЧЕНИЕ
    if ((digitalRead(4) == LOW || ir.value == POWER) && power == 1) {for(int i=1;i<=10;i++){ brig=i; analogWrite(6, brig * 25);delay(200);//плавное включение подсветки при ВКЛЮЧЕНИИ
    //дальше загрузочный экран
    }
    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 строка
    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 при включении, если не надо, задержку можно убрать.
    //-----mute = 0; audio(); cl();------это обязательно оставляем, иначе будут глюки....
  } 
  // 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);
    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("       ");}
    }
   
    //надписи основного экрана    
    lcd.setCursor(0, 0); lcd.print("VOLUME");//1 строка
    lcd.setCursor(0, 1); lcd.print("CONTROL");//2 строка
    lcd.setCursor(18, 1); lcd.print("dB");//2строка после цифр уровня громкости
    lcd.setCursor(0, 2); lcd.print("--------------------");//3 строка
    //lcd.setCursor(0, 3);//4 строка
   
    // потом дата
    //lcd.print(data / 10); lcd.print(data % 10); lcd.print("-");
    //lcd.print(mon / 10); lcd.print(mon % 10); lcd.print("-");
    //lcd.print(year);

    
    //яркость подсветки.... автоматическое снижение при неактивных кнопках.....
    //  ждем 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 || 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); }
   
    
    // 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;
      }

      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);
    }
  
//мигание двух точек, которые разделяют час и минуты
//нечётное - точки1
      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);
}

Продолжим.....Осталось прилепить индикацию аварии по  всем шести выходам......

P.S. За орфографию, именно за нее, здесь и в скейче не пинать. Делается все для себя и на "коленке". И чтобы работало как надо, а комментарии(в скейче).... это коментарии и пофиг. Кому не нравится, исправляем под себя, выкладываем здесь и радуемся, что все работает!

50 (2022-07-11 22:37:48 отредактировано niko00780)

Re: PT2258 + LCD2004_I2C + IR + DS3231

Подскажите, как сделать задержку включения и выключения 7 пина???

Держим нажатой  кнопку энкодера (10 пин) больше 5 секунд, ВКЛючается 7й пин....

отпускаем ....

Еще раз нажимаем и держим  нажатой  кнопку энкодера(10 пин) больше 5 секунд, ВЫКлючается 7й пин....

Вкл/выкл, просто вот....

 if (digitalRead(10) == LOW &&  menu == 0 && digitalRead(7) ==  LOW){ digitalWrite(7, HIGH);delay(200);times = millis();}
 if (digitalRead(10) == LOW &&  menu == 0 && digitalRead(7) == HIGH){ digitalWrite(7,  LOW);delay(200);times = millis();}

а с задержкой никак не пойму....