Визуализация уровня громкости

operrr
Offline
Зарегистрирован: 29.09.2016

Тех.задание:  Вывести на 2-х разрядный семисегментный индикатор текущий уровень звука. 

Аппаратная часть:

1. Arduino UNO

2. Микрофонный усилитель FC-109

3. Модуль TM1637

Скейч:

#include "TM1637.h"
#define CLK 2 // пин модуля индикатора
#define DIO 3 // пин модуля индикатора
TM1637 tm1637(CLK, DIO);
int BuzzPin = 5; // пищалка на пине 5
int MicInPin = A0; //модуль микрофона садим на аналоговый пин 0
int VoiceLevel = 0; // значения с микрофона
int MaxVoiceLevel = 0; // Максимальное значение сигнала
int MicLevel = 0; // значения с микрофона в 2х значном формате


void setup() 
{
  pinMode(BuzzPin, OUTPUT); //объявляем пин пищалки как выход
  pinMode(MicInPin, INPUT); //объявляем пин микрофона как вход
  tm1637.init();
  tm1637.set(2); //BRIGHT_TYPICAL = 2,BRIGHT_DARKEST = 0,BRIGHTEST = 7;
  Serial.begin(9600); 
  Serial.println("Microphone Test" ); 
  tm1637.point(POINT_OFF);
}

void loop() 
{
  VoiceLevel = analogRead(MicInPin);
  MicLevel = map(VoiceLevel,0,1023,0,99); // переводим диапазон значений
  if (MaxVoiceLevel < MicLevel)
  {
      MaxVoiceLevel = MicLevel;
      beep(100);
   }
  Serial.print("Value= ");                       
  Serial.print(VoiceLevel);
  Serial.print("  Microphone value= ");                       
  Serial.print(MicLevel); 
  Serial.print("  MAX= ");
  Serial.println(MaxVoiceLevel);  
  int8_t Digits[] = {0x00, 0x00, 0x00, 0x00};
  int KL1 = MicLevel;
  int KL2 = (MicLevel - KL1) * 100;
  int KL3 = MaxVoiceLevel;
  int KL4 = (MaxVoiceLevel - KL3) * 100;
      
      Digits[0] = (KL1 / 10); // раскидываем 4-значное число на цифры
      Digits[1] = (KL1 % 10);
      Digits[2] = (KL3 / 10); // раскидываем 4-значное число на цифры
      Digits[3] = (KL3 % 10);
      tm1637.display(Digits);
      delay(100);
}


void beep(unsigned char delayms)
{
  analogWrite(BuzzPin, 10);      // значение должно находится между 0 и 255
  delay(delayms);          // пауза delayms мс
  analogWrite(BuzzPin, 0);       // 0 - выключаем пьезо
  delay(delayms);          // пауза delayms мс
}

Проблема:

Часть кода должна выводить в порт значения с аналогового порта пропорционально уровню громкости.Вроде все работает, но есть одно НО. При чтении аналогового порта и грубо говоря тишине получаю значения 333-335, когда что-либо кричу в микрофон значения по логике должно увеличиваться и оно сначала действительно увеличивается до 600-700, потом может упасть до 200-270 и через несколько секунд опять выходит на значение 333-335. С портами все в порядке, если подцепить потенциометр то получаю значения от 0 до 1023 как и должно быть а вот с микрофоном беда. Хэлп парни, я уже конкретно туплю и просто не могу вкурить в чем проблема.

 

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

Привет.

Думаю дело в электрической схеме, которую вы не выложили.

Безе нее точно утверждать не буду, но если у вас проcтой усилитель звука то он просто усиливает колебания которые снимает микрофон и они с частотой от 30ГЦ до 16КГц в зависимости от того что слышит микрофон, а вы медленным analogRead считываете показания, вот он и выдает то что успел периодически выхватить из потока импульсов.

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

Думаю между усилителем и Ардуино должна быть некая прослойка в виде RC фильтра чтоб пульсации звука привести к постоянному напряжению меняющему свою амплитуду в зависимости от громкости.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Или программный ФНЧ -  благо в две строчки пишется.

operrr
Offline
Зарегистрирован: 29.09.2016

Скоро нарисую схему именно с установленными модулями, пока ищу в чем лучше рисовать. По проекту есть некоторые продвижения, но пока очень спорные.

BoBo4kA
Offline
Зарегистрирован: 15.01.2016

operrr пишет:

пока ищу в чем лучше рисовать.

https://www.draw.io/

enjoyneering
enjoyneering аватар
Offline
Зарегистрирован: 05.09.2016

надо вход ацп притянуть к земле через резистор, а лучше через делитель напряжения.

operrr
Offline
Зарегистрирован: 29.09.2016

Именно к этому и пришел, скоро оттестирую и отпишусь. 

operrr
Offline
Зарегистрирован: 29.09.2016

Проект временно приостановлен

Andry Smart
Offline
Зарегистрирован: 06.09.2016

bodriy2014,а исходниками не поделитесь?

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

Andry Smart пишет:

bodriy2014,а исходниками не поделитесь?

Да не проблема, на моем сайте есть мыло стукните мне что это вы.

А я поищу где они, так как сортирую в основном самое крупное.