Индикатор уровня аудио сигнала на светодиодной шкале SHB10R (Arduino)

Светодиодная шкала SHB10R — это, по сути, 10 независимых светодиодов в одном корпусе, выложенных в форме шкалы. У индикатора 20 ножек: анод и катод для каждого светодиода.

На основе Arduino используя светодиодную шкалу SHB10R можно сделать простой индикатор уровня аудио сигнала. Всего используется 4 таких шкалы, по 20 светодиодов на канал. Так как кол-во цифровых выходов платы Arduino ограничено, то используется динамическая индикация, при этом 10 цифровых выходов Arduino используется для управления анодами светодиодной шкалы и 4 для управления катодами которые замкнуты вместе в каждой отдельной шкале.

Схема достаточно проста и содержит помимо платы Arduino 4 транзистора BC547 и 16 резисторов.

#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;}
}// 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);}

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

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

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