Sistema de monitoramento de poluição sonora baseado em IoT – medir e rastrear decibéis (dB) usando NodeMCU

Tempo de leitura: 7 minutes

Certamente não podemos imaginar um mundo sem som. O som é parte integrante do nosso dia-a-dia, tudo fica monótono sem a presença de áudio. Mas muito de qualquer coisa é perigoso, com o advento de automóveis, alto-falantes, etc., a poluição sonora se tornou uma ameaça nos últimos dias. Portanto, neste projeto, construiremos um decibelímetro IoT para medir o som em um determinado local e registrar o valor em um gráfico usando IoT. Um dispositivo como este será útil em lugares como hospitais e escolas para rastrear e monitorar os níveis de som e agir de acordo. Anteriormente, também construímos um medidor de poluição do ar para monitorar a qualidade do ar usando a IoT.

Um medidor de nível de som é empregado para medições acústicas (som que viaja pelo ar). O tipo mais simples de microfone para medidores de nível de som é o microfone capacitor, que combina precisão com estabilidade e confiabilidade. O diafragma do microfone responde às mudanças na pressão do ar causadas por ondas sonoras. É por isso que o instrumento é geralmente mencionado como um medidor de nível de pressão sonora (SPL).

Medidores de nível de som são comumente utilizados em estudos de poluição sonora para a quantificação de vários tipos de ruído, especialmente para ruído industrial, ambiental, de mineração e de aeronaves. A leitura de um medidor de nível de som não se correlaciona bem com o volume percebido por humanos, que é melhor medido por um medidor de volume. O volume específico pode ser uma não linearidade compressiva e varia em determinados níveis e frequências. Essas métricas também podem ser calculadas de várias outras maneiras.

Aqui, vamos fazer um decibelímetro baseado em IoT que medirá o som em decibéis (dB) usando um sensor de som e o exibirá no display LCD junto com isso, ele também enviará as leituras para a plataforma Blynk IoT tornando-o acessível de todo o mundo.

 

Componentes necessários

  • Placa ESP8266 NodeMCU
  • Sensor de microfone
  • Módulo 16*2 LCD
  • ProtoBoard
  • Fios de conexão

 

Como funciona o módulo de microfone?

O sensor de som baseado em microfone é usado para detectar som. Ele fornece uma medida de quão alto é um som. O módulo sensor de som é uma pequena placa que mistura um microfone (50Hz-10kHz) e alguns circuitos de processamento para converter ondas sonoras em sinais elétricos. Este sinal elétrico é alimentado para o comparador de alta precisão LM393 on-board para digitalizá-lo e é disponibilizado no pino OUT.

O módulo possui um potenciômetro embutido para ajuste de sensibilidade do sinal OUT. Vamos definir um limite empregando um potenciômetro. De forma que quando a amplitude do som exceder o valor da borda, o módulo irá produzir LOW, caso contrário, HIGH. Além disso, o módulo possui dois LEDs. O LED da instalação acenderá quando o módulo for ligado. O LED de status acenderá quando a saída digital ficar BAIXA.

O sensor de som possui apenas três pinos: VCC, GND e OUT. O pino VCC fornece energia para o sensor e funciona em 3,3V a 5V. O pino OUT emite ALTO quando as condições são silenciosas e fica BAIXO quando o som é detectado.

 

Diagrama de circuito para medidor de som IoT

As conexões são bem simples, basta conectar o sensor de som a um dos pinos analógicos e o LCD aos pinos I2C.

No diagrama acima, conectamos os pinos de alimentação do sensor de som e display LCD a 3v3 e pino GND do NodeMCU. Junto com isso, também conectamos os pinos SCL e SDA do módulo a D1 e D2 respectivamente, e o pino OUT do sensor de som ao pino A0.

 

Configurando Blynk para monitoramento remoto

Para a parte da IoT, usaremos a plataforma Blynk IoT. Anteriormente, usamos Blynk com Nodemcu para construir muitos projetos diferentes. Você também pode verificar outros projetos Blynk que construímos anteriormente. Neste aplicativo, adicionaremos um medidor para exibir a intensidade do som em decibéis. Vamos configurar o aplicativo rapidamente.

  • Em primeiro lugar, instale o aplicativo Blynk da PlayStore e crie uma conta.
  • Clique no botão criar e crie seu novo projeto.

  • Dê um nome ao seu projeto e escolha a placa como NodeMCU e o tipo de conexão como Wi-Fi.

  • Um token de autenticação será enviado para o seu ID de e-mail registrado. Mantenha-o seguro, pois ele será usado posteriormente durante a programação.

Auth Token é uma string alfanumérica exclusiva para identificar seu projeto no servidor do Blynk e atribuir os dados corretos por meio dele.

 

  • Agora arraste e solte um medidor da lista e configure-o

  • Conecte o medidor ao pino virtual V0 e defina os valores para 0 e 90 respectivamente, defina também a taxa de leitura para 1 segundo.

E agora você concluiu a configuração do Blynk. Vamos pular para a parte de codificação.

 

Programa para medidor de decibéis de IoT

Aqui, temos que desenvolver um código que recebe a entrada do sensor de som e mapeia seu valor em decibéis e, depois de comparar o volume, não deve apenas imprimi-lo para o display LCD 16*2, mas também enviá-lo para o servidor Blynk.

O código completo para este projeto pode ser encontrado no final desta página. Você pode copiar e colar diretamente em seu IDE e alterar apenas três parâmetros, ou seja, SSID, passagem e token de autenticação. A explicação do código é a seguinte.

