1

Тема: Анализатор спектра LCD2004

5 режимов отображения полос, управление кнопкой D12 (10 К на GND, управление +5 В). Сигнал подается на вход А0 через разделительный конденсатор 0,1 мкФ.

http://forum.rcl-radio.ru/uploads/images/2019/12/32b8bb1116d9324d64e2ee363f9819d0.png

В СКЕТЧЕ ИСПОЛЬЗУЕТСЯ ПОДКЛЮЧЕНИЕ ЭКРАНА ЧЕРЕЗ ШИНУ I2C, ЧТО СКАЗЫВАЕТСЯ НА БЫСТРОДЕЙСТВИИ ОТОБРАЖЕНИЯ КАРТИНКИ АНАЛИЗАТОРА СПЕКТРА, ПОЭТОМУ РЕКОМЕНДУЕТСЯ ИСПОЛЬЗОВАТЬ ПАРАЛЛЕЛЬНОЕ ПОДКЛЮЧЕНИЕ ЭКРАНА К ПЛАТЕ ARDUINO

  #define AUTO_GAIN 1       // автонастройка по громкости
  #define VOL_THR 45        // порог тишины (ниже него отображения на матрице не будет)
  #define LOW_PASS 40       // нижний порог чувствительности шумов (нет скачков при отсутствии звука)
  #define DEF_GAIN 120       // максимальный порог по умолчанию 
  #define FHT_N 256         // ширина спектра х2
  #define LOG_OUT 1
  #include <FHT.h> 
  #include <EEPROM.h>
  #include <Wire.h> 
  #include <LiquidCrystal_I2C.h>
   LiquidCrystal_I2C lcd(0x27,20,4);  // Устанавливаем дисплей
      byte posOffset[20] = {2, 3, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 40}; // вч выше
      byte maxValue, maxValue_f,www=1,gain_sp = DEF_GAIN;
      float k = 0.1;
      int i1,yyy,spek;
      unsigned long gainTimer;
   
