Projeto100 - Criando um VU meter analógico com Arduino e display Oled

Básico - Projeto 100

Criando um OledMeter (VU meter)

Objetivo

O objetivo deste projeto é simular um VU meter analógico no display OLED, capaz de aferir a intensidade sonora do ambiente. Para isso, vamos utilizar o módulo sensor de som que transforma qualquer variação sonora do ambiente em sinais que serão lidos no Arduino. O Arduino ao receber e processar esses sinais, irá controlar a animação exibida no display OLED, conforme as diferentes frequências sonoras que receber.

No projeto utilizamos o módulo KY-038, mas o resultado deverá ser semelhante para qualquer outro tipo de módulo sensor de som. Também utilizaremos no projeto um conjunto de 6 leds, que deverão acender ou apagar de acordo com essas frequências sonoras recebidas e um display OLED SSD1306 via I2C.

Observações:

a) O desenho e o funcionamento do VU meter analógico foram baseados no projeto Analog VU Meter - I2C OLED - OLEDMeter Animation criado por Greg Stievenart.

b) O funcionamento do medidor de volume de áudio com a utilização de leds foi adaptado do projeto Projeto 99 - Como medir a intensidade sonora com módulo sensor de som e Arduino.

Definições

VU meter: Medidor de volume de áudio, conhecido como VU (unidade de volume) ou Indicador de Volume Padrão (SVI) é um dispositivo que exibe a representação gráfica do nível de sinal de áudio captado. O VU meter pode ser utilizado para fins técnicos em equipamentos profissionais de gravação, por exemplo, ou apenas como um dispositivo estético em equipamentos de som. Leia mais em VU Meter – O que é isso?.

Intensidade Sonora: "A intensidade sonora está associada àquilo que nós chamamos de volume de áudio. A diferença entre um som intenso - ou forte - e um som fraco vem da amplitude de vibração da onda. Quanto maior a amplitude da onda, maior a pressão que a onda irá exercer no ar." A unidade de medida da intensidade sonora ou intensidade do som é o decibel (Fonte: Entenda os conceitos de ondas sonoras: timbre, altura e intensidade e Intensidade do som).

Módulo sensor de som: Módulo eletrônico composto principalmente por um chip comparador de tensão, um potenciômetro (trimpot) e um microfone de eletreto. O sensor deverá identificar a presença e a intensidade do som em um determinado ambiente, variando o estado de sua saída digital ao detectar o som (LOW para HIGH) e ainda detectar a intensidade do som ao usar uma saída analógica.

O limite de detecção de saída digital pode ser ajustado pelo potenciômetro (trimpot) que regulará, caso necessário, o nível de sinal sonoro necessário para alterar o estado da saída digital. Veja na ilustração abaixo os principais elementos que compõem um sensor de som, no caso o módulo KY038. Saiba mais sobre módulo sensor de som em Sound Sensor Tutorial for Arduino, ESP8266 and ESP32.

Display OLED (Organic Light-Emitting Diode, ou Diodo Emissor de Luz Orgânico): Display gráfico com alto contraste, excelente nitidez, leve e muito econômico, pois como possui luz própria não precisa de backlight utilizado nas telas de LCD ou LED, por exemplo. Outra grande vantagem do display OLED é possibilidade de gerar imagens. Como desvantagens, o display possui uma vida útil menor (entre 10mil e 40mil horas de uso) e não deve ser utilizado em locais úmidos, pois a água danifica facilmente o componente. Para saber mais leia Projeto 90 - Como controlar um Display OLED SSD1306 com Arduino - biblioteca Adafruit. No tutorial você saberá como usar todos os recursos do display OLED SSD1306 via I2C.

Atenção: Não utilize o display em locais molhados ou úmidos, pois a água pode danificar o componente.

Referências

Projeto 90 - Como controlar um Display OLED SSD1306 com Arduino - biblioteca Adafruit

Projeto 91 - Como desenhar imagens bitmap em um Display OLED SSD1306 com Arduino - biblioteca Adafruit

Projeto 94 - Simulando um botão giratório no display OLED - Arduino

Projeto 99 - Como medir a intensidade sonora com módulo sensor de som e Arduino 

Aplicação

Para fins didáticos e projetos para identificar a intensidade sonora do ambiente.

Componentes necessários

Referência

Componente

Quantidade

Imagem

Observação