Na primeira parte do código, incluímos todas as bibliotecas e definições necessárias. Além disso, definimos as variáveis e objetos necessários para programação futura.

#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <LiquidCrystal_I2C.h>
#define SENSOR_PIN A0
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
const int sampleWindow = 50;
unsigned int sample;
int db;
char auth[] = "IEu1xT825VDt6hNfrcFgdJ6InJ1QUfsA"; <<<< Token
char ssid[] = "SeuSSID";
char pass[] = "SuaSenha";

Mais adiante, criamos uma função Blynk para lidar com o pino virtual ao qual nosso medidor está conectado. Estamos simplesmente enviando os valores armazenados na variável dB para o pino V0.

BLYNK_READ(V0)
{
  Blynk.virtualWrite(V0, db);
}

Na parte de configuração do código, estamos definindo o modo pin como entrada e iniciando o display LCD, bem como a função Blynk.

void setup() {
  pinMode (SENSOR_PIN, INPUT);
  lcd.begin(16, 2);
  lcd.backlight();
  lcd.clear();
  Blynk.begin(auth, ssid, pass);
}

Na parte do loop, estamos fazendo todas as tarefas de processamento, como comparação e atribuição de valor, junto com a execução da função Blynk.

void loop() {
  Blynk.run();
  unsigned long startMillis = millis(); // Início da janela de amostra
  float peakToPeak = 0; //nível pico a pico
  unsigned int signalMax = 0; //valor minimo
  unsigned int signalMin = 1024; //valor máximo
  // coletar dados para 50 ms
  while (millis() - startMillis < sampleWindow)
  {
    sample = analogRead(SENSOR_PIN); //obter leitura do microfone
    if (sample < 1024) // jogue fora leituras espúrias
    {
      if (sample > signalMax) {
        signalMax = sample; // salve apenas os níveis máximos
      } else if (sample < signalMin) {
        signalMin = sample; // salve apenas os níveis mínimos
      }
    }
  }
  peakToPeak = signalMax - signalMin; //max - min = amplitude pico-pico
  Serial.println(peakToPeak);
  db = map(peakToPeak, 20, 900, 49.5, 90); //calibrar para decibéis
  lcd.setCursor(0, 0);
  lcd.print("Intensidade: ");
  lcd.print(db);
  lcd.print("dB");
  if (db <= 50)
  {
    lcd.setCursor(0, 1);
    lcd.print("Nível: Bastante");
  }
  else if (db > 50 && db < 75)
  {
    lcd.setCursor(0, 1);
    lcd.print("Nível: Moderado");
  }
  else if (db >= 75)
  {
    lcd.setCursor(0, 1);
    lcd.print("Nível: Alto");
  }
  delay(600);
  lcd.clear();
}

 

Trabalho do Projeto

Agora que você entendeu o código, pode simplesmente carregá-lo em sua placa NodeMCU e o projeto deve começar a funcionar.

Para ter certeza de que os valores estão corretos, comparei-os com um aplicativo Android no meu telefone que pode medir o som. Como você pode ver pelas fotos, os resultados foram bem próximos.

Espero que você tenha gostado do projeto e aprendido algo útil. Se tiver alguma dúvida, deixe-as na seção de comentários abaixo.

#define BLYNK_PRINT Serial 
#include <ESP8266WiFi.h> 
#include <BlynkSimpleEsp8266.h> 
#include <LiquidCrystal_I2C.h> 
#define SENSOR_PIN A0 
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); 
const int sampleWindow = 50;
unsigned int sample;
int db;
char auth[] = "IEu1xT825VDt6hNfrcFgdJ6InJ1QUfsA"; <<<< Token 
char ssid[] = "SeuSSID"; 
char pass[] = "SuaSenha";
BLYNK_READ(V0)
{
  Blynk.virtualWrite(V0, db);
}
void setup() {
  pinMode (SENSOR_PIN, INPUT);
  lcd.begin(16, 2);
  lcd.backlight();
  lcd.clear();
  Blynk.begin(auth, ssid, pass);
}
void loop() { 
  Blynk.run(); 
  unsigned long startMillis = millis();  // Início da janela de amostra 
  float peakToPeak = 0; //nível pico a pico 
  unsigned int signalMax = 0; //valor minimo 
  unsigned int signalMin = 1024; //valor máximo 
  // coletar dados para 50 ms 
  while (millis() - startMillis < sampleWindow) { 
    sample = analogRead(SENSOR_PIN); //obter leitura do microfone 
    if (sample < 1024) // jogue fora leituras espúrias 
    { 
       if (sample > signalMax) { 
           signalMax = sample; // salve apenas os níveis máximos 
       } else if (sample < signalMin) { 
         signalMin = sample; // salve apenas os níveis mínimos 
       } 
    } 
  } 
  peakToPeak = signalMax - signalMin; //max - min = amplitude pico-pico 
  Serial.println(peakToPeak); 
  db = map(peakToPeak, 20, 900, 49.5, 90); //calibrar para decibéis 
  lcd.setCursor(0, 0); 
  lcd.print("Intensidade: "); 
  lcd.print(db); lcd.print("dB"); 
  if (db <= 50) { 
     lcd.setCursor(0, 1); 
     lcd.print("Nível: Bastante"); 
  } else if (db > 50 && db < 75) { 
    lcd.setCursor(0, 1); 
    lcd.print("Nível: Moderado"); 
  } else if (db >= 75) { 
    lcd.setCursor(0, 1); 
    lcd.print("Nível: Alto"); 
  } 
  delay(600); 
  lcd.clear(); 
}

 

Aqui você terá o codigo completo, para seus testes. (Download)