void setup(){
   Serial.begin(9600);Wire.begin();
   ADMUX  = 0b01100000; ADCSRA = 0b11010100; 
   lcd.init();lcd.backlight();
   pinMode(12,INPUT);
   spek = EEPROM.read(100);
}

 void loop(){
   if(digitalRead(12)==HIGH){spek++;EEPROM.update(100,spek); www=1;if(spek>5){spek=0;}delay(300);}

      if(spek==0&&www==1){
      byte v1[8] = {0, 0, 0, 0, 0, 0, 0, 4};
      byte v2[8] = {0, 0, 0, 0, 0, 0, 4, 4};
      byte v3[8] = {0, 0, 0, 0, 0, 4, 4, 4};
      byte v4[8] = {0, 0, 0, 0, 4, 4, 4, 4};
      byte v5[8] = {0, 0, 0, 4, 4, 4, 4, 4};
      byte v6[8] = {0, 0, 4, 4, 4, 4, 4, 4};
      byte v7[8] = {0, 4, 4, 4, 4, 4, 4, 4};
      byte v8[8] = {4, 4, 4, 4, 4, 4, 4, 4};
      lcd.createChar(0, v1);lcd.createChar(1, v2);lcd.createChar(2, v3);lcd.createChar(3, v4);lcd.createChar(4, v5);lcd.createChar(5, v6);lcd.createChar(6, v7);lcd.createChar(7, v8);
      www=0;}

      if(spek==1&&www==1){
      byte v1[8] = {0, 0, 0, 0, 0, 0, 0, 14};
      byte v2[8] = {0, 0, 0, 0, 0, 0, 14, 14};
      byte v3[8] = {0, 0, 0, 0, 0, 14, 14, 14};
      byte v4[8] = {0, 0, 0, 0, 14, 14, 14, 14};
      byte v5[8] = {0, 0, 0, 14, 14, 14, 14, 14};
      byte v6[8] = {0, 0, 14, 14, 14, 14, 14, 14};
      byte v7[8] = {0, 14, 14, 14, 14, 14, 14, 14};
      byte v8[8] = {14, 14, 14, 14, 14, 14, 14, 14};
      lcd.createChar(0, v1);lcd.createChar(1, v2);lcd.createChar(2, v3);lcd.createChar(3, v4);lcd.createChar(4, v5);lcd.createChar(5, v6);lcd.createChar(6, v7);lcd.createChar(7, v8);
      www=0;}

      if(spek==2&&www==1){
      byte v1[8] = {0, 0, 0, 0, 0, 0, 0, 10};
      byte v2[8] = {0, 0, 0, 0, 0, 0, 10, 10};
      byte v3[8] = {0, 0, 0, 0, 0, 10, 10, 10};
      byte v4[8] = {0, 0, 0, 0, 10, 10, 10, 10};
      byte v5[8] = {0, 0, 0, 10, 10, 10, 10, 10};
      byte v6[8] = {0, 0, 10, 10, 10, 10, 10, 10};
      byte v7[8] = {0, 10, 10, 10, 10, 10, 10, 10};
      byte v8[8] = {10, 10, 10, 10, 10, 10, 10, 10};
      lcd.createChar(0, v1);lcd.createChar(1, v2);lcd.createChar(2, v3);lcd.createChar(3, v4);lcd.createChar(4, v5);lcd.createChar(5, v6);lcd.createChar(6, v7);lcd.createChar(7, v8);
      www=0;}

      if(spek==3&&www==1){
      byte v1[8] = {0, 0, 0, 0, 0, 0, 0, 27};
      byte v2[8] = {0, 0, 0, 0, 0, 0, 27, 27};
      byte v3[8] = {0, 0, 0, 0, 0, 27, 27, 27};
      byte v4[8] = {0, 0, 0, 0, 27, 27, 27, 27};
      byte v5[8] = {0, 0, 0, 27, 27, 27, 27, 27};
      byte v6[8] = {0, 0, 27, 27, 27, 27, 27, 27};
      byte v7[8] = {0, 27, 27, 27, 27, 27, 27, 27};
      byte v8[8] = {27, 27, 27, 27, 27, 27, 27, 27};
      lcd.createChar(0, v1);lcd.createChar(1, v2);lcd.createChar(2, v3);lcd.createChar(3, v4);lcd.createChar(4, v5);lcd.createChar(5, v6);lcd.createChar(6, v7);lcd.createChar(7, v8);
      www=0;}

      if(spek==4&&www==1){
      byte v1[8] = {0, 0, 0, 0, 0, 0, 0, 31};
      byte v2[8] = {0, 0, 0, 0, 0, 0, 31, 31};
      byte v3[8] = {0, 0, 0, 0, 0, 31, 31, 31};
      byte v4[8] = {0, 0, 0, 0, 31, 31, 31, 31};
      byte v5[8] = {0, 0, 0, 31, 31, 31, 31, 31};
      byte v6[8] = {0, 0, 31, 31, 31, 31, 31, 31};
      byte v7[8] = {0, 31, 31, 31, 31, 31, 31, 31};
      byte v8[8] = {31, 31, 31, 31, 31, 31, 31, 31};
      lcd.createChar(0, v1);lcd.createChar(1, v2);lcd.createChar(2, v3);lcd.createChar(3, v4);lcd.createChar(4, v5);lcd.createChar(5, v6);lcd.createChar(6, v7);lcd.createChar(7, v8);
      www=0;}

      if(spek==5&&www==1){
      byte v1[8] = {0, 0, 0, 0, 0, 0, 0, 21};
      byte v2[8] = {0, 0, 0, 0, 0, 0, 21, 21};
      byte v3[8] = {0, 0, 0, 0, 0, 21, 21, 21};
      byte v4[8] = {0, 0, 0, 0, 21, 21, 21, 21};
      byte v5[8] = {0, 0, 0, 21, 21, 21, 21, 21};
      byte v6[8] = {0, 0, 21, 21, 21, 21, 21, 21};
      byte v7[8] = {0, 21, 21, 21, 21, 21, 21, 21};
      byte v8[8] = {21, 21, 21, 21, 21, 21, 21, 21};
      lcd.createChar(0, v1);lcd.createChar(1, v2);lcd.createChar(2, v3);lcd.createChar(3, v4);lcd.createChar(4, v5);lcd.createChar(5, v6);lcd.createChar(6, v7);lcd.createChar(7, v8);
      www=0;}
    
      analyzeAudio();   // функция FHT, забивает массив fht_log_out[] величинами по спектру

      for (int pos = 0; pos < 20; 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, 31);
        posLevel = constrain(posLevel, 0, 31);

   if(posLevel<7){
    lcd.setCursor(pos, 0);lcd.print(" ");
    lcd.setCursor(pos, 1);lcd.print(" ");
    lcd.setCursor(pos, 2);lcd.print(" ");
    lcd.setCursor(pos, 3);lcd.write((uint8_t)posLevel);}
   
   if(posLevel>7&&posLevel<15){
    lcd.setCursor(pos, 0);lcd.print(" ");
    lcd.setCursor(pos, 1);lcd.print(" ");
    lcd.setCursor(pos, 3);lcd.write((uint8_t)7);lcd.setCursor(pos, 2);lcd.write((uint8_t)posLevel-8);}

   if(posLevel>15&&posLevel<23){
    lcd.setCursor(pos, 0);lcd.print(" ");
    lcd.setCursor(pos, 3);lcd.write((uint8_t)7);
    lcd.setCursor(pos, 2);lcd.write((uint8_t)7);lcd.setCursor(pos, 1);lcd.write((uint8_t)posLevel-16);}    

   if(posLevel>23&&posLevel<31){
    lcd.setCursor(pos, 3);lcd.write((uint8_t)7);
    lcd.setCursor(pos, 2);lcd.write((uint8_t)7);
    lcd.setCursor(pos, 1);lcd.write((uint8_t)7);lcd.setCursor(pos, 0);lcd.write((uint8_t)posLevel-24);}           
      }


   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 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
}
 

2 (2020-01-26 21:24:06 отредактировано vanzan777)

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

liman324 Здраствуйте.
Немного поколдовав над вашим проектом. Чудка изменил. За основу брал вот этот проект http://rcl-radio.ru/?p=42903
Используется тот же индикатор 2004, что и у вас в проекте. Но подключение на прямую к ардуине. Нет пока кнопки переключеия режимов. И режим пока только один.
Изменения сделал, то что собрал тот проект что выше. Толком не заработало.
Выкладываю свой код для ардуинке.
Вход тот же А0, подключение индикатора lcd D6-RS, D7-E, D8-D4, D9-D5, D10-D6, D11-D7); Cначала пины ардуины потом индикатора.


#define AUTO_GAIN 1       // автонастройка по громкости (экспериментальная функция)
#define VOL_THR 35        // порог тишины (ниже него отображения на матрице не будет)
#define LOW_PASS 30        // нижний порог чувствительности шумов (нет скачков при отсутствии звука)
#define DEF_GAIN 120       // максимальный порог по умолчанию (при GAIN_CONTROL игнорируется)
#define FHT_N 256          // ширина спектра х2
// вручную забитый массив тонов, сначала плавно, потом круче
byte posOffset[20] = {2, 3, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 40}; // вч выше

#define LOG_OUT 1
#include <FHT.h>          
#include <LiquidCrystal.h>
LiquidCrystal lcd(6, 7, 8, 9, 10, 11);
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))

