Detector de ruido con Arduino

Este proyecto ha sido sido realizado por el Grupo 11 de la asignatura Sistemas Empotrados y de Tiempo Real, perteneciente al Grado en Ingeniería Informática de la URJC. Componentes:

  • Jesús Bonilla Sánchez
  • Dalmatjon Cenuka Tafaj
  • Pablo Cerdán López

El objetivo era crear un circuito que. con ayuda de un micrófono, captase el nivel de ruido de una habitación. De esta manera, se podría utilizar en UCI de hospitales, bibliotecas u oficinas. En función del nivel de ruido detectado, se mostrará un mensaje a través de la pantalla LCD y una barra LED irá cambiando de color (lenguaje más universal, en caso de que alguien no pueda leer bien la pantalla).

Materiales

ComponentePrecioDónde comprarlo
Arduino UNO32.99€ (kit) /
24.20€ (únicamente la placa)
Para comprar el kit intermedio de Arduino:
www.amazon.es
2 x Protoboard4.99€Una de ellas viene con el kit de Arduino, la otra se puede adquirir aquí:
www.amazon.es
Luces LED2.40€Vienen en el kit, pero se pueden comprar más aquí:
www.amazon.es
Pantalla LCD 2×165.29€Viene también con la placa de Arduino. Si no, puede adquirirse aquí:
www.amazon.es
Micrófono MAX98146.79€www.amazon.es
Cables2.95€Vienen incluidos. Para comprar más:
www.amazon.es
Resistencias 5.99€También vienen en el kit.
www.amazon.es
Potenciómetro2€Viene incluido. Si se quiere comprar alguno más:
es.farnell.com
Precio total (contando el kit de Arduino)44.77€
Precio total59.60€

Implementación

Este es el diseño del circuito realizado con Fritzing:

Ahora, explicaremos paso por paso su implementación:

Pantalla LCD: la colocaremos en una de las protoboards, y sus conexiones serán las siguientes, de izquierda a derecha:

  • VSS: la conectaremos a tierra.
  • VDD: la conectaremos a nuestra corriente de 5V.
  • RS: lo conectaremos a un pin de la entrada digital de nuestra placa Arduino, en nuestro caso, al 12.
  • RW: lo conectaremos a tierra.
  • E: también lo conectaremos a un pin digital. En este caso hemos elegido el 11.
  • D4, D5, D6, D7: también los conectaremos a los pines digitales, en nuestro caso a los pines 2, 3, 4, 5.
  • A: lo conectaremos a 5V.
  • K: lo conectaremos a tierra.

Potenciómetro: en la misma protoboard, conectaremos la pata izquierda a la corriente (5V), la pata derecha a tierra y la central al pin V0 de nuestra pantalla.

Micrófono amplificador: también en la misma protoboard, sus pines GND y Gain irán conectados a tierra, Vdd conectará con 5V y Out al pin analógico A0 de la placa Arduino.

LEDs: los conectaremos en la otra protoboard. En este caso, hemos usado una escala azul-verde-amarillo-rojo. Cada LED tendrá su cátodo (pata corta) conectada a tierra, y su ánodo a los pines digitales de la placa Arduino, todos ellos con su correspondiente resistencia de por medio.

Código

Nuestro código es el siguiente:

/*
 * Incluimos las librerías que tengamos que utilizar
 */

  #include  <LiquidCrystal.h>
  
/*
 * Declaramos las variables
 */

 const int micro = A0; //Indicamos que el micrófono se ha conectado al pin analógico 0
 const int sampleWindow = 1000; //Ancho de ventana en ms (para recibir la señal del micrófono) 

 int led[] = {10, 9, 8, 7, 6}; //Declaramos un array con las luces LED
  
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //Este es el constructor de la pantalla LCD

void setup() 
{
  for(int i = 0; i<5; i++){
    pinMode(led[i], OUTPUT); //Indicamos que los LEDs están en modo salida
  }
  lcd.begin(16, 2);
  Serial.begin(9600); //Conexión con el puerto serie
}

void loop() 
{
  unsigned long inicio = millis(); //Medimos el tiempo en el que se inicia el bucle loop
  
  unsigned int signalMax = 0;
  unsigned int signalMin = 1024;

  //Vamos a recopilar los datos del micrófono durante la ventana (1s)
  unsigned int valor;
  while(millis() - inicio < sampleWindow) //Mientras no haya pasado 1s desde que empezó el bucle loop y se ejecutó la última iteración del while
  {
    valor = analogRead(micro);
    
    if(valor < 1024){
       if(valor > signalMax){
          signalMax = valor; //Actualizamos el máximo
       }
       else if(valor < signalMin){
          signalMin = valor; //Actualizamos el mínimo
       }
    }
  }
  unsigned int amplitud = signalMax - signalMin; //Guardamos en una variable la amplitud del sonido
  double tension = (amplitud * 5.0) / 1024; //Convertimos la amplitud a tensión
  double db = 20.0 * log10 (tension / 5.0); //Pasamos a decibelios
  double sonido = db + 50 ; //Como la ganancia son 50dB, sumamos el valor obtenido en el cálculo anterior a esos 50 dB
  
  encenderLeds(sonido);
  mostrarPantalla(sonido);
}

//Función que se encarga de mostrar la información por la pantalla LCD
void mostrarPantalla(double valor){
    
  lcd.setCursor(6, 0);
  lcd.print(valor);
  lcd.print("  ");

  lcd.setCursor(0, 1);
  lcd.print("NIVEL: ");

  if(valor < 20){
    lcd.print("BAJO  ");
  }
  else if(valor < 40){
    lcd.print("NORMAL");
  }
  else{
    lcd.print("ALTO  ");
  }
}

//Función que se encarga de encender o apagar los LEDs basándose en el nivel de ruido
void encenderLeds(double valor){
  digitalWrite(led[0], HIGH);
  
 if(valor >= 40){
   digitalWrite(led[4], HIGH);
 }
 else{
  digitalWrite(led[4], LOW);
 }
  
 if(valor >= 35){
  digitalWrite(led[3], HIGH);
 }
 else{
  digitalWrite(led[3], LOW);
 }

 if(valor >= 30){
  digitalWrite(led[2], HIGH);
 }
 else{
  digitalWrite(led[2], LOW);
 }

 if(valor >= 25){
  digitalWrite(led[1], HIGH);
 }
 else{
  digitalWrite(led[1], LOW);
 }
}

Posibles mejoras

  • Construir una carcasa que recubra el circuito para hacerlo más estético.
  • Comprobar si con un micrófono mejor el sonido podría detectarse de forma más precisa.
  • Cambiar la forma de la señal luminosa, por ejemplo con parpadeos, al alcanzar niveles altos de ruido.

También te podría gustar...

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *