ИМС TDA8425 представляет собой двухканальный (стереофонический) регулятор громкости и тембра с микропроцессорным управлением. На странице http://rcl-radio.ru/?p=51737 ранее было написано как использовать TDA8425 совместно с Arduino Nano, а в качестве органов управления были рассмотрены два варианта, это управление кнопками и управление при помощи энкодера. На этой странице будет рассмотрен вариант использования ИК-модуля VS1838B с пультом управления.
Технические характеристики ИК-модуля VS1838B:
- Потребляемый ток: 0,5 мА
- Рабочая частота: 38 КГц
- Расстояние приема сигнала: 20 м
- Эффективный угол приема сигнала: 90˚
- Рабочее напряжение (приемник): 2,7 — 5,5 В
- Рабочее напряжение (модуль): 2,7 — 5,5 В
Технические характеристики TDA8425:
- Напряжение питания минимальное 7 В
- Напряжение питания максимальное 13,2 В
- Частотный диапазон 35…20000 Гц
- Коэффициент гармоник 0,05%
- Выходное напряжение максимальное 1 В
- Регулировка громкости 48 уровней от -88 дБ до +6 дБ с шагом 2 дБ
- Регулировка тембра НЧ от -12 дБ до +15 дБ с шагом 3 дБ
- Регулировка тембра ВЧ от -12 дБ до +12 дБ с шагом 3 дБ
- Регулировка баланса 8 дБ с шагом 2 дБ
Плата Arduino Nano аудиопроцессор TDA8425 обмениваются данными на шине I2C по линиям SDA (data — данные) и SCL (clock — синхронизация).
На рисунке показано изображения пульта под команды которого написан скетч, но пульт можно применить другой, при этом коды кнопок будут соответственно другие. Даже если Вы будете использовать такой же пульт, то вероятней всего коды кнопок будут отличатся. Но в мониторе порта Вы сможете посмотреть коды кнопок и вписать в скетч свои значения.
Стоит обратить внимание на то, что в рассматриваемом пульте при удержании кнопки длительное время сначала следует код команды кнопки, а далее код 0xFFFFFFFF как код удержания нажатой кнопки, при этом код 0xFFFFFFFF подается при удержании любой кнопки. В других пультах для каждой кнопки код удержания кнопки может быть свой для каждой кнопки.
#include <IRremote.h> #include <Wire.h> #include <TDA8425.h> #include <LiquidCrystal.h> #include <EEPROM.h>//#include <EEPROMex.h> TDA8425 tda; IRrecv irrecv(12); // указываем вывод модуля IR приемника decode_results ir; LiquidCrystal lcd(7, 6, 2, 3, 4, 5);// RS,E,D4,D5,D6,D7 byte a1[8]={0b00000,0b11011,0b11011,0b11011,0b11011,0b11011,0b11011,0b00000}; byte a2[8]={0b00000,0b11000,0b11000,0b11000,0b11000,0b11000,0b11000,0b00000}; byte menu,z,g1,g2,b1,b2,n1,n2,v1,v2,in,mute,w,w1; int vol,vol_d,balans,bass,bass_d,treb,treb_d; unsigned long time,time1; void setup() { Serial.begin(9600); irrecv.enableIRIn(); // запускаем модуль IR lcd.begin(16, 2); lcd.createChar(0,a1); lcd.createChar(1,a2); vol = EEPROM.read(0);// vol eeprom bass = EEPROM.read(1);// bass eeprom treb = EEPROM.read(2);// treb eeprom in = EEPROM.read(3);// in eeprom balans = EEPROM.read(4)-4;// balans eeprom lcd.setCursor(4,0);lcd.print("TDA8425");delay(500);lcd.clear(); } void loop() { if ( irrecv.decode( &ir )) {delay(200);Serial.print("0x");Serial.println( ir.value,HEX);time1=millis();time=millis();w=1;w1=1;irrecv.resume();}// IR приемник if(ir.value==0xFF18E7){menu++;cl();if(menu>4){menu=0;}}// меню кнопка вверх 0xFF18E7 if(ir.value==0xFF4AB5){menu--;cl();if(menu==255){menu=4;}}// меню кнопка вниз 0xFF4AB5 if(ir.value==0xFFA25D){menu=0;cl();g1=0;g2=0;}// меню кнопка 1(ГРОМКОСТЬ) 0xFFA25D if(ir.value==0xFF629D){menu=1;cl();b1=0;b2=0;}// меню кнопка 2(БАЛАНС) 0xFF629D if(ir.value==0xFFE21D){menu=2;cl();n1=0;n2=0;}// меню кнопка 3(НЧ) 0xFFE21D if(ir.value==0xFF22DD){menu=3;cl();v1=0;v2=0;}// меню кнопка 4(ВЧ) 0xFF22DD if(ir.value==0xFF02FD){menu=4;cl();}// меню кнопка 5(ВЫБОР ВХОДА) 0xFF02FD ///////////////////////// громкость ///////////////////////////// if(menu==0){ // 0xFFFFFFFF - долгое нажатие любой кнопки if(ir.value==0xFF5AA5){vol++;g1=1;g2=0;cl();}// кнопка > 0xFF5AA5 if(ir.value==0xFFFFFFFF and g1==1){vol++;g2=0;cl();}// кнопка >>>>>> if(ir.value==0xFF10EF){vol--;g1=0;g2=1;cl();}// кнопка < 0xFF10EF if(ir.value==0xFFFFFFFF and g2==1){vol--;g1=0;cl();}// кнопка <<<<<< if(vol>63){vol=63;}if(vol<=16){vol=16;} lcd.setCursor(0,0);lcd.print("Volume "); vol_d=vol*2-120; if(vol_d>=0){lcd.print("+");}else{lcd.print("-");} if(vol_d>-10){{lcd.print(" ");}} lcd.print(abs(vol_d));lcd.print(" dB "); // ползунок громкости начинает работать с -56 дБ if(vol-32>0){for(z=0;z<=vol-33;z++){lcd.setCursor(z/2,1);lcd.write((uint8_t)0);}} if((vol-32)%2==0&&vol-32>=0){lcd.setCursor(z/2,1);lcd.write((uint8_t)1);} audio(); } ///////////////////////// баланс ///////////////////////////// if(menu==1){// 0xFFFFFFFF - долгое нажатие любой кнопки if(ir.value==0xFF5AA5){balans++;b1=1;b2=0;cl();}// кнопка > 0xFF5AA5 if(ir.value==0xFFFFFFFF and b1==1){balans++;b2=0;cl();}// кнопка >>>>>> if(ir.value==0xFF10EF){balans--;b1=0;b2=1;cl();}// кнопка < 0xFF10EF if(ir.value==0xFFFFFFFF and b2==1){balans--;b1=0;cl();}// кнопка <<<<<< if(balans>4){balans=4;}if(balans<-4){balans=-4;} lcd.setCursor(0,0); if(balans*2>=0){lcd.print("-");}else{lcd.print("+");} lcd.print(abs(balans*2));lcd.print(" dB "); lcd.print(" <> "); if(balans*2>=0){lcd.print("+");}else{lcd.print("-");} lcd.print(abs(balans*2));lcd.print(" dB "); lcd.setCursor(0,1);lcd.print("R"); lcd.setCursor(15,1);lcd.print("L"); if(balans<0){lcd.setCursor(balans+7,1);lcd.write((uint8_t)0);} if(balans>0){lcd.setCursor(balans+8,1);lcd.write((uint8_t)0);} if(balans==0){lcd.setCursor(7,1);lcd.write((uint8_t)0);lcd.setCursor(8,1);lcd.write((uint8_t)0);} audio(); } ///////////////////////// тембр нч ///////////////////////////// if(menu==2){// 0xFFFFFFFF - долгое нажатие любой кнопки if(ir.value==0xFF5AA5){bass++;n1=1;n2=0;cl();}// кнопка > 0xFF5AA5 if(ir.value==0xFFFFFFFF and n1==1){bass++;n2=0;cl();}// кнопка >>>>>> if(ir.value==0xFF10EF){bass--;n1=0;n2=1;cl();}// кнопка < 0xFF10EF if(ir.value==0xFFFFFFFF and n2==1){bass--;n1=0;cl();}// кнопка <<<<<< if(bass>11){bass=11;}if(bass<2||bass==255){bass=2;} lcd.setCursor(0,0);lcd.print("Bass "); bass_d=bass*3-18; if(bass_d>=0){lcd.print("+");}else{lcd.print("-");} if(bass_d>-10&&bass_d<=0||bass_d<10&&bass_d>0){{lcd.print(" ");}} lcd.print(abs(bass_d));lcd.print(" dB "); if(bass>1){for(z=3;z<=bass+1;z++){lcd.setCursor(z,1);lcd.write((uint8_t)0);}} audio(); } ///////////////////////// тембр вч ///////////////////////////// if(menu==3){// 0xFFFFFFFF - долгое нажатие любой кнопки if(ir.value==0xFF5AA5){treb++;v1=1;v2=0;cl();}// кнопка > 0xFF5AA5 if(ir.value==0xFFFFFFFF and v1==1){treb++;v2=0;cl();}// кнопка >>>>>> if(ir.value==0xFF10EF){treb--;v1=0;v2=1;cl();}// кнопка < 0xFF10EF if(ir.value==0xFFFFFFFF and v2==1){treb--;v1=0;cl();}// кнопка <<<<<< if(treb>10){treb=10;}if(treb<2||treb==255){treb=2;} lcd.setCursor(0,0);lcd.print("Treble "); treb_d=treb*3-18; if(treb_d>=0){lcd.print("+");}else{lcd.print("-");} if(treb_d>-10&&treb_d<=0||treb_d<10&&treb_d>0){{lcd.print(" ");}} lcd.print(abs(treb_d));lcd.print(" dB "); if(treb>1){for(z=3;z<=treb+1;z++){lcd.setCursor(z,1);lcd.write((uint8_t)0);}} audio(); } ///////////////////////// input ///////////////////////////// if(menu==4){ if(ir.value==0xFF5AA5){in++;cl();}// кнопка > 0xFF5AA5 if(ir.value==0xFF10EF){in--;cl();}// кнопка < 0xFF10EF if(in>1&&in<255){in=0;}if(in>2){in=1;} lcd.setCursor(0,0);lcd.print("Source selector"); lcd.setCursor(0,1);lcd.print("Input: ");lcd.print(in); audio(); } ////////////////// mute ////////////////////////////////// if(ir.value==0xFFB04F){mute++;delay(500);cl();}// кнопка # 0xFFB04F if(mute>1){mute=0;cl();menu=0;} if(mute==1){menu=-1;audio();lcd.setCursor(6,0);lcd.print("MUTE");} /////////////////// -20 dB /////////////////////////////// if(ir.value==0xFF6897){vol=vol-10;delay(500);audio();menu=0;cl();}//кнопка # 0xFF6897 if(millis()-time>10000 and w==1 and mute==0){// возврат в меню громкости через 10 сек не активности menu=0;cl();w=0;} if(millis()-time1>60000 and w1==1){ // eeprom запись при не активности 60 сек EEPROM.update(0,vol); EEPROM.update(4,balans+4); EEPROM.update(1,bass); EEPROM.update(2,treb); EEPROM.update(3,in); w1=0;} }//loop void cl(){ir.value=0;delay(100);lcd.clear();} void audio(){ tda.setVolumeL(vol+balans); tda.setVolumeR(vol-balans); tda.setBass(bass); tda.setTreble(treb); tda.setMute(mute); tda.setSource(in); }
Кнопки вверх, вниз 1,2,3,4,5 на пульте используются для навигации по меню, а это соответственно громкость, баланс, тембр НЧ, тембр ВЧ, коммутатор входа. Кнопки # — MUTE, * — 20 дБ, < и > уменьшение или увеличение громкости, тембра и др.
При не активности модуля VS1838B в течении 10 секунд происходит переход в меню громкости, а при не активности модуля в течении 60 секунд происходит сохранение всех параметров в энергонезависимую память.
Видео
как добавить в этот скетч код для спектра (http://rcl-radio.ru/?p=51737)? точнее не самого спектра, а переключение между режимами (громкость, нч, вч, спектр и тд) как только не пробовал, спектр либо горит всегда, либо режим переключился, но спектр всё-равно работает. увы, мой код на данный момент не сохранился.. спасибо!
Не совсем понял вопрос. При нажатии на кнопку энкодера, анализатор спектра на 10 секунд отключается.
я имею в виду в код с этой статьи (без энкодера, только пульт) внедрить переключение спектра между остальными режимами, проблема изложена выше
Вы хотите добавить пульт в скетч с анализатором спектра?
наоборот, добавить в скетч с пультом анализатор спектра
Я код анализатора 3 дня настраивал, думаю, что наоборот, будет проще сделать. Добавить код пульта в код с анализатором намного проще. Но энкодер я бы не советовал удалять, на нем весь код основан.
А можно ли применить вот такой дисплей:
https://ru.aliexpress.com/item/1709948156.html?spm=a2g0o.cart.0.0.48c33c00tim3A2&mp=1 ?
Смотрится поинтересней, но я не понял что у него с контроллером. То ли полностью совместим с HD44780 , то ли потребуются танцы с бубном? 🙂
Полностью совместимый.
Получил дисплеи. Правда, вместо «белого на черном» китайчик подкинул «синий на черном». Но дисплеи хорошие,смотрятся очень и очень. 🙂
Хороший дисплей, попробуйте тестовую прошивку с тремя полосками на знакоместо — http://forum.rcl-radio.ru/viewtopic.php?id=57, возможно еще лучше будет выглядеть. Если понравится скетч переделаю.
пытаюсь залить скетч, вылезает сообщение «boarddefs.h: No such file or directory»
🙁
Проверьте библиотеку IR — http://rcl-radio.ru/wp-content/uploads/2019/06/IRremote.zip
boarddefs.h — входит в состав этой библиотеки
Это я лоханулся. Удалил старую библиотеку, поставил новую — все компилируется ОК!. Только я забыл,что у меня в ардуинке 168-й камень — у него пямяти всего-то — пшик! Не лезет этот скетч в его мозг. :-)) А жаль — визуально новый вариант посимпатичнее. 🙂
Можно попробовать переделать Ваш скетч на три полосы, оптимизировать скетч, может и войдет.
Скинте Ваш скетч на форум, посмотрю что можно сделать.
А я использовал ваш скетч со странички http://rcl-radio.ru/?p=53019 в чистом виде. 🙂 Без кнопок и энкодера, исключитьельно только с IR модулем. 🙂
http://forum.rcl-radio.ru/viewtopic.php?id=62
Скетч использует 13962 байт
Вот синий.
Ну и до кучи плата контроллера
И спереди