1

Тема: PT2258 + LCD2004_I2C + IR + DS3231

Основная статья - http://rcl-radio.ru/?p=128120

Тестовый скетч
http://forum.rcl-radio.ru/uploads/images/2022/06/34e18e17cda5a03b0ac2ba1b8ddeb4f7.png


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

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

 
byte v1[8] = {0b00111,0b00111,0b00111,0b00111,0b00111,0b00111,0b00111,0b00111};
byte v2[8] = {0b00111,0b00111,0b00000,0b00000,0b00000,0b00000,0b00000,0b00000};      
byte v3[8] = {0b00000,0b00000,0b00000,0b00000,0b00000,0b00000,0b11111,0b11111};
byte v4[8] = {0b11111,0b11111,0b00000,0b00000,0b00000,0b00000,0b11111,0b11111};
byte v5[8] = {0b11100,0b11100,0b00000,0b00000,0b00000,0b00000,0b11100,0b11100};
byte v6[8] = {0b11100,0b11100,0b11100,0b11100,0b11100,0b11100,0b11100,0b11100};
byte v7[8] = {0b00000,0b00000,0b00000,0b00000,0b00000,0b00000,0b00111,0b00111};
byte v8[8] = {0b11111,0b11111,0b00000,0b00000,0b00000,0b00000,0b00000,0b00000}; 
unsigned long times,oldPosition  = -999,newPosition; 
int vol,ch1,ch2,ch3,ch4,ch5,ch6,menu,brig=250;
bool mute,power,w,w1,gr1,gr2;
byte a[6],d1,d2,d3,d4,d5,d6,e1,e2,e3,x;
int hour,minut,secon,data,mon,year;


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(10,INPUT);        // encoder SW
  pinMode(6,OUTPUT);  // ВЫХОД УПРАВЛЕНИЯ ПОДСВЕТКОЙ
  analogWrite(6, brig);
   //  clock.setDateTime(__DATE__, __TIME__); // Устанавливаем время на часах, основываясь на времени компиляции скетча

  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;
/// IR ////////////////////////////////////////
  if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);irrecv.resume();times=millis();w=1;w1=1;}// IR приемник - чтение, в мониторе порта отображаются коды кнопок
  if(ir.value==0){gr1=0;gr2=0;}// запрет нажатий не активных кнопок пульта  

////////////// VOLUME ///////////////////////////////////////////////////////////////////
 if(menu==0){
 
   if (newPosition != oldPosition){oldPosition = newPosition;vol=vol+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w1=1;vol_func();audio();}
   a[0]= (64-vol)/10;a[1]=(64-vol)%10;
   for(x=0;x<2;x++){switch(x){case 0: e1=11,e2=12,e3=13;break;case 1: e1=14,e2=15,e3=16;break;}digit();}
   lcd.setCursor(0,0);lcd.print("VOLUME");
   lcd.setCursor(0,1);lcd.print("CONTROL");
   lcd.setCursor(0,2);lcd.print("--------------------");
   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);
     
  }  
  
  }  

void audio(){
        pt.clear(); 
      //  pt.setVolume(75); //  int 0...79     
        pt.setVol1(vol+ch1); //  int 0...79       
        pt.setVol2(vol+ch2); //  int 0...79 
        pt.setVol3(vol+ch3); //  int 0...79 
        pt.setVol4(vol+ch4); //  int 0...79 
        pt.setVol5(vol+ch5); //  int 0...79 
        pt.setVol6(vol+ch6); //  int 0...79 
        pt.setMute(mute); // mute 0 - off / 1 - on
  }

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

void digit(){switch(a[x]){
case 0: d1=1,d2=8,d3=6,d4=1,d5=3,d6=6;break;case 1: d1=32,d2=2,d3=6,d4=32,d5=32,d6=6;break;
case 2: d1=2,d2=8,d3=6,d4=1,d5=4,d6=5;break;case 3: d1=2,d2=4,d3=6,d4=7,d5=3,d6=6;break;
case 4: d1=1,d2=3,d3=6,d4=32,d5=32,d6=6;break;case 5: d1=1,d2=4,d3=5,d4=7,d5=3,d6=6;break;
case 6: d1=1,d2=4,d3=5,d4=1,d5=3,d6=6;break;case 7: d1=1,d2=8,d3=6,d4=32,d5=32,d6=6;break;
case 8: d1=1,d2=4,d3=6,d4=1,d5=3,d6=6;break;case 9: d1=1,d2=4,d3=6,d4=7,d5=3,d6=6;break;}
lcd.setCursor(e1,0);lcd.write((uint8_t)d1);lcd.setCursor(e2,0);lcd.write((uint8_t)d2);lcd.setCursor(e3,0);lcd.write((uint8_t)d3);
lcd.setCursor(e1,1);lcd.write((uint8_t)d4);lcd.setCursor(e2,1);lcd.write((uint8_t)d5);lcd.setCursor(e3,1);lcd.write((uint8_t)d6);}
 

2

Re: PT2258 + LCD2004_I2C + IR + DS3231

Добавлено меню регулировки уровня выходов, яркость подсветки

http://forum.rcl-radio.ru/uploads/images/2022/06/0a3c320a2db91fffe8858d4b65802a88.png

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

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

 
byte v1[8] = {0b00111,0b00111,0b00111,0b00111,0b00111,0b00111,0b00111,0b00111};
byte v2[8] = {0b00111,0b00111,0b00000,0b00000,0b00000,0b00000,0b00000,0b00000};      
byte v3[8] = {0b00000,0b00000,0b00000,0b00000,0b00000,0b00000,0b11111,0b11111};
byte v4[8] = {0b11111,0b11111,0b00000,0b00000,0b00000,0b00000,0b11111,0b11111};
byte v5[8] = {0b11100,0b11100,0b00000,0b00000,0b00000,0b00000,0b11100,0b11100};
byte v6[8] = {0b11100,0b11100,0b11100,0b11100,0b11100,0b11100,0b11100,0b11100};
byte v7[8] = {0b00000,0b00000,0b00000,0b00000,0b00000,0b00000,0b00111,0b00111};
byte v8[8] = {0b11111,0b11111,0b00000,0b00000,0b00000,0b00000,0b00000,0b00000}; 
unsigned long times,oldPosition  = -999,newPosition; 
int vol,ch1,ch2,ch3,ch4,ch5,ch6,menu,menu1,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;
int hour,minut,secon,data,mon,year;
byte mesto2[8]={0,10,0,10,0,10,0,10};
byte mesto3[8]={0,0,1,1,2,2,3,3};


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(10,INPUT);  // МЕНЮ КНОПКА SW энкодера
  pinMode(6,OUTPUT);  // ВЫХОД УПРАВЛЕНИЯ ПОДСВЕТКОЙ
  pinMode(2,INPUT_PULLUP);   // КНОПКА SET
  // 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);
  delay(500);
  audio();
  
  }

void loop(){
/// READ TIME /////////////////////////////////
DateTime = clock.getDateTime();hour = DateTime.hour;minut = DateTime.minute;secon = DateTime.second;
  data = DateTime.day;mon = DateTime.month;year = DateTime.year;

/// BUTTON ////////////////////////////////////
  if(digitalRead(10)==LOW&&menu==1){menu1++;delay(200);times=millis();w=1;w1=1;if(menu1>7){menu1=0;}}// меню 0
  
  if(digitalRead(2)==LOW){menu++;delay(200);times=millis();cl();w=1;w1=1;if(menu>1){menu=0;}}// меню 0
  
  
/// IR ////////////////////////////////////////
  if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);irrecv.resume();times=millis();w=1;w1=1;}// IR приемник - чтение, в мониторе порта отображаются коды кнопок
  if(ir.value==0){gr1=0;gr2=0;}// запрет нажатий не активных кнопок пульта  

////////////// VOLUME ///////////////////////////////////////////////////////////////////
 if(menu==0){
 
   if (newPosition != oldPosition){oldPosition = newPosition;vol=vol+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w1=1;vol_func();audio();}
   a[0]= (64-vol)/10;a[1]=(64-vol)%10;
   for(x=0;x<2;x++){switch(x){case 0: e1=11,e2=12,e3=13;break;case 1: e1=14,e2=15,e3=16;break;}digit();}
   lcd.setCursor(0,0);lcd.print("VOLUME");
   lcd.setCursor(0,1);lcd.print("CONTROL");
   lcd.setCursor(0,2);lcd.print("--------------------");
   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);
     
  }  

