1

Тема: Анализатор спектра (Разработка)

http://forum.rcl-radio.ru/uploads/images/2020/01/24d2b189b5d7e5f7f691bd7da81060ce.gif
Данный контент доступен только зарегистрированным пользователям.


Данный контент доступен только зарегистрированным пользователям.


Сборка

2

Re: Анализатор спектра (Разработка)

Это что за "замануха" свежая ?  Наверно мне придется сделать. В только осилил 20 светодиодов.  Напишите в кранце -  в чем задумка ?

3

Re: Анализатор спектра (Разработка)

Обычный анализатор аудио спектра, красивая мигалка, семь полос по 20 диодов. Я только начал делать еще схему не собрал, скетч даже писать еще не начал. Что из этого выйдет не знаю, может и не получится.

4

Re: Анализатор спектра (Разработка)

Вот это по моему (аналог). Схему на печатке делать будете ?  Я на макетке задолбался мультиплексировать.  Семь каналов по каким критериям разделены ?

5

Re: Анализатор спектра (Разработка)

Разделение по частоте. Печатки не будет.

6

Re: Анализатор спектра (Разработка)

Данный контент доступен только зарегистрированным пользователям.
http://forum.rcl-radio.ru/uploads/images/2020/01/62753091f0d167edc0e8f94890a57d42.jpg


#include <FlexiTimer2.h>
byte ur[8];
byte i,dig,seg,f;

void setup() { 
 FlexiTimer2::set(2, 1.0/6000, flash);  FlexiTimer2::start();
  for(i=0;i<=13;i++){pinMode(i,OUTPUT);}
  analogReference(INTERNAL);// аудио вход 1,1 В максимум

}
 void loop(){
/*
   ur[1]=random(0,20);
   ur[2]=random(0,20);
   ur[3]=random(0,20);
   ur[4]=random(0,20);
   ur[5]=random(0,20);
   ur[6]=random(0,20);
   ur[7]=random(0,20);
 */  
 for(f=0;f<21;f++){delay(300);
   ur[1]=f;
   ur[2]=f;
   ur[3]=f;
   ur[4]=f;
   ur[5]=f;
   ur[6]=f;
   ur[7]=f;}
   delay(50);
 }

void flash(){ 
  switch(i){
    // 1 ряд
    case 0: cl();if(ur[1]<=10){dig=1;seg=ur[1];digital();segment();}else{dig=1;seg=10;digital();segment();}break;
    case 1: cl();if(ur[1]<=10){dig=2;seg=0;digital();segment();}else{dig=2;seg=ur[1]-10;digital();segment();}break;    
    // 2 ряд
    case 2: cl();if(ur[2]<=10){dig=3;seg=ur[2];digital();segment();}else{dig=3;seg=10;digital();segment();}break;
    case 3: cl();if(ur[2]<=10){dig=4;seg=0;digital();segment();}else{dig=4;seg=ur[2]-10;digital();segment();}break;   
    // 3 ряд
    case 4: cl();if(ur[3]<=10){dig=5;seg=ur[3];digital();segment();}else{dig=5;seg=10;digital();segment();}break;
    case 5: cl();if(ur[3]<=10){dig=6;seg=0;digital();segment();}else{dig=6;seg=ur[3]-10;digital();segment();}break;   
    // 4 ряд
    case 6: cl();if(ur[4]<=10){dig=7;seg=ur[4];digital();segment();}else{dig=7;seg=10;digital();segment();}break;
    case 7: cl();if(ur[4]<=10){dig=8;seg=0;digital();segment();}else{dig=8;seg=ur[4]-10;digital();segment();}break;
    // 5 ряд
    case 8: cl();if(ur[5]<=10){dig=9;seg=ur[5];digital();segment();}else{dig=9;seg=10;digital();segment();}break;
    case 9: cl();if(ur[5]<=10){dig=10;seg=0;digital();segment();}else{dig=10;seg=ur[5]-10;digital();segment();}break;
    // 6 ряд
    case 10: cl();if(ur[6]<=10){dig=11;seg=ur[6];digital();segment();}else{dig=11;seg=10;digital();segment();}break;
    case 11: cl();if(ur[6]<=10){dig=12;seg=0;digital();segment();}else{dig=12;seg=ur[6]-10;digital();segment();}break;
    // 7 ряд
    case 12: cl();if(ur[7]<=10){dig=13;seg=ur[7];digital();segment();}else{dig=13;seg=10;digital();segment();}break;
    case 13: cl();if(ur[7]<=10){dig=14;seg=0;digital();segment();}else{dig=14;seg=ur[7]-10;digital();segment();}break; }
   
 if(seg<=3){delayMicroseconds(50);}else{delayMicroseconds(250);}
    i++;if(i>13){i=0;}
  }

 void segment(){ 
 switch(seg){
            //  1       2        3      4       5       6       7       8       9       10
    case 0: ch(11,0);ch(10,0);ch(9,0);ch(8,0);ch(7,0);ch(6,0);ch(5,0);ch(4,0);ch(3,0);ch(2,0);break;
    case 1: ch(11,1);ch(10,0);ch(9,0);ch(8,0);ch(7,0);ch(6,0);ch(5,0);ch(4,0);ch(3,0);ch(2,0);break;
    case 2: ch(11,1);ch(10,1);ch(9,0);ch(8,0);ch(7,0);ch(6,0);ch(5,0);ch(4,0);ch(3,0);ch(2,0);break;
    case 3: ch(11,1);ch(10,1);ch(9,1);ch(8,0);ch(7,0);ch(6,0);ch(5,0);ch(4,0);ch(3,0);ch(2,0);break;
    case 4: ch(11,1);ch(10,1);ch(9,1);ch(8,1);ch(7,0);ch(6,0);ch(5,0);ch(4,0);ch(3,0);ch(2,0);break;
    case 5: ch(11,1);ch(10,1);ch(9,1);ch(8,1);ch(7,1);ch(6,0);ch(5,0);ch(4,0);ch(3,0);ch(2,0);break;
    case 6: ch(11,1);ch(10,1);ch(9,1);ch(8,1);ch(7,1);ch(6,1);ch(5,0);ch(4,0);ch(3,0);ch(2,0);break;
    case 7: ch(11,1);ch(10,1);ch(9,1);ch(8,1);ch(7,1);ch(6,1);ch(5,1);ch(4,0);ch(3,0);ch(2,0);break;
    case 8: ch(11,1);ch(10,1);ch(9,1);ch(8,1);ch(7,1);ch(6,1);ch(5,1);ch(4,1);ch(3,0);ch(2,0);break;
    case 9: ch(11,1);ch(10,1);ch(9,1);ch(8,1);ch(7,1);ch(6,1);ch(5,1);ch(4,1);ch(3,1);ch(2,0);break;
   case 10: ch(11,1);ch(10,1);ch(9,1);ch(8,1);ch(7,1);ch(6,1);ch(5,1);ch(4,1);ch(3,1);ch(2,1);break;}}   

