O assunto hoje do Arduino e Cia é som. Mais precisamente, Sensor de Som.

Já vimos aqui no site como gerar sons a partir do Arduino usando o comando tone. O que eu vou utilizar hoje é esta pequena mas eficiente placa com microfone embutido, o Sensor de Som Arduino. Com ela, vou mostrar como detectar o som ambiente e como tratar o sinal gerado por esse módulo.

Esta placa, além do microfone, tem um pequeno amplificador embutido (o circuito integrado LM386), pois apenas o microfone não seria capaz de enviar os dados para o Arduino.

O esquema de conexão é bem enxuto, composto por apenas 3 pinos: Vcc, GND e S (sinal). No meio da placa, há um potenciômetro para ajuste da sensibilidade.

Sensor de Som Arduino

A placa trabalha com tensão de 5v, e o pino de sinal deve ser ligado de preferência à uma porta analógica do Arduino, já que o sinal gerado é variável, e com isso podemos observar os diferentes níveis de ruído captados pelo microfone.

O circuito de testes será composto pelo módulo Sensor de Som, mais o display LCD Winstar WH1602A, que já abordamos aqui no site, neste artigo. Se você não tem esse display, não se preocupe, pois o programa é facilmente adaptável à outros modelos de displays.

O display, na sua parte superior, vai mostrar o nível do som (Baixo, Médio e Alto), e na parte inferior, será mostrada uma barra que vai acompanhar em tempo real o nível do som detectado pelo microfone:

Sensor de Som - Circuito em funcionamento

Conexão do sensor de som com Arduino

Para conexão do sensor de som em uma placa Arduino Uno junto com display LCD, siga o esquema abaixo:

Sensor de Som Arduino - Circuito

O programa não utiliza nenhuma biblioteca própria para o módulo sensor de som, já que vamos apenas efetuar a leitura do sinal variável recebido pelo Arduino na porta analógica. Para o display LCD, é utilizada a já conhecida LiquidCrystal.

Para melhorar a precisão do programa, optei por fazer a leitura do sinal 128 vezes, utilizando a variável NUM_LEITURA. Depois, calculo o valor médio e uso este valor para gerar no LCD a indicação de nível de som. O gráfico na linha inferior do display utiliza as informações do sinal em tempo real. Caso você opte por não utilizar o display, os dados também são mostrados no Serial Monitor.

// Programa : Niveis de ruido com Sensor de Som  
// Autor : Arduino e Cia  
   
int num_leitura = 128; //Define o numero de medicoes  
int pinosinal = A0; //Pino ligado ao pino S do modulo sensor de som  
long sinal;   //Armazena o valor lido do Sensor de Som  
long soma = 0; //Armazena o valor total das n medicoes  
long nivel =0; //Armazena o valor medio  
int mostranivel = 0; //Utilizado para gerar o grafico inferior  
int apaga = 0; //Variavel auxiliar para gerar o grafico inferior  
   
#include <LiquidCrystal.h> //Carrega a biblioteca LCD  
   
//Define os pinos que serao ligados ao LCD  
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); 
   
//Array para montar o simbolo grafico  
byte a[8]=   
{B10000, B11000, B11100, B11110, B11110, B11100, B11000, B10000,};   
   
void setup()  
{   
  pinMode(pinosinal, INPUT); //Define o pino de sinal como Entrada  
  Serial.begin(9600);  
  lcd.begin(16,2); //Inicializa LCD  
  lcd.clear();   //Limpa o LCD  
  lcd.setCursor(0,0); //Posiciona o cursor na coluna 0, linha 0  
  lcd.print("Nivel : ");  
  lcd.createChar(1, a); //Atribui a "1" o valor do array "A",   
                        //que desenha o simbolo grafico  
}  
   
void loop()  
{  
  //Efetua 128 leituras do sinal  
  for (int i=0; i<num_leitura ; i++)  
  {  
    sinal = analogRead(pinosinal);  
    soma = soma + sinal;  
  }  

  nivel = soma/num_leitura; //Calcula o valor medio  
  //Converte o valor lido para um valor entre 0 e 15  
  mostranivel = map(sinal, 0, 500, 0, 15);    
    
  //Gera o grafico inferior  
  for (int i = 0; i<mostranivel; i++)  
  {  
    lcd.setCursor(i,1);  
    lcd.write(1);  
    apaga = 15 - i;  
    for (int x = i; x<15;x++)  
    {  
      lcd.setCursor(x+1,1);  
      lcd.write(" ");  
    }  
  }  
     
  //Verifica o nivel de sinal e exibe na tela    
  if (nivel >0 && nivel < 100)  
  {  
    lcd.setCursor(8,0);  
    lcd.print("Baixo");  
    Serial.print("Nivel Baixo");  
    Serial.print(" - Media : ");  
    Serial.println(nivel);  
  }  

  if (nivel >100 && nivel < 200)  
  {  
    lcd.setCursor(8,0);  
    lcd.print("Medio ");  
    Serial.print("Nivel Medio");  
    Serial.print(" - Media : ");  
    Serial.println(nivel);  
  }  

  if (nivel > 200)  
  {  
    lcd.setCursor(8,0);  
    lcd.print("Alto  ");  
    Serial.print("Nivel alto");  
    Serial.print(" - Media : ");  
    Serial.println(nivel);  
  }  

  soma = 0; //Reinicia a soma dos valores das medicoes  
}  

Lembrando que os valores utilizados como comparação  podem ser ajustados de acordo com o nível de sensibilidade definido pelo potenciômetro.

Finalmente, no vídeo abaixo você confere o projeto em funcionamento:


Gostou? Confira outros posts com Arduino aqui mesmo no Arduino e Cia!

Avalie este post!