Protoboard Protoboard 830 pontos 1 Resultado de imagem para protoboard 830v

No mínimo utilizar protoboard com 830 pontos

Jumpers Kit cabos ligação macho / macho 1  
Módulo Sensor de Som Módulo Sensor de Som KY-038 1

– Modelo: KY-038 ou KY-037 
– Chip comparador de sinal LM393
– Tensão de Operação: 3.3-5v DC
– Sensibilidade ajustável via potenciômetro
– Saída Digital e Analógica
– Corrente elétrica
– Led indicador para tensão
– Led indicador para saída digital

(datasheet)

Obs.: Você poderá utilizar outros tipos de sensores de som que possuem saída digital.

Display OLED

Display OLED SSD1306

1 Tarzan Componentes Eletrônicos | Shield Arduino| Display Oled 1.3 Polegadas  Branco 125x64 I2c - R$ 51,90

– Tensão de operação: 3,3-5V
– Controlador: SSD1306
– Cor: Azul e Amarelo
– Comunicação: I2C
– Resolução: 128×64
– Dimensões: 30 x 27mm

Você também poderá utilizar na cor azul, branco ou colorido.

A comunicação poderá ser I2C ou SPI

Led difuso 5mm Led 5mm 6

Utilizar led de qualquer cor

                                     

Resistor Resistor 150 Ω ou maior 6 Se precisar usar outros valores, calcule o resistor apropriado para o led ou barra grafica utilizada
Arduino UNO R3 Arduino UNO 1

Você poderá utilizar uma placa Arduino UNO original ou similar

Montagem do Circuito

Conecte os componentes no Protoboard como mostra a figura abaixo (display OLED com comunicação I2C). Verifique cuidadosamente os cabos de ligação antes de ligar seu Arduino. Lembre-se que o Arduino deve estar totalmente desconectado da força enquanto você monta o circuito.


Atenção

1. Lembre-se que o LED tem polaridade: O terminal maior tem polaridade positiva e o lado do chanfro tem polaridade negativa.

2. Determinamos o valor do resistor através da tabela prática: Tabela prática de utilização de leds 3mm e 5mm. Entretanto, o mais correto é sempre verificar o datasheet do fabricante do LED para você ter os exatos valores de tensão e corrente do mesmo - leia Leds ligados em série e em paralelo.

Obs.: Resistores superiores a 150 Ω poderão ser utilizados em LEDs de todas as cores para um circuito com tensão igual ou inferior a 5V.

2.1. Valores utilizados para nossos projetos: LEDs difusos ou de alto brilho: Vermelho, Laranja e Amarelo: 150 Ω | Led Verde e Azul: 100 Ω

3. Para a montagem do display OLED SSD1306 via protocolo I2C, verifique a "pinagem" do módulo com comunicação I2C:

 

Observações:

a. Em algumas marcas os pino Vcc e GND estão invertidos. Portanto, preste muita atenção antes de fazer a conexão com o Arduino.

b. Caso o utilize um display OLED por comunicação via serial SPI veja como é feita a conexão no Projeto 90 - Como controlar um Display OLED SSD1306 com Arduino - biblioteca Adafruit.

3.1. Faça a conexão dos pinos SCL e SDA com o Arduino da seguinte forma:

MICROCONTROLADOR SCL SDA
Arduino Uno A5 A4
Arduino Nano A5 A4
Arduino Mega 21 20
Leonardo/Micro 3 2

3.2. No nosso projeto utilizamos um display OLED SSD1306 I2C e Arduino Uno. Veja a montagem do display OLED utilizado no projeto:

4. Para a montagem do módulo sensor de som, vamos utilizar a saída analógica para verificarmos o valor lido no sensor, servindo como parâmetro de leitura da intensidade sonora do ambiente. (Obs.: se desejar, poderá manter a conexão com a entrada digital do Arduino, pois isso não afetará no resultado do projeto).

4.1. Se o seu módulo sensor de som possuir 3 pinos, utilize apenas o pino de saída para a conexão analógica do Arduino.

4.2. Veja a montagem do nosso exemplo:

 

5. A montagem do nosso exemplo foi realizada em um protoboard com 400 pontos e com um display OLED SSD1306 com comunicação via protocolo I2C. Verifique sempre se o seu protoboard possui linhas de alimentação contínuas ou separadas.

