Sonómetro de aula con arduino.


ESQUEMAS DE CONEXIÓN.


ESQUEMA GENERAL


ESQUEMA DE CONEXIÓN Y ALIMENTACIÓN DE LOS LED'S




CÓDIGOS DEL PROGRAMA.

VERSIÓN 1. POR MUESTREO O POLLING


/**********************************************************************/
/*                                                                    */
/*             SONÓMETRO PARA EL CONTROL DE RUIDO EN EL AULA          */
/*         VERSIÓN 1: POR MUESTREO DE LA SALIDA DIGITAL (POLLING)     */
/*                                                                    */
/*                 www.fpbasicaelectricidad.blogspot.com              */
/*                                                                    */
/*                             mayo 2016                              */
/**********************************************************************/  

// DEFINICIONES //
#define PIN_LED_ROJO      4
#define PIN_LED_AMARILLO  5
#define PIN_LED_VERDE     6
#define PIN_SONIDO        3
#define PIN_V_POTENC      9

// VARIABLES GLOBALES //
long veces_leido = 0;
long veces_on = 0;
int Potenciometro_A0 = A0;
long Valor_Potenciometro = 0;
long para_rango_led_verde, para_rango_led_rojo;

// INICIALIZACIÓN DE LA PLACA ARDUINO NANO V3.0//
void setup() {
   pinMode(PIN_LED_ROJO, OUTPUT); 
   pinMode(PIN_LED_AMARILLO, OUTPUT); 
   pinMode(PIN_LED_VERDE, OUTPUT);
   pinMode(PIN_V_POTENC, OUTPUT); 
   pinMode(PIN_SONIDO, INPUT_PULLUP);
   digitalWrite(PIN_LED_VERDE, HIGH);
   
   Serial.begin(9600);
}

// PROGRAMA PRINCIPAL //
void loop() {

  // Primeramente se lee el valor del PIN DIGITAL del MÓDULO DE SONIDO //
  // 200.000 veces y se contabilizan las que superan el umbral         //
  for ( veces_leido = 0, veces_on=0; veces_leido <= 200000; veces_leido++){
    if (!digitalRead(PIN_SONIDO)) veces_on++;
  }
  
  // Se lee el valor del potenciómetro escribiendo primeramente un bit en PIN_V_POTENC //
  digitalWrite(PIN_V_POTENC, HIGH);
  Valor_Potenciometro = analogRead(Potenciometro_A0);
  digitalWrite(PIN_V_POTENC, LOW);

  // Se calculan los umbrales para iluminar los led's correspondientes          //
  // en función de la sensiblidad ajustada en el potenciómetro       //

  para_rango_led_rojo  = long (1000 + Valor_Potenciometro * 165);
  para_rango_led_verde = long (  2 + Valor_Potenciometro *  50);
 
  
  if (veces_on <= para_rango_led_verde){                                   
      digitalWrite(PIN_LED_ROJO, LOW);
      digitalWrite(PIN_LED_AMARILLO, LOW);
      digitalWrite(PIN_LED_VERDE, HIGH);
      Serial.write(20);                     // SE ENVÍA ESTE CÓDIGO PARA EL USO CON PROCESSING. 
                                            // NO SE USA SI SOLO TENEMOS SALIDAS A LED'S
  }
  else if (veces_on >= para_rango_led_rojo){                      
      digitalWrite(PIN_LED_ROJO, HIGH);
      digitalWrite(PIN_LED_AMARILLO, LOW);
      digitalWrite(PIN_LED_VERDE, LOW);
      Serial.write(22);                     // SE ENVÍA ESTE CÓDIGO PARA EL USO CON PROCESSING. 
                                            // NO SE USA SI SOLO TENEMOS SALIDAS A LED'S
  }
  else {
      digitalWrite(PIN_LED_ROJO, LOW);
      digitalWrite(PIN_LED_AMARILLO, HIGH);
      digitalWrite(PIN_LED_VERDE, LOW);
      Serial.write(21);                     // SE ENVÍA ESTE CÓDIGO PARA EL USO CON PROCESSING. 
                                            // NO SE USA SI SOLO TENEMOS SALIDAS A LED'S
  }

  // ESTAS LLAMADAS A FUNCIONES SE HAN UTILIZADO PARA LA PUESTA A PUNTO PARA LEER LOS DATOS DESDE EL MONITOR SERIE//
  Serial.print(" VECES_ON= "); Serial.print(veces_on);
  Serial.print(" VALOR POTENCIOMETRO= "); Serial.print(Valor_Potenciometro);
  Serial.print(" PARA_RANGO_ROJO= "); Serial.print(para_rango_led_rojo);
  Serial.print(" PARA_RANGO_VERDE= "); Serial.print(para_rango_led_verde);
  Serial.println("--");
}

VERSIÓN 2. MEDIANTE INTERRUPCIONES ASÍNCRONAS


/**********************************************************************/
/*                                                                    */
/*             SONÓMETRO PARA EL CONTROL DE RUIDO EN EL AULA          */
/*                    VERSIÓN 2: POR INTERRUPCIONES                   */
/*                                                                    */
/*                 www.fpbasicaelectricidad.blogspot.com              */
/*                                                                    */
/*                             mayo 2016                              */
/**********************************************************************/  