void digital(){  
   switch(dig){ 
     //////// К155ИД3 ////////////////////////////////////////
     case 1: ch(0,0);ch(1,0);ch(12,0);ch(13,0);break; // 0000
     case 2: ch(0,0);ch(1,0);ch(12,0);ch(13,1);break; // 0001
     case 3: ch(0,0);ch(1,0);ch(12,1);ch(13,0);break; // 0010
     case 4: ch(0,0);ch(1,0);ch(12,1);ch(13,1);break; // 0011
     case 5: ch(0,0);ch(1,1);ch(12,0);ch(13,0);break; // 0100
     case 6: ch(0,0);ch(1,1);ch(12,0);ch(13,1);break; // 0101
     case 7: ch(0,0);ch(1,1);ch(12,1);ch(13,0);break; // 0110
     case 8: ch(0,0);ch(1,1);ch(12,1);ch(13,1);break; // 0111
     case 9: ch(0,1);ch(1,0);ch(12,0);ch(13,0);break; // 1000
     case 10: ch(0,1);ch(1,0);ch(12,0);ch(13,1);break;// 1001
     case 11: ch(0,1);ch(1,0);ch(12,1);ch(13,0);break;// 1010
     case 12: ch(0,1);ch(1,0);ch(12,1);ch(13,1);break;// 1011
     case 13: ch(0,1);ch(1,1);ch(12,0);ch(13,0);break;// 1100
     case 14: ch(0,1);ch(1,1);ch(12,0);ch(13,1);break;// 1101
     }}
 
void cl(){
   dig=1;seg=0;segment();digital();
   dig=2;seg=0;segment();digital();
   dig=3;seg=0;segment();digital();
   dig=4;seg=0;segment();digital();
   dig=5;seg=0;segment();digital();
   dig=6;seg=0;segment();digital();
   dig=7;seg=0;segment();digital();
   dig=8;seg=0;segment();digital();
   dig=9;seg=0;segment();digital();
   dig=10;seg=0;segment();digital();
   dig=11;seg=0;segment();digital();
   dig=12;seg=0;segment();digital();
   dig=13;seg=0;segment();digital();
   dig=14;seg=0;segment();digital();
  }     
 
void ch(int pin, int logic){digitalWrite(pin,logic);}

7

Re: Анализатор спектра (Разработка)

http://forum.rcl-radio.ru/uploads/images/2020/01/56d914ddd696a812e6c68d63069bac5d.gif

8

Re: Анализатор спектра (Разработка)

Анализатор спектра

#define AUTO_GAIN 1       // автонастройка по громкости (экспериментальная функция)
#define VOL_THR 65        // порог тишины (ниже него отображения на матрице не будет)
#define LOW_PASS 60       // нижний порог чувствительности шумов (нет скачков при отсутствии звука)
#define DEF_GAIN 120       // максимальный порог по умолчанию 
#define FHT_N 128          // ширина спектра х2
#define LOG_OUT 1

#include <FlexiTimer2.h>
#include <FHT.h>  
  byte ur[8],urr[8];;
  byte i,dig,seg,i1;
  byte posOffset[7] = {4, 6, 10, 15, 25, 30, 35};
  byte gain_sp = DEF_GAIN;   
  unsigned long gainTimer;
  byte maxValue, maxValue_f;
  float k = 0.1;

void setup() { 
  FlexiTimer2::set(2, 1.0/2000, flash);  FlexiTimer2::start();
  ADMUX  = 0b01100000; ADCSRA = 0b11010110;
  for(i=0;i<=13;i++){pinMode(i,OUTPUT);}
}

 void loop(){
    analyzeAudio();   // функция FHT, забивает массив fht_log_out[] величинами по спектру

      for (int pos = 0; pos < 7; pos++) {  
        if (fht_log_out[posOffset[pos]] > maxValue) maxValue = fht_log_out[posOffset[pos]];
       
        int posLevel = map(fht_log_out[posOffset[pos]], LOW_PASS, gain_sp, 0, 20);posLevel = constrain(posLevel, 0, 20);

         urr[pos] = posLevel;
         if(urr[pos]<ur[pos]){ur[pos]=ur[pos]-1;}
         else{
         ur[pos] = posLevel;}
         delay(1);
         //delayMicroseconds(500);
 }

   if (AUTO_GAIN) {
    maxValue_f = maxValue * k + maxValue_f * (1 - k);
    if (millis() - gainTimer > 1500) {   
    if (maxValue_f > VOL_THR) gain_sp = maxValue_f;
      else gain_sp = 150;gainTimer = millis();}
      else {gain_sp = DEF_GAIN;}}
 }// loop

