//#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> // [url]http://forum.rcl-radio.ru/misc.php?action=pan_download&item=45&download=1[/url]
#include <Encoder.h> // [url]http://rcl-radio.ru/wp-content/uploads/2019/05/Encoder.zip[/url]
#include <EEPROM.h>
#include <MsTimer2.h> // [url]http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip[/url]
#include <boarddefs.h> // входит в состав библиотеки IRremote
#include <IRremote.h> // [url]http://rcl-radio.ru/wp-content/uploads/2019/06/IRremote.zip[/url]
#include <PT2258.h> // [url]https://github.com/liman324/PT2258.git[/url]
#include <DS3231.h>
#include <microDS18B20.h>
PT2258 pt;
//-----------------------------------------------------------------------------------------------------------
LiquidCrystal_I2C lcd(0x27, 20, 4); // Устанавливаем дисплей
Encoder myEnc(9, 8);// DT, CLK
IRrecv irrecv(11); // указываем вывод модуля IR приемника
decode_results ir;
DS3231 clock; RTCDateTime DateTime;
MicroDS18B20<5> sensor;
//-----------------------------------------------------------------------------------------------------------
//запись кодов символов в экран
byte v1[8] = {B00111,B01111,B11111,B11111,B11111,B11111,B11111,B11111};
byte v2[8] = {B11111,B11111,B11111,B00000,B00000,B00000,B00000,B00000};
byte v3[8] = {B11100,B11110,B11111,B11111,B11111,B11111,B11111,B11111};
byte v4[8] = {B11111,B11111,B11111,B11111,B11111,B11111,B01111,B00111};
byte v5[8] = {B00000,B00000,B00000,B00000,B00000,B11111,B11111,B11111};
byte v6[8] = {B11111,B11111,B11111,B11111,B11111,B11111,B11110,B11100};
byte v7[8] = {B11111,B11111,B11111,B00000,B00000,B00000,B11111,B11111};
byte v8[8] = {B11111,B11111,B11111,B11111,B11111,B11111,B11111,B11111};
//-----------------------------------------------------------------------------------------------------------
//обьявление переменных
static uint32_t timTemp;
unsigned long times,oldPosition = -999,newPosition;
int vol, ch1, ch2, ch3, ch4, ch5, ch6, menu, menu1, menu2, brig, brig0=10, brig1, temp0, i;
bool mute, power, w, w1, gr1, gr2,termo;
byte a[6], d1, d2, d3, d4, d5, d6, e1, e2, e3, x, www, tim_w;
int hour, minut, secon, data, mon, year, time_temp;
byte mesto2[8] = {0, 10, 0, 10, 0, 10, 0, 10};
byte mesto3[8] = {0, 0, 1, 1, 2, 2, 3, 3};
int hh, mm, ss, dd, mn, gg;
byte standby = 1;
int pin7=0;
int x_timer;
int perc;
//-----------------------------------------------------------------------------------------------------------
////переменные для автоматического снижения яркости на основном экране......
bool _tim1I = 0;
bool _tim1O = 0;
unsigned long _tim1P = 0UL;
bool _trgrt1 = 0;
bool _trgrt1I = 0;
bool _start=0;
//-----------------------------------------------------------------------------------------------------------
//приготовились.....
void setup() {
irrecv.enableIRIn(); lcd.init(); lcd.backlight(); Wire.begin(); clock.begin(); Serial.begin(9600);
MsTimer2::set(1, to_Timer); MsTimer2::start();
lcd.createChar(1, v1); lcd.createChar(2, v2); lcd.createChar(3, v3); lcd.createChar(4, v4);
lcd.createChar(5, v5); lcd.createChar(6, v6); lcd.createChar(7, v7); lcd.createChar(8, v8);
if (EEPROM.read(100) != 0) {
for (int i = 0; i < 101; i++) {
EEPROM.update(i, 0); // очистка памяти при первом включении
}
}
//-----------------------------------------------------------------------------------------------------------
//объявление входов,выходов
//pinMode(0) //serial port
//pinMode(1) //serial port
pinMode(2, INPUT_PULLUP); // КНОПКА SET
pinMode(3, INPUT_PULLUP); // КНОПКА MUTE
pinMode(4, INPUT_PULLUP); // КНОПКА POWER
//pinMode(5) // термодатчик 18B20
pinMode(6, OUTPUT); // ВЫХОД УПРАВЛЕНИЯ ПОДСВЕТКОЙ
pinMode(7, OUTPUT); // ВЫХОД АКТИВАЦИИ АНАЛИЗАТОРА СПЕКТРА
//pinMode(8) Encoder myEnc(8); //CLK
//pinMode(9) Encoder myEnc(9); //DT
pinMode(10, INPUT); // МЕНЮ КНОПКА SW энкодера
//pinMode(11) IRrecv irrecv(11);// указываем вывод модуля IR приемника
pinMode(12, OUTPUT); // Выход управления STANDBY - реле включения усилителя
pinMode(13, OUTPUT); // Выход управления STANDBY--- c задержкой для реле софтстарта усилителя
//-----------------------------------------------------------------------------------------------------------
//входы для индикации аварий каналов, кому не надо можете удалить от этого места....
pinMode(14, INPUT_PULLUP); //вход аварии левый передний /норма +5 вольт, авария 0 вольт/ замыкаем на землю при аварии
pinMode(15, INPUT_PULLUP); //вход аварии левый задний /норма +5 вольт, авария 0 вольт/ замыкаем на землю при аварии
pinMode(16, INPUT_PULLUP); //вход аварии центральный канал /норма +5 вольт, авария 0 вольт/ замыкаем на землю при аварии
pinMode(17, INPUT_PULLUP); //вход аварии сабвуфера /норма +5 вольт, авария 0 вольт/ замыкаем на землю при аварии
pinMode(A6, INPUT); //вход аварии правый передний /норма +5 вольт, авария 0 вольт/ замыкаем на землю при аварии
//чисто аналоговый вход //вот тут вход привязываем к +5 вольт через резистор 10 кОм, обязательно,да програмно пробовал
//ловит наводки, лучше железно, рядом с ардуиной, так надежнее
pinMode(A7, INPUT); //вход аварии правый задний /норма +5 вольт, авария 0 вольт/ замыкаем на землю при аварии
//чисто аналоговый вход //вот тут вход привязываем к +5 вольт через резистор 10 кОм, обязательно,да программно пробовал
//ловит наводки, лучше железно, рядом с ардуиной, так надежнее
///....до этого......
//-----------------------------------------------------------------------------------------------------------
clock.setDateTime(__DATE__, __TIME__); // Устанавливаем время на часах, основываясь на времени компиляции скетча
vol = EEPROM.read(0);
ch1 = EEPROM.read(1); ch2 = EEPROM.read(2); ch3 = EEPROM.read(3);
ch4 = EEPROM.read(4); ch5 = EEPROM.read(5); ch6 = EEPROM.read(6);
brig0 = EEPROM.read(7); brig1 = EEPROM.read(8);
analogWrite(6, brig0 * 25);
digitalWrite(12, LOW);
digitalWrite(13, LOW);
delay(500);
audio();
}
//-----------------------------------------------------------------------------------------------------------
/////////////////поехали/////////////////////////////////////////////
void loop() {
/// READ TIME /////////////////////////////////
DateTime = clock.getDateTime(); hour = DateTime.hour; minut = DateTime.minute; secon = DateTime.second;
data = DateTime.day; mon = DateTime.month; year = DateTime.year;
//-----------------------------------------------------------------------------------------------------------
/// BUTTON ////////////////////////////////////
//// МЕНЮ КНОПКА энкодера
if (power == 0) {
if ((digitalRead(10) == LOW || ir.value == OK) && menu == 1) {menu1++;delay(200);times = millis();cl1();w = 1;w1 = 1;
if (menu1 > 7) {menu1 = 0;}
}
if (digitalRead(10) == LOW && menu == 2) {menu2++;delay(200);times = millis();w = 1;w1 = 1;
if (menu2 > 5) {menu2 = 0;}
}
//-----------------------------------------------------------------------------------------------------------
/////////////Долгое нажатие кнопки энкодера(больше 5 секунд)
////////////---включение/отключение АНАЛИЗАТОРА СПЕКТРА на втором экране LCD 2004/////////////////
if (digitalRead(10) == LOW && menu==0){delay(200);x_timer++;}// держим кнопку, идет счет x_timer
if (digitalRead(10) == HIGH) {x_timer=0;} // если отпустить кнопку то x_timer сбрасывается
if (x_timer > 12 && pin7==0) {digitalWrite(7,HIGH);pin7=1;x_timer=0;} // 12*200 мс + время работы цикла = 5с включаем пин 7 если он был выключен
if (x_timer > 12 && pin7==1 ) {digitalWrite(7,LOW);pin7=0;x_timer=0;} // 12*200 мс + время работы цикла = 5с выключаем пин 7 если он был включен
//-----------------------------------------------------------------------------------------------------------
// МЕНЮ КНОПКА SET
if ((digitalRead(2) == LOW || ir.value == SET) && digitalRead(10) == HIGH) {menu++;delay(200);times = millis();cl();w = 1;w1 = 1;menu1 = 0;
if (menu > 1) {menu = 0; }
}
//-----------------------------------------------------------------------------------------------------------
// МЕНЮ КНОПКА SET time(нажатие одновременно кнопки энкодера и кнопкиSET)
if (digitalRead(2) == LOW && digitalRead(10) == LOW) {menu = 2;delay(200);times = millis();cl();w = 1;w1 = 1;lcd.setCursor(2, 1);
lcd.print("TIME CORRECTION");delay(1000);
}
//-----------------------------------------------------------------------------------------------------------
// МЕНЮ КНОПКА MUTE - mute on
if ((digitalRead(3) == LOW || ir.value == MUT) && mute == 0) {mute = 1;cl();audio();menu = 100;brig=brig1;analogWrite(6, brig * 25);
//-----------------------------------------------------------------------------------------------------------
//слово MUTE//да, охренеть! можно проще? и круче? --- поправляйте!(просто "MUTE" не прет!!!)(и массивы ниасилил йа......)
//1 символ "М"+пробел"
lcd.setCursor(1,0);lcd.write(3);lcd.print(" ");lcd.write(1);lcd.print(" ");
lcd.setCursor(1,1);lcd.write(8);lcd.write(3);lcd.write(1);lcd.write(8);lcd.print(" ");
lcd.setCursor(1,2);lcd.write(8);lcd.print(" ");lcd.write(8);lcd.print(" ");
//2 символ "U"+пробел"
lcd.setCursor(6,0);lcd.write(3);lcd.print(" ");lcd.write(1);lcd.print(" ");
lcd.setCursor(6,1);lcd.write(8);lcd.print(" ");lcd.write(8);lcd.print(" ");
lcd.setCursor(6,2);lcd.write(4);lcd.write(8);lcd.write(8);lcd.write(6);lcd.print(" ");
//3 символ "T"+пробел"
lcd.setCursor(11,0);lcd.write(8);lcd.write(8);lcd.write(8);lcd.print(" ");
lcd.setCursor(11,1);lcd.print(" ");lcd.write(8);lcd.print(" ");
lcd.setCursor(11,2);lcd.print(" ");lcd.write(8);lcd.print(" ");
//4 символ "E"+пробел"
lcd.setCursor(15,0);lcd.write(1);lcd.write(2);lcd.write(2);lcd.write(2);
lcd.setCursor(15,1);lcd.write(8);lcd.write(2);lcd.write(2);
lcd.setCursor(15,2);lcd.write(4);lcd.write(5);lcd.write(5);lcd.write(5);
delay(500);
}
//-----------------------------------------------------------------------------------------------------------
// МЕНЮ КНОПКА MUTE - mute off
if ((digitalRead(3) == LOW || ir.value == MUT) && mute == 1) {mute = 0;cl();times = millis();w = 1;w1 = 1;menu = 0;menu1 = 0;myEnc.write(0);newPosition = 0;brig=brig0;analogWrite(6, brig * 25);audio();}
}
//-----------------------------------------------------------------------------------------------------------
// МЕНЮ STANDBY
//КНОПКА POWER ON/OFF
//КНОПКА POWER
// POWER O F F
//сначала ВЫКЛЮЧЕНИЕ
if (((digitalRead(4) == LOW || ir.value == POWER) && power == 0) || standby == 1) {menu1 = 0; mute = 1; audio();
power = 1; standby = 0;cl();times = millis(); w = 1; w1 = 1; menu = 100;//сначала вырубаем звук,выключаем все и врубаем меню STANDBY.....
///// в цикле плавное снижение уровня подсветки.....
for (i = 10; i >=1 ; i--) {
brig = i;analogWrite(6, brig * 25);
delay(100);
}
}
//-----------------------------------------------------------------------------------------------------------
//КНОПКА POWER
// POWER O N
if ((digitalRead(4) == LOW || ir.value == POWER) && power == 1 ) {
power = 0; cl();times = millis(); w = 1; w1 = 1; menu = 0; menu1 = 0;myEnc.write(0);newPosition = 0;
digitalWrite(12, HIGH);//включение питания 1й выход
// ЭКРАН ПРИ ВКЛЮЧЕНИИ
lcd.setCursor(0, 0); lcd.print(" BU DIGITAL SARAY ");//1 строка
lcd.setCursor(0, 1); lcd.print("POWER AMPLIFIER 5.1");//2 строка
lcd.setCursor(0, 2); lcd.print(" SYSTEM LOADING ");//3 строка
for(int i=1;i<=10;i++){ brig=i; analogWrite(6, brig * 25);delay(200);//плавное включение подсветки при ВКЛЮЧЕНИИ
}
digitalWrite(13, HIGH); //включение питания 2й выход
// квадратики загрузки _-_-_-_-_-_-_-_-_-_-_-
lcd.setCursor(0, 3);
for (int thisChar = 0; thisChar < 10; thisChar++) {lcd.write(5);delay(75);lcd.write(2);delay(75);}
cl();_start=1; mute = 0; audio(); //очистка экрана, отключение mute.....слушаем музыку))))
}
//-----------------------------------------------------------------------------------------------------------
// power off//выключение усилителя(реле)
if (power == 1) {digitalWrite(12, LOW);} // выход standby
else {digitalWrite(12, HIGH);}
if (power == 1) {digitalWrite(13, LOW);digitalWrite(7,LOW);} // выход standby delay, выход отключения АНАЛИЗАТОРА СПЕКТРА
//-----------------------------------------------------------------------------------------------------------
/// IR ////////////////////////////////////////
if ( irrecv.decode( &ir )) {
Serial.print("0x"); // IR приемник - чтение, в мониторе порта отображаются коды кнопок
Serial.println( ir.value, HEX);
//Serial.println (sensor_Alarm_1);
//Serial.println (sensor_Alarm_2);
irrecv.resume();
times = millis();
w = 1;
w1 = 1;
}
if (ir.value == 0) {
gr1 = 0; // запрет нажатий не активных кнопок пульта
gr2 = 0;
}
//-----------------------------------------------------------------------------------------------------------
////////////// VOLUME ///////////////////////////////////////////////////////////////////
//ОСНОВНОЙ ЭКРАН
if (menu == 0) {
// кнопка >
if (ir.value == VOLUME_UP && mute == 0 && power == 0) {vol++;gr1 = 1;gr2 = 0;cl1();times = millis();w = 1;vol_func();audio();}
// кнопка >>>>>>
if (ir.value == 0xFFFFFFFF and gr1 == 1) {vol++;gr2 = 0;cl1();times = millis();w = 1;vol_func();audio();}
// кнопка <
if (ir.value == VOLUME_DW) {vol--;gr1 = 0;gr2 = 1;cl1();times = millis();w = 1;vol_func();audio();}
// кнопка <<<<<<
if (ir.value == 0xFFFFFFFF and gr2 == 1) {vol--;gr1 = 0;cl1();times = millis();w = 1;vol_func();audio();}
if (newPosition != oldPosition) {oldPosition = newPosition;vol = vol + newPosition;
myEnc.write(0);newPosition = 0; times = millis();w = 1;w1 = 1;vol_func();audio();}
//-----------------------------------------------------------------------------------------------------------
// цифры громкости
a[0] = (vol) / 10; a[1] = (vol) % 10;
for (x = 0; x < 2; x++) {
switch (x) {
case 0: e1 = 10, e2 = 11, e3 = 12;break;
case 1: e1 = 14, e2 = 15, e3 = 16;break;}
digit();
}
//-----------------------------------------------------------------------------------------------------------
//Минус (гаснущий при нуле) перед цифрами уровня громкости
lcd.setCursor(8, 0); if (vol > 0) {lcd.write(5);} else {lcd.print(" ");//{lcd.write(5);---какой символ отображать----из таблички в начале скейча
}
//-----------------------------------------------------------------------------------------------------------
////Вывод температуры на основной экран///////
if (millis() - timTemp >= 800) { ///время опроса датчика
timTemp = millis();
// читаем прошлое значение
//значение температуры выводится только при срабатывании термозащиты,у нас усилитель, а не термометр))))))))
if (termo == 1) {if (sensor.readTemp()) {lcd.setCursor(17, 3);lcd.print(sensor.getTemp(),0);lcd.write(223);}//выводим на экран
else {lcd.setCursor(17, 3);lcd.print("ERR");delay(250);lcd.setCursor(17, 3);lcd.print(" ");}//если обрыв датчика пишем error
}
// запрашиваем новое измерение
sensor.requestTemp();
//-----------------------------------------------------------------------------------------------------------
//термозащита //4 строка
//вот тут меняем уставку защиты.....50...90 градусов....или 100))))
//если температура превышает уставку.....
if ((sensor.getTemp())>=30){vol = 35; audio(); termo=1;//гасим часы, снижаем уровень до -35 дБ.....врубаем подсветку на максимум.....
//вместо часов выводим сообщение....
if (secon & 1){ lcd.setCursor(0, 3);lcd.print(">TERMO OVERLOAD< ");}
// 01234567890123456 это символы в строке считаю, чтоб не промазать)))
else { lcd.setCursor(0, 3);lcd.print(" >70");lcd.write(223);lcd.print(" MAX TEMP< ");}//тут пишем максимальную температуру, как в уставке
// 0123 4 567890123456 это символы в строке считаю, чтоб не промазать))
}
//если температура в норме.....
else {audio();termo=0;//гасим подсветку и возвращаем часы .....
lcd.setCursor(0, 3);lcd.print(" ");
lcd.print(hour / 10); lcd.print(hour % 10);// lcd.print(":");
if (secon & 1)
{lcd.write(165);} //secon - нечетное
else {lcd.write(58);} //secon - четное
lcd.print(minut / 10); lcd.print(minut % 10);lcd.print(" ");
}
}
//-----------------------------------------------------------------------------------------------------------
//надписи основного экрана
//1 строка
lcd.setCursor(0, 0); lcd.print(" VOLUME ");
//2 строка начало
if (termo==0){lcd.setCursor(0, 1); lcd.print(" 5.1 CH ");}
else {lcd.setCursor(0, 1); lcd.print(" LIMIT ");}//если сработала термозащита выводим слово---лимит---
//2 строка в конце
lcd.setCursor(18,1); lcd.print("dB");//2 строка после цифр уровня громкости
//-----------------------------------------------------------------------------------------------------------
// индикаторы неисправности каналов
// кому не нужно раскоментируйте строку ниже
//lcd.setCursor(0, 2); lcd.print("--------------------");//3 строка
//и все остальное можете удалить, от этого места.......
//переменные аварии правого переднего канала и правого заднего канала
int sensor_Alarm_3 = analogRead(A6);//считываем сигнал аварии правого переднего канала
int sensor_Alarm_4 = analogRead(A7);//считываем сигнал аварии правого заднего канала
if (digitalRead(14) == LOW || digitalRead(15) == LOW ||digitalRead(16) == LOW ||digitalRead(17) == LOW
||sensor_Alarm_3 < 10||sensor_Alarm_4 < 10){
//левый передний
if (digitalRead(14) == HIGH)
{lcd.setCursor(0, 2);lcd.print(" ");}
if (digitalRead(14) == LOW ) {if ((millis() % 1000) > 500)
{lcd.setCursor(0, 2); lcd.print("FL ");}
else{lcd.setCursor(0, 2); lcd.print("DC ");}
}
//левый задний
if (digitalRead(15) == HIGH)
{lcd.setCursor(3, 2); lcd.print(" ");}
if (digitalRead(15) == LOW) {if ((millis() % 1000) > 500)
{lcd.setCursor(3, 2); lcd.print("RL ");}
else{lcd.setCursor(3, 2); lcd.print("DC ");}
}
//центральный
if (digitalRead(16) == HIGH)
{lcd.setCursor(6, 2);lcd.print(" ");}
if (digitalRead(16) == LOW) {if ((millis() % 1000) > 500)
{lcd.setCursor(6, 2); lcd.print("CNTR");}
else{lcd.setCursor(6, 2); lcd.print(" DC ");}
}
//сабвуфер
if (digitalRead(17) == HIGH)
{lcd.setCursor(10, 2);lcd.print(" ");}
if (digitalRead(17) == LOW) {if ((millis() % 1000) > 500)
{lcd.setCursor(10, 2); lcd.print(" SUB");}
else{lcd.setCursor(10, 2); lcd.print(" D C");}
}
//правый передний/// тут пришлось поковыряться......вход А6 чисто аналоговый
if (sensor_Alarm_3 >= 500)
{lcd.setCursor(14, 2);lcd.print(" ");}
if (sensor_Alarm_3 <= 10) {if ((millis() % 1000) > 500)
{lcd.setCursor(14, 2); lcd.print(" FR");}
else{lcd.setCursor(14, 2); lcd.print(" DC");}
}
//правый задний /// и тут тоже пришлось поковыряться......вход А7 чисто аналоговый
if (sensor_Alarm_4 >= 500)
{lcd.setCursor(17, 2);lcd.print(" ");}
if (sensor_Alarm_4 <= 10) {if ((millis() % 1000) > 500)
{lcd.setCursor(17, 2); lcd.print(" RR");}
else{lcd.setCursor(17, 2); lcd.print(" DC");}
}
}
else {int perc = map(vol, 64, 0, 0, 100);
//fillBar0 принимает аргументы (столбец, строка, длина полосы, значение в % (0 - 100) )
fillBar0(0, 2, 20, perc);
delay(50);}
////до сюда.....
//-----------------------------------------------------------------------------------------------------------
//яркость подсветки.... автоматическое снижение при неактивных кнопках.....
// ждем 10 сек и выключаем подсветку
if (_start==1) { if (_trgrt1I) { _trgrt1 = 0;} else {_trgrt1 = 1; _trgrt1I = 1;} } else {_trgrt1 = 0; _trgrt1I = 0;};
if ( (_trgrt1) || digitalRead(2) == LOW || digitalRead(3) == LOW || digitalRead(4) == LOW ||
digitalRead(8) == LOW || digitalRead(9) == LOW || digitalRead(10) == LOW ||
digitalRead(14) == LOW || digitalRead(15) == LOW || digitalRead(16) == LOW ||
digitalRead(17) == LOW || sensor_Alarm_3 < 10 || sensor_Alarm_4 < 10 ||
ir.value == OK || ir.value == SET || ir.value == MUT || ir.value == POWER ||
termo == 1 || gr1==1 || gr2==1) {_tim1O = 1; _tim1I = 1;} else { if(_tim1I) {_tim1I = 0; _tim1P = millis();} else { if (_tim1O) {if ( _isTimer(_tim1P, 10000)) _tim1O = 0;}}}
if (!( _tim1O ) ) {brig = brig1;analogWrite(6, brig * 25);} //////////////вот тут меняем время задержки отключения подсветки ↑↑↑↑↑↑
if ( _tim1O ){brig = brig0;analogWrite(6, brig * 25);}
}
//-----------------------------------------------------------------------------------------------------------
///////// ATT //////////////////////////////////////////////////////////////////////////////
//Меню аттенюаторов
if (menu == 1) {
switch (menu1) {
case 0: temp0 = ch1; break;
case 1: temp0 = ch2; break;
case 2: temp0 = ch3; break;
case 3: temp0 = ch4; break;
case 4: temp0 = ch5; break;
case 5: temp0 = ch6; break;
case 6: temp0 = brig0; break;
case 7: temp0 = brig1; break;
}
// кнопка >
if (ir.value == VOLUME_UP) {temp0--; gr1 = 1;gr2 = 0;cl1();times = millis();w = 1;www = 1;}
// кнопка >>>>>>
if (ir.value == 0xFFFFFFFF and gr1 == 1) {temp0--;gr2 = 0;cl1();times = millis();w = 1;w = 1;www = 1;}
// кнопка <
if (ir.value == VOLUME_DW) {temp0++; gr1 = 0;gr2 = 1;cl1();times = millis(); w = 1;w = 1;www = 1;
}
// кнопка <<<<<<
if (ir.value == 0xFFFFFFFF and gr2 == 1) {temp0++;gr1 = 0;cl1();times = millis(); w = 1;w = 1;www = 1;}
if (newPosition != oldPosition) {oldPosition = newPosition;temp0 = temp0 - newPosition; myEnc.write(0); newPosition = 0; times = millis(); w = 1; www = 1;
}
switch (menu1) {
case 0: ch1 = temp0; if (ch1 < 0) {ch1 = 0;} if (ch1 > 15) {ch1 = 15;} break;
case 1: ch2 = temp0; if (ch2 < 0) {ch2 = 0;} if (ch2 > 15) {ch2 = 15;} break;
case 2: ch3 = temp0; if (ch3 < 0) {ch3 = 0;} if (ch3 > 15) {ch3 = 15;} break;
case 3: ch4 = temp0; if (ch4 < 0) {ch4 = 0;} if (ch4 > 15) {ch4 = 15;} break;
case 4: ch5 = temp0; if (ch5 < 0) {ch5 = 0;} if (ch5 > 15) {ch5 = 15;} break;
case 5: ch6 = temp0; if (ch6 < 0) {ch6 = 0;} if (ch6 > 15) {ch6 = 15;} break;
case 6: brig0 = temp0; brig0_func(); break;
case 7: brig1 = temp0; brig1_func(); break;
}
//-----------------------------------------------------------------------------------------------------------
au();
if (menu1 < 7) {brig = brig0;}
if (menu1 == 7) {brig = brig1;}
analogWrite(6, brig * 25);
for (i = 0; i < 8; i++) {
if (menu1 == i) {
lcd.setCursor(mesto2[i], mesto3[i]);
lcd.print(char(126));
} else {
lcd.setCursor(mesto2[i], mesto3[i]);
lcd.print(" ");
}
}
lcd.setCursor(1, 0); lcd.print("Lfront"); if (ch1 == 0) {
lcd.print(" ");
} lcd.print(-ch1); if (ch1 < 10) {
lcd.print(" ");
}
lcd.setCursor(11, 0); lcd.print("Rfront"); if (ch2 == 0) {
lcd.print(" ");
} lcd.print(-ch2); if (ch2 < 10) {
lcd.print(" ");
}
lcd.setCursor(1, 1); lcd.print("L rear"); if (ch3 == 0) {
lcd.print(" ");
} lcd.print(-ch3); if (ch3 < 10) {
lcd.print(" ");
}
lcd.setCursor(11, 1); lcd.print("R rear"); if (ch4 == 0) {
lcd.print(" ");
} lcd.print(-ch4); if (ch4 < 10) {
lcd.print(" ");
}
lcd.setCursor(1, 2); lcd.print("Center"); if (ch5 == 0) {
lcd.print(" ");
} lcd.print(-ch5); if (ch5 < 10) {
lcd.print(" ");
}
lcd.setCursor(11, 2); lcd.print("SubW "); if (ch6 == 0) {
lcd.print(" ");
} lcd.print(-ch6); if (ch6 < 10) {
lcd.print(" ");
}
lcd.setCursor(1, 3); lcd.print("BR ON "); lcd.print(brig0); lcd.print(" ");
lcd.setCursor(11, 3); lcd.print("BR OFF "); lcd.print(brig1); lcd.print(" ");
}
//-----------------------------------------------------------------------------------------------------------
//////// Меню коррекции времени ..............menu set time /////////////////////////////////////
if (menu == 2) {
hh = DateTime.hour; mm = DateTime.minute; ss = DateTime.second; dd = DateTime.day; mn = DateTime.month; gg = DateTime.year;
switch (menu2) {
case 0: time_temp = hh; break;
case 1: time_temp = mm; break;
case 2: time_temp = ss; break;
case 3: time_temp = dd; break;
case 4: time_temp = mn; break;
case 5: time_temp = gg; break;
}
if (newPosition != oldPosition) {
oldPosition = newPosition;
time_temp = time_temp - newPosition; myEnc.write(0); newPosition = 0; times = millis(); w = 1; tim_w = 1;
}
switch (menu2) {
case 0: hh = time_temp;
if (hh < 0) {hh = 0;}
if (hh > 23) {hh = 23;} break;
case 1: mm = time_temp;
if (mm < 0) {mm = 0;}
if (mm > 59) {mm = 59;} break;
case 2: ss = time_temp;
if (ss < 0) {ss = 0;}
if (ss > 59) {ss = 59;} break;
case 3: dd = time_temp;
if (dd < 1) {dd = 1;}
if (dd > 31) {dd = 31;} break;
case 4: mn = time_temp;
if (mn < 1) {mn = 1;}
if (mn > 12) {mn = 12;} break;
case 5: gg = time_temp;
if (gg < 2022) {gg = 2022;}
if (gg > 2100) {gg = 2100;} break;
}
lcd.setCursor(0, 0); lcd.print("TIME CORRECTION");
lcd.setCursor(0, 1); lcd.print("--------------------");
lcd.setCursor(0, 2);
if (menu2 == 0) {
lcd.print("set hour ");
}
if (menu2 == 1) {
lcd.print("set minute ");
}
if (menu2 == 2) {
lcd.print("set seconds");
}
if (menu2 == 3) {
lcd.print("set date ");
}
if (menu2 == 4) {
lcd.print("set month ");
}
if (menu2 == 5) {
lcd.print("set year ");
}
lcd.setCursor(0, 3);
lcd.print(hour / 10); lcd.print(hour % 10); lcd.print(":");
lcd.print(minut / 10); lcd.print(minut % 10); lcd.print(":");
lcd.print(secon / 10); lcd.print(secon % 10); lcd.print(" ");
lcd.print(data / 10); lcd.print(data % 10); lcd.print("-");
lcd.print(mon / 10); lcd.print(mon % 10); lcd.print("-");
lcd.print(year);
if (tim_w == 1) {
tim_w = 0;
clock.setDateTime(gg, mn, dd, hh, mm, ss);
delay(100);
}
}
//-----------------------------------------------------------------------------------------------------------
/////Запись в память настроек
/////// EEPROM //////////////////////////////////////
if (millis() - times > 10000 && w1 == 1 && mute == 0 && power == 0) {
w1 = 0;
EEPROM.update(0, vol); EEPROM.update(1, ch1); EEPROM.update(2, ch2); EEPROM.update(3, ch3);
EEPROM.update(4, ch4); EEPROM.update(5, ch5); EEPROM.update(6, ch6);
EEPROM.update(7, brig0); EEPROM.update(8, brig1);
if(menu!=0){cl();}
}
//-----------------------------------------------------------------------------------------------------------
///////////Экран STANDBY
if (power == 1) {
a[0] = DateTime.hour / 10;
a[1] = DateTime.hour % 10;
a[2] = DateTime.minute / 10;
a[3] = DateTime.minute % 10;
//a[4] = DateTime.second / 10;//десятки секунд///секунды закомментированы/если нужны секунды, раскомминтируем это
//a[5] = DateTime.second % 10;//единицы секунд///секунды закомментированы/если нужны секунды, раскомминтируем это
//for (i = 0; i < 6; i++) {//если нужны секунды, раскомминтируем это
//что показывать. в данном случае часы и минуты,секунды закомментированы
for (i = 0; i < 4; i++) { //если НЕ нужны секунды, это закомментируем
switch (i) {
case 0: e1 = 1, e2 = 2, e3 = 3; break;//десятки часов
case 1: e1 = 5, e2 = 6, e3 = 7; break;//единицы часов
case 2: e1 = 12, e2 = 13, e3 = 14; break;//десятки минут
case 3: e1 = 16, e2 = 17, e3 = 18; break;//единицы минут
//case 4: e1 = 14, e2 = 15, e3 = 16; break;//не надо//секунды закомментированы
// case 5: e1 = 17, e2 = 18, e3 = 19; break;//не надо//секунды закомментированы
}
///////маска цифр, ДЛЯ ЧАСОВ.....какая цифра из каких символов состоит....
///d1,d2,d3-верхняя часть цифры;d4,d5,d6-нижняя часть цифры;
switch (a[i]) {
//1 набор, 2,4,5 прямые// елсли нравится, оставляем, а нижний комментируем/* */
/*case 0: d1=1,d2=2,d3=3,d4=4,d5=5,d6=6;break;
case 1: d1=2,d2=3,d3=32,d4=5,d5=8,d6=5;break;
case 2: d1=7,d2=7,d3=3,d4=8,d5=5,d6=5;break;
case 3: d1=7,d2=7,d3=3,d4=5,d5=5,d6=6;break;
case 4: d1=4,d2=5,d3=8,d4=32,d5=32,d6=8;break;
case 5: d1=8,d2=7,d3=7,d4=5,d5=5,d6=6;break;
case 6: d1=1,d2=7,d3=7,d4=4,d5=5,d6=6;break;
case 7: d1=2,d2=2,d3=3,d4=32,d5=32,d6=8;break;
case 8: d1=1,d2=7,d3=3,d4=4,d5=5,d6=6;break;
case 9: d1=1,d2=7,d3=3,d4=5,d5=5,d6=6;break;*/
//2 набор, 2,4,5 закругленные// если нравится, оставляем, а верхний комментируем/* */
case 0: d1=1,d2=2,d3=3,d4=4,d5=5,d6=6;break;
case 1: d1=2,d2=3,d3=32,d4=5,d5=8,d6=5;break;
case 2: d1=7,d2=7,d3=3,d4=4,d5=5,d6=5;break;
case 3: d1=7,d2=7,d3=3,d4=5,d5=5,d6=6;break;
case 4: d1=4,d2=5,d3=3,d4=32,d5=32,d6=8;break;
case 5: d1=1,d2=7,d3=7,d4=5,d5=5,d6=6;break;
case 6: d1=1,d2=7,d3=7,d4=4,d5=5,d6=6;break;
case 7: d1=2,d2=2,d3=3,d4=32,d5=32,d6=8;break;
case 8: d1=1,d2=7,d3=3,d4=4,d5=5,d6=6;break;
case 9: d1=1,d2=7,d3=3,d4=5,d5=5,d6=6;break;
}
///////////////положение цифр ЧАСОВ на экране///сейчас 2я и 3я строка..........
lcd.setCursor(e1, 1); lcd.write((uint8_t)d1); lcd.setCursor(e2, 1); lcd.write((uint8_t)d2); lcd.setCursor(e3, 1); lcd.write((uint8_t)d3);
lcd.setCursor(e1, 2); lcd.write((uint8_t)d4); lcd.setCursor(e2, 2); lcd.write((uint8_t)d5); lcd.setCursor(e3, 2); lcd.write((uint8_t)d6);
}
/*//точки между цифр
if(secon&1) //secon - нечетное
{lcd.setCursor(9,1) ;lcd.write(2); lcd.print(" ");
lcd.setCursor(9,2);lcd.print(" ");lcd.write(5);}
else //secon - четное
{lcd.setCursor(9,1) ;lcd.print(" ");lcd.write(2);
lcd.setCursor(9,2);lcd.write(5); lcd.print(" ");}*/
//снежинки между цифр
if(secon&1) //secon - нечетное
{lcd.setCursor(9,1) ;lcd.write(42); lcd.print(" ");
lcd.setCursor(9,2);lcd.print(" ");lcd.write(42);}
else //secon - четное
{lcd.setCursor(9,1) ;lcd.print(" ");lcd.write(42);
lcd.setCursor(9,2);lcd.write(42); lcd.print(" ");}
//-----------------------------------------------------------------------------------------------------------
//перемещение снежинок......первая и последняя строчки
//строчки с четными секундами
for(int i=0;i<=9;i++){
if(secon % 10 == i && secon / 10 == 0 || secon % 10 == i && secon / 10 == 2||secon % 10 == i && secon / 10 == 4)
{lcd.setCursor(0+i,0);lcd.write(42);/////чет,верхняя строка с 0го до 19го знака, сдвиг вправо, символ "*"
lcd.setCursor(19-i,3);lcd.write(42);}///чет,нижняя строка с 19го до 0го знака, сдвиг влево, символ "*"
else {lcd.setCursor(0+i,0);lcd.print(" ");////чет,верхняя строка с 0го до 19го знака, сдвиг вправо, символ " "
lcd.setCursor(19-i,3);lcd.print(" ");}//чет,нижняя строка с 19го до 0го знака, сдвиг влево, символ " "
}
//строчки с нечетными секундами
for(int i=0;i<=9;i++){
if(secon % 10 == i && secon / 10 == 1||secon % 10 == i && secon / 10 == 3||secon % 10 == i && secon / 10 == 5)
{lcd.setCursor(10+i,0);lcd.write(42);////нечет,верхняя строка с 0го до 19го знака, сдвиг вправо, символ "*"
lcd.setCursor(9-i,3);lcd.write(42);}///нечет,нижняя строка с 19го до 0го знака, сдвиг влево, символ "*"
else {lcd.setCursor(10+i,0);lcd.print(" ");//нечет,верхняя строка с 0го до 19го знака, сдвиг вправо, символ " "
lcd.setCursor(9-i,3);lcd.print(" ");}//нечет,нижняя строка с 19го до 0го знака, сдвиг влево, символ " "
}
//lcd.setCursor(0, 2); lcd.print("--------------------");
//lcd.setCursor(6, 3); lcd.print("STAND BY");
}
}
/// END LOOP
//-----------------------------------------------------------------------------------------------------------
/////
bool _isTimer(unsigned long startTime, unsigned long period )
{
unsigned long currentTime;
currentTime = millis();
if (currentTime>= startTime) {return (currentTime>=(startTime + period));} else {return (currentTime >=(4294967295-startTime+period));}
}
void fillBar0(byte start_pos, byte row, byte bar_length, byte fill_percent) {
byte infill = round((float)bar_length * fill_percent / 100);
lcd.setCursor(start_pos, row);
if (infill == 0) lcd.write(16);
else lcd.write(5);
for (int n = 1; n < bar_length - 1; n++) {
if (n < infill) lcd.write(5);
if (n >= infill) lcd.write(16);
}
if (infill == bar_length) lcd.write(5);
else lcd.write(16);
}
void au() {
if (www == 1) {
audio();
www = 0;
}
}
void cl() {
ir.value = 0;
delay(100);
lcd.clear();
}
void cl1() {
ir.value = 0;
delay(50);
}
void brig1_func() {
if (brig1 > 10) {
brig1 = 10;
} if (brig1 < 0) {
brig1 = 0;
}
}
void brig0_func() {
if (brig0 > 10) {
brig0 = 10;
} if (brig0 < 0) {
brig0 = 0;
}
}
void audio() {
pt.clear();
// pt.setVolume(75); // int 0...79
pt.setVol1(79 - (vol + ch1)); // int 0...79
pt.setVol2(79 - (vol + ch2)); // int 0...79
pt.setVol3(79 - (vol + ch3)); // int 0...79
pt.setVol4(79 - (vol + ch4)); // int 0...79
pt.setVol5(79 - (vol + ch5)); // int 0...79
pt.setVol6(79 - (vol + ch6)); // int 0...79
pt.setMute(mute); // mute 0 - off / 1 - on
}
void to_Timer() {
newPosition = myEnc.read() / 4;
}
void vol_func() {
if (0 > vol) {
vol = 0;
} if (64 < vol) {
vol = 64;
}
}
//-----------------------------------------------------------------------------------------------------------
///////маска цифр,ДЛЯ РЕГУЛЯТОРА ГРОМКОСТИ какая цифра из каких символов состоит....
///d1,d2,d3-верхняя часть цифры;d4,d5,d6-нижняя часть цифры;
void digit() {
switch (a[x]) {
//1 набор, 2,4,5 прямые// если нравится оставляем, а нижний комментируем/* */
/*case 0: d1=1,d2=2,d3=3,d4=4,d5=5,d6=6;break;
case 1: d1=2,d2=3,d3=32,d4=5,d5=8,d6=5;break;
case 2: d1=7,d2=7,d3=3,d4=8,d5=5,d6=5;break;
case 3: d1=7,d2=7,d3=3,d4=5,d5=5,d6=6;break;
case 4: d1=4,d2=5,d3=8,d4=32,d5=32,d6=8;break;
case 5: d1=8,d2=7,d3=7,d4=5,d5=5,d6=6;break;
case 6: d1=1,d2=7,d3=7,d4=4,d5=5,d6=6;break;
case 7: d1=2,d2=2,d3=3,d4=32,d5=32,d6=8;break;
case 8: d1=1,d2=7,d3=3,d4=4,d5=5,d6=6;break;
case 9: d1=1,d2=7,d3=3,d4=5,d5=5,d6=6;break;*/
//2 набор, 2,4,5 закругленные// елсли нравится оставляем, а верхий коментируем/* */
case 0: d1=1,d2=2,d3=3,d4=4,d5=5,d6=6;break;
case 1: d1=2,d2=3,d3=32,d4=5,d5=8,d6=5;break;
case 2: d1=7,d2=7,d3=3,d4=4,d5=5,d6=5;break;
case 3: d1=7,d2=7,d3=3,d4=5,d5=5,d6=6;break;
case 4: d1=4,d2=5,d3=3,d4=32,d5=32,d6=8;break;
case 5: d1=1,d2=7,d3=7,d4=5,d5=5,d6=6;break;
case 6: d1=1,d2=7,d3=7,d4=4,d5=5,d6=6;break;
case 7: d1=2,d2=2,d3=3,d4=32,d5=32,d6=8;break;
case 8: d1=1,d2=7,d3=3,d4=4,d5=5,d6=6;break;
case 9: d1=1,d2=7,d3=3,d4=5,d5=5,d6=6;break;
}
///////////////положение цифр ИНДИКАТОРА ГРОМКОСТИ на экране///сейчас 2я и 3я строка..........
lcd.setCursor(e1, 0); lcd.write((uint8_t)d1); lcd.setCursor(e2, 0); lcd.write((uint8_t)d2); lcd.setCursor(e3, 0); lcd.write((uint8_t)d3);
lcd.setCursor(e1, 1); lcd.write((uint8_t)d4); lcd.setCursor(e2, 1); lcd.write((uint8_t)d5); lcd.setCursor(e3, 1); lcd.write((uint8_t)d6);
}