byte v1[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b11111};
byte v2[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b11111, 0b11111};
byte v3[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b11111, 0b11111, 0b11111};
byte v4[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b11111, 0b11111, 0b11111, 0b11111};
byte v5[8] = {0b00000, 0b00000, 0b00000, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111};
byte v6[8] = {0b00000, 0b00000, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111};
byte v7[8] = {0b00000, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111};
byte v8[8] = {0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111};

byte gain = DEF_GAIN;   
unsigned long gainTimer;
byte maxValue, maxValue_f;
float k = 0.1;

void setup() { 
  lcd.begin(20,4);// LCD 16X2
  
  sbi(ADCSRA, ADPS2);
  cbi(ADCSRA, ADPS1);
  sbi(ADCSRA, ADPS0);
  analogReference(INTERNAL);
  lcd.createChar(0, v1);
  lcd.createChar(1, v2);
  lcd.createChar(2, v3);
  lcd.createChar(3, v4);
  lcd.createChar(4, v5);
  lcd.createChar(5, v6);
  lcd.createChar(6, v7);
  lcd.createChar(7, v8);
}

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

      for (int pos = 0; pos < 20; 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, 0, 31);
    posLevel = constrain(posLevel, 0, 31);
    
    if(posLevel<7){
    lcd.setCursor(pos, 0);lcd.print(" ");
    lcd.setCursor(pos, 1);lcd.print(" ");
    lcd.setCursor(pos, 2);lcd.print(" ");
    lcd.setCursor(pos, 3);lcd.write((uint8_t)posLevel);}
   
   if(posLevel>7&&posLevel<15){
    lcd.setCursor(pos, 0);lcd.print(" ");
    lcd.setCursor(pos, 1);lcd.print(" ");
    lcd.setCursor(pos, 3);lcd.write((uint8_t)7);lcd.setCursor(pos, 2);lcd.write((uint8_t)posLevel-8);}

   if(posLevel>15&&posLevel<23){
    lcd.setCursor(pos, 0);lcd.print(" ");
    lcd.setCursor(pos, 3);lcd.write((uint8_t)7);
    lcd.setCursor(pos, 2);lcd.write((uint8_t)7);lcd.setCursor(pos, 1);lcd.write((uint8_t)posLevel-16);}    

   if(posLevel>23&&posLevel<31){
    lcd.setCursor(pos, 3);lcd.write((uint8_t)7);
    lcd.setCursor(pos, 2);lcd.write((uint8_t)7);
    lcd.setCursor(pos, 1);lcd.write((uint8_t)7);lcd.setCursor(pos, 0);lcd.write((uint8_t)posLevel-24);}           
      }


  if (AUTO_GAIN) {
    maxValue_f = maxValue * k + maxValue_f * (1 - k);
    if (millis() - gainTimer > 1500) {      // каждые 1500 мс
      // если максимальное значение больше порога, взять его как максимум для отображения
      if (maxValue_f > VOL_THR) gain = maxValue_f;

      // если нет, то взять порог побольше, чтобы шумы вообще не проходили
      else gain = 100;
      gainTimer = millis();
    }
  }
}

void analyzeAudio() {
  for (int i = 0 ; i < FHT_N ; i++) {
    int sample = analogRead(A0);
    fht_input[i] = sample; // put real data into bins
  }
  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
}

Пожалуйста подскажите, как сюда кнопку задействовать, и дополнительные режимы добавить.

3

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

#define AUTO_GAIN 1       // автонастройка по громкости
  #define VOL_THR 45        // порог тишины (ниже него отображения на матрице не будет)
  #define LOW_PASS 40       // нижний порог чувствительности шумов (нет скачков при отсутствии звука)
  #define DEF_GAIN 120       // максимальный порог по умолчанию 
  #define FHT_N 256         // ширина спектра х2
  #define LOG_OUT 1
  #include <FHT.h> 
  #include <EEPROM.h>
  #include <Wire.h> 
  #include <LiquidCrystal.h>
      LiquidCrystal lcd(6, 7, 8, 9, 10, 11);
      byte posOffset[20] = {2, 3, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 40}; // вч выше
      byte maxValue, maxValue_f,www=1,gain_sp = DEF_GAIN;
      float k = 0.1;
      int i1,yyy,spek;
      unsigned long gainTimer;
   