void flash(){ 
  switch(i){
    // 1 ряд
    case 0: cl();if(ur[0]<=10){dig=1;seg=ur[0];digital();segment();}else{dig=1;seg=10;digital();segment();}break;
    case 1: cl();if(ur[0]<=10){dig=2;seg=0;digital();segment();}else{dig=2;seg=ur[0]-10;digital();segment();}break;    
    // 2 ряд
    case 2: cl();if(ur[1]<=10){dig=3;seg=ur[1];digital();segment();}else{dig=3;seg=10;digital();segment();}break;
    case 3: cl();if(ur[1]<=10){dig=4;seg=0;digital();segment();}else{dig=4;seg=ur[1]-10;digital();segment();}break;   
    // 3 ряд
    case 4: cl();if(ur[2]<=10){dig=5;seg=ur[2];digital();segment();}else{dig=5;seg=10;digital();segment();}break;
    case 5: cl();if(ur[2]<=10){dig=6;seg=0;digital();segment();}else{dig=6;seg=ur[2]-10;digital();segment();}break;   
    // 4 ряд
    case 6: cl();if(ur[3]<=10){dig=7;seg=ur[3];digital();segment();}else{dig=7;seg=10;digital();segment();}break;
    case 7: cl();if(ur[3]<=10){dig=8;seg=0;digital();segment();}else{dig=8;seg=ur[3]-10;digital();segment();}break;
    // 5 ряд
    case 8: cl();if(ur[4]<=10){dig=9;seg=ur[4];digital();segment();}else{dig=9;seg=10;digital();segment();}break;
    case 9: cl();if(ur[4]<=10){dig=10;seg=0;digital();segment();}else{dig=10;seg=ur[4]-10;digital();segment();}break;
    // 6 ряд
    case 10: cl();if(ur[5]<=10){dig=11;seg=ur[5];digital();segment();}else{dig=11;seg=10;digital();segment();}break;
    case 11: cl();if(ur[5]<=10){dig=12;seg=0;digital();segment();}else{dig=12;seg=ur[5]-10;digital();segment();}break;
    // 7 ряд
    case 12: cl();if(ur[6]<=10){dig=13;seg=ur[6];digital();segment();}else{dig=13;seg=10;digital();segment();}break;
    case 13: cl();if(ur[6]<=10){dig=14;seg=0;digital();segment();}else{dig=14;seg=ur[6]-10;digital();segment();}break; }
   
 if(seg<=3){}else{delayMicroseconds(100);}
    i++;if(i>13){i=0;}
  }

 void segment(){ 
 switch(seg){
            //  1       2        3      4       5       6       7       8       9       10
    case 0: ch(11,0);ch(10,0);ch(9,0);ch(8,0);ch(7,0);ch(6,0);ch(5,0);ch(4,0);ch(3,0);ch(2,0);break;
    case 1: ch(11,1);ch(10,0);ch(9,0);ch(8,0);ch(7,0);ch(6,0);ch(5,0);ch(4,0);ch(3,0);ch(2,0);break;
    case 2: ch(11,1);ch(10,1);ch(9,0);ch(8,0);ch(7,0);ch(6,0);ch(5,0);ch(4,0);ch(3,0);ch(2,0);break;
    case 3: ch(11,1);ch(10,1);ch(9,1);ch(8,0);ch(7,0);ch(6,0);ch(5,0);ch(4,0);ch(3,0);ch(2,0);break;
    case 4: ch(11,1);ch(10,1);ch(9,1);ch(8,1);ch(7,0);ch(6,0);ch(5,0);ch(4,0);ch(3,0);ch(2,0);break;
    case 5: ch(11,1);ch(10,1);ch(9,1);ch(8,1);ch(7,1);ch(6,0);ch(5,0);ch(4,0);ch(3,0);ch(2,0);break;
    case 6: ch(11,1);ch(10,1);ch(9,1);ch(8,1);ch(7,1);ch(6,1);ch(5,0);ch(4,0);ch(3,0);ch(2,0);break;
    case 7: ch(11,1);ch(10,1);ch(9,1);ch(8,1);ch(7,1);ch(6,1);ch(5,1);ch(4,0);ch(3,0);ch(2,0);break;
    case 8: ch(11,1);ch(10,1);ch(9,1);ch(8,1);ch(7,1);ch(6,1);ch(5,1);ch(4,1);ch(3,0);ch(2,0);break;
    case 9: ch(11,1);ch(10,1);ch(9,1);ch(8,1);ch(7,1);ch(6,1);ch(5,1);ch(4,1);ch(3,1);ch(2,0);break;
   case 10: ch(11,1);ch(10,1);ch(9,1);ch(8,1);ch(7,1);ch(6,1);ch(5,1);ch(4,1);ch(3,1);ch(2,1);break;}}   

void digital(){  
   switch(dig){ 
     //////// К155ИД3 ////////////////////////////////////////
     case 1: ch(0,0);ch(1,0);ch(12,0);ch(13,0);break; // 0000
     case 2: ch(0,0);ch(1,0);ch(12,0);ch(13,1);break; // 0001
     case 3: ch(0,0);ch(1,0);ch(12,1);ch(13,0);break; // 0010
     case 4: ch(0,0);ch(1,0);ch(12,1);ch(13,1);break; // 0011
     case 5: ch(0,0);ch(1,1);ch(12,0);ch(13,0);break; // 0100
     case 6: ch(0,0);ch(1,1);ch(12,0);ch(13,1);break; // 0101
     case 7: ch(0,0);ch(1,1);ch(12,1);ch(13,0);break; // 0110
     case 8: ch(0,0);ch(1,1);ch(12,1);ch(13,1);break; // 0111
     case 9: ch(0,1);ch(1,0);ch(12,0);ch(13,0);break; // 1000
     case 10: ch(0,1);ch(1,0);ch(12,0);ch(13,1);break;// 1001
     case 11: ch(0,1);ch(1,0);ch(12,1);ch(13,0);break;// 1010
     case 12: ch(0,1);ch(1,0);ch(12,1);ch(13,1);break;// 1011
     case 13: ch(0,1);ch(1,1);ch(12,0);ch(13,0);break;// 1100
     case 14: ch(0,1);ch(1,1);ch(12,0);ch(13,1);break;// 1101
     }}
 
