Индикатор уровня сигнала (Arduino)(2)

На рисунке показана схема простого индикатора уровня звукового сигнала. На входы А0 А1 подается звуковой сигнал через резисторы номиналом 4,7 кОм. Индикатор уровня имеет 45 ступеней, в левой часто индикатора LCD1602 отображаются названия каналов, которые имеют два исполнения — для горизонтального расположения индикатора и для вертикального. Кнопка SET позволяет переключать режимы отображения шкальных полос.

#define GAIN 14 // усиление 0...50
#define STEP 2  // плавность полос 0...20
#define RL 1    // RL - горизонт, вертикаль 0...1
 
#include <LiquidCrystal.h>
#include <EEPROM.h>
  LiquidCrystal lcd(2, 3, 4, 5, 6, 7);// RS,E,D4,D5,D6,D7
  byte z,z0,z1,w,www=1;
  int ur,ul,urr,ull;
 
 
void setup() {
  pinMode(8,INPUT_PULLUP);
  byte znak_r[8]={0b00000,0b00000,0b11111,0b00101,0b00101,0b11010,0b00000,0b00000};
  byte znak_l[8]={0b00000,0b00000,0b11111,0b10000,0b10000,0b10000,0b00000,0b00000};
  lcd.createChar(4,znak_r); 
  lcd.createChar(5,znak_l);
  lcd.begin(16, 2);// LCD 16X2
 // analogReference(INTERNAL);  // если очень маленький уровень сигнала
  pinMode(A0,INPUT);// A0 - аналоговый вход R
  pinMode(A1,INPUT);// A1 - аналоговый вход L
  w=EEPROM.read(0);
}
 
void loop() {
  if(digitalRead(8)==LOW){w++;www=1;if(w>4){w=0;}delay(200);EEPROM.update(0,w);}
 
  if(w==0&&www==1){www=0;
  byte a1[8] = {0b10101,0b10101,0b10101,0b10101,0b10101,0b10101,0b10101,0b10101};
  byte a2[8] = {0b10100,0b10100,0b10100,0b10100,0b10100,0b10100,0b10100,0b10100};
  byte a3[8] = {0b10000,0b10000,0b10000,0b10000,0b10000,0b10000,0b10000,0b10000};
  lcd.createChar(0,a1);lcd.createChar(1,a2);lcd.createChar(2,a3);}
  if(w==1&&www==1){www=0;
  byte a1[8] = {0b00000,0b10101,0b10101,0b10101,0b10101,0b10101,0b10101,0b00000};
  byte a2[8] = {0b00000,0b10100,0b10100,0b10100,0b10100,0b10100,0b10100,0b00000};
  byte a3[8] = {0b00000,0b10000,0b10000,0b10000,0b10000,0b10000,0b10000,0b00000};
  lcd.createChar(0,a1);lcd.createChar(1,a2);lcd.createChar(2,a3);} 
  if(w==2&&www==1){www=0;
  byte a1[8] = {0b10101,0b10101,0b10101,0b00000,0b00000,0b10101,0b10101,0b10101};
  byte a2[8] = {0b10100,0b10100,0b10100,0b00000,0b00000,0b10100,0b10100,0b10100};
  byte a3[8] = {0b10000,0b10000,0b10000,0b00000,0b00000,0b10000,0b10000,0b10000};
  lcd.createChar(0,a1);lcd.createChar(1,a2);lcd.createChar(2,a3);} 
  if(w==3&&www==1){www=0;
  byte a1[8] = {0b00000,0b10101,0b10101,0b00000,0b00000,0b10101,0b10101,0b00000};
  byte a2[8] = {0b00000,0b10100,0b10100,0b00000,0b00000,0b10100,0b10100,0b00000};
  byte a3[8] = {0b00000,0b10000,0b10000,0b00000,0b00000,0b10000,0b10000,0b00000};
  lcd.createChar(0,a1);lcd.createChar(1,a2);lcd.createChar(2,a3);}
  if(w==4&&www==1){www=0;
  byte a1[8] = {0b00000,0b00000,0b10101,0b10101,0b10101,0b10101,0b00000,0b00000};
  byte a2[8] = {0b00000,0b00000,0b10100,0b10100,0b10100,0b10100,0b00000,0b00000};
  byte a3[8] = {0b00000,0b00000,0b10000,0b10000,0b10000,0b10000,0b00000,0b00000};
  lcd.createChar(0,a1);lcd.createChar(1,a2);lcd.createChar(2,a3);} 
 
  urr = log(analogRead(0))*GAIN;
  ull = log(analogRead(1))*GAIN;
 
  if(RL==0){lcd.setCursor(0,0);lcd.write((uint8_t)4);lcd.setCursor(0,1);lcd.write((uint8_t)5);}
  if(RL==1){lcd.setCursor(0,1);lcd.print("L");lcd.setCursor(0,0);lcd.print("R");}
 
   if(urr<ur){ur=ur-1;delay(STEP);}else{ur = urr;}
  for(z=0,z0=0,z1=0;z<=ur;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+1,1);lcd.write((uint8_t)0);lcd.setCursor(z0+2,1);lcd.print(" ");}}
   if(z1==3){lcd.setCursor(z0+1,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+1,1);lcd.write((uint8_t)2);}
 
   if(ull<ul){ul=ul-1;delay(STEP);}else{ul = ull;}
  for(z=0,z0=0,z1=0;z<=ul;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+1,0);lcd.write((uint8_t)0);lcd.setCursor(z0+2,0);lcd.print(" ");}}
   if(z1==3){lcd.setCursor(z0+1,0);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+1,0);lcd.write((uint8_t)2);}
 
  delay(1);
}

Скетч индикатора содержит настройки которые позволяют отрегулировать усиление и время спада шкалы при понижении уровня сигнала.

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

#define GAIN 14 // усиление 0...50
#define STEP 2  // плавность полос 0...20
#define RL 0    // RL - горизонт, вертикаль 0...1
 
#include <LiquidCrystal.h>
#include <EEPROM.h>
  LiquidCrystal lcd(2, 3, 4, 5, 6, 7);// RS,E,D4,D5,D6,D7
  byte z,z0,z1,w,www=1;
  int ur,ul,urr,ull,urrr,ulll;
  int x,i,u_maxr,u_maxl;
  int u_l0[20],u_r0[20];
 
 
void setup() {
  pinMode(8,INPUT_PULLUP);
  byte znak_r[8]={0b00000,0b00000,0b11111,0b00101,0b00101,0b11010,0b00000,0b00000};
  byte znak_l[8]={0b00000,0b00000,0b11111,0b10000,0b10000,0b10000,0b00000,0b00000};
  lcd.createChar(4,znak_r); 
  lcd.createChar(5,znak_l);
  lcd.begin(16, 2);// LCD 16X2
 // analogReference(INTERNAL);  // если очень маленький уровень сигнала
  pinMode(A0,INPUT);// A0 - аналоговый вход R
  pinMode(A1,INPUT);// A1 - аналоговый вход L
  w=EEPROM.read(0);
}
 