// DEFINICIONES //
#define PIN_LED_ROJO      4
#define PIN_LED_AMARILLO  5
#define PIN_LED_VERDE     6
#define PIN_SONIDO        3
#define PIN_V_POTENC      9

// VARIABLES GLOBALES //
long veces_leido = 0;
long veces_on = 0, int_veces_on;
int Potenciometro_A0 = A0;
long Valor_Potenciometro = 0;
long para_rango_led_verde, para_rango_led_rojo;

// INICIALIZACIÓN DE LA PLACA ARDUINO NANO V3.0//
void setup() {
   pinMode(PIN_LED_ROJO, OUTPUT); 
   pinMode(PIN_LED_AMARILLO, OUTPUT); 
   pinMode(PIN_LED_VERDE, OUTPUT);
   pinMode(PIN_V_POTENC, OUTPUT); 
   pinMode(PIN_SONIDO, INPUT_PULLUP);
   // INICIALIZACIÓN DE LA INTERRUPCCIÓN EN EL PIN_SONIDO = D3
   attachInterrupt(digitalPinToInterrupt(PIN_SONIDO), funcion_interrupcion, HIGH);
   
   digitalWrite(PIN_LED_VERDE, HIGH);
   
   Serial.begin(9600);            // SOLO PARA PRUEBAS
}

// RUTINA DE INTERRUPCIÓN //
  void funcion_interrupcion(){ 
    int_veces_on++;
  }

// PROGRAMA PRINCIPAL //
void loop() {

  delay (1000);             // PAUSA ESTABLECIDA PARA TOMAR UN RANGO DE TIEMPO //
  veces_on = int_veces_on;  // SE COPIA EL VALOR DE VECES_ON DE LA INTERRUPCIÓN PARA UNA SIGUIENTE PUESTA A 0
  int_veces_on=0;           // SE INICIALIZA EL VALOR DE LA VARIABLE QUE SE INCREMENTA EN CADA RUTINA DE INTERRUPCIÓN
  
  // Se lee el valor del potenciómetro escribiendo primeramente un bit en PIN_V_POTENC //
  digitalWrite(PIN_V_POTENC, HIGH);
  Valor_Potenciometro = analogRead(Potenciometro_A0);
  digitalWrite(PIN_V_POTENC, LOW);
  
  // Se calculan los umbrales para iluminar los led's correspondientes          //
  // Se utiliza un rango logaritmico por las características logaritmicas       //
  // de percepción por el oido humano y ya que se ha utilizado un potenciómetro lineal //

  para_rango_led_rojo  = long (100 + Valor_Potenciometro * 5);
  para_rango_led_verde = long (  2 + Valor_Potenciometro / 2);
 
  
  if (veces_on <= para_rango_led_verde){                                   
      digitalWrite(PIN_LED_ROJO, LOW);
      digitalWrite(PIN_LED_AMARILLO, LOW);
      digitalWrite(PIN_LED_VERDE, HIGH);
      Serial.write(20);
  }
  else if (veces_on >= para_rango_led_rojo){                      
      digitalWrite(PIN_LED_ROJO, HIGH);
      digitalWrite(PIN_LED_AMARILLO, LOW);
      digitalWrite(PIN_LED_VERDE, LOW);
      Serial.write(22);
  }
  else {
      digitalWrite(PIN_LED_ROJO, LOW);
      digitalWrite(PIN_LED_AMARILLO, HIGH);
      digitalWrite(PIN_LED_VERDE, LOW);
      Serial.write(21);
  }
}     // FIN DEL PROGRAMA  

Programa de Processing:

El enlace al código fuente y los ejecutables es: 
https://drive.google.com/file/d/0B4q99Yx8xfl2VWxSWTZhd2tVUm8/view?usp=sharing

(incluye ejecutables para Windows y Linux)
Los drivers para el arduino nano chino puedes descargarlo desde: 
http://www.geekfactory.mx/sin-categoria/driver-ch340-para-arduino-chinos-o-genericos/

