Hackster is hosting Impact Spotlights: Industrial Automation. Watch the stream live on Thursday!Hackster is hosting Impact Spotlights: Industrial Automation. Stream on Thursday!
João Pereira
Published © LGPL

Sound Level Measurement

A simple sound intensity meter. Using an analog port on an arduino. The sound intensity range is shown by the different color of an RGB led.

IntermediateProtip240
Sound Level Measurement

Things used in this project

Schematics

Schematic

Schematic

Code

Sonómetro

Arduino
/* File: sonometro com formato de smile
 * Autor: Joo Pereira
 * Email: joaodper@gmail.com
 * Data: 2019
 */
 
#define COMMON_ANODE            // Define os Leds como anodo comum

const int redPin = 13;          // Leds vermelhos do contorno
const int greenPin = 9;         // Leds verdes do contorno

const int sadPin = 4;           // 2 Leds de baixo da boca vermelha
const int happyredPin = 5;      // Leds verdes da boca
const int happygreenPin = 3;    // Leds vermelhos da boca

const int sensorPIN = A0;
const int sampleWindow = 300;   // Janela de medioa en mS (50 mS = 20Hz)

int r = 0;
int g = 0;
int b = 0;
int cor_anterior = 0;           //0 - Verde; 1 - Laranja; 2 - Vermelho

void setup() 
{
  Serial.begin(9600);
  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(happyredPin, OUTPUT);
  pinMode(happygreenPin, OUTPUT);
  pinMode(sadPin, OUTPUT);
}
 
void loop() 
{

   unsigned long startMillis = millis();
 
   unsigned int signalMax = 0;
   unsigned int signalMin = 1024;
 
   // Mede durante a janela
   unsigned int sample;
   while (millis() - startMillis < sampleWindow)
   {
      sample = analogRead(sensorPIN);
      if (sample < 1024)
      {
         if (sample > signalMax)
         {
            signalMax = sample;  // Actualizar mximo
         }
         else if (sample < signalMin)
         {
            signalMin = sample;  // Actualizar mnimo
         }
      }
   }
   
   unsigned int peakToPeak = signalMax - signalMin;  // Amplitude do som
   //double volts = (peakToPeak * 5.0) / 1024;  // Converter para tenso
   //Serial.println(peakToPeak);
  
   if(peakToPeak<180){
    // verde
    setColor(0, 255);          // Ligar green
    setColorBoca(0, 255);      // Ligar green
    analogWrite(sadPin, 255);  // Apaga o vermelho da boca
 
    cor_anterior = 0;
  }  
  if(peakToPeak>179 && peakToPeak<350){
    // amarelo
    setColor(255, 255);         // yellow 
    setColorBoca(255, 255);     // yellow na boca
    analogWrite(sadPin, 255);   // Apaga o vermelho da boca
    cor_anterior = 1;
    delay(100);
  }
  if(peakToPeak>349){
    if (cor_anterior == 0) {    //Se anterior era verde 
      // amarelo
      setColor(255, 255);       // yellow
      setColorBoca(255, 255);   // yellow
      analogWrite(sadPin, 0);   // Vermelho da boca
      delay(100);
      // vermelho
      setColor(255, 0);         // Acende vermelho
      setColorBoca(0, 0);       // Apaga amarelo na boca
      analogWrite(sadPin, 0);   // Acende o vermelho da boca 
      delay(100);  
    }
    else{
      // vermelho
      setColor(255, 0);         // Acende vermelho
      setColorBoca(0, 0);       // Apaga amarelo na boca
      analogWrite(sadPin, 0);   // Acende o vermelho da boca
      delay(100);   
    }
    cor_anterior = 2;
    
  }

    peakToPeak = 0;
    delay(10);

}


void setColor(int red, int green)
{
  #ifdef COMMON_ANODE
    red = 255 - red;
    green = 255 - green;
  #endif
  analogWrite(redPin, red);
  analogWrite(greenPin, green);
}

void setColorBoca(int red, int green)
{
  #ifdef COMMON_ANODE
    red = 255 - red;
    green = 255 - green;
  #endif
  analogWrite(happyredPin, red);
  analogWrite(happygreenPin, green);
}

Credits

João Pereira
5 projects • 13 followers
Contact

Comments

Please log in or sign up to comment.