void loop() {
  if(digitalRead(8)==LOW){w++;www=1;if(w>4){w=0;}delay(200);EEPROM.update(0,w);}
 
  if(w==0&&www==1){www=0;
  byte a1[8] = {0b10101,0b10101,0b10101,0b10101,0b10101,0b10101,0b10101,0b10101};
  byte a2[8] = {0b10100,0b10100,0b10100,0b10100,0b10100,0b10100,0b10100,0b10100};
  byte a3[8] = {0b10000,0b10000,0b10000,0b10000,0b10000,0b10000,0b10000,0b10000};
  byte a4[8] = {0b00100,0b00100,0b00100,0b00100,0b00100,0b00100,0b00100,0b00100};// 
  lcd.createChar(0,a1);lcd.createChar(1,a2);lcd.createChar(2,a3);lcd.createChar(6,a4);} 
  if(w==1&&www==1){www=0;
  byte a1[8] = {0b00000,0b10101,0b10101,0b10101,0b10101,0b10101,0b10101,0b00000};
  byte a2[8] = {0b00000,0b10100,0b10100,0b10100,0b10100,0b10100,0b10100,0b00000};
  byte a3[8] = {0b00000,0b10000,0b10000,0b10000,0b10000,0b10000,0b10000,0b00000};
  byte a4[8] = {0b00000,0b00100,0b00100,0b00100,0b00100,0b00100,0b00100,0b00000};//  
  lcd.createChar(0,a1);lcd.createChar(1,a2);lcd.createChar(2,a3);lcd.createChar(6,a4);} 
  if(w==2&&www==1){www=0;
  byte a1[8] = {0b10101,0b10101,0b10101,0b00000,0b00000,0b10101,0b10101,0b10101};
  byte a2[8] = {0b10100,0b10100,0b10100,0b00000,0b00000,0b10100,0b10100,0b10100};
  byte a3[8] = {0b10000,0b10000,0b10000,0b00000,0b00000,0b10000,0b10000,0b10000};
  byte a4[8] = {0b00100,0b00100,0b00100,0b00100,0b00100,0b00100,0b00100,0b00100}; 
  lcd.createChar(0,a1);lcd.createChar(1,a2);lcd.createChar(2,a3);lcd.createChar(6,a4);} 
  if(w==3&&www==1){www=0;
  byte a1[8] = {0b00000,0b10101,0b10101,0b00000,0b00000,0b10101,0b10101,0b00000};
  byte a2[8] = {0b00000,0b10100,0b10100,0b00000,0b00000,0b10100,0b10100,0b00000};
  byte a3[8] = {0b00000,0b10000,0b10000,0b00000,0b00000,0b10000,0b10000,0b00000};
  byte a4[8] = {0b00000,0b00100,0b00100,0b00100,0b00100,0b00100,0b00100,0b00000};
  lcd.createChar(0,a1);lcd.createChar(1,a2);lcd.createChar(2,a3);lcd.createChar(6,a4);} 
  if(w==4&&www==1){www=0;
  byte a1[8] = {0b00000,0b00000,0b10101,0b10101,0b10101,0b10101,0b00000,0b00000};
  byte a2[8] = {0b00000,0b00000,0b10100,0b10100,0b10100,0b10100,0b00000,0b00000};
  byte a3[8] = {0b00000,0b00000,0b10000,0b10000,0b10000,0b10000,0b00000,0b00000};
  byte a4[8] = {0b00000,0b00000,0b00100,0b00100,0b00100,0b00100,0b00000,0b00000};
  lcd.createChar(0,a1);lcd.createChar(1,a2);lcd.createChar(2,a3);lcd.createChar(6,a4);} 
 
  urr = log(analogRead(0))*GAIN;if(urr>41){urr=41;}
  ull = log(analogRead(1))*GAIN;if(ull>41){ull=41;}
 
  if(RL==0){lcd.setCursor(0,0);lcd.write((uint8_t)4);lcd.setCursor(0,1);lcd.write((uint8_t)5);}
  if(RL==1){lcd.setCursor(0,1);lcd.print("L");lcd.setCursor(0,0);lcd.print("R");}
 
   if(urr<ur){ur=ur-1;delay(STEP);}else{ur = urr;}
  for(z=0,z0=0,z1=0;z<=ur;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+1,1);lcd.write((uint8_t)0);lcd.setCursor(z0+2,1);if(ur<39){lcd.print(" ");}}}
   if(z1==3){lcd.setCursor(z0+1,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+1,1);lcd.write((uint8_t)2);}
 
   if(ull<ul){ul=ul-1;delay(STEP);}else{ul = ull;}
  for(z=0,z0=0,z1=0;z<=ul;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+1,0);lcd.write((uint8_t)0);lcd.setCursor(z0+2,0);;if(ul<39){lcd.print(" ");}}}
   if(z1==3){lcd.setCursor(z0+1,0);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+1,0);lcd.write((uint8_t)2);}
 
//////////////////////////////////////////////////////////
 
i++;if(i<19){u_l0[i]=abs(ull);u_r0[i]=abs(urr);}else{i=1;}
  if(i==18){u_maxr=0;u_maxl=0;
    for(x=1;x<=15;x++){
      u_maxl=max(u_maxl,u_l0[x]);
      u_maxr=max(u_maxr,u_r0[x]);}}
 
  if(u_maxl<ulll){ulll=ulll-1;}else{ulll = u_maxl;}
  if(u_maxr<urrr){urrr=urrr-1;}else{urrr = u_maxr;}
 
  if(u_maxl<=ull){u_maxl=ull+1;} 
  if(u_maxr<=urr){u_maxr=urr+1;} 
 
  lcd.setCursor(ulll/3+1,0);if(ulll/3>2){lcd.write((uint8_t)6);}lcd.print("  ");
  lcd.setCursor(urrr/3+1,1);if(urrr/3>2){lcd.write((uint8_t)6);}lcd.print("  "); 
  delay(3);
}

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

Библиотека — http://forum.rcl-radio.ru/misc.php?action=pan_download&item=45&download=1


Скетч — http://forum.rcl-radio.ru/viewtopic.php?pid=1948#p1948 (одна пиковая полоса на знакоместо)

Скетч — http://forum.rcl-radio.ru/viewtopic.php?pid=1949#p1949 (две пиковые полосы на знакоместо)

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

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