Визуализация уровня громкости
- Войдите на сайт для отправки комментариев
Тех.задание: Вывести на 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 как и должно быть а вот с микрофоном беда. Хэлп парни, я уже конкретно туплю и просто не могу вкурить в чем проблема.
Привет.
Думаю дело в электрической схеме, которую вы не выложили.
Безе нее точно утверждать не буду, но если у вас проcтой усилитель звука то он просто усиливает колебания которые снимает микрофон и они с частотой от 30ГЦ до 16КГц в зависимости от того что слышит микрофон, а вы медленным analogRead считываете показания, вот он и выдает то что успел периодически выхватить из потока импульсов.
Подобную конструкцию сооружал в этом проекте, только я там собрал самый простой усилитель который знал.!)
Думаю между усилителем и Ардуино должна быть некая прослойка в виде RC фильтра чтоб пульсации звука привести к постоянному напряжению меняющему свою амплитуду в зависимости от громкости.
Или программный ФНЧ - благо в две строчки пишется.
Скоро нарисую схему именно с установленными модулями, пока ищу в чем лучше рисовать. По проекту есть некоторые продвижения, но пока очень спорные.
пока ищу в чем лучше рисовать.
https://www.draw.io/
надо вход ацп притянуть к земле через резистор, а лучше через делитель напряжения.
Именно к этому и пришел, скоро оттестирую и отпишусь.
Проект временно приостановлен
bodriy2014,а исходниками не поделитесь?
bodriy2014,а исходниками не поделитесь?
Да не проблема, на моем сайте есть мыло стукните мне что это вы.
А я поищу где они, так как сортирую в основном самое крупное.