регулировка громкости с регулятора и пульта селектор входов с кнопок и индикация селектора входов + пульт КНОПКА И ВЫХОД mute + пульт КНОПКА И standby + пульт
#define IR_1 0x2FDD02F // Кнопка VOL+
#define IR_2 0x2FD32CD // Кнопка VOL-
#define IR_3 0x2FD5566 // Кнопка MUTE
#define IR_4 0x2FD8888 // Кнопка STANDBY
#define IR_5 0x2FDD02F // Кнопка DVD
#define IR_6 0x2FD32CD // Кнопка TV
#define IR_7 0x2FD5566 // Кнопка GAME
#define IR_8 0x2FD8888 // Кнопка CD/MP3
#include <Wire.h>
#include <PT2323.h>
#include <PT2258.h>
#include <EEPROM.h>
#include <boarddefs.h>
#include <IRremote.h>
IRrecv irrecv(0); // указываем вывод модуля IR приемника (IR-IN)
decode_results ir;
PT2323 pt0;
PT2258 pt;
int vol,vol_old,in,mute,standby=1;
byte w,gr1,gr2,moto;
unsigned long time;
void setup() {
irrecv.enableIRIn();
Serial.begin(9600);
pinMode(A0,INPUT);// вход регулятора громкости 0...5 В
pinMode(A1,INPUT);// кнопка MUTE
pinMode(2,OUTPUT);// ВЫХОД УПР. MUTE
pinMode(A2,INPUT);// кнопка STANDBY
pinMode(3,OUTPUT);// ВЫХОД УПР. SRANDBY
//////// IN ////////////////////////////////
pinMode(4,INPUT); // in DVD
pinMode(5,INPUT); // in TV
pinMode(6,INPUT); // in GAME
pinMode(7,INPUT); // in CD/MP3
/////// LED OUTPUT /////////////////////////////
pinMode(8,OUTPUT); // in DVD
pinMode(9,OUTPUT); // in TV
pinMode(10,OUTPUT);// in GAME
pinMode(11,OUTPUT);// in CD/MP3
pinMode(12,OUTPUT);// MOUT+
pinMode(13,OUTPUT);// MOUT-
Wire.begin();
if(EEPROM.read(100)!=0){for(int i=0;i<101;i++){EEPROM.update(i,0);}}// очистка памяти при первом включении
vol = EEPROM.read(0)-79;in = EEPROM.read(1);
audio1();
audio();
}
void loop() {
///////////////////// IR ////////////////////////////////////////////////////////////////////////////////////////
if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);irrecv.resume();delay(100);time=millis();w=1;}// IR приемник - чтение, в мониторе порта отображаются коды кнопок
if(ir.value==IR_1){vol++;gr1=1;gr2=0;vol_func();audio1();audio();moto=1;}// кнопка VOL+
if(ir.value==0xFFFFFFFF and gr1==1){vol++;gr2=0;vol_func();audio1();audio();moto=1;}// кнопка >>>>>>
if(ir.value==IR_2){vol--;gr1=0;gr2=1;vol_func();audio1();audio();moto=1;}// кнопка VOL-
if(ir.value==0xFFFFFFFF and gr2==1){vol--;gr1=0;vol_func();audio1();audio();moto=1;}// кнопка <<<<<<
if(ir.value==IR_3&&mute==0){mute=1;audio1();audio();digitalWrite(2,HIGH);delay(300);}
if(ir.value==IR_3&&mute==1){mute=0;audio1();audio();digitalWrite(2,LOW);delay(300);}
if(ir.value==IR_4&&standby==1){standby=1;digitalWrite(3,HIGH);delay(300);}
if(ir.value==IR_4&&standby==0){standby=0;digitalWrite(3,LOW);delay(300);}
if(ir.value==IR_5){in=4;audio1();audio();delay(300);}
if(ir.value==IR_6){in=0;audio1();audio();delay(300);}
if(ir.value==IR_7){in=1;audio1();audio();delay(300);}
if(ir.value==IR_8){in=2;audio1();audio();delay(300);}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////// MUTE /////////////////////////////////////////////////////////////////////////////////////////
if(analogRead(A1)>900&&mute==0){mute=1;digitalWrite(2,HIGH);audio1();audio();delay(300);}
if(analogRead(A1)>900&&mute==1){mute=0;digitalWrite(2,LOW);audio1();audio();delay(300);}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////// STANDBY /////////////////////////////////////////////////////////////////////////////////////////
if(analogRead(A2)>900&&standby==1){standby=1;digitalWrite(3,HIGH);delay(300);} // усилитель вкл
if(analogRead(A2)>900&&standby==0){standby=0;digitalWrite(3,LOW);delay(300);} // усилитель выкл
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////// INPUT /////////////////////////////////////////////////////////////////////////////////////////////
if(digitalRead(4)==HIGH){in=4;audio1();audio();w=1;time=millis();delay(300);} // in DVD
if(digitalRead(5)==HIGH){in=0;audio1();audio();w=1;time=millis();delay(300);} // in TV
if(digitalRead(6)==HIGH){in=1;audio1();audio();w=1;time=millis();delay(300);} // in GAME
if(digitalRead(7)==HIGH){in=2;audio1();audio();w=1;time=millis();delay(300);} // in CD/MP3
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
switch(in){
case 4: digitalWrite(8,HIGH);digitalWrite(9,LOW);digitalWrite(10,LOW);digitalWrite(11,LOW);break;
case 0: digitalWrite(8,LOW);digitalWrite(9,HIGH);digitalWrite(10,LOW);digitalWrite(11,LOW);break;
case 1: digitalWrite(8,LOW);digitalWrite(9,LOW);digitalWrite(10,HIGH);digitalWrite(11,LOW);break;
case 2: digitalWrite(8,LOW);digitalWrite(9,LOW);digitalWrite(10,LOW);digitalWrite(11,HIGH);break;
}
if(moto==1){
if(vol>map(analogRead(A0),0,1023,0,79)){digitalWrite(12,HIGH);digitalWrite(13,LOW);}
else if(vol<map(analogRead(A0),0,1023,0,79)){digitalWrite(12,LOW);digitalWrite(13,HIGH);}
else{digitalWrite(12,LOW);digitalWrite(13,LOW);moto=0;}
}
if(moto==0){
vol_old = vol;
vol = map(analogRead(A0),0,1023,0,79);
if(vol_old!=vol){audio1();audio();w=1;time=millis();}
}
////// EEPROM ///////////////////////////////////////////////
if(millis()-time>10000 && w==1){EEPROM.update(0,vol+79);EEPROM.update(1,in);}
}
void vol_func(){if(vol>79){vol=79;}if(vol<0){vol=0;}}
void audio1(){
pt0.setInput(in);
pt0.setMute(0,0,0,0,0,0,0);
pt0.setFeature(1,1);
}
void audio(){
pt.setVolume(vol); // int 0...79
// pt.setVol1(0); // int 0...79
// pt.setVol2(0); // int 0...79
// pt.setVol3(0); // int 0...79
// pt.setVol4(0); // int 0...79
// pt.setVol5(0); // int 0...79
// pt.setVol6(0); // int 0...79
pt.setMute(mute); // mute 0 - off / 1 - on
}
Данный контент доступен только зарегистрированным пользователям.
Здравствуйте. В программе темы "Genius SW-HF 5.1 5000 (восстановление микроконтроллерного блока)" непонятная библиотека "boarddefs.h". В стандартных библиотеках Arduino IDE её нет. Буду благодарен, если вышлете эту библиотеку на почту "sa45home@yandex.ru".
Код от liman324 у меня не заработал, по этому мне пришлось переписать.
Протестирован на железе, полностью работоспособен, функционал почти полностью восстановлен, я решил не использовать еепром для сохранения последнего выбранного канала, и при нажатии кнопки выключения(кнопки stand-by) регулятор громкости не крутится в нижнее положениеи как это было в оригинале.
Считаю это несущественно, при желании этот функционал можно добавить.
Коды от пульта поставить на свои.(В этом коде поставлены коды от популярного пульта для ардуинок)
Если управление микросхемами не будет осуществляться, проверьте заданный адрес микросхем, мне пришлось в библиотеках редактировать, для pt2258 - 0x44 , для pt2323 - 0x4A
Светодиод mute подключать к 3 пину(и к 3 же пину подключать сигнал mute на усилитель) Постарался все ньюансы рассказать, возможно что то забыл, спрашивайте если что.
p.s: видео работы :
#include <IRremote.h>
#include <Wire.h>
#include <PT2323.h>
#include <PT2258.h>
#define IR_1 0xFF18E7 // Кнопка VOL+
#define IR_2 0xFF4AB5 // Кнопка VOL-
const unsigned long MOTOR_UP_CODE = 0xFF18E7; // Код кнопки "вверх" на пульте
const unsigned long MOTOR_DOWN_CODE = 0xFF4AB5; // Код кнопки "вниз" на пульте
const unsigned long REPEAT_CODE = 0xFFFFFFFF; // Код повторного нажатия при удерживании
#define IR_5 0xFFA25D // Кнопка DVD
#define IR_6 0xFF629D // Кнопка TV
#define IR_7 0xFFE21D // Кнопка GAME
#define IR_8 0xFF22DD // Кнопка CD/MP3
PT2323 pt0;
PT2258 pt;
// Пин моторчика регулятора громкости
const int motorPin1 = 12;
const int motorPin2 = 13;
const int irPin = A3; // Пин для ИК-приемника
const int standbyButton = 2; // Пин для физической кнопки standby
const int inputButton1 = 4; // Кнопка DVD
const int inputButton2 = 5; // Кнопка TV
const int inputButton3 = 6; // Кнопка GAME
const int inputButton4 = 7; // Кнопка CD/MP3
const unsigned long STANDBY_CODE = 0xFF6897; // Код кнопки standby на пульте
const unsigned long MUTE_CODE = 0xFFB04F; // Код кнопки mute на пульте
// Пин для управления mute
const int mutePin = 3; // Пин для режима mute
const int standby = A0; //
// Таймер для остановки моторчика
unsigned long motorStopTimer = 0;
const unsigned long motorTimeout = 300; // 300 мс
// Пины светодиодов для индикации каналов
const int led1 = 8;
const int led2 = 9;
const int led3 = 10;
const int led4 = 11;
const int flashled = A1;
IRrecv irrecv(irPin);
decode_results ir;
int in,mute=0;
byte w;
unsigned long time;
// Пин потенциометра для управления громкостью
const int potPin = A6;
uint8_t ochistka = 0b11000000; // Очистка регистра PT2258
bool motorRunning = false;
bool motorDirection = true; // true - вверх, false - вниз
unsigned long lastMotorCode = 0; // Код последней нажатой кнопки для управления моторчиком
// Переменные для хранения состояний
bool standbyMode = true; // Включаем режим standby при старте
bool muteMode = false; // Режим mute изначально выключен
int currentChannel = 0; // Текущий канал (используется в режиме standby)
void controlMotor(bool direction) {
if (direction) {
// Вращение в одном направлении
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, LOW);
} else {
// Вращение в обратном направлении
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, HIGH);
}
motorRunning = true;
motorDirection = direction;
motorStopTimer = millis(); // Обновляем таймер при каждом управлении моторчиком
}
void stopMotor() {
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, LOW);
motorRunning = false;
}
void audio1(){
pt0.setInput(in);
pt0.setMute(0,0,0,0,0,0,0);
pt0.setFeature(1,1);
}
void audio(){
pt.setVolume(0); // int 0...79
// pt.setVol1(0); // int 0...79
// pt.setVol2(0); // int 0...79
// pt.setVol3(0); // int 0...79
// pt.setVol4(0); // int 0...79
// pt.setVol5(0); // int 0...79
// pt.setVol6(0); // int 0...79
pt.setMute(0); // mute 0 - off / 1 - on
}
void start_pt2258(void) // очистим все регистры PT2258
{
Wire.beginTransmission(PT2258_address); // передаем адрес
Wire.write(ochistka); // команда при старте очистка всех регистров
Wire.endTransmission(); // закончили передачу
}
void setup() {
pinMode(motorPin1, OUTPUT);
pinMode(motorPin2, OUTPUT);
Serial.begin(9600);
Wire.begin();
Wire.setClock(100000);
audio();audio1();
// Настраиваем кнопки как входы
pinMode(inputButton1, INPUT_PULLUP);
pinMode(inputButton2, INPUT_PULLUP);
pinMode(inputButton3, INPUT_PULLUP);
pinMode(inputButton4, INPUT_PULLUP);
pinMode(standbyButton, INPUT_PULLUP);
pinMode(flashled, OUTPUT);
// Настраиваем пины светодиодов как выходы
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
// Настраиваем пин для управления mute как выход
pinMode(mutePin, OUTPUT);
digitalWrite(mutePin, HIGH); // Изначально mute выключен
pinMode(standby, OUTPUT);
// Устанавливаем все светодиоды и моторчик в начальное состояние (выключены)
digitalWrite(led1, HIGH);
digitalWrite(led2, HIGH);
digitalWrite(led3, HIGH);
digitalWrite(led4, HIGH);
digitalWrite(flashled, HIGH);
stopMotor();
start_pt2258(); // очистим все регистры PT2258
// Если режим standby включён, не восстанавливаем канал и не включаем светодиоды
if (standbyMode) {
// В режиме standby все светодиоды выключены
digitalWrite(led1, HIGH);
digitalWrite(led2, HIGH);
digitalWrite(led3, HIGH);
digitalWrite(led4, HIGH);
stopMotor(); // Останавливаем моторчик
digitalWrite(standby, LOW);
digitalWrite(flashled, HIGH);
// Выключенный Mute по умолчанию в режиме standby
digitalWrite(mutePin, HIGH);
} else {
digitalWrite(standby, HIGH);
digitalWrite(flashled, LOW);
// Восстанавливаем сохранённый канал
// switchInput(savedChannel);
// currentChannel = savedChannel;
}
irrecv.enableIRIn(); // Включаем прием ИК-сигналов
}
void loop() {
// Останавливаем мотор, если кнопка не была нажата в течение определённого времени
if (motorRunning && millis() - motorStopTimer > motorTimeout) {
stopMotor();
}
int potValue = analogRead(A6); // Чтение значения потенциометра (0-1023)
int volume = map(potValue, 0, 1023, 0, 79); // Преобразование значения потенциометра в диапазон 0-79
pt.setVolume(volume); // Установка громкости
delay(40); // Пауза для избежания слишком частого обновления
// Проверка кнопки standby
if (digitalRead(standbyButton) == LOW) {
standbyMode = !standbyMode; // Переключаем режим standby
delay(200); // Задержка для предотвращения дребезга кнопки
if (standbyMode) {
// В режиме standby все светодиоды выключены
digitalWrite(led1, HIGH);
digitalWrite(led2, HIGH);
digitalWrite(led3, HIGH);
digitalWrite(led4, HIGH);
digitalWrite(flashled, HIGH);
stopMotor(); // Останавливаем моторчик
digitalWrite(mutePin, HIGH); // mute выключен (в режиме standby mute всегда выключен)
digitalWrite(standby, LOW);
}
else {
// Восстанавливаем сохранённый канал
// int savedChannel = EEPROM.read(eepromChannelAddr);
// switchInput(savedChannel);
digitalWrite(standby, HIGH);
digitalWrite(flashled, LOW);
delay(200); // Задержка для предотвращения повторного срабатывания
}
return; // Прекращаем выполнение остального кода в режиме standby
}
////////////// INPUT /////////////////////////////////////////////////////////////////////////////////////////////
if (!standbyMode)
{
if(digitalRead(inputButton1) == LOW){in=4;audio1();audio();w=1;time=millis();delay(100);} // in DVD
if(digitalRead(inputButton2) == LOW){in=0;audio1();audio();w=1;time=millis();delay(100);} // in TV
if(digitalRead(inputButton3) == LOW){in=1;audio1();audio();w=1;time=millis();delay(100);} // in GAME
if(digitalRead(inputButton4) == LOW){in=2;audio1();audio();w=1;time=millis();delay(100);} // in CD/MP3
switch(in){
case 4: digitalWrite(8,LOW);digitalWrite(9,HIGH);digitalWrite(10,HIGH);digitalWrite(11,HIGH);break;
case 0: digitalWrite(8,HIGH);digitalWrite(9,LOW);digitalWrite(10,HIGH);digitalWrite(11,HIGH);break;
case 1: digitalWrite(8,HIGH);digitalWrite(9,HIGH);digitalWrite(10,LOW);digitalWrite(11,HIGH);break;
case 2: digitalWrite(8,HIGH);digitalWrite(9,HIGH);digitalWrite(10,HIGH);digitalWrite(11,LOW);break;
}
if(ir.value==IR_5){in=4;audio1();audio();delay(50);}
if(ir.value==IR_6){in=0;audio1();audio();delay(50);}
if(ir.value==IR_7){in=1;audio1();audio();delay(50);}
if(ir.value==IR_8){in=2;audio1();audio();delay(50);}
}
if (irrecv.decode( &ir )) {
unsigned long code = ir.value;
Serial.print("0x");Serial.println(ir.value,HEX);irrecv.resume();
delay(100);
time=millis(); w=1;
if(!standbyMode){
if (code == MOTOR_UP_CODE) {
controlMotor(true);
motorDirection = true; // Вращение моторчика в одном направлении (вверх)
lastMotorCode = MOTOR_UP_CODE;
} else if (code == MOTOR_DOWN_CODE) {
controlMotor(false); // Вращение моторчика в обратном направлении (вниз)
motorDirection = false;
lastMotorCode = MOTOR_DOWN_CODE;
} else if (code == REPEAT_CODE && (lastMotorCode == MOTOR_UP_CODE || lastMotorCode == MOTOR_DOWN_CODE)) {
// Продолжаем вращение моторчика в том же направлении
controlMotor(lastMotorCode == MOTOR_UP_CODE);
} else {
// Останавливаем мотор, если код не связан с моторчиком
stopMotor();
lastMotorCode = 0; // Сбрасываем код последней кнопки
}
}
// Включение/выключение режима standby с пульта
if (code == STANDBY_CODE || digitalRead(standbyButton) == LOW) {
standbyMode = !standbyMode; // Переключаем режим standby
if (standbyMode) {
// В режиме standby все светодиоды выключены
digitalWrite(led1, HIGH);
digitalWrite(led2, HIGH);
digitalWrite(led3, HIGH);
digitalWrite(led4, HIGH);
digitalWrite(flashled, HIGH);
stopMotor(); // Останавливаем моторчик
// Устанавливаем пин D3 в LOW
digitalWrite(mutePin, HIGH);
digitalWrite(standby, LOW);
} else {
// Восстанавливаем сохранённый канал
// int savedChannel = EEPROM.read(eepromChannelAddr);
digitalWrite(standby, HIGH);
digitalWrite(flashled, LOW);
// digitalWrite(HIGH);
// switchInput(savedChannel);
}
delay(50); // Задержка для предотвращения повторного срабатывания
}
// Включение/выключение режима mute с пульта
if (code == MUTE_CODE) {
muteMode = !muteMode; // Переключаем режим mute
digitalWrite(mutePin, muteMode ? HIGH : LOW); // Управляем пином mute
delay(100); // Задержка для предотвращения повторного срабатывания
}
}
}