Incluindo as bibliotecas Adafruit SSD1306 e Adafruit GFX

Para utilizar o controlador SSD1306 vamos incluir a biblioteca Adafruit SSD1306. Esta biblioteca foi escrita para resolver a complexidade do controlador SSD1306, oferecendo comandos simples para facilitar o controle de operação do display OLED. Para obtermos uma experiência completa, precisamos instalar também a biblioteca Adafruit GFX para exibir elementos gráficos primitivos como pontos, linhas, círculos, retângulos, etc.

Instalação das bibliotecas

1. No IDE do Arduino, acesse a aba Sketch, selecione [Incluir Biblioteca] e depois [Gerenciar Bibliotecas...].

2. No campo de pesquisa digite ssd1306 adafruit. Localizada a biblioteca Adafruit SSD1306 clique no botão [Instalar].

 

3. Na janela "Dependencies for library Adafruit SSD1306..." clique no botão [Install all]. Desta forma, instalaremos as bibliotecas Adafruit SSD1306, Adafruit GFX library e Adafruit BusIO todas juntas automaticamente.

4. Após a instalação, observe que aparecerá a informação que as bibliotecas foram instaladas. (Lembre-se que precisaremos das bibliotecas Adafruit SSD1306 e Adafruit GFX Library para controlar nosso display OLED).

Definindo o VU meter (OLED)

1.Conforme descrito pelo autor Stievenart, o VU meter foi primeiramente desenhado em MSPaint. Depois, o desenho foi convertido para uma máscara de fundo com 128X64px (mesmo tamanho da tela do display OLED). Para fazer isso ele utilizou o software gratuito Image2GLCD Software.

Obs.: Se você deseja criar as suas próprias imagens, leia: Projeto 91 - Como desenhar imagens bitmap em um Display OLED SSD1306 com Arduino - biblioteca Adafruit que explicamos passo a passo como converter imagens bitmap em exibição no display OLED. Para saber como desenhar uma linha, por exemplo, leia: Projeto 90 - Como controlar um Display OLED SSD1306 com Arduino - biblioteca Adafruit.

2 - Criado a máscara de fundo, o autor definiu as coordenadas x (a1) e y (a2) através das relações trigonométricas, sendo que a posição do ponteiro vai variar dependendo do valor da intensidade sonora lido no Arduino.

Obs.: Neste tutorial não vamos nos aprofundar nas equações definidas pelo autor. Isso fica a critério de vocês relembrarem das relações trigonométricas para determinar a posição de cada ponto final do ponteiro. Lembrando que o centro do círculo está localizado fora da área de exibição do display: altura de exibição do display é 64px e o centro do círculo tem 85px e o raio (tamanho do ponteiro) tem 80px.

3. Usando as relações mostradas acima, o autor desenvolveu as equações que definem as coordenadas da posição do ponteiro (agulha), para cada intervalo de leitura.

Obs.: A equação utiliza radiano como unidade de ângulo. Portanto, 1 radiano = pi/180º = 57,296º

Onde:

3.1. VUmeter = matriz com a máscara do desenho do medidor

3.2. hMeter = 64px - distância horizontal do centro da circunferência até onde o ponteiro aparece no display (tamanho do display/2 = 128/2 = 64)

3.3. vMeter = 85px - distância vertical do centro da circunferência até ao desenho do medidor

3.4. rMeter = 80px - raio do ponteiro (tamanho do ponteiro)

3.5. meterValue = amplitude dos valores analógicos medidos pelo sensor a cada 50 milissegundos e convertido convertido em um valor digital. Esse valor definirá a posição da extremidade.

Código do Projeto (Sketch)

1. Faça o download e abra o arquivo projeto100.ino no IDE do Arduino: DOWNLOAD - projeto100.ino

Observações: Ao rodar o programa, é possível que haja a necessidade de se fazer a calibragem do VU meter, pois os valores captados no módulo sensor de som podem variar em função de alterações no som ambiente, tensão do circuito ou regulagem do microfone.

2. Se preferir, copie e cole o código abaixo no IDE do Arduino:

/*******************************************************************************

     Projeto 100 - VU meter analógico
     Adaptado por: Angelo Luis Ferreira
     Autor: Greg Stievenart /  https://www.youtube.com/watch?v=rda-LA9GIMo
     Data: 06/12/2021
             http://squids.com.br/arduino

*******************************************************************************/
#include <Wire.h>                     // biblioteca requerida para rodar I2C
#include <SPI.h>                      // biblioteca requerida para rodar I2C
#include <Adafruit_GFX.h>             // biblioteca OLED
#include <Adafruit_SSD1306.h>         // biblioteca OLED

