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

3 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