| Ваш IP: 35.175.121.230 | Online(32) - гости: 11, боты: 21 | Загрузка сервера: 0.4 ::::::::::::

PT2257 — цифровой регулятор громкости (Arduino)

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.pdf


На основе 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
}

Добавить комментарий

Войти с помощью: 

Случайные статьи

  • Схема мигания лампы

    Схема мигания лампы

    Схема работает от постоянного напряжения 12В. Основу схемы составляют два транзистора BC557 и MOSFET IRF530. Максимальная мощность подключенной лампы (ламп) 42Вт. Все конденсаторы на напряжение не менее 25В. Время мигания лампы определяется емкостью С2.   На втором рисунке показана аналогичная схема, максимальная мощность подключенной лампы (ламп) не более 10Вт. Оригинал статьи — http://www.circuitstoday.com/12v-lamp-flasher-circuitПодробнее...
  • ТРИ НАПРЯЖЕНИЯ от одной «кроны»

    Применение в переносной аппаратуре операционных усилителей (ОУ) сразу же ставит задачу — каким обра­зом запитать их двуполярным напряжением +15 В. По­добный вопрос возникает потому, что в справочных ма­териалах параметры большинства ОУ приведены именно для этих питающих напряжений, и у многих радиолюби­телей создается впечатление, что ОУ могут хорошо рабо­тать лишь в …Подробнее...
  • Математические операторы (Arduino)

    Математические операторы (Arduino)

    +, -, *, / — сложить, вычесть, умножить, разделить pow(x, a); — возвести «х» в степень «а» ( x a ), pow может возводить в дробную степень sq(x); — возвести число «х» в квадрат ( x 2 ) sqrt(x); — взять квадратный корень числа «х» abs(x); — найти модуль числа, …Подробнее...
  • Улучшенный приемник прямого усиления на одной микросхеме

    Приемник состоит из магнитной антенны, двухкаскадного усилителя радиочастоты на логических элементах D1.1 D1.2, диодного детектора ЗЧ и усилителя ЗЧ на логических элементах D1.3-D1.6. В схеме использован детектор с удвоением напряжения, это позволяет получить лучшее подавление несущей частоты и подать декретированный сигнал прямо на вход усилителя ЗЧ. R3 — регулятор громкости, …Подробнее...
  • Мелодичный квартирный звонок

    В основе схемы звонка лежит мультивибратор на лог. элементах, частота генерации которого скачкообразно изменяется. Основной мультивибратор D1.1 D1.2. Его частота зависит от С1 и сопротивления резистора включенного между входом и выходом первого элемента. Параллельно этому резистору (R1) подключен R2. Роль переключателя выполняет один из каналов мультиплексора D2. Таким образом, когда …Подробнее...