///////// 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 (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(ch1<0){ch1=0;}if(ch1>15){ch1=15;}break;
      case 2: ch3 = temp0;if(ch1<0){ch1=0;}if(ch1>15){ch1=15;}break;
      case 3: ch4 = temp0;if(ch1<0){ch1=0;}if(ch1>15){ch1=15;}break;      
      case 4: ch5 = temp0;if(ch1<0){ch1=0;}if(ch1>15){ch1=15;}break;
      case 5: ch6 = temp0;if(ch1<0){ch1=0;}if(ch1>15){ch1=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(">");}else{lcd.setCursor(mesto2[i],mesto3[i]);lcd.print(" ");}}
  
  lcd.setCursor(1,0);lcd.print("CH1 ");lcd.print(ch1);lcd.print(" ");lcd.setCursor(11,0);lcd.print("CH2 ");lcd.print(ch2);lcd.print(" ");
  lcd.setCursor(1,1);lcd.print("CH3 ");lcd.print(ch3);lcd.print(" ");lcd.setCursor(11,1);lcd.print("CH4 ");lcd.print(ch4);lcd.print(" ");
  lcd.setCursor(1,2);lcd.print("CH5 ");lcd.print(ch5);lcd.print(" ");lcd.setCursor(11,2);lcd.print("CH6 ");lcd.print(ch6);lcd.print(" ");
  lcd.setCursor(1,3);lcd.print("BR_1 ");lcd.print(brig0);lcd.print(" ");lcd.setCursor(11,3);lcd.print("BR_2 ");lcd.print(brig1);lcd.print(" ");
  
 } 
/////// EEPROM //////////////////////////////////////
if(millis()-times>10000 && w1==1){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();
     }
            
  
  }  /// 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(vol+ch1); //  int 0...79       
        pt.setVol2(vol+ch2); //  int 0...79 
        pt.setVol3(vol+ch3); //  int 0...79 
        pt.setVol4(vol+ch4); //  int 0...79 
        pt.setVol5(vol+ch5); //  int 0...79 
        pt.setVol6(vol+ch6); //  int 0...79 
        pt.setMute(mute); // mute 0 - off / 1 - on
  }

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

void digit(){switch(a[x]){
case 0: d1=1,d2=8,d3=6,d4=1,d5=3,d6=6;break;case 1: d1=32,d2=2,d3=6,d4=32,d5=32,d6=6;break;
case 2: d1=2,d2=8,d3=6,d4=1,d5=4,d6=5;break;case 3: d1=2,d2=4,d3=6,d4=7,d5=3,d6=6;break;
case 4: d1=1,d2=3,d3=6,d4=32,d5=32,d6=6;break;case 5: d1=1,d2=4,d3=5,d4=7,d5=3,d6=6;break;
case 6: d1=1,d2=4,d3=5,d4=1,d5=3,d6=6;break;case 7: d1=1,d2=8,d3=6,d4=32,d5=32,d6=6;break;
case 8: d1=1,d2=4,d3=6,d4=1,d5=3,d6=6;break;case 9: d1=1,d2=4,d3=6,d4=7,d5=3,d6=6;break;}
lcd.setCursor(e1,0);lcd.write((uint8_t)d1);lcd.setCursor(e2,0);lcd.write((uint8_t)d2);lcd.setCursor(e3,0);lcd.write((uint8_t)d3);
lcd.setCursor(e1,1);lcd.write((uint8_t)d4);lcd.setCursor(e2,1);lcd.write((uint8_t)d5);lcd.setCursor(e3,1);lcd.write((uint8_t)d6);}
 

3

Re: PT2258 + LCD2004_I2C + IR + DS3231

Протестировано!!!

Основное меню
Регулировка громкости энкодером и ИК пультом

http://forum.rcl-radio.ru/uploads/images/2022/06/08f67738656f2dcb3a191e2517ac6893.png


Меню настройки аттенюаторов выходов и яркости подсветки в обычном режиме  и в режиме STANDBY
Для перехода в меню нажать кнопку SET, нажимая на кнопку энкодера можно перебирать пункты меню

http://forum.rcl-radio.ru/uploads/images/2022/06/449396a05b573ad38e29c8d8019bcf9d.png


Режим установки-корректировки времени
Нажать и удерживать кнопку энкодера, далее нажать кнопку SET, после появится меню корректировки времени, параметры перебираются кнопкой энкодера, ручка энкодера меняет выбранный параметр.

http://forum.rcl-radio.ru/uploads/images/2022/06/e2531f71ba8b4796d8a96068c5a0a3d1.png

Режим STANDBY

http://forum.rcl-radio.ru/uploads/images/2022/06/05a34bea7b04d98a1e7a6c5e6d025406.png



#define POWER     0x33B800FF
#define VOLUME_UP 0x33B8E01F
#define VOLUME_DW 0x33B810EF
#define MUT       0x33B8946B


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

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

 
byte v1[8] = {0b00111,0b00111,0b00111,0b00111,0b00111,0b00111,0b00111,0b00111};
byte v2[8] = {0b00111,0b00111,0b00000,0b00000,0b00000,0b00000,0b00000,0b00000};      
byte v3[8] = {0b00000,0b00000,0b00000,0b00000,0b00000,0b00000,0b11111,0b11111};
byte v4[8] = {0b11111,0b11111,0b00000,0b00000,0b00000,0b00000,0b11111,0b11111};
byte v5[8] = {0b11100,0b11100,0b00000,0b00000,0b00000,0b00000,0b11100,0b11100};
byte v6[8] = {0b11100,0b11100,0b11100,0b11100,0b11100,0b11100,0b11100,0b11100};
byte v7[8] = {0b00000,0b00000,0b00000,0b00000,0b00000,0b00000,0b00111,0b00111};
byte v8[8] = {0b11111,0b11111,0b00000,0b00000,0b00000,0b00000,0b00000,0b00000}; 
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;


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(10,INPUT);         // МЕНЮ КНОПКА SW энкодера
  pinMode(6,OUTPUT);         // ВЫХОД УПРАВЛЕНИЯ ПОДСВЕТКОЙ
  pinMode(2,INPUT_PULLUP);   // КНОПКА SET
  pinMode(3,INPUT_PULLUP);   // КНОПКА MUTE
  pinMode(4,INPUT_PULLUP);   // КНОПКА POWER
  pinMode(5,OUTPUT);         // Выход управления STANDBY усилителя
  // 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);
  delay(500);
  audio();
  
  }

void loop(){
/// READ TIME /////////////////////////////////
DateTime = clock.getDateTime();hour = DateTime.hour;minut = DateTime.minute;secon = DateTime.second;
  data = DateTime.day;mon = DateTime.month;year = DateTime.year;

/// BUTTON ////////////////////////////////////
if(power==0){
  if(digitalRead(10)==LOW&&menu==1){menu1++;delay(200);times=millis();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;}}
  
  if(digitalRead(2)==LOW&&digitalRead(10)==HIGH){menu++;delay(200);times=millis();cl();w=1;w1=1;menu1=0;if(menu>1){menu=0;}} // 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);} // SET time

  if((digitalRead(3)==LOW||ir.value==MUT)&&mute==0){mute=1;cl();audio();menu=100;lcd.setCursor(8,1);lcd.print("MUTE");delay(500);}// mute on
  if((digitalRead(3)==LOW||ir.value==MUT)&&mute==1){mute=0;cl();times=millis();w=1;w1=1;menu=0;menu1=0;audio();} // mute off
}
  if((digitalRead(4)==LOW||ir.value==POWER)&&power==0){power=1;cl();times=millis();w=1;w1=1;menu=100;menu1=0;mute=1;audio();brig = brig1;analogWrite(6, brig*25);} // power off
  if((digitalRead(4)==LOW||ir.value==POWER)&&power==1){power=0;cl();times=millis();w=1;w1=1;menu=0;menu1=0;mute=0;audio();brig = brig0;analogWrite(6, brig*25);} // power on
  
  if(power==1){digitalWrite(5,LOW);}else{digitalWrite(5,HIGH);} // output standby
  
/// IR ////////////////////////////////////////
  if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);irrecv.resume();times=millis();w=1;w1=1;}// IR приемник - чтение, в мониторе порта отображаются коды кнопок
  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]= (64-vol)/10;a[1]=(64-vol)%10;
   for(x=0;x<2;x++){switch(x){case 0: e1=11,e2=12,e3=13;break;case 1: e1=14,e2=15,e3=16;break;}digit();}
   lcd.setCursor(0,0);lcd.print("VOLUME");
   lcd.setCursor(0,1);lcd.print("CONTROL");
   lcd.setCursor(0,2);lcd.print("--------------------");
   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);
     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 (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(">");}else{lcd.setCursor(mesto2[i],mesto3[i]);lcd.print(" ");}}
  
  lcd.setCursor(1,0);lcd.print("CH1 ");lcd.print(ch1);lcd.print(" ");lcd.setCursor(11,0);lcd.print("CH2 ");lcd.print(ch2);lcd.print(" ");
  lcd.setCursor(1,1);lcd.print("CH3 ");lcd.print(ch3);lcd.print(" ");lcd.setCursor(11,1);lcd.print("CH4 ");lcd.print(ch4);lcd.print(" ");
  lcd.setCursor(1,2);lcd.print("CH5 ");lcd.print(ch5);lcd.print(" ");lcd.setCursor(11,2);lcd.print("CH6 ");lcd.print(ch6);lcd.print(" ");
  lcd.setCursor(1,3);lcd.print("BR_1 ");lcd.print(brig0);lcd.print(" ");lcd.setCursor(11,3);lcd.print("BR_2 ");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++){
      switch(i){
        case 0: e1=0,e2=1,e3=2;break;
        case 1: e1=3,e2=4,e3=5;break;
        case 2: e1=7,e2=8,e3=9;break;
        case 3: e1=10,e2=11,e3=12;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=8,d3=6,d4=1,d5=3,d6=6;break;
        case 1: d1=32,d2=2,d3=6,d4=32,d5=32,d6=6;break;
        case 2: d1=2,d2=8,d3=6,d4=1,d5=4,d6=5;break;
        case 3: d1=2,d2=4,d3=6,d4=7,d5=3,d6=6;break;
        case 4: d1=1,d2=3,d3=6,d4=32,d5=32,d6=6;break;
        case 5: d1=1,d2=4,d3=5,d4=7,d5=3,d6=6;break;
        case 6: d1=1,d2=4,d3=5,d4=1,d5=3,d6=6;break;
        case 7: d1=1,d2=8,d3=6,d4=32,d5=32,d6=6;break;
        case 8: d1=1,d2=4,d3=6,d4=1,d5=3,d6=6;break;
        case 9: d1=1,d2=4,d3=6,d4=7,d5=3,d6=6;break;
    }
     
      lcd.setCursor(e1,0);lcd.write((uint8_t)d1);lcd.setCursor(e2,0);lcd.write((uint8_t)d2);lcd.setCursor(e3,0);lcd.write((uint8_t)d3);
      lcd.setCursor(e1,1);lcd.write((uint8_t)d4);lcd.setCursor(e2,1);lcd.write((uint8_t)d5);lcd.setCursor(e3,1);lcd.write((uint8_t)d6);
  }
  lcd.setCursor(6,0);lcd.print(".");lcd.setCursor(13,0);lcd.print(".");lcd.setCursor(6,1);lcd.print(".");lcd.setCursor(13,1);lcd.print(".");
  lcd.setCursor(0,2);lcd.print("--------------------");
  lcd.setCursor(5,3);lcd.print("POWER  OFF");
  }      
            
  
  }  /// 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(vol<0){vol=0;}if(vol>64){vol=64;}}