void setup(){
   Serial.begin(9600);Wire.begin();lcd.begin(20,4);// LCD 20X4
   ADMUX  = 0b01100000; ADCSRA = 0b11010100; 
   pinMode(12,INPUT);
   spek = EEPROM.read(100);
}

 void loop(){
   if(digitalRead(12)==HIGH){spek++;EEPROM.update(100,spek); www=1;if(spek>5){spek=0;}delay(300);}

      if(spek==0&&www==1){
      byte v1[8] = {0, 0, 0, 0, 0, 0, 0, 4};
      byte v2[8] = {0, 0, 0, 0, 0, 0, 4, 4};
      byte v3[8] = {0, 0, 0, 0, 0, 4, 4, 4};
      byte v4[8] = {0, 0, 0, 0, 4, 4, 4, 4};
      byte v5[8] = {0, 0, 0, 4, 4, 4, 4, 4};
      byte v6[8] = {0, 0, 4, 4, 4, 4, 4, 4};
      byte v7[8] = {0, 4, 4, 4, 4, 4, 4, 4};
      byte v8[8] = {4, 4, 4, 4, 4, 4, 4, 4};
      lcd.createChar(0, v1);lcd.createChar(1, v2);lcd.createChar(2, v3);lcd.createChar(3, v4);lcd.createChar(4, v5);lcd.createChar(5, v6);lcd.createChar(6, v7);lcd.createChar(7, v8);
      www=0;}

      if(spek==1&&www==1){
      byte v1[8] = {0, 0, 0, 0, 0, 0, 0, 14};
      byte v2[8] = {0, 0, 0, 0, 0, 0, 14, 14};
      byte v3[8] = {0, 0, 0, 0, 0, 14, 14, 14};
      byte v4[8] = {0, 0, 0, 0, 14, 14, 14, 14};
      byte v5[8] = {0, 0, 0, 14, 14, 14, 14, 14};
      byte v6[8] = {0, 0, 14, 14, 14, 14, 14, 14};
      byte v7[8] = {0, 14, 14, 14, 14, 14, 14, 14};
      byte v8[8] = {14, 14, 14, 14, 14, 14, 14, 14};
      lcd.createChar(0, v1);lcd.createChar(1, v2);lcd.createChar(2, v3);lcd.createChar(3, v4);lcd.createChar(4, v5);lcd.createChar(5, v6);lcd.createChar(6, v7);lcd.createChar(7, v8);
      www=0;}

      if(spek==2&&www==1){
      byte v1[8] = {0, 0, 0, 0, 0, 0, 0, 10};
      byte v2[8] = {0, 0, 0, 0, 0, 0, 10, 10};
      byte v3[8] = {0, 0, 0, 0, 0, 10, 10, 10};
      byte v4[8] = {0, 0, 0, 0, 10, 10, 10, 10};
      byte v5[8] = {0, 0, 0, 10, 10, 10, 10, 10};
      byte v6[8] = {0, 0, 10, 10, 10, 10, 10, 10};
      byte v7[8] = {0, 10, 10, 10, 10, 10, 10, 10};
      byte v8[8] = {10, 10, 10, 10, 10, 10, 10, 10};
      lcd.createChar(0, v1);lcd.createChar(1, v2);lcd.createChar(2, v3);lcd.createChar(3, v4);lcd.createChar(4, v5);lcd.createChar(5, v6);lcd.createChar(6, v7);lcd.createChar(7, v8);
      www=0;}

      if(spek==3&&www==1){
      byte v1[8] = {0, 0, 0, 0, 0, 0, 0, 27};
      byte v2[8] = {0, 0, 0, 0, 0, 0, 27, 27};
      byte v3[8] = {0, 0, 0, 0, 0, 27, 27, 27};
      byte v4[8] = {0, 0, 0, 0, 27, 27, 27, 27};
      byte v5[8] = {0, 0, 0, 27, 27, 27, 27, 27};
      byte v6[8] = {0, 0, 27, 27, 27, 27, 27, 27};
      byte v7[8] = {0, 27, 27, 27, 27, 27, 27, 27};
      byte v8[8] = {27, 27, 27, 27, 27, 27, 27, 27};
      lcd.createChar(0, v1);lcd.createChar(1, v2);lcd.createChar(2, v3);lcd.createChar(3, v4);lcd.createChar(4, v5);lcd.createChar(5, v6);lcd.createChar(6, v7);lcd.createChar(7, v8);
      www=0;}

      if(spek==4&&www==1){
      byte v1[8] = {0, 0, 0, 0, 0, 0, 0, 31};
      byte v2[8] = {0, 0, 0, 0, 0, 0, 31, 31};
      byte v3[8] = {0, 0, 0, 0, 0, 31, 31, 31};
      byte v4[8] = {0, 0, 0, 0, 31, 31, 31, 31};
      byte v5[8] = {0, 0, 0, 31, 31, 31, 31, 31};
      byte v6[8] = {0, 0, 31, 31, 31, 31, 31, 31};
      byte v7[8] = {0, 31, 31, 31, 31, 31, 31, 31};
      byte v8[8] = {31, 31, 31, 31, 31, 31, 31, 31};
      lcd.createChar(0, v1);lcd.createChar(1, v2);lcd.createChar(2, v3);lcd.createChar(3, v4);lcd.createChar(4, v5);lcd.createChar(5, v6);lcd.createChar(6, v7);lcd.createChar(7, v8);
      www=0;}

      if(spek==5&&www==1){
      byte v1[8] = {0, 0, 0, 0, 0, 0, 0, 21};
      byte v2[8] = {0, 0, 0, 0, 0, 0, 21, 21};
      byte v3[8] = {0, 0, 0, 0, 0, 21, 21, 21};
      byte v4[8] = {0, 0, 0, 0, 21, 21, 21, 21};
      byte v5[8] = {0, 0, 0, 21, 21, 21, 21, 21};
      byte v6[8] = {0, 0, 21, 21, 21, 21, 21, 21};
      byte v7[8] = {0, 21, 21, 21, 21, 21, 21, 21};
      byte v8[8] = {21, 21, 21, 21, 21, 21, 21, 21};
      lcd.createChar(0, v1);lcd.createChar(1, v2);lcd.createChar(2, v3);lcd.createChar(3, v4);lcd.createChar(4, v5);lcd.createChar(5, v6);lcd.createChar(6, v7);lcd.createChar(7, v8);
      www=0;}
    
      analyzeAudio();   // функция FHT, забивает массив fht_log_out[] величинами по спектру

      for (int pos = 0; pos < 20; 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, 31);
        posLevel = constrain(posLevel, 0, 31);

   if(posLevel<7){
    lcd.setCursor(pos, 0);lcd.print(" ");
    lcd.setCursor(pos, 1);lcd.print(" ");
    lcd.setCursor(pos, 2);lcd.print(" ");
    lcd.setCursor(pos, 3);lcd.write((uint8_t)posLevel);}
   
   if(posLevel>7&&posLevel<15){
    lcd.setCursor(pos, 0);lcd.print(" ");
    lcd.setCursor(pos, 1);lcd.print(" ");
    lcd.setCursor(pos, 3);lcd.write((uint8_t)7);lcd.setCursor(pos, 2);lcd.write((uint8_t)posLevel-8);}

   if(posLevel>15&&posLevel<23){
    lcd.setCursor(pos, 0);lcd.print(" ");
    lcd.setCursor(pos, 3);lcd.write((uint8_t)7);
    lcd.setCursor(pos, 2);lcd.write((uint8_t)7);lcd.setCursor(pos, 1);lcd.write((uint8_t)posLevel-16);}    

   if(posLevel>23&&posLevel<31){
    lcd.setCursor(pos, 3);lcd.write((uint8_t)7);
    lcd.setCursor(pos, 2);lcd.write((uint8_t)7);
    lcd.setCursor(pos, 1);lcd.write((uint8_t)7);lcd.setCursor(pos, 0);lcd.write((uint8_t)posLevel-24);}           
      }


   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 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
}

