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.
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:
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:
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!