void digit(){switch(a[x]){
case 0: d1=1,d2=8,d3=6,d4=1,d5=3,d6=6;break;case 1: d1=32,d2=2,d3=6,d4=32,d5=32,d6=6;break;
case 2: d1=2,d2=8,d3=6,d4=1,d5=4,d6=5;break;case 3: d1=2,d2=4,d3=6,d4=7,d5=3,d6=6;break;
case 4: d1=1,d2=3,d3=6,d4=32,d5=32,d6=6;break;case 5: d1=1,d2=4,d3=5,d4=7,d5=3,d6=6;break;
case 6: d1=1,d2=4,d3=5,d4=1,d5=3,d6=6;break;case 7: d1=1,d2=8,d3=6,d4=32,d5=32,d6=6;break;
case 8: d1=1,d2=4,d3=6,d4=1,d5=3,d6=6;break;case 9: d1=1,d2=4,d3=6,d4=7,d5=3,d6=6;break;}
lcd.setCursor(e1,0);lcd.write((uint8_t)d1);lcd.setCursor(e2,0);lcd.write((uint8_t)d2);lcd.setCursor(e3,0);lcd.write((uint8_t)d3);
lcd.setCursor(e1,1);lcd.write((uint8_t)d4);lcd.setCursor(e2,1);lcd.write((uint8_t)d5);lcd.setCursor(e3,1);lcd.write((uint8_t)d6);}
 
 

4

Re: PT2258 + LCD2004_I2C + IR + DS3231

Схема

http://forum.rcl-radio.ru/uploads/images/2022/06/de00105b5420bac95fc2832750ee2d94.png

http://rcl-radio.ru/wp-content/uploads/2020/07/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA-%D1%8D%D0%BA%D1%80%D0%B0%D0%BD%D0%B0-%D0%BE%D1%82-2020-07-06-203508.png

5

Re: PT2258 + LCD2004_I2C + IR + DS3231

Здравствуйте, вижу скейч. Завтра протестирую в железе.......

6

Re: PT2258 + LCD2004_I2C + IR + DS3231

Другой набор цифр

http://forum.rcl-radio.ru/uploads/images/2022/06/25ec1512af9f394efdd3d07b705218f8.png

#define POWER     0x33B800FF
#define VOLUME_UP 0x33B8E01F
#define VOLUME_DW 0x33B810EF
#define MUT       0x33B8946B


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

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

 
      byte v1[8] = {7,15,15,15,15,15,15,7};
      byte v2[8] = {7,15,15, 0, 0, 0, 0, 0};      
      byte v3[8] = { 0, 0, 0, 0, 0,0,31,31};
      byte v4[8] = {31,31, 0, 0, 0, 0,31,31};
      byte v5[8] = { 30, 30, 14, 0, 0, 0, 0, 0};
      byte v6[8] = {28,30,30,30,30,30,30,28};
      byte v7[8] = { 0, 0, 0, 0, 0, 15,15,7};
      byte v8[8] = { 31, 31,0,0,0,0,0, 0};
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;


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(10,INPUT);         // МЕНЮ КНОПКА SW энкодера
  pinMode(6,OUTPUT);         // ВЫХОД УПРАВЛЕНИЯ ПОДСВЕТКОЙ
  pinMode(2,INPUT_PULLUP);   // КНОПКА SET
  pinMode(3,INPUT_PULLUP);   // КНОПКА MUTE
  pinMode(4,INPUT_PULLUP);   // КНОПКА POWER
  pinMode(5,OUTPUT);         // Выход управления STANDBY усилителя
  // 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);
  delay(500);
  audio();
  
  }

void loop(){
/// READ TIME /////////////////////////////////
DateTime = clock.getDateTime();hour = DateTime.hour;minut = DateTime.minute;secon = DateTime.second;
  data = DateTime.day;mon = DateTime.month;year = DateTime.year;

/// BUTTON ////////////////////////////////////
if(power==0){
  if(digitalRead(10)==LOW&&menu==1){menu1++;delay(200);times=millis();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;}}
  
  if(digitalRead(2)==LOW&&digitalRead(10)==HIGH){menu++;delay(200);times=millis();cl();w=1;w1=1;menu1=0;if(menu>1){menu=0;}} // 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);} // SET time

  if((digitalRead(3)==LOW||ir.value==MUT)&&mute==0){mute=1;cl();audio();menu=100;lcd.setCursor(8,1);lcd.print("MUTE");delay(500);}// mute on
  if((digitalRead(3)==LOW||ir.value==MUT)&&mute==1){mute=0;cl();times=millis();w=1;w1=1;menu=0;menu1=0;audio();} // mute off
}
  if((digitalRead(4)==LOW||ir.value==POWER)&&power==0){power=1;cl();times=millis();w=1;w1=1;menu=100;menu1=0;mute=1;audio();brig = brig1;analogWrite(6, brig*25);} // power off
  if((digitalRead(4)==LOW||ir.value==POWER)&&power==1){power=0;cl();times=millis();w=1;w1=1;menu=0;menu1=0;mute=0;audio();brig = brig0;analogWrite(6, brig*25);} // power on
  
  if(power==1){digitalWrite(5,LOW);}else{digitalWrite(5,HIGH);} // output standby
  
/// IR ////////////////////////////////////////
  if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);irrecv.resume();times=millis();w=1;w1=1;}// IR приемник - чтение, в мониторе порта отображаются коды кнопок
  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]= (64-vol)/10;a[1]=(64-vol)%10;
   for(x=0;x<2;x++){switch(x){case 0: e1=11,e2=12,e3=13;break;case 1: e1=14,e2=15,e3=16;break;}digit();}
   lcd.setCursor(0,0);lcd.print("VOLUME");
   lcd.setCursor(0,1);lcd.print("CONTROL");
   lcd.setCursor(0,2);lcd.print("--------------------");
   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);
     
  }  

///////// 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 (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(">");}else{lcd.setCursor(mesto2[i],mesto3[i]);lcd.print(" ");}}
  
  lcd.setCursor(1,0);lcd.print("CH1 ");lcd.print(ch1);lcd.print(" ");lcd.setCursor(11,0);lcd.print("CH2 ");lcd.print(ch2);lcd.print(" ");
  lcd.setCursor(1,1);lcd.print("CH3 ");lcd.print(ch3);lcd.print(" ");lcd.setCursor(11,1);lcd.print("CH4 ");lcd.print(ch4);lcd.print(" ");
  lcd.setCursor(1,2);lcd.print("CH5 ");lcd.print(ch5);lcd.print(" ");lcd.setCursor(11,2);lcd.print("CH6 ");lcd.print(ch6);lcd.print(" ");
  lcd.setCursor(1,3);lcd.print("BR_1 ");lcd.print(brig0);lcd.print(" ");lcd.setCursor(11,3);lcd.print("BR_2 ");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++){
      switch(i){
        case 0: e1=0,e2=1,e3=2;break;
        case 1: e1=3,e2=4,e3=5;break;
        case 2: e1=7,e2=8,e3=9;break;
        case 3: e1=10,e2=11,e3=12;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=8,d3=6,d4=1,d5=3,d6=6;break;
        case 1: d1=32,d2=2,d3=6,d4=32,d5=32,d6=6;break;
        case 2: d1=2,d2=4,d3=6,d4=1,d5=3,d6=3;break;
        case 3: d1=2,d2=4,d3=6,d4=7,d5=3,d6=6;break;
        case 4: d1=1,d2=3,d3=6,d4=32,d5=32,d6=6;break;
        case 5: d1=1,d2=4,d3=5,d4=7,d5=3,d6=6;break;
        case 6: d1=1,d2=4,d3=5,d4=1,d5=3,d6=6;break;
        case 7: d1=1,d2=8,d3=6,d4=32,d5=32,d6=6;break;
        case 8: d1=1,d2=4,d3=6,d4=1,d5=3,d6=6;break;
        case 9: d1=1,d2=4,d3=6,d4=7,d5=3,d6=6;break;
    }
     
      lcd.setCursor(e1,0);lcd.write((uint8_t)d1);lcd.setCursor(e2,0);lcd.write((uint8_t)d2);lcd.setCursor(e3,0);lcd.write((uint8_t)d3);
      lcd.setCursor(e1,1);lcd.write((uint8_t)d4);lcd.setCursor(e2,1);lcd.write((uint8_t)d5);lcd.setCursor(e3,1);lcd.write((uint8_t)d6);
  }
  lcd.setCursor(6,0);lcd.print(".");lcd.setCursor(13,0);lcd.print(".");lcd.setCursor(6,1);lcd.print(".");lcd.setCursor(13,1);lcd.print(".");
  lcd.setCursor(0,2);lcd.print("--------------------");
  lcd.setCursor(5,3);lcd.print("POWER  OFF");
  }      
            
  
  }  /// 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(vol<0){vol=0;}if(vol>64){vol=64;}}