// configuração do display OLED
#define SCREEN_WIDTH 128             // OLED display width, in pixels
#define SCREEN_HEIGHT 64             // OLED display height, in pixels

// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
#define OLED_RESET     -1            // Reset pin # (or -1 if sharing Arduino reset pin)
// instancia o objeto display da biblioteca Adfruit
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); 

// define pinos do Arduino
const byte ledPin[] = {7,8,9,10,11,12};  // pinos de saída digital para os leds
const byte sensorPin = A0;               // entrada analógica para o módulo sensor de som

// número de leds usados no projeto
const byte nLeds = 6;                    

// define variáveis leitura sensor de som
const int timer = 50;             // largura da janela de amostra em mS (50 mS = 20Hz)
unsigned int sound;               // variável para leitura analógica do sensor

// define variáveis do OLE meter
int hMeter = 64;                 // centro horizontal do ponteiro (agulha)
int vMeter = 85;                 // centro vertical do ponteiro (fora dos limites da tela - height = 64px)
int rMeter = 80;                 // comprimento do ponteiro 

// calibragem
int signalSet = 1024;           // este número pode ser alterado entre 1 e 1024
byte increment = 8;             // incremento para o limit entre cada led (da esquerda para a direita)

// Imagem da máscara de fundo do medidor VU no display OLED:
static const unsigned char PROGMEM VUMeter[] = { 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x03, 0x00, 0x60, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x09, 0x04, 0x80, 0x21, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x01, 0x98, 0x08, 0x06, 0x03, 0x80, 0x21, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0xA4, 0x10, 0x09, 0x00, 0x80, 0x21, 0x20, 0x07, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0xA4, 0x10, 0x06, 0x03, 0x00, 0x20, 0xC0, 0x00, 0x80, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x71, 0x80, 0xA4, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x0A, 0x40, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3C, 0x00, 0x00,
  0x00, 0x00, 0x3A, 0x40, 0x00, 0x00, 0x02, 0x01, 0x00, 0x40, 0x80, 0x07, 0x00, 0x20, 0x00, 0x00,
  0x00, 0x00, 0x42, 0x40, 0x00, 0x08, 0x02, 0x01, 0x08, 0x40, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00,
  0x00, 0x00, 0x79, 0x80, 0x04, 0x08, 0x02, 0x01, 0x08, 0x81, 0x10, 0x00, 0x00, 0x04, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x04, 0x08, 0x02, 0x01, 0x08, 0x81, 0x11, 0x04, 0x00, 0x38, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x02, 0x01, 0x08, 0x81, 0x21, 0x04, 0x00, 0x00, 0x08, 0x00,
  0x00, 0x00, 0x00, 0x84, 0x02, 0x04, 0x0F, 0xFF, 0xFF, 0xC3, 0xE2, 0x04, 0x00, 0x00, 0x08, 0x00,
  0x00, 0x00, 0x00, 0xC2, 0x01, 0x07, 0xF0, 0x00, 0x00, 0x3B, 0xFE, 0x08, 0x40, 0x40, 0x08, 0x00,
  0x00, 0xFE, 0x00, 0x62, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xE8, 0x40, 0x80, 0x7F, 0x00,
  0x00, 0x00, 0x00, 0x21, 0x1E, 0x00, 0x04, 0x00, 0x80, 0x00, 0x7F, 0xFE, 0x80, 0x80, 0x08, 0x00,
  0x00, 0x00, 0x03, 0x31, 0xE0, 0x00, 0x04, 0x00, 0x80, 0x04, 0x01, 0xFF, 0xC1, 0x00, 0x08, 0x00,
  0x00, 0x00, 0x07, 0x1E, 0x00, 0x40, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFA, 0x00, 0x08, 0x00,
  0x00, 0x00, 0x07, 0xF0, 0x00, 0x40, 0x3B, 0x07, 0x60, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x34, 0x81, 0x90, 0xCC, 0xC0, 0x00, 0x3F, 0xC0, 0x00, 0x00,
  0x00, 0x00, 0x0C, 0x00, 0x03, 0x30, 0x0C, 0x82, 0x90, 0x53, 0x20, 0x00, 0x07, 0xF8, 0x00, 0x00,
  0x00, 0x00, 0x70, 0x40, 0x00, 0xC8, 0x3B, 0x02, 0x60, 0x53, 0x20, 0x00, 0x00, 0xFE, 0x00, 0x00,
  0x00, 0x01, 0x80, 0x20, 0x01, 0xC8, 0x00, 0x00, 0x00, 0x4C, 0xC0, 0x00, 0x00, 0x3F, 0x80, 0x00,
  0x00, 0x06, 0x00, 0x00, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xE0, 0x00,
  0x00, 0x08, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00,
  0x00, 0x30, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00,
  0x00, 0x00, 0x40, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00,
  0x00, 0x00, 0xA0, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x02, 0x02, 0x30, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x03, 0x06, 0x30, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x8C, 0x30, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0xD8, 0x30, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x70, 0x19, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x20, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

void setup(){
  Serial.begin(9600);
  // pinMode módulo sensor de son
  pinMode(sensorPin, INPUT);      // entrada analógica para fonte de áudio externa
  // pinMode leds
  for (byte i; i<6; i++) {
    pinMode(ledPin[i], OUTPUT);   // saídas digitais para os leds
  }
  // initialize OLED display with the I2C addr 0x3C
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);               // inicia
  display.clearDisplay();                                  // limpa a exibição de qualquer informação no LCD
}