void cl(){
   dig=1;seg=0;segment();digital();
   dig=2;seg=0;segment();digital();
   dig=3;seg=0;segment();digital();
   dig=4;seg=0;segment();digital();
   dig=5;seg=0;segment();digital();
   dig=6;seg=0;segment();digital();
   dig=7;seg=0;segment();digital();
   dig=8;seg=0;segment();digital();
   dig=9;seg=0;segment();digital();
   dig=10;seg=0;segment();digital();
   dig=11;seg=0;segment();digital();
   dig=12;seg=0;segment();digital();
   dig=13;seg=0;segment();digital();
   dig=14;seg=0;segment();digital();
  }     
 
void ch(int pin, int logic){digitalWrite(pin,logic);}

void analyzeAudio() { 
 while(i1 < FHT_N){i1++; 
    do{ADCSRA |= (1 << ADSC);} 
    while((ADCSRA & (1 << ADIF)) == 0);fht_input[i1] = (ADCL|ADCH << 8);}i1=0;
    fht_window(); // window the data for better frequency response
    fht_reorder(); // reorder the data before doing the fht
    fht_run(); // process the data in the fht
    fht_mag_log(); // take the output of the fht
}

9

Re: Анализатор спектра (Разработка)

Разработка и тестирование завершено

На вход А0 через конденсатор 0.1мкФ подать аудиосигнал

http://forum.rcl-radio.ru/uploads/images/2020/01/0a1f50e664ad47122d9eb6f3ba602479.jpg

Библиотеки
Данный контент доступен только зарегистрированным пользователям.
Данный контент доступен только зарегистрированным пользователям.


#define AUTO_GAIN 1       // автонастройка по громкости (экспериментальная функция)
#define VOL_THR 75        // порог тишины (ниже него отображения на матрице не будет)
#define LOW_PASS 70       // нижний порог чувствительности шумов (нет скачков при отсутствии звука)
#define DEF_GAIN 110       // максимальный порог по умолчанию 
#define FHT_N 128          // ширина спектра х2
#define LOG_OUT 1

#include <FlexiTimer2.h>
#include <FHT.h>  
  byte ur[8],urr[8];;
  byte i,dig,seg,i1;
  byte posOffset[7] = {4, 6, 8, 15, 25, 30, 35};
  byte gain_sp = DEF_GAIN;   
  unsigned long gainTimer;
  byte maxValue, maxValue_f;
  float k = 0.1;

void setup() { 
  FlexiTimer2::set(2, 1.0/2000, flash);  FlexiTimer2::start();
  ADMUX  = 0b01100000; ADCSRA = 0b11010110;
  for(i=0;i<=13;i++){pinMode(i,OUTPUT);}
}

 void loop(){
    analyzeAudio();   // функция FHT, забивает массив fht_log_out[] величинами по спектру

      for (int pos = 0; pos < 7; pos++) {  
        if (fht_log_out[posOffset[pos]] > maxValue) maxValue = fht_log_out[posOffset[pos]];
       
        int posLevel = map(fht_log_out[posOffset[pos]], LOW_PASS, gain_sp, 1, 20);posLevel = constrain(posLevel, 1, 20);

         urr[pos] = posLevel;
         if(urr[pos]<ur[pos]){ur[pos]=ur[pos]-1;}
         else{
         ur[pos] = posLevel;}
         delay(1);
         //delayMicroseconds(500);
 }

   if (AUTO_GAIN) {
    maxValue_f = maxValue * k + maxValue_f * (1 - k);
    if (millis() - gainTimer > 1500) {   
    if (maxValue_f > VOL_THR) gain_sp = maxValue_f;
      else gain_sp = 150;gainTimer = millis();}
      else {gain_sp = DEF_GAIN;}}
 }// loop