void digit(){switch(a[x]){
        case 0: d1=1,d2=8,d3=6,d4=1,d5=3,d6=6;break;
        case 1: d1=32,d2=2,d3=6,d4=32,d5=32,d6=6;break;
        case 2: d1=2,d2=4,d3=6,d4=1,d5=3,d6=3;break;
        case 3: d1=2,d2=4,d3=6,d4=7,d5=3,d6=6;break;
        case 4: d1=1,d2=3,d3=6,d4=32,d5=32,d6=6;break;
        case 5: d1=1,d2=4,d3=5,d4=7,d5=3,d6=6;break;
        case 6: d1=1,d2=4,d3=5,d4=1,d5=3,d6=6;break;
        case 7: d1=1,d2=8,d3=6,d4=32,d5=32,d6=6;break;
        case 8: d1=1,d2=4,d3=6,d4=1,d5=3,d6=6;break;
        case 9: d1=1,d2=4,d3=6,d4=7,d5=3,d6=6;break;}
lcd.setCursor(e1,0);lcd.write((uint8_t)d1);lcd.setCursor(e2,0);lcd.write((uint8_t)d2);lcd.setCursor(e3,0);lcd.write((uint8_t)d3);
lcd.setCursor(e1,1);lcd.write((uint8_t)d4);lcd.setCursor(e2,1);lcd.write((uint8_t)d5);lcd.setCursor(e3,1);lcd.write((uint8_t)d6);}
 

7 (2022-06-21 21:59:40 отредактировано niko00780)

Re: PT2258 + LCD2004_I2C + IR + DS3231

Скейч немного изменил. Шрифт цифр основной громкости и часы.(не окончательно, возможны изменения) Изменил названия каналов второго меню. Проверил в железе все регулировки. Основная громкость -ОК ноль- минимум, 64 -максимум. Во втором меню по каналам ослабление- НОЛЬ- минимальное ослабление. 15 - максимальное ослабление. Добавил знак "-". Как сделать, чтобы этот минус перед цифрами при НУЛЕ убирался....
http://forum.rcl-radio.ru/uploads/images/2022/06/071a340b01b2931514e8f47638bc05ae.jpg
http://forum.rcl-radio.ru/uploads/images/2022/06/987e0c111a5f4b3efa98fc0daa4f73b6.jpg
http://forum.rcl-radio.ru/uploads/images/2022/06/b22284e5746bbcf10e51178d05723d3e.jpg

скейч...

#define POWER     0x33B800FF
#define VOLUME_UP 0x33B8E01F
#define VOLUME_DW 0x33B810EF
#define MUT       0x33B8946B


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

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

 
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;


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(10,INPUT);         // МЕНЮ КНОПКА SW энкодера
  pinMode(6,OUTPUT);         // ВЫХОД УПРАВЛЕНИЯ ПОДСВЕТКОЙ
  pinMode(2,INPUT_PULLUP);   // КНОПКА SET
  pinMode(3,INPUT_PULLUP);   // КНОПКА MUTE
  pinMode(4,INPUT_PULLUP);   // КНОПКА POWER
  pinMode(5,OUTPUT);         // Выход управления STANDBY усилителя
  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);
  delay(500);
  audio();
  
  }

void loop(){
/// READ TIME /////////////////////////////////
DateTime = clock.getDateTime();hour = DateTime.hour;minut = DateTime.minute;secon = DateTime.second;
  data = DateTime.day;mon = DateTime.month;year = DateTime.year;

/// BUTTON ////////////////////////////////////
if(power==0){
  if(digitalRead(10)==LOW&&menu==1){menu1++;delay(200);times=millis();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;}}
  
  if(digitalRead(2)==LOW&&digitalRead(10)==HIGH){menu++;delay(200);times=millis();cl();w=1;w1=1;menu1=0;if(menu>1){menu=0;}} // 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);} // SET time

  if((digitalRead(3)==LOW||ir.value==MUT)&&mute==0){mute=1;cl();audio();menu=100;lcd.setCursor(8,1);lcd.print("MUTE");delay(500);}// mute on
  if((digitalRead(3)==LOW||ir.value==MUT)&&mute==1){mute=0;cl();times=millis();w=1;w1=1;menu=0;menu1=0;audio();} // mute off
}
  if((digitalRead(4)==LOW||ir.value==POWER)&&power==0){power=1;cl();times=millis();w=1;w1=1;menu=100;menu1=0;mute=1;audio();brig = brig1;analogWrite(6, brig*25);} // power off
  if((digitalRead(4)==LOW||ir.value==POWER)&&power==1){power=0;cl();times=millis();w=1;w1=1;menu=0;menu1=0;mute=0;audio();brig = brig0;analogWrite(6, brig*25);} // power on
  
  if(power==1){digitalWrite(5,LOW);}else{digitalWrite(5,HIGH);} // output standby
  
/// IR ////////////////////////////////////////
  if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);irrecv.resume();times=millis();w=1;w1=1;}// IR приемник - чтение, в мониторе порта отображаются коды кнопок
  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]= (64-vol)/10;a[1]=(64-vol)%10;
   for(x=0;x<2;x++){switch(x){case 0: e1=11,e2=12,e3=13;break;case 1: e1=15,e2=16,e3=17;break;}digit();}
   lcd.setCursor(0,0);lcd.print("VOLUME");
   lcd.setCursor(0,1);lcd.print("CONTROL");
   lcd.setCursor(0,2);lcd.print("--------------------");
   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);
     
  }  

///////// 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 (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(">");}else{lcd.setCursor(mesto2[i],mesto3[i]);lcd.print(" ");}}
  
  lcd.setCursor(1,0);lcd.print("Lfront-");lcd.print(ch1);lcd.print(" ");lcd.setCursor(11,0);lcd.print("Rfront-");lcd.print(ch2);lcd.print(" ");
  lcd.setCursor(1,1);lcd.print("Lrear -");lcd.print(ch3);lcd.print(" ");lcd.setCursor(11,1);lcd.print("Rrear -");lcd.print(ch4);lcd.print(" ");
  lcd.setCursor(1,2);lcd.print("CENTR -");lcd.print(ch5);lcd.print(" ");lcd.setCursor(11,2);lcd.print("BASS  -");lcd.print(ch6);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++){
      switch(i){
        case 0: e1=0,e2=1,e3=2;break;
        case 1: e1=3,e2=4,e3=5;break;
        case 2: e1=7,e2=8,e3=9;break;
        case 3: e1=10,e2=11,e3=12;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);
  }
  lcd.setCursor(6,0);lcd.print(".");lcd.setCursor(13,0);lcd.print(".");lcd.setCursor(6,1);lcd.print(".");lcd.setCursor(13,1);lcd.print(".");
  lcd.setCursor(0,2);lcd.print("--------------------");
  lcd.setCursor(5,3);lcd.print("POWER  OFF");
  }      
            
  
  }  /// 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(vol<0){vol=0;}if(vol>64){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);}
 

8

Re: PT2258 + LCD2004_I2C + IR + DS3231

Да, не забываем менять адрес своего экрана в скейче.....

 PT2258 pt;
 LiquidCrystal_I2C lcd(0x3F,20,4);  // Устанавливаем дисплей

9

Re: PT2258 + LCD2004_I2C + IR + DS3231

Я поправил:

#define POWER     0x33B800FF
#define VOLUME_UP 0x33B8E01F
#define VOLUME_DW 0x33B810EF
#define MUT       0x33B8946B


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

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

 
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;


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(10,INPUT);         // МЕНЮ КНОПКА SW энкодера
  pinMode(6,OUTPUT);         // ВЫХОД УПРАВЛЕНИЯ ПОДСВЕТКОЙ
  pinMode(2,INPUT_PULLUP);   // КНОПКА SET
  pinMode(3,INPUT_PULLUP);   // КНОПКА MUTE
  pinMode(4,INPUT_PULLUP);   // КНОПКА POWER
  pinMode(5,OUTPUT);         // Выход управления STANDBY усилителя
  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);
  delay(500);
  audio();
  
  }