void loop(){
  readSound();            // define amplitude pia a pico das leituras do sensor de som 
}

void readSound() {
/***********************************************************************
  Início do código retirado do Exemplo de esboço de nível de som da Adafruit para o
 Amplificador de microfone Adafruit
************************************************************************/
  
  unsigned long startMillis = millis();                    // início da janela de amostra
  unsigned int PeaktoPeak = 0;                             // nível pico a pico
  unsigned int SignalMax = 0;
  unsigned int SignalMin = 1024;

  while ( millis() - startMillis < timer ){               // faz medidas durante 50ms e define valor máximo e mínimo
    sound = analogRead(sensorPin);                        // faz a leitura analógica do sensor
    if (sound < 1024) {

      if (sound >= SignalMax){

        SignalMax = sound;                                // salva apenas os níveis máximos
      }

      else if (sound < SignalMin){

        SignalMin = sound;                                // salva apenas os níveis mínimos
      }
    }
  }
  
  PeaktoPeak = SignalMax - SignalMin;                     // max - min = amplitude pico a pico
  float MeterValue = PeaktoPeak * signalSet / 1024;       // converte em sinal digital para o Arduino
  //Serial.println(MeterValue);                           // mostra o valor de MeterValue (usar somente na calibragem)
/*****************************************************************************/

  oledMeter(MeterValue);                                    // ativa o OLED meter display
  vuMeterLeds(MeterValue);                                  // ativa o VU meter de leds;
}

// exibe o OLEDmeter no display
void oledMeter(float MeterValue) {
  MeterValue = MeterValue - 37;                            // ajusta a agulha para a posição zero
  display.clearDisplay();                                  // atualiza a exibição para a próxima etapa
  display.drawBitmap(0, 0, VUMeter, 128, 64, WHITE);       // desenha o plano de fundo
  int a1 = (hMeter + (sin(MeterValue / 57.296) * rMeter)); // coordenada horizontal da agulha do medidor
  int a2 = (vMeter - (cos(MeterValue / 57.296) * rMeter)); // coordenada vertical da agulha do medidor
  display.drawLine(a1, a2, hMeter, vMeter, WHITE);         // desenha agulha (linha do ponteiro)
  display.display();                                       // exibe no display Oled
}

// exibe o VU meter com leds
void vuMeterLeds(float MeterValue) {
  // vu meter com leds
  int limit = 8;                      // define o limite para acionar o led e o display (calibragem)   
  for (byte i=0;i limit ? digitalWrite(ledPin[i],HIGH) : digitalWrite(ledPin[i],LOW);
      limit += increment;
   }
}

Vídeo

Calibragem do medidor de intensidade sonora com leds

1. Antes de usar o nosso VU meter, precisamos calibrar o programa com o som ambiente isento mantendo-o sem ruídos externos como música de fundo, por exemplo.