void flash(){ 
  switch(i){
    // 1 ряд
    case 0: cl();if(ur[0]<=10){dig=1;seg=ur[0];digital();segment();segment1();}else{dig=1;seg=10;digital();segment();seg=0;segment1();}break;
    case 1: cl();if(ur[0]<=10){dig=2;seg=0;digital();segment();segment1();}else{dig=2;seg=ur[0]-10;digital();segment();segment1();}break;    
    // 2 ряд
    case 2: cl();if(ur[1]<=10){dig=3;seg=ur[1];digital();segment();segment1();}else{dig=3;seg=10;digital();segment();seg=0;segment1();}break;
    case 3: cl();if(ur[1]<=10){dig=4;seg=0;digital();segment();segment1();}else{dig=4;seg=ur[1]-10;digital();segment();segment1();}break;   
    // 3 ряд
    case 4: cl();if(ur[2]<=10){dig=5;seg=ur[2];digital();segment();segment1();}else{dig=5;seg=10;digital();segment();seg=0;segment1();}break;
    case 5: cl();if(ur[2]<=10){dig=6;seg=0;digital();segment();segment1();}else{dig=6;seg=ur[2]-10;digital();segment();segment1();}break;   
    // 4 ряд
    case 6: cl();if(ur[3]<=10){dig=7;seg=ur[3];digital();segment();segment1();}else{dig=7;seg=10;digital();segment();seg=0;segment1();}break;
    case 7: cl();if(ur[3]<=10){dig=8;seg=0;digital();segment();segment1();}else{dig=8;seg=ur[3]-10;digital();segment();segment1();}break;
    // 5 ряд
    case 8: cl();if(ur[4]<=10){dig=9;seg=ur[4];digital();segment();segment1();}else{dig=9;seg=10;digital();segment();seg=0;segment1();}break;
    case 9: cl();if(ur[4]<=10){dig=10;seg=0;digital();segment();segment1();}else{dig=10;seg=ur[4]-10;digital();segment();segment1();}break;
    // 6 ряд
    case 10: cl();if(ur[5]<=10){dig=11;seg=ur[5];digital();segment();segment1();}else{dig=11;seg=10;digital();segment();seg=0;segment1();}break;
    case 11: cl();if(ur[5]<=10){dig=12;seg=0;digital();segment();segment1();}else{dig=12;seg=ur[5]-10;digital();segment();segment1();}break;
    // 7 ряд
    case 12: cl();if(ur[6]<=10){dig=13;seg=ur[6];digital();segment();segment1();}else{dig=13;seg=10;digital();segment();seg=0;segment1();}break;
    case 13: cl();if(ur[6]<=10){dig=14;seg=0;digital();segment();segment1();}else{dig=14;seg=ur[6]-10;digital();segment();segment1();}break; }
    i++;if(i>13){i=0;}}

 void segment1(){ 
   
    switch(seg){
            //  1       2        3      4       5       6       7       8       9       10
    case 0: ch(11,0);ch(10,0);ch(9,0);ch(8,0);ch(7,0);ch(6,0);ch(5,0);ch(4,0);ch(3,0);ch(2,0);break;
    case 1: ch(11,1);ch(10,0);ch(9,0);ch(8,0);ch(7,0);ch(6,0);ch(5,0);ch(4,0);ch(3,0);ch(2,0);break;
    case 2: ch(11,0);ch(10,1);ch(9,0);ch(8,0);ch(7,0);ch(6,0);ch(5,0);ch(4,0);ch(3,0);ch(2,0);break;
    case 3: ch(11,0);ch(10,0);ch(9,1);ch(8,0);ch(7,0);ch(6,0);ch(5,0);ch(4,0);ch(3,0);ch(2,0);break;
    case 4: ch(11,0);ch(10,0);ch(9,0);ch(8,1);ch(7,0);ch(6,0);ch(5,0);ch(4,0);ch(3,0);ch(2,0);break;
    case 5: ch(11,0);ch(10,0);ch(9,0);ch(8,0);ch(7,1);ch(6,0);ch(5,0);ch(4,0);ch(3,0);ch(2,0);break;
    case 6: ch(11,0);ch(10,0);ch(9,0);ch(8,0);ch(7,0);ch(6,1);ch(5,0);ch(4,0);ch(3,0);ch(2,0);break;
    case 7: ch(11,0);ch(10,0);ch(9,0);ch(8,0);ch(7,0);ch(6,0);ch(5,1);ch(4,0);ch(3,0);ch(2,0);break;
    case 8: ch(11,0);ch(10,0);ch(9,0);ch(8,0);ch(7,0);ch(6,0);ch(5,0);ch(4,1);ch(3,0);ch(2,0);break;
    case 9: ch(11,0);ch(10,0);ch(9,0);ch(8,0);ch(7,0);ch(6,0);ch(5,0);ch(4,0);ch(3,1);ch(2,0);break;
   case 10: ch(11,0);ch(10,0);ch(9,0);ch(8,0);ch(7,0);ch(6,0);ch(5,0);ch(4,0);ch(3,0);ch(2,1);break;}
 }
 
 void segment(){  
      switch(seg){
            //  1       2        3      4       5       6       7       8       9       10
    case 0: ch(11,0);ch(10,0);ch(9,0);ch(8,0);ch(7,0);ch(6,0);ch(5,0);ch(4,0);ch(3,0);ch(2,0);break;
    case 1: ch(11,1);ch(10,0);ch(9,0);ch(8,0);ch(7,0);ch(6,0);ch(5,0);ch(4,0);ch(3,0);ch(2,0);break;
    case 2: ch(11,1);ch(10,1);ch(9,0);ch(8,0);ch(7,0);ch(6,0);ch(5,0);ch(4,0);ch(3,0);ch(2,0);break;
    case 3: ch(11,1);ch(10,1);ch(9,1);ch(8,0);ch(7,0);ch(6,0);ch(5,0);ch(4,0);ch(3,0);ch(2,0);break;
    case 4: ch(11,1);ch(10,1);ch(9,1);ch(8,1);ch(7,0);ch(6,0);ch(5,0);ch(4,0);ch(3,0);ch(2,0);break;
    case 5: ch(11,1);ch(10,1);ch(9,1);ch(8,1);ch(7,1);ch(6,0);ch(5,0);ch(4,0);ch(3,0);ch(2,0);break;
    case 6: ch(11,1);ch(10,1);ch(9,1);ch(8,1);ch(7,1);ch(6,1);ch(5,0);ch(4,0);ch(3,0);ch(2,0);break;
    case 7: ch(11,1);ch(10,1);ch(9,1);ch(8,1);ch(7,1);ch(6,1);ch(5,1);ch(4,0);ch(3,0);ch(2,0);break;
    case 8: ch(11,1);ch(10,1);ch(9,1);ch(8,1);ch(7,1);ch(6,1);ch(5,1);ch(4,1);ch(3,0);ch(2,0);break;
    case 9: ch(11,1);ch(10,1);ch(9,1);ch(8,1);ch(7,1);ch(6,1);ch(5,1);ch(4,1);ch(3,1);ch(2,0);break;
   case 10: ch(11,1);ch(10,1);ch(9,1);ch(8,1);ch(7,1);ch(6,1);ch(5,1);ch(4,1);ch(3,1);ch(2,1);break;}
 }   