/*   fpbasicaelectricidad.blogspot.com   Arduino + Processing: Semáforo de ruido   ARCHIVOS DE PROCESSING CON POTENCIÓMETRO DE NIVEL      MAYO DE 2016 */ import processing.serial.*; //Importamos la librería Serial Serial port; //Nombre del puerto serie import controlP5.*; ControlP5 cp5; int dato_puerto; PImage imagen_rojo, imagen_amarillo, imagen_verde; void setup() {      port = new Serial(this, Serial.list()[0], 9600); //Abre el puerto serie COM3   size(450, 450); //Creamos una ventana de 450 píxeles de anchura por 450 píxeles de altura   imagen_rojo = loadImage("triste.jpg");   imagen_amarillo = loadImage("indiferente.jpg");   imagen_verde = loadImage("riyendo.jpg");   background(255,255,255);//Fondo de color blanco      crea_potenciometro(); } void crea_potenciometro() {      cp5 = new ControlP5(this);            cp5.addSlider("Sensibilidad")      .setPosition(10,10)      .setSize(100,20)      .setRange(0,100)      .setValue(50)      ; }   void draw() {   float s1=0, s2=0;      // Mandar datos del potenciometro al arduino   s1 = cp5.getController("Sensibilidad").getValue();   if (s1 != s2) {     port.write(int (s1));     s2=s1;   }         //Recibir datos del sonido del Arduino   if(port.available() > 0) // si hay algún dato disponible en el puerto    {      dato_puerto = port.read();//Lee el dato y lo almacena en la variable "dato_puerto"      if (dato_puerto == 20) image(imagen_verde, 0, 0);      else if (dato_puerto == 22) image(imagen_rojo, 0, 0);      else image(imagen_amarillo, 0, 0);      //println(dato_puerto);    }    //else print (" Arduino desconectado del puerto USB"); }

Los iconos para el programa de Processing:

Vídeos:

:


Fotos del proceso de construcción:




















PRESENTACIÓN DEL SONÓMETRO EN LAS JORNADAS PROVINCIALES DE BUENAS PRÁCTICAS EN LA FORMACIÓN PROFESIONAL.

EL PÓSTER

8 comentarios:

  1. Hola, pregunta, que transistores ocupan?

    ResponderEliminar
  2. Hola:
    Nosotros hemos usado el transistor BD-139. Es un NPN-80V-1,5A-250HFE. Las características de ganancia del BJT no son restrictivas pues trabaja en corte-saturación como interruptor, con lo cual puedes utilizar otros muchos transistores y funcionaría también bien.
    Un saludo
    Feliz 2018.

    ResponderEliminar
  3. Hola.
    Lo primero, enhorabuena por el proyecto.
    Soy Alfonso Muñoz, de valencia.
    Portavoz de un grupomuy numeroso de vecinos del barrio de Benimaclet, en Valencia.
    Te resumo.
    Nuestro barrio está sujeto a permanentes agresiones al orden y al descanso como consecuencia del ruido... Las autoridades no nos hace ni caso.
    Nuestra idea es instalar sonómetros gráficos , q intenten concienciar a los inquilinos de la calle, y su semáforo de ruido nos parece genial, ya q pensamos en instalar algo así en nuestros balcones a título personal.
    Cómo no somos ni asociación ni ningún tipo colectivo reconocido, no contamos con medios económicos ni subvenciones de ningún tipo.
    Pensamos q quizás, podrían "donarnos" los proyectos q los chicos hagan.
    A nosotros nos harían un grandísimo favor para comenzar nuestra campaña de.concienciacion ciudadana, y en compensación, sus alumnos verían q.sus proyectos están siendo utilizados realmente por una grandiosa causa, hacer q gente normal y corriente q no puede ni descansar en sus casas, puedan volver a hacerlo.
    Mi email:
    alfonso@iaprende.es
    Muchas gracias

    ResponderEliminar
    Respuestas
    1. Hola Alfonso:
      Disculpa que hay tardado en contestar, desde hace algún tiempo tengo desatendido el blog porque estoy impartiendo clases en otros módulos y otros niveles.
      Me alegra, y te agradezco tu comentario en el blog, que te haya gustado nuestro proyecto y que veas una utilidad práctica en él. De hecho, además de como recurso didáctico, estos sonómetros se diseñaron y construyeron para controlar el nivel de ruido en durante distintas actividades en clase y en los recreos.
      En estos momentos imparto otros módulos, en otros niveles e incluso estoy en otro Centro, de forma que estamos haciendo otro tipo de prácticas.
      A pesar de eso, lo que me pides es imposible de hacer; el material de los ciclos formativos se compra a base de asignaciones (bastante ajustadas) de la conserjería de Educación, con lo cual el material se usa en las prácticas y se queda en el centro o se recicla de nuevo para otras prácticas.
      De todas formas, el proyecto está suficientemente documentado para poder hacerlo con unos básicos conocimientos de Arduino.
      De nuevo, muchas gracias.
      Un saludo

      Eliminar
  4. Hola
    Me preguntaba en que rangos de dB trabaja este proyecto?
    De antemano muchas gracias y felicitaciones por su proyecto.

    ResponderEliminar
  5. Hola, quiero hacer este proyecto con mis alumnos, quisiera preguntarte cusl de los dos métodos te ha ido mejor. Si has hecho mejoras. Es un proyecto que quiero que hagan para montarlo en las aulas. Gracias

    ResponderEliminar
  6. hola, que componentes usas?
    quiero hacer la simulacion en proteus, pero no alcanzo a encontrar, "Electret Microphone Breakout Board parte 1". Saludos, espero tu respuesta muyyy pronto, porfavor

    ResponderEliminar
  7. Hola, me gustaría poder comunicarme contigo de cualquier manera (vía correo, WhatsApp, zoom etc.), para poder debatir algunas cosas, ya que me gustaría poder implementar funciones de este proyecto, en un proyecto de sonido ambiental que estoy haciendo.

    ResponderEliminar