Тема: Индикатор уровня аудио сигнала на светодиодной шкале SHB10R
Индикатор уровня на светодиодной шкале SHB10R.
Основная статья - http://rcl-radio.ru/?p=67845
Индикатор содержит 20 светодиодов на канал (ПК ЛК итого 40 шт) по 2 светодиодной шкале SHB10R.
Компоненты:
SHB10R - 4 шт
Arduino Nano
BC547 - 4 шт
Резисторы 470 Ом 0,125 Вт 20 шт
Резисторы 4,7 кОм 0,125 Вт 2 шт
Резисторы 1 кОм 0,125 Вт 4 шт
#include <MsTimer2.h> // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip
byte i,dig,seg,dig_l,dig_r,sum_r,sum_l,old_r;
int arr_r[15],arr_l[15];
int arr_r_max = 0,arr_l_max = 0,l,r,n,m;
unsigned long times;
void setup() {
MsTimer2::set(4, to_Timer);MsTimer2::start();
analogReference(INTERNAL);// аудио вход 1,1 В максимум
for(i=0;i<=13;i++){pinMode(i,OUTPUT);}
pinMode(A0,INPUT);
pinMode(A1,INPUT);
}
void loop() {
if(n==0){
for(int i = 0; i < 15; i++){
arr_r[i] = analogRead(A0)/15;
arr_l[i] = analogRead(A1)/15;
arr_r_max = max(arr_r_max, arr_r[i]);
arr_l_max = max(arr_l_max, arr_l[i]);
delay(1);
}
dig_r = arr_r_max;dig_l = arr_l_max;
if(dig_r>20){dig_r=20;}
if(dig_l>20){dig_l=20;}
arr_r_max=0; arr_l_max=0;}
if(analogRead(A0)/10<dig_r){dig_r=dig_r-1;delay(10);n=1;}else{n=0;}
if(analogRead(A1)/10<dig_l){dig_l=dig_l-1;delay(10);m=1;}else{m=0;}
/// медленное затухание шкалы
//if(analogRead(A0)/10<dig_r){dig_r=dig_r-1;delay(30);n=1;}else{n=0;}
//if(analogRead(A1)/10<dig_l){dig_l=dig_l-1;delay(30);m=1;}else{m=0;}
}// loop
void to_Timer(){
switch(i){
case 0: if(dig_r<=10){cl();dig=0;seg=dig_r;digital();segment();}else{dig=0;seg=10;digital();segment();}break;
case 1: if(dig_r<=10){cl();dig=1;seg=0;digital();segment();}else{dig=1;seg=dig_r-10;digital();segment();}break;
case 2: if(dig_l<=10){cl();dig=2;seg=dig_l;digital();segment();}else{dig=2;seg=10;digital();segment();}break;
case 3: if(dig_l<=10){cl();dig=3;seg=0;digital();segment();}else{dig=3;seg=dig_l-10;digital();segment();}break;
}i++;if(i>3){i=0;}
delay(3);
cl();}
void segment(){
switch(seg){
// 1 2 3 4 5 6 7 8 9 10
case 0: ch(2,0);ch(3,0);ch(4,0);ch(5,0);ch(6,0);ch(7,0);ch(8,0);ch(9,0);ch(10,0);ch(11,0);break;
case 1: ch(2,1);ch(3,0);ch(4,0);ch(5,0);ch(6,0);ch(7,0);ch(8,0);ch(9,0);ch(10,0);ch(11,0);break;
case 2: ch(2,1);ch(3,1);ch(4,0);ch(5,0);ch(6,0);ch(7,0);ch(8,0);ch(9,0);ch(10,0);ch(11,0);break;
case 3: ch(2,1);ch(3,1);ch(4,1);ch(5,0);ch(6,0);ch(7,0);ch(8,0);ch(9,0);ch(10,0);ch(11,0);break;
case 4: ch(2,1);ch(3,1);ch(4,1);ch(5,1);ch(6,0);ch(7,0);ch(8,0);ch(9,0);ch(10,0);ch(11,0);break;
case 5: ch(2,1);ch(3,1);ch(4,1);ch(5,1);ch(6,1);ch(7,0);ch(8,0);ch(9,0);ch(10,0);ch(11,0);break;
case 6: ch(2,1);ch(3,1);ch(4,1);ch(5,1);ch(6,1);ch(7,1);ch(8,0);ch(9,0);ch(10,0);ch(11,0);break;
case 7: ch(2,1);ch(3,1);ch(4,1);ch(5,1);ch(6,1);ch(7,1);ch(8,1);ch(9,0);ch(10,0);ch(11,0);break;
case 8: ch(2,1);ch(3,1);ch(4,1);ch(5,1);ch(6,1);ch(7,1);ch(8,1);ch(9,1);ch(10,0);ch(11,0);break;
case 9: ch(2,1);ch(3,1);ch(4,1);ch(5,1);ch(6,1);ch(7,1);ch(8,1);ch(9,1);ch(10,1);ch(11,0);break;
case 10: ch(2,1);ch(3,1);ch(4,1);ch(5,1);ch(6,1);ch(7,1);ch(8,1);ch(9,1);ch(10,1);ch(11,1);break;}}
void digital(){
switch(dig){
case 0: ch(0,0);ch(1,0);ch(12,0);ch(13,1);break;//1
case 1: ch(0,0);ch(1,0);ch(12,1);ch(13,0);break;//2
case 2: ch(0,0);ch(1,1);ch(12,0);ch(13,0);break;//3
case 3: ch(0,1);ch(1,0);ch(12,0);ch(13,0);break;//4
}}
void cl(){
dig=0;seg=0;segment();digital();
dig=1;seg=0;segment();digital();
dig=2;seg=0;segment();digital();
dig=3;seg=0;segment();digital();
}
void ch(int pin, int logic){digitalWrite(pin,logic);}