void digital(){  
   switch(dig){ 
     //////// К155ИД3 ////////////////////////////////////////
     case 1: ch(0,0);ch(1,0);ch(12,0);ch(13,0);break; // 0000
     case 2: ch(0,0);ch(1,0);ch(12,0);ch(13,1);break; // 0001
     case 3: ch(0,0);ch(1,0);ch(12,1);ch(13,0);break; // 0010
     case 4: ch(0,0);ch(1,0);ch(12,1);ch(13,1);break; // 0011
     case 5: ch(0,0);ch(1,1);ch(12,0);ch(13,0);break; // 0100
     case 6: ch(0,0);ch(1,1);ch(12,0);ch(13,1);break; // 0101
     case 7: ch(0,0);ch(1,1);ch(12,1);ch(13,0);break; // 0110
     case 8: ch(0,0);ch(1,1);ch(12,1);ch(13,1);break; // 0111
     case 9: ch(0,1);ch(1,0);ch(12,0);ch(13,0);break; // 1000
     case 10: ch(0,1);ch(1,0);ch(12,0);ch(13,1);break;// 1001
     case 11: ch(0,1);ch(1,0);ch(12,1);ch(13,0);break;// 1010
     case 12: ch(0,1);ch(1,0);ch(12,1);ch(13,1);break;// 1011
     case 13: ch(0,1);ch(1,1);ch(12,0);ch(13,0);break;// 1100
     case 14: ch(0,1);ch(1,1);ch(12,0);ch(13,1);break;// 1101
     }}
 
void cl(){
   dig=1;seg=0;segment();digital();
   dig=2;seg=0;segment();digital();
   dig=3;seg=0;segment();digital();
   dig=4;seg=0;segment();digital();
   dig=5;seg=0;segment();digital();
   dig=6;seg=0;segment();digital();
   dig=7;seg=0;segment();digital();
   dig=8;seg=0;segment();digital();
   dig=9;seg=0;segment();digital();
   dig=10;seg=0;segment();digital();
   dig=11;seg=0;segment();digital();
   dig=12;seg=0;segment();digital();
   dig=13;seg=0;segment();digital();
   dig=14;seg=0;segment();digital();
  }     
 
void ch(int pin, int logic){digitalWrite(pin,logic);}

void analyzeAudio() { 
 while(i1 < FHT_N){i1++; 
    do{ADCSRA |= (1 << ADSC);} 
    while((ADCSRA & (1 << ADIF)) == 0);fht_input[i1] = (ADCL|ADCH << 8);}i1=0;
    fht_window(); // window the data for better frequency response
    fht_reorder(); // reorder the data before doing the fht
    fht_run(); // process the data in the fht
    fht_mag_log(); // take the output of the fht
}

10

Re: Анализатор спектра (Разработка)

Из видео видно, что верхний светодиод светиться на полную яркость, а все нижние на половину. Это так ?

11

Re: Анализатор спектра (Разработка)

Да, все верно, но есть вариант скетча, что все светят ярко.

12

Re: Анализатор спектра (Разработка)

Как это реализовано аппаратно ?  ШИМ ? Сзади платы со светодиодами сильная "паутина"получилась ? Хочу печатку разработать под матрицы из двух светодиодов.

13

Re: Анализатор спектра (Разработка)

Нет, не ШИМ. Сначала идет быстрый опрос светодиодов, а потом самый верхнего с небольшой выдержкой.
У SHB10R я замкнул все катоды и обрезал провода оставив только крайние, поэтому аноды всех модулей замкнуты между собой прямыми проводниками.

14

Re: Анализатор спектра (Разработка)

liman324 Здраствуйте.
Есть матрицы 8х8 с обшим катодом или анодом. Можно на них сделать?
Или уже есть подобное? Что то я не смог найти.
Если подскажите, за ранее спасибки.

15

Re: Анализатор спектра (Разработка)

Если матрица без платы (просто набор светодиодов), то подойдет.

16 (2020-01-30 16:13:33 отредактировано vanzan777)

Re: Анализатор спектра (Разработка)

liman здраствуйте.
Да без платы. Набор светодиодов. Есть 8х8 с обшим катодом или анодом. Ниже эти матрицы.
Как это можно релизовать?
http://forum.rcl-radio.ru/uploads/images/2020/01/86de19ae969fc2e0eb63e5525694def6.gif

17

Re: Анализатор спектра (Разработка)

Схема анализатора рассчитана на светодиодные индикаторы с общим катодом.
Дешифратор поддерживает 8 полос, надо будет только код немного поправить.

18

Re: Анализатор спектра (Разработка)

liman спасибки. Ждемс...)))

19

Re: Анализатор спектра (Разработка)

8 полос. Задействовать выводы 16 и 17 К155ИД3

#define AUTO_GAIN 1       // автонастройка по громкости (экспериментальная функция)
#define VOL_THR 75        // порог тишины (ниже него отображения на матрице не будет)
#define LOW_PASS 70       // нижний порог чувствительности шумов (нет скачков при отсутствии звука)
#define DEF_GAIN 110       // максимальный порог по умолчанию 
#define FHT_N 128          // ширина спектра х2
#define LOG_OUT 1

#include <FlexiTimer2.h>
#include <FHT.h>  
  byte ur[8],urr[8];;
  byte i,dig,seg,i1;
  byte posOffset[8] = {4, 6, 8, 15, 25, 30, 35, 40};
  byte gain_sp = DEF_GAIN;   
  unsigned long gainTimer;
  byte maxValue, maxValue_f;
  float k = 0.1;

