Светодиодная шкала 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);}