Sistema de monitoramento de poluição sonora baseado em IoT – medir e rastrear decibéis (dB) usando NodeMCU
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.
Conteudo
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)