void loop(){
/// READ TIME /////////////////////////////////
DateTime = clock.getDateTime();hour = DateTime.hour;minut = DateTime.minute;secon = DateTime.second;
  data = DateTime.day;mon = DateTime.month;year = DateTime.year;

/// BUTTON ////////////////////////////////////
if(power==0){
  if(digitalRead(10)==LOW&&menu==1){menu1++;delay(200);times=millis();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;}}
  
  if(digitalRead(2)==LOW&&digitalRead(10)==HIGH){menu++;delay(200);times=millis();cl();w=1;w1=1;menu1=0;if(menu>1){menu=0;}} // 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);} // SET time

  if((digitalRead(3)==LOW||ir.value==MUT)&&mute==0){mute=1;cl();audio();menu=100;lcd.setCursor(8,1);lcd.print("MUTE");delay(500);}// mute on
  if((digitalRead(3)==LOW||ir.value==MUT)&&mute==1){mute=0;cl();times=millis();w=1;w1=1;menu=0;menu1=0;audio();} // mute off
}
  if((digitalRead(4)==LOW||ir.value==POWER)&&power==0){power=1;cl();times=millis();w=1;w1=1;menu=100;menu1=0;mute=1;audio();brig = brig1;analogWrite(6, brig*25);} // power off
  if((digitalRead(4)==LOW||ir.value==POWER)&&power==1){power=0;cl();times=millis();w=1;w1=1;menu=0;menu1=0;mute=0;audio();brig = brig0;analogWrite(6, brig*25);} // power on
  
  if(power==1){digitalWrite(5,LOW);}else{digitalWrite(5,HIGH);} // output standby
  
/// IR ////////////////////////////////////////
  if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);irrecv.resume();times=millis();w=1;w1=1;}// IR приемник - чтение, в мониторе порта отображаются коды кнопок
  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]= (64-vol)/10;a[1]=(64-vol)%10;
   for(x=0;x<2;x++){switch(x){case 0: e1=11,e2=12,e3=13;break;case 1: e1=15,e2=16,e3=17;break;}digit();}
   lcd.setCursor(0,0);lcd.print("VOLUME");
   lcd.setCursor(0,1);lcd.print("CONTROL");
   lcd.setCursor(0,2);lcd.print("--------------------");
   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);
     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 (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(">");}else{lcd.setCursor(mesto2[i],mesto3[i]);lcd.print(" ");}}
  
  lcd.setCursor(1,0);lcd.print("Lfront");if(ch1==0){lcd.print(" ");}lcd.print(-ch1);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("Lrear ");if(ch3==0){lcd.print(" ");}lcd.print(-ch3);lcd.print(" ");lcd.setCursor(11,1);lcd.print("Rrear ");if(ch4==0){lcd.print(" ");}lcd.print(-ch4);if(ch4<10){lcd.print(" ");}
  lcd.setCursor(1,2);lcd.print("CENTR ");if(ch5==0){lcd.print(" ");}lcd.print(-ch5);lcd.print(" ");lcd.setCursor(11,2);lcd.print("BASS  ");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++){
      switch(i){
        case 0: e1=0,e2=1,e3=2;break;
        case 1: e1=3,e2=4,e3=5;break;
        case 2: e1=7,e2=8,e3=9;break;
        case 3: e1=10,e2=11,e3=12;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);
  }
  lcd.setCursor(6,0);lcd.print(".");lcd.setCursor(13,0);lcd.print(".");lcd.setCursor(6,1);lcd.print(".");lcd.setCursor(13,1);lcd.print(".");
  lcd.setCursor(0,2);lcd.print("--------------------");
  lcd.setCursor(5,3);lcd.print("POWER  OFF");
  }      
            
  
  }  /// 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(vol<0){vol=0;}if(vol>64){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);}
 

10

Re: PT2258 + LCD2004_I2C + IR + DS3231

Написал статью - http://rcl-radio.ru/?p=128120

11

Re: PT2258 + LCD2004_I2C + IR + DS3231

Статья супер! Разъяснение по адресам микросхемы замечательно! Сейчас скейч посмотрю....

12

Re: PT2258 + LCD2004_I2C + IR + DS3231

Во втором меню в пункте настройке яркости подсветки в режиме STANDBY (BR_2)  если поменять яркость допустим до 3х и вернуться кнопкой энкодера в начало этого меню, к 1му пункту(регулировка ослабления 1 канала), то яркость восстанавливается как в режиме power on (BR_1), а если выйти из этого пункта меню кнопкой "SET" то яркость так и остается на том уровне, как  (BR_2)... Можно поправить? Чтобы при выходе из последнего пункта (BR_2) второго меню кнопкой "SET" яркость восстанавливалась до уровня как в  (BR_1) ......

13

Re: PT2258 + LCD2004_I2C + IR + DS3231

Где подсмотреть коды символов и вид всех циферок с таким вот шрифтом??? http://forum.rcl-radio.ru/uploads/images/2022/06/0c759942711b2d8bfd713669fe408a2b.png
Я б в скейче подправил, глянем разницу....

14

Re: PT2258 + LCD2004_I2C + IR + DS3231

Во втором меню в пункте настройке яркости подсветки в режиме STANDBY (BR_2)  если поменять яркость допустим до 3х и вернуться кнопкой энкодера в начало этого меню, к 1му пункту(регулировка ослабления 1 канала), то яркость восстанавливается как в режиме power on (BR_1), а если выйти из этого пункта меню кнопкой "SET" то яркость так и остается на том уровне, как  (BR_2)... Можно поправить? Чтобы при выходе из последнего пункта (BR_2) второго меню кнопкой "SET" яркость восстанавливалась до уровня как в  (BR_1) ......

Поправил:

http://forum.rcl-radio.ru/viewtopic.php?pid=6330#p6330

15

Re: PT2258 + LCD2004_I2C + IR + DS3231

Где подсмотреть коды символов и вид всех циферок с таким вот шрифтом???

byte v1[8] = {7,15,15,15,15,15,15,7};
      byte v2[8] = {7,15,15, 0, 0, 0, 0, 0};     
      byte v3[8] = { 0, 0, 0, 0, 0,0,31,31};
      byte v4[8] = {31,31, 0, 0, 0, 0,31,31};
      byte v5[8] = { 30, 30, 14, 0, 0, 0, 0, 0};
      byte v6[8] = {28,30,30,30,30,30,30,28};
      byte v7[8] = { 0, 0, 0, 0, 0, 15,15,7};
      byte v8[8] = { 31, 31,0,0,0,0,0, 0};

16

Re: PT2258 + LCD2004_I2C + IR + DS3231

Якость привыходе из меню ----ОК!

17

Re: PT2258 + LCD2004_I2C + IR + DS3231

liman324 пишет:

Где подсмотреть коды символов и вид всех циферок с таким вот шрифтом???

byte v1[8] = {7,15,15,15,15,15,15,7};
      byte v2[8] = {7,15,15, 0, 0, 0, 0, 0};     
      byte v3[8] = { 0, 0, 0, 0, 0,0,31,31};
      byte v4[8] = {31,31, 0, 0, 0, 0,31,31};
      byte v5[8] = { 30, 30, 14, 0, 0, 0, 0, 0};
      byte v6[8] = {28,30,30,30,30,30,30,28};
      byte v7[8] = { 0, 0, 0, 0, 0, 15,15,7};
      byte v8[8] = { 31, 31,0,0,0,0,0, 0};

к этому бы  - коды циферок добавить ))))), а где их вставить, сообразим))))))

18

Re: PT2258 + LCD2004_I2C + IR + DS3231

Проверил пульт. Работает. На пульт еще кнопку "SET" добавить нужно.

19

Re: PT2258 + LCD2004_I2C + IR + DS3231

liman324 пишет:

Где подсмотреть коды символов и вид всех циферок с таким вот шрифтом???

byte v1[8] = {7,15,15,15,15,15,15,7};
      byte v2[8] = {7,15,15, 0, 0, 0, 0, 0};     
      byte v3[8] = { 0, 0, 0, 0, 0,0,31,31};
      byte v4[8] = {31,31, 0, 0, 0, 0,31,31};
      byte v5[8] = { 30, 30, 14, 0, 0, 0, 0, 0};
      byte v6[8] = {28,30,30,30,30,30,30,28};
      byte v7[8] = { 0, 0, 0, 0, 0, 15,15,7};
      byte v8[8] = { 31, 31,0,0,0,0,0, 0};

нашел, откуда-http://forum.rcl-radio.ru/viewtopic.php?pid=916#p916.....будем пробовать)))

20

Re: PT2258 + LCD2004_I2C + IR + DS3231

Проверил пульт. Работает. На пульт еще кнопку "SET" добавить нужно.

Сделаю пульт на кнопку SET
Кнопки громкости
#define VOLUME_UP 0x33B8E01F
#define VOLUME_DW 0x33B810EF
будут регулировать параметры
добавлю еще одну кнопку пульта имитирующую нажатие кнопки энкодера, назаву ее ОК