void setup() { 
  FlexiTimer2::set(2, 1.0/2000, flash);  FlexiTimer2::start();
  ADMUX  = 0b01100000; ADCSRA = 0b11010110;
  for(i=0;i<=13;i++){pinMode(i,OUTPUT);}
}

 void loop(){
    analyzeAudio();   // функция FHT, забивает массив fht_log_out[] величинами по спектру

      for (int pos = 0; pos < 8; pos++) {  
        if (fht_log_out[posOffset[pos]] > maxValue) maxValue = fht_log_out[posOffset[pos]];
       
        int posLevel = map(fht_log_out[posOffset[pos]], LOW_PASS, gain_sp, 1, 20);posLevel = constrain(posLevel, 1, 20);

         urr[pos] = posLevel;
         if(urr[pos]<ur[pos]){ur[pos]=ur[pos]-1;}
         else{
         ur[pos] = posLevel;}
         delay(1);
         //delayMicroseconds(500);
 }

   if (AUTO_GAIN) {
    maxValue_f = maxValue * k + maxValue_f * (1 - k);
    if (millis() - gainTimer > 1500) {   
    if (maxValue_f > VOL_THR) gain_sp = maxValue_f;
      else gain_sp = 150;gainTimer = millis();}
      else {gain_sp = DEF_GAIN;}}
 }// loop

void flash(){ 
  switch(i){
    // 1 ряд
    case 0: cl();if(ur[0]<=10){dig=1;seg=ur[0];digital();segment();segment1();}else{dig=1;seg=10;digital();segment();seg=0;segment1();}break;
    case 1: cl();if(ur[0]<=10){dig=2;seg=0;digital();segment();segment1();}else{dig=2;seg=ur[0]-10;digital();segment();segment1();}break;    
    // 2 ряд
    case 2: cl();if(ur[1]<=10){dig=3;seg=ur[1];digital();segment();segment1();}else{dig=3;seg=10;digital();segment();seg=0;segment1();}break;
    case 3: cl();if(ur[1]<=10){dig=4;seg=0;digital();segment();segment1();}else{dig=4;seg=ur[1]-10;digital();segment();segment1();}break;   
    // 3 ряд
    case 4: cl();if(ur[2]<=10){dig=5;seg=ur[2];digital();segment();segment1();}else{dig=5;seg=10;digital();segment();seg=0;segment1();}break;
    case 5: cl();if(ur[2]<=10){dig=6;seg=0;digital();segment();segment1();}else{dig=6;seg=ur[2]-10;digital();segment();segment1();}break;   
    // 4 ряд
    case 6: cl();if(ur[3]<=10){dig=7;seg=ur[3];digital();segment();segment1();}else{dig=7;seg=10;digital();segment();seg=0;segment1();}break;
    case 7: cl();if(ur[3]<=10){dig=8;seg=0;digital();segment();segment1();}else{dig=8;seg=ur[3]-10;digital();segment();segment1();}break;
    // 5 ряд
    case 8: cl();if(ur[4]<=10){dig=9;seg=ur[4];digital();segment();segment1();}else{dig=9;seg=10;digital();segment();seg=0;segment1();}break;
    case 9: cl();if(ur[4]<=10){dig=10;seg=0;digital();segment();segment1();}else{dig=10;seg=ur[4]-10;digital();segment();segment1();}break;
    // 6 ряд
    case 10: cl();if(ur[5]<=10){dig=11;seg=ur[5];digital();segment();segment1();}else{dig=11;seg=10;digital();segment();seg=0;segment1();}break;
    case 11: cl();if(ur[5]<=10){dig=12;seg=0;digital();segment();segment1();}else{dig=12;seg=ur[5]-10;digital();segment();segment1();}break;
    // 7 ряд
    case 12: cl();if(ur[6]<=10){dig=13;seg=ur[6];digital();segment();segment1();}else{dig=13;seg=10;digital();segment();seg=0;segment1();}break;
    case 13: cl();if(ur[6]<=10){dig=14;seg=0;digital();segment();segment1();}else{dig=14;seg=ur[6]-10;digital();segment();segment1();}break; 
    // 8 ряд
    case 14: cl();if(ur[7]<=10){dig=15;seg=ur[7];digital();segment();segment1();}else{dig=15;seg=10;digital();segment();seg=0;segment1();}break;
    case 15: cl();if(ur[7]<=10){dig=16;seg=0;digital();segment();segment1();}else{dig=16;seg=ur[7]-10;digital();segment();segment1();}break; }
    
    i++;if(i>15){i=0;}}

 void segment1(){ 
   
    switch(seg){
            //  1       2        3      4       5       6       7       8       9       10
    case 0: ch(11,0);ch(10,0);ch(9,0);ch(8,0);ch(7,0);ch(6,0);ch(5,0);ch(4,0);ch(3,0);ch(2,0);break;
    case 1: ch(11,1);ch(10,0);ch(9,0);ch(8,0);ch(7,0);ch(6,0);ch(5,0);ch(4,0);ch(3,0);ch(2,0);break;
    case 2: ch(11,0);ch(10,1);ch(9,0);ch(8,0);ch(7,0);ch(6,0);ch(5,0);ch(4,0);ch(3,0);ch(2,0);break;
    case 3: ch(11,0);ch(10,0);ch(9,1);ch(8,0);ch(7,0);ch(6,0);ch(5,0);ch(4,0);ch(3,0);ch(2,0);break;
    case 4: ch(11,0);ch(10,0);ch(9,0);ch(8,1);ch(7,0);ch(6,0);ch(5,0);ch(4,0);ch(3,0);ch(2,0);break;
    case 5: ch(11,0);ch(10,0);ch(9,0);ch(8,0);ch(7,1);ch(6,0);ch(5,0);ch(4,0);ch(3,0);ch(2,0);break;
    case 6: ch(11,0);ch(10,0);ch(9,0);ch(8,0);ch(7,0);ch(6,1);ch(5,0);ch(4,0);ch(3,0);ch(2,0);break;
    case 7: ch(11,0);ch(10,0);ch(9,0);ch(8,0);ch(7,0);ch(6,0);ch(5,1);ch(4,0);ch(3,0);ch(2,0);break;
    case 8: ch(11,0);ch(10,0);ch(9,0);ch(8,0);ch(7,0);ch(6,0);ch(5,0);ch(4,1);ch(3,0);ch(2,0);break;
    case 9: ch(11,0);ch(10,0);ch(9,0);ch(8,0);ch(7,0);ch(6,0);ch(5,0);ch(4,0);ch(3,1);ch(2,0);break;
   case 10: ch(11,0);ch(10,0);ch(9,0);ch(8,0);ch(7,0);ch(6,0);ch(5,0);ch(4,0);ch(3,0);ch(2,1);break;}
 }
 
 void segment(){  
      switch(seg){
            //  1       2        3      4       5       6       7       8       9       10
    case 0: ch(11,0);ch(10,0);ch(9,0);ch(8,0);ch(7,0);ch(6,0);ch(5,0);ch(4,0);ch(3,0);ch(2,0);break;
    case 1: ch(11,1);ch(10,0);ch(9,0);ch(8,0);ch(7,0);ch(6,0);ch(5,0);ch(4,0);ch(3,0);ch(2,0);break;
    case 2: ch(11,1);ch(10,1);ch(9,0);ch(8,0);ch(7,0);ch(6,0);ch(5,0);ch(4,0);ch(3,0);ch(2,0);break;
    case 3: ch(11,1);ch(10,1);ch(9,1);ch(8,0);ch(7,0);ch(6,0);ch(5,0);ch(4,0);ch(3,0);ch(2,0);break;
    case 4: ch(11,1);ch(10,1);ch(9,1);ch(8,1);ch(7,0);ch(6,0);ch(5,0);ch(4,0);ch(3,0);ch(2,0);break;
    case 5: ch(11,1);ch(10,1);ch(9,1);ch(8,1);ch(7,1);ch(6,0);ch(5,0);ch(4,0);ch(3,0);ch(2,0);break;
    case 6: ch(11,1);ch(10,1);ch(9,1);ch(8,1);ch(7,1);ch(6,1);ch(5,0);ch(4,0);ch(3,0);ch(2,0);break;
    case 7: ch(11,1);ch(10,1);ch(9,1);ch(8,1);ch(7,1);ch(6,1);ch(5,1);ch(4,0);ch(3,0);ch(2,0);break;
    case 8: ch(11,1);ch(10,1);ch(9,1);ch(8,1);ch(7,1);ch(6,1);ch(5,1);ch(4,1);ch(3,0);ch(2,0);break;
    case 9: ch(11,1);ch(10,1);ch(9,1);ch(8,1);ch(7,1);ch(6,1);ch(5,1);ch(4,1);ch(3,1);ch(2,0);break;
   case 10: ch(11,1);ch(10,1);ch(9,1);ch(8,1);ch(7,1);ch(6,1);ch(5,1);ch(4,1);ch(3,1);ch(2,1);break;}
 }   