4

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

ругнулся при прошивке на эту строку
if(digitalRead(12)==HIGH){spek++;EEPROM.update(100,spek); www=1;if(spek>5){spek=0;}delay(300);}

что не так?

5

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

У меня компиляция проходит без ошибок.

6 (2020-01-28 20:19:54 отредактировано vanzan777)

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

Здраствуйте. Разобрался в этой ошибке.
Заработало.
Но, по шине I2C слайд шоу. На прямую, лучше.

Добавил - поднял частоту опроса аналогового порта до 38.4 кГц, по теореме
Котельникова (Найквиста) частота дискретизации будет 19 кГц

Прошивка

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

#define AUTO_GAIN 1       // автонастройка по громкости
  #define VOL_THR 45        // порог тишины (ниже него отображения на матрице не будет)
  #define LOW_PASS 40       // нижний порог чувствительности шумов (нет скачков при отсутствии звука)
  #define DEF_GAIN 120       // максимальный порог по умолчанию 
  #define FHT_N 256         // ширина спектра х2
  #define LOG_OUT 1
  #include <FHT.h> 
  #include <EEPROM.h>
  #include <Wire.h> 
  #include <LiquidCrystal.h>
  #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) 
  #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
     
  
      LiquidCrystal lcd(6, 7, 8, 9, 10, 11);
      byte posOffset[20] = {10, 16, 18, 20, 24, 30, 34, 40, 44, 50, 54, 56, 58, 60, 62, 64, 68, 70, 72, 74}; // вч выш
      byte maxValue, maxValue_f,www=1,gain_sp = DEF_GAIN;
      float k = 0.1;
      int i1,yyy,spek;
      unsigned long gainTimer;
   
