PT2257 2-х канальный I2C цифровой контроллер громкости, разработан для использования в HI-FI аппаратуре и качественных автомобильных аудиосистемах, обладает низким уровнем шумов и искажений.
Основные характеристики:
- Напряжение питания от 3 до 9 В
- Регулировка громкости от -79 до 0 дБ
- Раздельная для каждого канала регулировка громкости
- Режим MUTE
- КНИ при выходном напряжении 200 мВ не превышает 0,003% при входном напряжении 2 В КНИ не более 0,07%
Библиотека https://github.com/liman324/PT2257/archive/master.zip или PT2257.zip
Тестовый скетч
#include <Wire.h> #include <PT2257.h> PT2257 rt; void setup() { Wire.begin(); } void loop() { rt.setLeft(33); // int 0...79 rt.setRight(33);// int 0...79 rt.setMute(0); // int 0...1 delay(1000); }
Тестовый скетч позволяет задавать громкость для каждого канала от 0 (мин) до 79 (макс), поддерживает режим MUTE.
На основе PT2257 и Arduino можно сделать простой регулятор громкости и баланса, регулировка будет осуществляться при помощи энкодера, а информация будет выводится на LCD дисплей 1602. Так же необходимо добавить кнопку MUTE.
Для выбора регулировки между громкостью и баланса необходимо нажать кнопку энкодера. Значения установленной громкости и баланса сохраняются в энергонезависимой памяти.
#include <Wire.h> #include <EEPROMex.h> #include <PT2257.h> #include <LiquidCrystal.h> PT2257 rt; #include <Encoder.h> Encoder myEnc(10, 11);//CLK, DT LiquidCrystal lcd(7, 6, 2, 3, 4, 5);// RS,E,D4,D5,D6,D7 int menu,vol,vol_ram,vol_d,z,balans,balans_ram,balans_d,z1; byte w,mute; long oldPosition = -999; unsigned long time,time1; byte a1[8]={0b00000,0b00000,0b11011,0b11011,0b11011,0b11011,0b00000,0b00000}; byte a2[8]={0b00000,0b00000,0b11000,0b11000,0b11000,0b11000,0b00000,0b00000}; byte a3[8]={0b00000,0b00000,0b00000,0b11011,0b11011,0b00000,0b00000,0b00000}; byte a4[8]={0b00000,0b00000,0b00000,0b11000,0b11000,0b00000,0b00000,0b00000}; void setup() { Wire.begin();Serial.begin(9600);lcd.begin(16, 2); pinMode(12,INPUT);// кнопка энкодера pinMode(A0,INPUT);// кнопка mute lcd.createChar(0,a1); lcd.createChar(1,a2);lcd.createChar(2,a3); lcd.createChar(3,a4); vol = EEPROM.read(0);// vol eeprom balans = EEPROM.read(1)-7; vol_ram=vol;balans_ram=balans; delay(1000); audio(); } void loop() { if(digitalRead(12)==LOW){menu++;myEnc.write(0);vol_ram=vol;balans_ram=balans;delay(300);if(menu>1||menu<0){menu=0;}} /////////////////////////////////////// vol ///////////////////////////////////// if(menu==0){ long newPosition = myEnc.read()/4+vol_ram; if (newPosition != oldPosition) { oldPosition = newPosition;vol=newPosition; audio();time = millis();w=1; if(vol>79){myEnc.write(0);vol_ram=79;} if(vol<0){myEnc.write(0);vol_ram=0;} }} // индикация баланс + управление кнопками +\- 4 дБ /////// if(menu==1){ long newPosition = myEnc.read()/4+balans_ram; if (newPosition != oldPosition) { oldPosition = newPosition;balans=newPosition; audio();time = millis();w=1; if(balans>7){myEnc.write(0);balans_ram=7;} if(balans<-7){myEnc.write(0);balans_ram=-7;} }} ///////////////////////////////////////////////////////////// if(millis()-time1>100){lcd.clear();vol_d=vol/3; if(vol_d>=0){for(z=0;z<=vol_d;z++){lcd.setCursor(z/2,0);if(menu==0){lcd.write((uint8_t)0);}else{lcd.write((uint8_t)2);}}} if((vol_d)%2==0){lcd.setCursor(z/2,0);if(menu==0){lcd.write((uint8_t)1);}else{lcd.write((uint8_t)3);}} lcd.setCursor(14,0);lcd.print(vol);time1=millis(); if(balans<0){lcd.setCursor(balans+7,1);if(menu==1){lcd.write((uint8_t)0);}else{lcd.write((uint8_t)2);}} if(balans>0){lcd.setCursor(balans+8,1);if(menu==1){lcd.write((uint8_t)0);}else{lcd.write((uint8_t)2);}} if(balans==0){lcd.setCursor(7,1);if(menu==1){lcd.write((uint8_t)0);}else{lcd.write((uint8_t)2);}lcd.setCursor(8,1); if(menu==1){lcd.write((uint8_t)0);}else{lcd.write((uint8_t)2);}}else{lcd.setCursor(7,1);if(balans>0){lcd.print("+");}lcd.print(balans);} } ///////////// mute //////////////////////////////// if(analogRead(A1)>900){mute++;delay(300);if(mute>1){mute=0;}audio();} ///////////// eeprom ////////////////////////////// if(millis()-time>10000 && w==1){// запись всех настроек в EEPROM через 60 сек неактивности EEPROM.update(0,vol);EEPROM.update(1,balans+7); w=0;} } void audio(){ rt.setLeft(vol-8+balans); // int 0...79 rt.setRight(vol-8-balans);// int 0...79 rt.setMute(mute); // int 0...1 }
- Pt2257 + энкодер+ lcd1602 i2c — http://forum.rcl-radio.ru/viewtopic.php?pid=6066#p6066
- Pt2257 + энкодер+ lcd1602 i2c+ ИК пульт — http://forum.rcl-radio.ru/viewtopic.php?pid=6068#p6068