Опубликуйте скетч со всеми Вашми изминениями, вечером сделаю

21

Re: PT2258 + LCD2004_I2C + IR + DS3231

с теми кнопками для пульта, что есть в скейчеесть,  все ок. все работает, проверял. Спасибо.
Ждем кнопку "OK"
Поменял коды больших цифр, теперь вид такой
http://forum.rcl-radio.ru/uploads/images/2022/06/e5f9aef2043ed2c1b140838ff254a3ad.jpg
http://forum.rcl-radio.ru/uploads/images/2022/06/3e6f2c4e4fc9339799e704c1f60e4c7f.jpg
вроде как получше? или прошлые пожирнее оставить?
Да и еще.
При подаче питания и загрузке программы включается основной режим работы "power ON" .
Можно подправить??? чтобы при подаче питания и загрузке программы включался режим"power OFF"(statdby)......

При переходе из режима "power OFF"(statdby) в режим "power ON" хотелось бы  добавить задержку включения для первого экрана на 5 секунд. И во время этих первых 5ти секунд показывать надпись "LOADING"



скейч

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

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

 
byte v1[8] = {7,15,15,15,15,15,15,7};
      byte v2[8] = {7,15,15, 0, 0, 0, 0, 0};      
      byte v3[8] = { 0, 0, 0, 0, 0,0,31,31};
      byte v4[8] = {31,31, 0, 0, 0, 0,31,31};
      byte v5[8] = { 30, 30, 14, 0, 0, 0, 0, 0};
      byte v6[8] = {28,30,30,30,30,30,30,28};
      byte v7[8] = { 0, 0, 0, 0, 0, 15,15,7};
      byte v8[8] = { 31, 31,0,0,0,0,0, 0};
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;


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(10,INPUT);         // МЕНЮ КНОПКА SW энкодера
  pinMode(6,OUTPUT);         // ВЫХОД УПРАВЛЕНИЯ ПОДСВЕТКОЙ
  pinMode(2,INPUT_PULLUP);   // КНОПКА SET
  pinMode(3,INPUT_PULLUP);   // КНОПКА MUTE
  pinMode(4,INPUT_PULLUP);   // КНОПКА POWER
  pinMode(5,OUTPUT);         // Выход управления STANDBY усилителя
  pinMode(11,OUTPUT);        // Выход управления c задержкой STANDBY  усилителя
  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);
  delay(500);
  audio();
  
  }

void loop(){
/// READ TIME /////////////////////////////////
DateTime = clock.getDateTime();hour = DateTime.hour;minut = DateTime.minute;secon = DateTime.second;
  data = DateTime.day;mon = DateTime.month;year = DateTime.year;

/// BUTTON ////////////////////////////////////
if(power==0){
  if(digitalRead(10)==LOW&&menu==1){menu1++;delay(200);times=millis();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;}}
  
  if(digitalRead(2)==LOW&&digitalRead(10)==HIGH){menu++;delay(200);times=millis();cl();w=1;w1=1;menu1=0;if(menu>1){menu=0;}} // 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);} // SET time

  if((digitalRead(3)==LOW||ir.value==MUT)&&mute==0){mute=1;cl();audio();menu=100;lcd.setCursor(8,1);lcd.print("MUTE");delay(500);}// mute on
  if((digitalRead(3)==LOW||ir.value==MUT)&&mute==1){mute=0;cl();times=millis();w=1;w1=1;menu=0;menu1=0;audio();} // mute off
}
  if((digitalRead(4)==LOW||ir.value==POWER)&&power==0){power=1;cl();times=millis();w=1;w1=1;menu=100;menu1=0;mute=1;audio();brig = brig1;analogWrite(6, brig*25);} // power off
  if((digitalRead(4)==LOW||ir.value==POWER)&&power==1){power=0;cl();times=millis();w=1;w1=1;menu=0;menu1=0;mute=0;audio();brig = brig0;analogWrite(6, brig*25);} // power on
  
 if(power==1){digitalWrite(5,LOW);}else{digitalWrite(5,HIGH);} // output standby
  
  if(power==1){digitalWrite(11,LOW);}else{digitalWrite(11,HIGH);} // output standby

  
/// IR ////////////////////////////////////////
  if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);irrecv.resume();times=millis();w=1;w1=1;}// IR приемник - чтение, в мониторе порта отображаются коды кнопок
  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]= (64-vol)/10;a[1]=(64-vol)%10;
   for(x=0;x<2;x++){switch(x){case 0: e1=11,e2=12,e3=13;break;case 1: e1=14,e2=15,e3=16;break;}digit();}
   lcd.setCursor(0,0);lcd.print("VOLUME");
   lcd.setCursor(0,1);lcd.print("CONTROL");
   lcd.setCursor(0,2);lcd.print("--------------------");
   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);
     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 (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(">");}else{lcd.setCursor(mesto2[i],mesto3[i]);lcd.print(" ");}}
  
  lcd.setCursor(1,0);lcd.print("Lfront");if(ch1==0){lcd.print(" ");}lcd.print(-ch1);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("Lrear ");if(ch3==0){lcd.print(" ");}lcd.print(-ch3);lcd.print(" ");lcd.setCursor(11,1);lcd.print("Rrear ");if(ch4==0){lcd.print(" ");}lcd.print(-ch4);if(ch4<10){lcd.print(" ");}
  lcd.setCursor(1,2);lcd.print("CENTR ");if(ch5==0){lcd.print(" ");}lcd.print(-ch5);lcd.print(" ");lcd.setCursor(11,2);lcd.print("BASS  ");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++){
      switch(i){
        case 0: e1=0,e2=1,e3=2;break;
        case 1: e1=3,e2=4,e3=5;break;
        case 2: e1=7,e2=8,e3=9;break;
        case 3: e1=10,e2=11,e3=12;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=8,d3=6,d4=1,d5=3,d6=6;break;
        case 1: d1=32,d2=2,d3=6,d4=32,d5=32,d6=6;break;
        case 2: d1=2,d2=4,d3=6,d4=1,d5=3,d6=3;break;
        case 3: d1=2,d2=4,d3=6,d4=7,d5=3,d6=6;break;
        case 4: d1=1,d2=3,d3=6,d4=32,d5=32,d6=6;break;
        case 5: d1=1,d2=4,d3=5,d4=7,d5=3,d6=6;break;
        case 6: d1=1,d2=4,d3=5,d4=1,d5=3,d6=6;break;
        case 7: d1=1,d2=8,d3=6,d4=32,d5=32,d6=6;break;
        case 8: d1=1,d2=4,d3=6,d4=1,d5=3,d6=6;break;
        case 9: d1=1,d2=4,d3=6,d4=7,d5=3,d6=6;break;
    }
     
      lcd.setCursor(e1,0);lcd.write((uint8_t)d1);lcd.setCursor(e2,0);lcd.write((uint8_t)d2);lcd.setCursor(e3,0);lcd.write((uint8_t)d3);
      lcd.setCursor(e1,1);lcd.write((uint8_t)d4);lcd.setCursor(e2,1);lcd.write((uint8_t)d5);lcd.setCursor(e3,1);lcd.write((uint8_t)d6);
  }
  lcd.setCursor(6,0);lcd.print(".");lcd.setCursor(13,0);lcd.print(".");lcd.setCursor(6,1);lcd.print(".");lcd.setCursor(13,1);lcd.print(".");
  lcd.setCursor(0,2);lcd.print("--------------------");
  lcd.setCursor(6,3);lcd.print("STANDBY");
  }      
            
  
  }  /// 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(vol<0){vol=0;}if(vol>64){vol=64;}}

void digit(){switch(a[x]){
case 0: d1=1,d2=8,d3=6,d4=1,d5=3,d6=6;break;
        case 1: d1=32,d2=2,d3=6,d4=32,d5=32,d6=6;break;
        case 2: d1=2,d2=4,d3=6,d4=1,d5=3,d6=3;break;
        case 3: d1=2,d2=4,d3=6,d4=7,d5=3,d6=6;break;
        case 4: d1=1,d2=3,d3=6,d4=32,d5=32,d6=6;break;
        case 5: d1=1,d2=4,d3=5,d4=7,d5=3,d6=6;break;
        case 6: d1=1,d2=4,d3=5,d4=1,d5=3,d6=6;break;
        case 7: d1=1,d2=8,d3=6,d4=32,d5=32,d6=6;break;
        case 8: d1=1,d2=4,d3=6,d4=1,d5=3,d6=6;break;
        case 9: d1=1,d2=4,d3=6,d4=7,d5=3,d6=6;break;}
lcd.setCursor(e1,0);lcd.write((uint8_t)d1);lcd.setCursor(e2,0);lcd.write((uint8_t)d2);lcd.setCursor(e3,0);lcd.write((uint8_t)d3);
lcd.setCursor(e1,1);lcd.write((uint8_t)d4);lcd.setCursor(e2,1);lcd.write((uint8_t)d5);lcd.setCursor(e3,1);lcd.write((uint8_t)d6);}

Теперь бы еще ВТОРОЙ выход STANDBY(пусть будет 11 пин) с задержкой на 5 секунд на включение  организовать....