void setup(){

   sbi(ADCSRA, ADPS2);  // поднимаем частоту опроса аналогового порта до 38.4 кГц, по теореме
   cbi(ADCSRA, ADPS1);  // Котельникова (Найквиста) частота дискретизации будет 19 кГц
   sbi(ADCSRA, ADPS0);  // http://yaab-arduino.blogspot.ru/2015/02/fast-sampling-from-analog-input.html
   
   Serial.begin(9600);
   lcd.begin(20,4);// LCD 20X4
   ADMUX  = 0b01100000; ADCSRA = 0b11010100; 
   lcd.setCursor(1, 1);
   lcd.print("Spektrum  Analyzer");
   delay(4000);
   pinMode(12,INPUT);
   spek = EEPROM.read(100);
}

 void loop(){
   if(digitalRead(12)==HIGH){spek++;EEPROM.update(100,spek); www=1;if(spek>5){spek=0;}delay(300);}

      if(spek==0&&www==1){
      byte v1[8] = {0, 0, 0, 0, 0, 0, 0, 31};
      byte v2[8] = {0, 0, 0, 0, 0, 0, 31, 31};
      byte v3[8] = {0, 0, 0, 0, 0, 31, 31, 31};
      byte v4[8] = {0, 0, 0, 0, 31, 31, 31, 31};
      byte v5[8] = {0, 0, 0, 31, 31, 31, 31, 31};
      byte v6[8] = {0, 0, 31, 31, 31, 31, 31, 31};
      byte v7[8] = {0, 31, 31, 31, 31, 31, 31, 31};
      byte v8[8] = {31, 31, 31, 31, 31, 31, 31, 31};
      lcd.createChar(0, v1);lcd.createChar(1, v2);lcd.createChar(2, v3);lcd.createChar(3, v4);lcd.createChar(4, v5);lcd.createChar(5, v6);lcd.createChar(6, v7);lcd.createChar(7, v8);
      www=0;}
     

      if(spek==1&&www==1){
      byte v1[8] = {0, 0, 0, 0, 0, 0, 0, 4};
      byte v2[8] = {0, 0, 0, 0, 0, 0, 4, 4};
      byte v3[8] = {0, 0, 0, 0, 0, 4, 4, 4};
      byte v4[8] = {0, 0, 0, 0, 4, 4, 4, 4};
      byte v5[8] = {0, 0, 0, 4, 4, 4, 4, 4};
      byte v6[8] = {0, 0, 4, 4, 4, 4, 4, 4};
      byte v7[8] = {0, 4, 4, 4, 4, 4, 4, 4};
      byte v8[8] = {4, 4, 4, 4, 4, 4, 4, 4};
      lcd.createChar(0, v1);lcd.createChar(1, v2);lcd.createChar(2, v3);lcd.createChar(3, v4);lcd.createChar(4, v5);lcd.createChar(5, v6);lcd.createChar(6, v7);lcd.createChar(7, v8);
      www=0;}

      if(spek==2&&www==1){
      byte v1[8] = {0, 0, 0, 0, 0, 0, 0, 14};
      byte v2[8] = {0, 0, 0, 0, 0, 0, 14, 14};
      byte v3[8] = {0, 0, 0, 0, 0, 14, 14, 14};
      byte v4[8] = {0, 0, 0, 0, 14, 14, 14, 14};
      byte v5[8] = {0, 0, 0, 14, 14, 14, 14, 14};
      byte v6[8] = {0, 0, 14, 14, 14, 14, 14, 14};
      byte v7[8] = {0, 14, 14, 14, 14, 14, 14, 14};
      byte v8[8] = {14, 14, 14, 14, 14, 14, 14, 14};
      lcd.createChar(0, v1);lcd.createChar(1, v2);lcd.createChar(2, v3);lcd.createChar(3, v4);lcd.createChar(4, v5);lcd.createChar(5, v6);lcd.createChar(6, v7);lcd.createChar(7, v8);
      www=0;}

      if(spek==3&&www==1){
      byte v1[8] = {0, 0, 0, 0, 0, 0, 0, 10};
      byte v2[8] = {0, 0, 0, 0, 0, 0, 10, 10};
      byte v3[8] = {0, 0, 0, 0, 0, 10, 10, 10};
      byte v4[8] = {0, 0, 0, 0, 10, 10, 10, 10};
      byte v5[8] = {0, 0, 0, 10, 10, 10, 10, 10};
      byte v6[8] = {0, 0, 10, 10, 10, 10, 10, 10};
      byte v7[8] = {0, 10, 10, 10, 10, 10, 10, 10};
      byte v8[8] = {10, 10, 10, 10, 10, 10, 10, 10};
      lcd.createChar(0, v1);lcd.createChar(1, v2);lcd.createChar(2, v3);lcd.createChar(3, v4);lcd.createChar(4, v5);lcd.createChar(5, v6);lcd.createChar(6, v7);lcd.createChar(7, v8);
      www=0;}

      if(spek==4&&www==1){
      byte v1[8] = {0, 0, 0, 0, 0, 0, 0, 27};
      byte v2[8] = {0, 0, 0, 0, 0, 0, 27, 27};
      byte v3[8] = {0, 0, 0, 0, 0, 27, 27, 27};
      byte v4[8] = {0, 0, 0, 0, 27, 27, 27, 27};
      byte v5[8] = {0, 0, 0, 27, 27, 27, 27, 27};
      byte v6[8] = {0, 0, 27, 27, 27, 27, 27, 27};
      byte v7[8] = {0, 27, 27, 27, 27, 27, 27, 27};
      byte v8[8] = {27, 27, 27, 27, 27, 27, 27, 27};
      lcd.createChar(0, v1);lcd.createChar(1, v2);lcd.createChar(2, v3);lcd.createChar(3, v4);lcd.createChar(4, v5);lcd.createChar(5, v6);lcd.createChar(6, v7);lcd.createChar(7, v8);
      www=0;}

      
      if(spek==5&&www==1){
      byte v1[8] = {0, 0, 0, 0, 0, 0, 0, 21};
      byte v2[8] = {0, 0, 0, 0, 0, 0, 21, 21};
      byte v3[8] = {0, 0, 0, 0, 0, 21, 21, 21};
      byte v4[8] = {0, 0, 0, 0, 21, 21, 21, 21};
      byte v5[8] = {0, 0, 0, 21, 21, 21, 21, 21};
      byte v6[8] = {0, 0, 21, 21, 21, 21, 21, 21};
      byte v7[8] = {0, 21, 21, 21, 21, 21, 21, 21};
      byte v8[8] = {21, 21, 21, 21, 21, 21, 21, 21};
      lcd.createChar(0, v1);lcd.createChar(1, v2);lcd.createChar(2, v3);lcd.createChar(3, v4);lcd.createChar(4, v5);lcd.createChar(5, v6);lcd.createChar(6, v7);lcd.createChar(7, v8);
      www=0;}
    
      analyzeAudio();   // функция FHT, забивает массив fht_log_out[] величинами по спектру

      for (int pos = 0; pos < 20; 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, 31);
        posLevel = constrain(posLevel, 0, 31);

   if(posLevel<7){
    lcd.setCursor(pos, 0);lcd.print(" ");
    lcd.setCursor(pos, 1);lcd.print(" ");
    lcd.setCursor(pos, 2);lcd.print(" ");
    lcd.setCursor(pos, 3);lcd.write((uint8_t)posLevel);}
   
   if(posLevel>7&&posLevel<15){
    lcd.setCursor(pos, 0);lcd.print(" ");
    lcd.setCursor(pos, 1);lcd.print(" ");
    lcd.setCursor(pos, 3);lcd.write((uint8_t)7);lcd.setCursor(pos, 2);lcd.write((uint8_t)posLevel-8);}

   if(posLevel>15&&posLevel<23){
    lcd.setCursor(pos, 0);lcd.print(" ");
    lcd.setCursor(pos, 3);lcd.write((uint8_t)7);
    lcd.setCursor(pos, 2);lcd.write((uint8_t)7);lcd.setCursor(pos, 1);lcd.write((uint8_t)posLevel-16);}    

   if(posLevel>23&&posLevel<31){
    lcd.setCursor(pos, 3);lcd.write((uint8_t)7);
    lcd.setCursor(pos, 2);lcd.write((uint8_t)7);
    lcd.setCursor(pos, 1);lcd.write((uint8_t)7);lcd.setCursor(pos, 0);lcd.write((uint8_t)posLevel-24);}           
      }


   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 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
}

7

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

liman324 Здраствуйте.
А как сделать так, что бы столбики не снизу вверх, а наоборот? Сверху вниз отображались?
За ранее спасибки.

8

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

Здравствуйте! Хотя ветка и затихла попробую спросить. Как в данном проекте использовать такой вот дисплей https://aliexpress.ru/item/100500206007 … 4aa6OHLinX ? Уж очень не хотелось бы снимать доп. платку.

9

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

С платой I2C не хватит быстродействия экрана.

10

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

