Электронный регулятор громкости CS3310 (Arduino)

CS3310 — электронный, стерео регулятор громкости с микроконтроллерным управлением.

Основные характеристики регулятора громкости на CS3310:

  • два независимых канала
  • шаг регулировки 0,5 дБ
  • диапазон регулировки от -95,5 дБ до +31,5 дБ (127 дБ)
  • КНИ не более 0.001%
  • динамический диапазон 116 дБ
  • перекрестные помехи между каналами не более -110 дБ
  • напряжение питания ±5 В
  • MUTE

На базе Arduino можно организовать управление CS3310. Вся информация будет выводится на дисплей LCD1602 + I2C (I2C модуль на базе микросхем PCF8574 позволяют подключить символьный дисплей 1602 к плате Arduino всего по двум проводам SDA и SCL (А4 и А5), что дает возможность не использовать цифровые выходы Arduino при подключении дисплея.) Управление громкостью осуществляется при помощи энкодера KY-040. При нажатии на кнопку энкодера активируется режим MUTE.

#include <Wire.h> 
#include <EEPROM.h>
#include <Encoder.h>  // http://rcl-radio.ru/wp-content/uploads/2019/05/Encoder.zip
#include <MsTimer2.h> // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip
#include <CS3310.h>  // http://forum.rcl-radio.ru/misc.php?action=pan_download&item=582&download=1
#include <LiquidCrystal_I2C.h> //Библиотека -  http://forum.rcl-radio.ru/misc.php?action=pan_download&item=45&download=1
  LiquidCrystal_I2C lcd(0x27,16,2);  // Устанавливаем дисплей 
  Encoder myEnc(9, 8);//CLK, DT
  CS3310 cs(2,3,4);//CS,SCLK,SDATAI
 
  byte a1[8] = {0b00000,0b10101,0b10101,0b10101,0b10101,0b10101,0b10101,0b00000};
  byte a2[8] = {0b00000,0b10100,0b10100,0b10100,0b10100,0b10100,0b10100,0b00000};
  byte a3[8] = {0b00000,0b10000,0b10000,0b10000,0b10000,0b10000,0b10000,0b00000};  
  int vol,vol_d,z,z0,z1,vol_old;
  byte w,w1,mute;
  unsigned long times,oldPosition  = -999,newPosition;
 
void setup(){ 
  Wire.begin();Serial.begin(9600);
  lcd.init();lcd.backlight();
  MsTimer2::set(1, to_Timer);MsTimer2::start();
  lcd.createChar(0,a1);lcd.createChar(1,a2);lcd.createChar(2,a3);
  lcd.setCursor(0,0);lcd.print("     CS3310   ");delay(3000);lcd.clear();// ЗАСТАВКА
  vol = EEPROM.read(0);
  pinMode(7,INPUT);
  audio();
  }
 
void loop(){
   if (newPosition != oldPosition&&mute==0){oldPosition = newPosition;
   vol=vol+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w1=1;vol_func();audio();Serial.print(vol*0.5-96,1);Serial.print(" ");Serial.println(vol);} 
   vol_d=map(vol,0,255,0,45);
   if(w1==1){
   for(z=0,z0=0,z1=0;z<=vol_d;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1,1);lcd.print("   ");}}
   if(z1==3){lcd.setCursor(z0,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0,1);lcd.write((uint8_t)2);}w1=0;}
 
   if(digitalRead(7)==LOW&&mute==0){mute=1;vol_old=vol;vol=0;audio();lcd.clear();lcd.setCursor(0,0);lcd.print("      MUTE   ");delay(300);}
   if(digitalRead(7)==LOW&&mute==1){mute=0;vol=vol_old;      audio();lcd.clear();w1=1;delay(300);}
 
   if(mute==0){  
     lcd.setCursor(0,0);lcd.print("VOLUME ");
     if(vol*0.5-96>=0){lcd.print("+");}
     lcd.print(vol*0.5-96,1);lcd.print(" ");
     lcd.setCursor(14,0);lcd.print("dB");}
//     delay(10);
 
 //////// EEPROM //////////////////////////////////////////////////
  if(millis()-times>3000 && w==1){EEPROM.update(0,vol);w=0;}
  } // LOOP
 
void audio(){
  cs.setVol(vol,vol);
  // byte 0  === mute
  // byte 1...255 === -95.5...+31.5 dB (step 0.5 dB)
  }
void to_Timer(){newPosition = myEnc.read()/4;}
void vol_func(){if(vol<0){vol=0;}if(vol>255){vol=255;}
  }

Форум — http://forum.rcl-radio.ru/viewtopic.php?id=162

CS3310 — http://ali.pub/4qrcvd

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

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