Добавить, добавил, а на задержку не умею))))

 if(power==1){digitalWrite(5,LOW);}else{digitalWrite(5,HIGH);} // output standby
  
 if(power==1){digitalWrite(11,LOW);}else{digitalWrite(11,HIGH);} // output standby time

22

Re: PT2258 + LCD2004_I2C + IR + DS3231

Добавил кнопки пульта для меню аттенюатора, надпись при включении и задержку, пин 11 так же имеет задержку в 5 сек при включении.

#define POWER     0x33B800FF
#define VOLUME_UP 0x33B8E01F
#define VOLUME_DW 0x33B810EF
#define MUT       0x33B8946B
#define SET       0x33B8D827
#define OK        0x33B820DF


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

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

 
byte v1[8] = {7,15,15,15,15,15,15,7};
      byte v2[8] = {7,15,15, 0, 0, 0, 0, 0};      
      byte v3[8] = { 0, 0, 0, 0, 0,0,31,31};
      byte v4[8] = {31,31, 0, 0, 0, 0,31,31};
      byte v5[8] = { 30, 30, 14, 0, 0, 0, 0, 0};
      byte v6[8] = {28,30,30,30,30,30,30,28};
      byte v7[8] = { 0, 0, 0, 0, 0, 15,15,7};
      byte v8[8] = { 31, 31,0,0,0,0,0, 0};
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(10,INPUT);         // МЕНЮ КНОПКА SW энкодера
  pinMode(6,OUTPUT);         // ВЫХОД УПРАВЛЕНИЯ ПОДСВЕТКОЙ
  pinMode(2,INPUT_PULLUP);   // КНОПКА SET
  pinMode(3,INPUT_PULLUP);   // КНОПКА MUTE
  pinMode(4,INPUT_PULLUP);   // КНОПКА POWER
  pinMode(5,OUTPUT);         // Выход управления STANDBY усилителя
  pinMode(11,OUTPUT);        // Выход управления c задержкой STANDBY  усилителя
  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(5,LOW);digitalWrite(11,LOW);
  delay(500);
  audio();
  
  }

void loop(){
/// READ TIME /////////////////////////////////
DateTime = clock.getDateTime();hour = DateTime.hour;minut = DateTime.minute;secon = DateTime.second;
  data = DateTime.day;mon = DateTime.month;year = DateTime.year;

/// BUTTON ////////////////////////////////////
if(power==0){
  if((digitalRead(10)==LOW||ir.value==OK)&&menu==1){menu1++;delay(200);times=millis();cl1();w=1;w1=1;if(menu1>7){menu1=0;}}
  if(digitalRead(10)==LOW&&menu==2){menu2++;delay(200);times=millis();w=1;w1=1;if(menu2>5){menu2=0;}}
  
  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
  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);} // SET time

  if((digitalRead(3)==LOW||ir.value==MUT)&&mute==0){mute=1;cl();audio();menu=100;lcd.setCursor(8,1);lcd.print("MUTE");delay(500);}// mute on
  if((digitalRead(3)==LOW||ir.value==MUT)&&mute==1){mute=0;cl();times=millis();w=1;w1=1;menu=0;menu1=0;audio();} // mute off
}
  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 off
  if((digitalRead(4)==LOW||ir.value==POWER)&&power==1){power=0;cl();times=millis();w=1;w1=1;menu=0;menu1=0;mute=0;audio();brig = brig0;analogWrite(6, brig*25);lcd.setCursor(6,1);lcd.print("LOADING");delay(5000);digitalWrite(11,HIGH);cl();} // power on
  
  if(power==1){digitalWrite(5,LOW);}else{digitalWrite(5,HIGH);} // output standby
  
  if(power==1){digitalWrite(11,LOW);} // output standby

  
/// IR ////////////////////////////////////////
  if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);irrecv.resume();times=millis();w=1;w1=1;}// IR приемник - чтение, в мониторе порта отображаются коды кнопок
  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]= (64-vol)/10;a[1]=(64-vol)%10;
   for(x=0;x<2;x++){switch(x){case 0: e1=11,e2=12,e3=13;break;case 1: e1=14,e2=15,e3=16;break;}digit();}
   lcd.setCursor(0,0);lcd.print("VOLUME");
   lcd.setCursor(0,1);lcd.print("CONTROL");
   lcd.setCursor(0,2);lcd.print("--------------------");
   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);
     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(">");}else{lcd.setCursor(mesto2[i],mesto3[i]);lcd.print(" ");}}
  
  lcd.setCursor(1,0);lcd.print("Lfront");if(ch1==0){lcd.print(" ");}lcd.print(-ch1);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("Lrear ");if(ch3==0){lcd.print(" ");}lcd.print(-ch3);lcd.print(" ");lcd.setCursor(11,1);lcd.print("Rrear ");if(ch4==0){lcd.print(" ");}lcd.print(-ch4);if(ch4<10){lcd.print(" ");}
  lcd.setCursor(1,2);lcd.print("CENTR ");if(ch5==0){lcd.print(" ");}lcd.print(-ch5);lcd.print(" ");lcd.setCursor(11,2);lcd.print("BASS  ");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++){
      switch(i){
        case 0: e1=0,e2=1,e3=2;break;
        case 1: e1=3,e2=4,e3=5;break;
        case 2: e1=7,e2=8,e3=9;break;
        case 3: e1=10,e2=11,e3=12;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=8,d3=6,d4=1,d5=3,d6=6;break;
        case 1: d1=32,d2=2,d3=6,d4=32,d5=32,d6=6;break;
        case 2: d1=2,d2=4,d3=6,d4=1,d5=3,d6=3;break;
        case 3: d1=2,d2=4,d3=6,d4=7,d5=3,d6=6;break;
        case 4: d1=1,d2=3,d3=6,d4=32,d5=32,d6=6;break;
        case 5: d1=1,d2=4,d3=5,d4=7,d5=3,d6=6;break;
        case 6: d1=1,d2=4,d3=5,d4=1,d5=3,d6=6;break;
        case 7: d1=1,d2=8,d3=6,d4=32,d5=32,d6=6;break;
        case 8: d1=1,d2=4,d3=6,d4=1,d5=3,d6=6;break;
        case 9: d1=1,d2=4,d3=6,d4=7,d5=3,d6=6;break;
    }
     
      lcd.setCursor(e1,0);lcd.write((uint8_t)d1);lcd.setCursor(e2,0);lcd.write((uint8_t)d2);lcd.setCursor(e3,0);lcd.write((uint8_t)d3);
      lcd.setCursor(e1,1);lcd.write((uint8_t)d4);lcd.setCursor(e2,1);lcd.write((uint8_t)d5);lcd.setCursor(e3,1);lcd.write((uint8_t)d6);
  }
  lcd.setCursor(6,0);lcd.print(".");lcd.setCursor(13,0);lcd.print(".");lcd.setCursor(6,1);lcd.print(".");lcd.setCursor(13,1);lcd.print(".");
  lcd.setCursor(0,2);lcd.print("--------------------");
  lcd.setCursor(6,3);lcd.print("STANDBY");
  }      
            
  
  }  /// 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(vol<0){vol=0;}if(vol>64){vol=64;}}

void digit(){switch(a[x]){
case 0: d1=1,d2=8,d3=6,d4=1,d5=3,d6=6;break;
        case 1: d1=32,d2=2,d3=6,d4=32,d5=32,d6=6;break;
        case 2: d1=2,d2=4,d3=6,d4=1,d5=3,d6=3;break;
        case 3: d1=2,d2=4,d3=6,d4=7,d5=3,d6=6;break;
        case 4: d1=1,d2=3,d3=6,d4=32,d5=32,d6=6;break;
        case 5: d1=1,d2=4,d3=5,d4=7,d5=3,d6=6;break;
        case 6: d1=1,d2=4,d3=5,d4=1,d5=3,d6=6;break;
        case 7: d1=1,d2=8,d3=6,d4=32,d5=32,d6=6;break;
        case 8: d1=1,d2=4,d3=6,d4=1,d5=3,d6=6;break;
        case 9: d1=1,d2=4,d3=6,d4=7,d5=3,d6=6;break;}
lcd.setCursor(e1,0);lcd.write((uint8_t)d1);lcd.setCursor(e2,0);lcd.write((uint8_t)d2);lcd.setCursor(e3,0);lcd.write((uint8_t)d3);
lcd.setCursor(e1,1);lcd.write((uint8_t)d4);lcd.setCursor(e2,1);lcd.write((uint8_t)d5);lcd.setCursor(e3,1);lcd.write((uint8_t)d6);}

23

Re: PT2258 + LCD2004_I2C + IR + DS3231

Проверил. кнопки пульта для меню аттенюатора, надпись при включении и задержку, пин 11 так же имеет задержку в 5 сек при включении. работает.  Только один момент. Пин 5й должен сразу включатся после активации повер он. а пин 11 при этом ---с задержкой на 5 сек....Разобрался. сделал

было

  if((digitalRead(4)==LOW||ir.value==POWER)&&power==1){power=0;cl();times=millis();w=1;w1=1;menu=0;menu1=0;mute=0;audio();brig = brig0;analogWrite(6, brig*25);lcd.setCursor(6,1);lcd.print("LOADING");delay(5000);digitalWrite(11,HIGH);cl();} // power on