Здравствуйте! Хотел посмотреть хотя бы приблизительно как все это работает, но увы! Залил скетч от vanzan777, соединил для I2C(всего то 6 проводков, ошибиться не мог), скетч залился без ошибок. На дисплее ничего не вижу! Скажите, пожалуйста, что можно посмотреть? Или у vanzan777 управление по I2C отключено?

11

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

Возможно дисплей имеет другой i2c адрес, проверьте адреса i2c сканером.

12

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

Переменным резистором  на модуле контрастность дисплея регулируется только две полосы. Подключил дисплей параллельно к ардуино. Никакой реакции на экране от музыки нет. Что можно посмотреть? Спасибо!

13 (2021-11-25 22:39:52 отредактировано samand587)

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

liman324 пишет:

.... проверьте адреса i2c сканером.

Адрес стандартный 0х27

14

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

vanzan777 использует параллельное подключение экрана.

15

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

Я залил Ваш скетч- результат тот же! Пробовал подключать параллельно как у vanzan777 - не хочет работать. А при параллельном включении доп. плату с дисплея снимать?

16

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

А при параллельном включении доп. плату с дисплея снимать?

Да, снимать.

17

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

Так почему же с Вашим скетчем по i2c не хочет работать? В подключениях проводов ошибки нет, скетч заливается без замечаний. Где еще что посмотреть? Х.З.!

18

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

Протестируйте дисплей - http://forum.rcl-radio.ru/viewtopic.php?id=103

19

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

Дисплей исправен. Вот фото!http://forum.rcl-radio.ru/uploads/images/2021/11/f89f3801bcd344fd4f1b3185de8444c5.jpg

20

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

Здравствуйте! Попробовал залить Ваш скетч- не заливается, хотя компиляция проходит успешно. Ардуино пишет, что загрузка завершена, а текст остается как на экране выше. Что это может быть?

21

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

Вы заливаете этот скетч - http://forum.rcl-radio.ru/viewtopic.php?pid=504#p504

22

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

Да!

23

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

Попробуйте этот скетч

 #define AUTO_GAIN 1       // автонастройка по громкости
  #define VOL_THR 45        // порог тишины (ниже него отображения на матрице не будет)
  #define LOW_PASS 40       // нижний порог чувствительности шумов (нет скачков при отсутствии звука)
  #define DEF_GAIN 120       // максимальный порог по умолчанию 
  #define FHT_N 256         // ширина спектра х2
  #define LOG_OUT 1
  #include <FHT.h> 
  #include <EEPROM.h>
  #include <Wire.h> 
  #include <LiquidCrystal_I2C.h>
   LiquidCrystal_I2C lcd(0x27,20,4);  // Устанавливаем дисплей
   #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
   #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
      byte posOffset[20] = {2, 3, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 40}; // вч выше
      byte maxValue, maxValue_f,www=1,gain_sp = DEF_GAIN;
      float k = 0.1;
      int i1,yyy,spek;
      unsigned long gainTimer;
   
