| Ваш IP: 3.236.132.132 | Online(34) - гости: 24, боты: 10 | Загрузка сервера: 0.54 ::::::::::::

Индикатор уровня сигнала (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 (две пиковые полосы на знакоместо)

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

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

Случайные статьи

  • Устройство защиты электродвигателя

    В качестве типовых элементов защиты электродвигателей чаще всего применяют электротепловые реле. Конструкторы вынуждены завышать номинальный ток этих реле, чтобы не было срабатываний при пуске. Надежность такой защиты невелика, и большой процент двигателей выходит из строя в процессе эксплуатации. Схема устройства защиты двигателей (см. рисунок) от неполнофазных режимов и перегрузки отличается …Подробнее...
  • Сигнализатор открытой двери холодильника

    Схема сигнализатора помещена в небольшую коробочку, в коробочке имеется прорезь для фоторезистора. Уст-во помещают в прямой видимости от осветительной лампы холодильника. При закрытой двери холодильника R2 фоторезистор имеет высокое сопротивление (более 200 кОм), при попадании света на фоторезистор сопротивление его становиться малым, запускается счетчик 4060. Через 20 секунд зазвучит звуковой …Подробнее...
  • Регулятор скорости вентилятора (12В)

    Регулятор скорости вентилятора (12В)

    На рисунке показана простая схема регулятора скорости вращения вентилятора (кулера). Иногда вентиляторы при работе создают значительный шум, для уменьшения шума можно уменьшить скорость вращения вентилятора, там где позволяет тепловой режим. Схема позволяет осуществить плавную регулировку скорости вращения вентилятора при помощи потенциометра R3. После сборки уст-во в настройке не нуждаетсяПодробнее...
  • Переключатели елочных гирлянд

    Переключатель елочных гирлянд коммутирует переключение 2-х гирлянд, его силовая часть питается от сетевого напряжения 220В через выпрямитель на диодном мосте VD3. В качестве коммутирующих ключей служат тринисторы которые коммутируют гирлянды с сетевым напряжением. Максимальная мощность подключенных гирлянд может быть до 200Вт. На DD1.1 DD1.3 собран генератор импульсов с частотой следования …Подробнее...
  • Часы на PIC16F84A

    Часы на PIC16F84A

    На рисунке показана схема часов выполненных на микроконтроллере PIC16F84A. Часы имеют функцию корректировки времени которую можно осуществить при помощи кнопок  SA1 (минуты) SA2 (часы). В схеме используются семи сегментные индикаторы с общим катодом. pic16f84-clock.zipПодробнее...