стало

  if((digitalRead(4)==LOW||ir.value==POWER)&&power==1){power=0;cl();times=millis();w=1;w1=1;menu=0;menu1=0;mute=0;audio();brig = brig0;analogWrite(6, brig*25);lcd.setCursor(6,1);lcd.print("LOADING");lcd.setCursor(4,2);lcd.print("PLEASE WAIT");digitalWrite(5,HIGH);delay(5000);digitalWrite(11,HIGH);cl();} // power on

скейч   

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

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

 
byte v1[8] = {7,15,15,15,15,15,15,7};
      byte v2[8] = {7,15,15, 0, 0, 0, 0, 0};      
      byte v3[8] = { 0, 0, 0, 0, 0,0,31,31};
      byte v4[8] = {31,31, 0, 0, 0, 0,31,31};
      byte v5[8] = { 30, 30, 14, 0, 0, 0, 0, 0};
      byte v6[8] = {28,30,30,30,30,30,30,28};
      byte v7[8] = { 0, 0, 0, 0, 0, 15,15,7};
      byte v8[8] = { 31, 31,0,0,0,0,0, 0};
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(10,INPUT);         // МЕНЮ КНОПКА SW энкодера
  pinMode(6,OUTPUT);         // ВЫХОД УПРАВЛЕНИЯ ПОДСВЕТКОЙ
  pinMode(2,INPUT_PULLUP);   // КНОПКА SET
  pinMode(3,INPUT_PULLUP);   // КНОПКА MUTE
  pinMode(4,INPUT_PULLUP);   // КНОПКА POWER
  pinMode(5,OUTPUT);         // Выход управления STANDBY усилителя
  pinMode(11,OUTPUT);        // Выход управления c задержкой STANDBY  усилителя
  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(5,LOW);
  digitalWrite(11,LOW);
  delay(500);
  audio();
  
  }

void loop(){
/// READ TIME /////////////////////////////////
DateTime = clock.getDateTime();hour = DateTime.hour;minut = DateTime.minute;secon = DateTime.second;
  data = DateTime.day;mon = DateTime.month;year = DateTime.year;

/// BUTTON ////////////////////////////////////
if(power==0){
  if((digitalRead(10)==LOW||ir.value==OK)&&menu==1){menu1++;delay(200);times=millis();cl1();w=1;w1=1;if(menu1>7){menu1=0;}}
  if(digitalRead(10)==LOW&&menu==2){menu2++;delay(200);times=millis();w=1;w1=1;if(menu2>5){menu2=0;}}
  
  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
  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);} // SET time

  if((digitalRead(3)==LOW||ir.value==MUT)&&mute==0){mute=1;cl();audio();menu=100;lcd.setCursor(8,1);lcd.print("MUTE");delay(500);}// mute on
  if((digitalRead(3)==LOW||ir.value==MUT)&&mute==1){mute=0;cl();times=millis();w=1;w1=1;menu=0;menu1=0;audio();} // mute off
}
  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 off
  if((digitalRead(4)==LOW||ir.value==POWER)&&power==1){power=0;cl();times=millis();w=1;w1=1;menu=0;menu1=0;mute=0;audio();brig = brig0;analogWrite(6, brig*25);lcd.setCursor(6,1);lcd.print("LOADING");lcd.setCursor(4,2);lcd.print("PLEASE WAIT");digitalWrite(5,HIGH);delay(5000);digitalWrite(11,HIGH);cl();} // power on
  
  if(power==1){digitalWrite(5,LOW);}else{digitalWrite(5,HIGH);} // output standby
  if(power==1){digitalWrite(11,LOW);} // output standby
/// IR ////////////////////////////////////////
  if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);irrecv.resume();times=millis();w=1;w1=1;}// IR приемник - чтение, в мониторе порта отображаются коды кнопок
  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]= (64-vol)/10;a[1]=(64-vol)%10;
   for(x=0;x<2;x++){switch(x){case 0: e1=11,e2=12,e3=13;break;case 1: e1=14,e2=15,e3=16;break;}digit();}
   lcd.setCursor(0,0);lcd.print("VOLUME");
   lcd.setCursor(0,1);lcd.print("CONTROL");
   lcd.setCursor(0,2);lcd.print("--------------------");
   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);
     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(">");}else{lcd.setCursor(mesto2[i],mesto3[i]);lcd.print(" ");}}
  
  lcd.setCursor(1,0);lcd.print("Lfront");if(ch1==0){lcd.print(" ");}lcd.print(-ch1);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("Lrear ");if(ch3==0){lcd.print(" ");}lcd.print(-ch3);lcd.print(" ");lcd.setCursor(11,1);lcd.print("Rrear ");if(ch4==0){lcd.print(" ");}lcd.print(-ch4);if(ch4<10){lcd.print(" ");}
  lcd.setCursor(1,2);lcd.print("CENTR ");if(ch5==0){lcd.print(" ");}lcd.print(-ch5);lcd.print(" ");lcd.setCursor(11,2);lcd.print("BASS  ");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++){
      switch(i){
        case 0: e1=0,e2=1,e3=2;break;
        case 1: e1=3,e2=4,e3=5;break;
        case 2: e1=7,e2=8,e3=9;break;
        case 3: e1=10,e2=11,e3=12;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=8,d3=6,d4=1,d5=3,d6=6;break;
        case 1: d1=32,d2=2,d3=6,d4=32,d5=32,d6=6;break;
        case 2: d1=2,d2=4,d3=6,d4=1,d5=3,d6=3;break;
        case 3: d1=2,d2=4,d3=6,d4=7,d5=3,d6=6;break;
        case 4: d1=1,d2=3,d3=6,d4=32,d5=32,d6=6;break;
        case 5: d1=1,d2=4,d3=5,d4=7,d5=3,d6=6;break;
        case 6: d1=1,d2=4,d3=5,d4=1,d5=3,d6=6;break;
        case 7: d1=1,d2=8,d3=6,d4=32,d5=32,d6=6;break;
        case 8: d1=1,d2=4,d3=6,d4=1,d5=3,d6=6;break;
        case 9: d1=1,d2=4,d3=6,d4=7,d5=3,d6=6;break;
    }
     
      lcd.setCursor(e1,0);lcd.write((uint8_t)d1);lcd.setCursor(e2,0);lcd.write((uint8_t)d2);lcd.setCursor(e3,0);lcd.write((uint8_t)d3);
      lcd.setCursor(e1,1);lcd.write((uint8_t)d4);lcd.setCursor(e2,1);lcd.write((uint8_t)d5);lcd.setCursor(e3,1);lcd.write((uint8_t)d6);
  }
  lcd.setCursor(6,0);lcd.print(".");lcd.setCursor(13,0);lcd.print(".");lcd.setCursor(6,1);lcd.print(".");lcd.setCursor(13,1);lcd.print(".");
  lcd.setCursor(0,2);lcd.print("--------------------");
  lcd.setCursor(6,3);lcd.print("STANDBY");
  }      
            
  
  }  /// 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(vol<0){vol=0;}if(vol>64){vol=64;}}

void digit(){switch(a[x]){
case 0: d1=1,d2=8,d3=6,d4=1,d5=3,d6=6;break;
        case 1: d1=32,d2=2,d3=6,d4=32,d5=32,d6=6;break;
        case 2: d1=2,d2=4,d3=6,d4=1,d5=3,d6=3;break;
        case 3: d1=2,d2=4,d3=6,d4=7,d5=3,d6=6;break;
        case 4: d1=1,d2=3,d3=6,d4=32,d5=32,d6=6;break;
        case 5: d1=1,d2=4,d3=5,d4=7,d5=3,d6=6;break;
        case 6: d1=1,d2=4,d3=5,d4=1,d5=3,d6=6;break;
        case 7: d1=1,d2=8,d3=6,d4=32,d5=32,d6=6;break;
        case 8: d1=1,d2=4,d3=6,d4=1,d5=3,d6=6;break;
        case 9: d1=1,d2=4,d3=6,d4=7,d5=3,d6=6;break;}
lcd.setCursor(e1,0);lcd.write((uint8_t)d1);lcd.setCursor(e2,0);lcd.write((uint8_t)d2);lcd.setCursor(e3,0);lcd.write((uint8_t)d3);
lcd.setCursor(e1,1);lcd.write((uint8_t)d4);lcd.setCursor(e2,1);lcd.write((uint8_t)d5);lcd.setCursor(e3,1);lcd.write((uint8_t)d6);}

идем дальше:)

24 (2022-07-02 21:48:59 отредактировано sanj76a)

Re: PT2258 + LCD2004_I2C + IR + DS3231

Можно ли убрать 1 канал?
Стоит задача: 1 сабвуфер и 4 канала.
Или подскажите другую тему.

25

Re: PT2258 + LCD2004_I2C + IR + DS3231

sanj76a пишет:

Можно ли убрать 1 канал?
Стоит задача: 1 сабвуфер и 4 канала.
Или подскажите другую тему.

Можно и 4 канала+саб. Можно и 2.1......Вам из меню убрать нужно канал???......Можно попробовать.....