void digital(){  
   switch(dig){ 
     //////// К155ИД3 ////////////////////////////////////////
     case 1: ch(0,0);ch(1,0);ch(12,0);ch(13,0);break; // 0000
     case 2: ch(0,0);ch(1,0);ch(12,0);ch(13,1);break; // 0001
     case 3: ch(0,0);ch(1,0);ch(12,1);ch(13,0);break; // 0010
     case 4: ch(0,0);ch(1,0);ch(12,1);ch(13,1);break; // 0011
     case 5: ch(0,0);ch(1,1);ch(12,0);ch(13,0);break; // 0100
     case 6: ch(0,0);ch(1,1);ch(12,0);ch(13,1);break; // 0101
     case 7: ch(0,0);ch(1,1);ch(12,1);ch(13,0);break; // 0110
     case 8: ch(0,0);ch(1,1);ch(12,1);ch(13,1);break; // 0111
     case 9: ch(0,1);ch(1,0);ch(12,0);ch(13,0);break; // 1000
     case 10: ch(0,1);ch(1,0);ch(12,0);ch(13,1);break;// 1001
     case 11: ch(0,1);ch(1,0);ch(12,1);ch(13,0);break;// 1010
     case 12: ch(0,1);ch(1,0);ch(12,1);ch(13,1);break;// 1011
     case 13: ch(0,1);ch(1,1);ch(12,0);ch(13,0);break;// 1100
     case 14: ch(0,1);ch(1,1);ch(12,0);ch(13,1);break;// 1101
     case 15: ch(0,1);ch(1,1);ch(12,1);ch(13,0);break;// 1110
     case 16: ch(0,1);ch(1,1);ch(12,1);ch(13,1);break;// 1111
     }}
 
void cl(){
   dig=1;seg=0;segment();digital();
   dig=2;seg=0;segment();digital();
   dig=3;seg=0;segment();digital();
   dig=4;seg=0;segment();digital();
   dig=5;seg=0;segment();digital();
   dig=6;seg=0;segment();digital();
   dig=7;seg=0;segment();digital();
   dig=8;seg=0;segment();digital();
   dig=9;seg=0;segment();digital();
   dig=10;seg=0;segment();digital();
   dig=11;seg=0;segment();digital();
   dig=12;seg=0;segment();digital();
   dig=13;seg=0;segment();digital();
   dig=14;seg=0;segment();digital();
   dig=15;seg=0;segment();digital();
   dig=16;seg=0;segment();digital();
  }     
 
void ch(int pin, int logic){digitalWrite(pin,logic);}

void analyzeAudio() { 
 while(i1 < FHT_N){i1++; 
    do{ADCSRA |= (1 << ADSC);} 
    while((ADCSRA & (1 << ADIF)) == 0);fht_input[i1] = (ADCL|ADCH << 8);}i1=0;
    fht_window(); // window the data for better frequency response
    fht_reorder(); // reorder the data before doing the fht
    fht_run(); // process the data in the fht
    fht_mag_log(); // take the output of the fht
}

20 (2020-01-30 22:45:14 отредактировано vanzan777)

Re: Анализатор спектра (Разработка)

liman спасибки. Я сильно извиняюсь. А как тогда подключить эту матрицу. Что то не могу сообразить.
Схему если можно покажите пожалуйста.
За ранее спасибки.