2. No programa, exclua as duas barras da linha 158. Isso vai fazer com que os valores lidos pelo sensor de som seja exibidos no Monitor Serial.

2. Rode o programa e abra o Monitor Serial para leitura dos valores obtidos no módulo sensor de som. Deixe o programa fazer algumas leituras e observe o valor máximo dessas leituras.

2.1. Observe que no nosso exemplo, o valor máximo obtido é 4 (aproximado). (Esses valores variam em função da tensão, regulagem do microfone do sensor e do som ambiente. Você deverá usar um valor máximo das leituras no seu projeto).

2.2. Com o valor máximo obtido, acrescente 1. Portanto o novo valor limite será 4 para o nosso exemplo. Faça da mesma forma com o valor obtido no seu projeto.

3. No programa, altere a constante "limit" com o novo valor, como mostra a figura abaixo (linha 179):

4. Rode agora o programa e observe que nenhum led deverá acender com o som ambiente isento de ruídos. Caso, um dos leds ainda continue acendendo, acrescente mais 1 na variável "limit". Faça isso uma ou mais vezes, num  processo de tentativa e erro até que nenhum led se acenda ao rodar o programa.

5. É recomendável que sempre faça a calibragem do nosso medidor de intensidade do som antes de utilizá-lo, pois os valores obtidos no módulo sensor de som podem variar em função de alterações no som ambiente, tensão do circuito ou regulagem do microfone.

Calibragem da agulha do ponteiro do VU meter no display OLED

1. Assim como os leds, também precisamos ajustar a agulha do ponteiro do VU meter analógico. A posição correta do ponteiro quando o som ambiente estiver isento de ruídos é na direção do 0% do mostrador.

1.1. É importante observar que sempre vai existir um pequeno ruído de fundo. Portanto, sempre existirá uma pequena oscilação do ponteiro, mesmo em silêncio.

2. Rode o programa e observe, na condição de som ambiente isento de ruído, qual a posição do ponteiro.

3. Altere o programa da seguinte forma:

3.1. Se o ponteiro estiver à direita da posição 0%, como mostramos na imagem acima, aumente em 2 o valor de subtração da linha de comando 167 do sketch. Veja no exemplo abaixo, onde aumentaríamos de 37 para 39. 

3.2. Já se o ponteiro estiver à esquerda de 0%, reduza em 2 o valor da linha de comando 167 do programa. No exemplo abaixo alteraríamos de 37 para 35.

4. Depois de ajustar, rode o programa e o ponteiro deverá estar na direção de 0%. Caso não atinja, altere novamente o código, uma ou mais vezes, até encontrar a posição mais próxima possível do 0%.

Como o projeto deve funcionar

1. Ao reiniciar o programa depois de ter realizado a calibragem do medidor, como mostramos acima, os leds e o indicador exibido no display OLED (VU meter) serão ativados apenas quando algum ruído com intensidade sonora maior que o limite que definimos, for detectado pelo sensor.

2. Assim, quanto mais forte for o som (maior amplitude de vibração da onda sonora), mais leds se acenderão e o ponteiro do VU meter apontará mais para a direita. Desta forma, podemos visualizar a intensidade sonora de uma música, por exemplo.

3. Caso não ocorra alterações nos leds ou no indicador do display OLED, é recomendável que você refaça a calibragem do nosso medidor de som.

Observações:

3.1. Como existem variações entre vários tipos e modelos de módulos sensor de som, pode ser que seja necessário alterar o valor da variável increment, linha 42 do sketch. O increment altera os limites para cada led do medidor.

3.2. Também é possível alterar a variável signalSet para mudar a amplitude de captação do som que será enviada para o Arduino. Assim, quanto menor o valor menor da variável signalSet menor será a amplitude enviada, necessitando de um um volume maior de som para ter a mesma medição. Mude esta variável somente se perceber que o ponteiro do VU meter fica muito deslocado para a direita, ou seja, fora do intervalo ideal do medidor que é de 0 a 100%. Caso não perceba isso, mantenha com 1024. Isto vai depender da localização e distância da saída (caixa de som) em relação ao microfone do módulo sensor e do volume do som aplicado.

 

Desafios

Com base neste projeto, resolva o seguinte desafio:  Desafio 91

O anúncio abaixo ajuda a manter o Squids Arduino funcionando

Comentários

×

Infomações do site / SEO








×

Adicionar Marcadores