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