void setup(){
   Serial.begin(9600);Wire.begin();
  sbi(ADCSRA, ADPS2);
  cbi(ADCSRA, ADPS1);
  sbi(ADCSRA, ADPS0);
  analogReference(INTERNAL);
   lcd.init();lcd.backlight();
   pinMode(12,INPUT);
   spek = EEPROM.read(100);
}

 void loop(){
   if(digitalRead(12)==HIGH){spek++;EEPROM.update(100,spek); www=1;if(spek>5){spek=0;}delay(300);}

      if(spek==0&&www==1){
      byte v1[8] = {0, 0, 0, 0, 0, 0, 0, 4};
      byte v2[8] = {0, 0, 0, 0, 0, 0, 4, 4};
      byte v3[8] = {0, 0, 0, 0, 0, 4, 4, 4};
      byte v4[8] = {0, 0, 0, 0, 4, 4, 4, 4};
      byte v5[8] = {0, 0, 0, 4, 4, 4, 4, 4};
      byte v6[8] = {0, 0, 4, 4, 4, 4, 4, 4};
      byte v7[8] = {0, 4, 4, 4, 4, 4, 4, 4};
      byte v8[8] = {4, 4, 4, 4, 4, 4, 4, 4};
      lcd.createChar(0, v1);lcd.createChar(1, v2);lcd.createChar(2, v3);lcd.createChar(3, v4);lcd.createChar(4, v5);lcd.createChar(5, v6);lcd.createChar(6, v7);lcd.createChar(7, v8);
      www=0;}

      if(spek==1&&www==1){
      byte v1[8] = {0, 0, 0, 0, 0, 0, 0, 14};
      byte v2[8] = {0, 0, 0, 0, 0, 0, 14, 14};
      byte v3[8] = {0, 0, 0, 0, 0, 14, 14, 14};
      byte v4[8] = {0, 0, 0, 0, 14, 14, 14, 14};
      byte v5[8] = {0, 0, 0, 14, 14, 14, 14, 14};
      byte v6[8] = {0, 0, 14, 14, 14, 14, 14, 14};
      byte v7[8] = {0, 14, 14, 14, 14, 14, 14, 14};
      byte v8[8] = {14, 14, 14, 14, 14, 14, 14, 14};
      lcd.createChar(0, v1);lcd.createChar(1, v2);lcd.createChar(2, v3);lcd.createChar(3, v4);lcd.createChar(4, v5);lcd.createChar(5, v6);lcd.createChar(6, v7);lcd.createChar(7, v8);
      www=0;}

      if(spek==2&&www==1){
      byte v1[8] = {0, 0, 0, 0, 0, 0, 0, 10};
      byte v2[8] = {0, 0, 0, 0, 0, 0, 10, 10};
      byte v3[8] = {0, 0, 0, 0, 0, 10, 10, 10};
      byte v4[8] = {0, 0, 0, 0, 10, 10, 10, 10};
      byte v5[8] = {0, 0, 0, 10, 10, 10, 10, 10};
      byte v6[8] = {0, 0, 10, 10, 10, 10, 10, 10};
      byte v7[8] = {0, 10, 10, 10, 10, 10, 10, 10};
      byte v8[8] = {10, 10, 10, 10, 10, 10, 10, 10};
      lcd.createChar(0, v1);lcd.createChar(1, v2);lcd.createChar(2, v3);lcd.createChar(3, v4);lcd.createChar(4, v5);lcd.createChar(5, v6);lcd.createChar(6, v7);lcd.createChar(7, v8);
      www=0;}

      if(spek==3&&www==1){
      byte v1[8] = {0, 0, 0, 0, 0, 0, 0, 27};
      byte v2[8] = {0, 0, 0, 0, 0, 0, 27, 27};
      byte v3[8] = {0, 0, 0, 0, 0, 27, 27, 27};
      byte v4[8] = {0, 0, 0, 0, 27, 27, 27, 27};
      byte v5[8] = {0, 0, 0, 27, 27, 27, 27, 27};
      byte v6[8] = {0, 0, 27, 27, 27, 27, 27, 27};
      byte v7[8] = {0, 27, 27, 27, 27, 27, 27, 27};
      byte v8[8] = {27, 27, 27, 27, 27, 27, 27, 27};
      lcd.createChar(0, v1);lcd.createChar(1, v2);lcd.createChar(2, v3);lcd.createChar(3, v4);lcd.createChar(4, v5);lcd.createChar(5, v6);lcd.createChar(6, v7);lcd.createChar(7, v8);
      www=0;}

      if(spek==4&&www==1){
      byte v1[8] = {0, 0, 0, 0, 0, 0, 0, 31};
      byte v2[8] = {0, 0, 0, 0, 0, 0, 31, 31};
      byte v3[8] = {0, 0, 0, 0, 0, 31, 31, 31};
      byte v4[8] = {0, 0, 0, 0, 31, 31, 31, 31};
      byte v5[8] = {0, 0, 0, 31, 31, 31, 31, 31};
      byte v6[8] = {0, 0, 31, 31, 31, 31, 31, 31};
      byte v7[8] = {0, 31, 31, 31, 31, 31, 31, 31};
      byte v8[8] = {31, 31, 31, 31, 31, 31, 31, 31};
      lcd.createChar(0, v1);lcd.createChar(1, v2);lcd.createChar(2, v3);lcd.createChar(3, v4);lcd.createChar(4, v5);lcd.createChar(5, v6);lcd.createChar(6, v7);lcd.createChar(7, v8);
      www=0;}

      if(spek==5&&www==1){
      byte v1[8] = {0, 0, 0, 0, 0, 0, 0, 21};
      byte v2[8] = {0, 0, 0, 0, 0, 0, 21, 21};
      byte v3[8] = {0, 0, 0, 0, 0, 21, 21, 21};
      byte v4[8] = {0, 0, 0, 0, 21, 21, 21, 21};
      byte v5[8] = {0, 0, 0, 21, 21, 21, 21, 21};
      byte v6[8] = {0, 0, 21, 21, 21, 21, 21, 21};
      byte v7[8] = {0, 21, 21, 21, 21, 21, 21, 21};
      byte v8[8] = {21, 21, 21, 21, 21, 21, 21, 21};
      lcd.createChar(0, v1);lcd.createChar(1, v2);lcd.createChar(2, v3);lcd.createChar(3, v4);lcd.createChar(4, v5);lcd.createChar(5, v6);lcd.createChar(6, v7);lcd.createChar(7, v8);
      www=0;}
    
      analyzeAudio();   // функция FHT, забивает массив fht_log_out[] величинами по спектру

      for (int pos = 0; pos < 20; 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, 31);
        posLevel = constrain(posLevel, 0, 31);

   if(posLevel<7){
    lcd.setCursor(pos, 0);lcd.print(" ");
    lcd.setCursor(pos, 1);lcd.print(" ");
    lcd.setCursor(pos, 2);lcd.print(" ");
    lcd.setCursor(pos, 3);lcd.write((uint8_t)posLevel);}
   
   if(posLevel>7&&posLevel<15){
    lcd.setCursor(pos, 0);lcd.print(" ");
    lcd.setCursor(pos, 1);lcd.print(" ");
    lcd.setCursor(pos, 3);lcd.write((uint8_t)7);lcd.setCursor(pos, 2);lcd.write((uint8_t)posLevel-8);}

   if(posLevel>15&&posLevel<23){
    lcd.setCursor(pos, 0);lcd.print(" ");
    lcd.setCursor(pos, 3);lcd.write((uint8_t)7);
    lcd.setCursor(pos, 2);lcd.write((uint8_t)7);lcd.setCursor(pos, 1);lcd.write((uint8_t)posLevel-16);}    

   if(posLevel>23&&posLevel<31){
    lcd.setCursor(pos, 3);lcd.write((uint8_t)7);
    lcd.setCursor(pos, 2);lcd.write((uint8_t)7);
    lcd.setCursor(pos, 1);lcd.write((uint8_t)7);lcd.setCursor(pos, 0);lcd.write((uint8_t)posLevel-24);}           
      }


   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 analyzeAudio() { 
  for (int i1 = 0 ; i1 < FHT_N ; i1++) {
    int sample = analogRead(A0);
    fht_input[i1] = sample; // put real data into bins
  }
  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
}

 

24

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

Не понял как, но загрузился вот этот http://forum.rcl-radio.ru/viewtopic.php?pid=504#p504 Попробую  и другой!

25

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

Крайний скетч так же загрузился! С предыдущим без звука были какие то шумы, а с крайним все столбики на нуле. Попробую с музыкой.