buddhimaan
Created August 31, 2021 © GPL3+

IoT Sound Visualizer

An IoT compatible sound visualizer designer to measure the sound level inside a room and display it via LEDs

BeginnerFull instructions provided210
IoT Sound Visualizer

Things used in this project

Hardware components

Arduino Nano RP2040 Connect
Arduino Nano RP2040 Connect
×1
5 mm LED: Red
5 mm LED: Red
×2
5 mm LED: Yellow
5 mm LED: Yellow
×2
5 mm LED: Green
5 mm LED: Green
×3
Resistor 220 ohm
Resistor 220 ohm
×7
Jumper wires (generic)
Jumper wires (generic)
×8

Story

Read more

Code

Code

Arduino
Upload this Code to your RP2040 Connect Board to have your very own sound visualizer
#include "thingProperties.h"
// PDM for mbed_rp2040 - Version: Latest 
#include <PDM.h>

int LEDC = 2;
int LEDG1 = 3;
int LEDG2 = 4;
int LEDG3 = 5;
int LEDY4 = 6;
int LEDY5 = 7;
int LEDR6 = 8;
int LEDR7 = 9;

bool switchLED;

static const char channels = 1;

static const int frequency = 16000;

short sampleBuffer [512];

volatile int samplesRead;

void setup() {
  // Initialize serial and wait for port to open:
  Serial.begin(9600);
  // This delay gives the chance to wait for a Serial Monitor without blocking if none is found
  delay(1500); 
  
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(LEDC, OUTPUT);
  pinMode(LEDG1, OUTPUT);
  pinMode(LEDG2, OUTPUT);
  pinMode(LEDG3, OUTPUT);
  pinMode(LEDY4, OUTPUT);
  pinMode(LEDY5, OUTPUT);
  pinMode(LEDR6, OUTPUT);
  pinMode(LEDR7, OUTPUT);

  // Defined in thingProperties.h
  initProperties();

  // Connect to Arduino IoT Cloud
  ArduinoCloud.begin(ArduinoIoTPreferredConnection);
  
  PDM.onReceive(onPDMData);
  if (!PDM.begin(channels, frequency))
  {
    Serial.println("Failed to Initialize PDM");
    while(1);
  }
  
  
  /*
     The following function allows you to obtain more information
     related to the state of network and IoT Cloud connection and errors
     the higher number the more granular information you’ll get.
     The default is 0 (only errors).
     Maximum is 4
 */
  setDebugMessageLevel(2);
  ArduinoCloud.printDebugInfo();
}

void loop() {
  ArduinoCloud.update();
  
  if(samplesRead)
  {
    for (int i = 0; i < samplesRead; i++)
    {
      Serial.println(sampleBuffer[i]);
      sound_Level = sampleBuffer[i];
      
      if (sampleBuffer[i] >= 100 || sampleBuffer[i] <= -100)
      {
        digitalWrite(LEDG1, HIGH);
        
        if (sampleBuffer[i] >= 500 || sampleBuffer[i] <= -500)
        {
          digitalWrite(LEDG2, HIGH);
          
          if (sampleBuffer[i] >= 1000 || sampleBuffer[i] <= -1000)
          {
            digitalWrite(LEDG3, HIGH);
            
            if (sampleBuffer[i] >= 2500 || sampleBuffer[i] <= -2500)
            {
            digitalWrite(LEDY4, HIGH);
            
              if (sampleBuffer[i] >= 5000 || sampleBuffer[i] <= -5000)
              {
              digitalWrite(LEDY5, HIGH);
              
                if (sampleBuffer[i] >= 7500 || sampleBuffer[i] <= -7500)
                {
                  digitalWrite(LEDR6, HIGH);
                  
                  if (sampleBuffer[i] >= 15000 || sampleBuffer[i] <= -15000)
                  {
                    digitalWrite(LEDR7, HIGH);
                  }
                  
                  else
                  {
                    digitalWrite(LEDR7, LOW);
                  }
                }
                
                else
                {
                  digitalWrite(LEDR6, LOW);
                }
              }
              
             else
              {
                digitalWrite(LEDY5, LOW);
              }
            }
            else
            {
              digitalWrite(LEDY4, LOW);
            }
          }
          
          else
          {
           digitalWrite(LEDG3, LOW);
          }
        }
        
        else
        {
         digitalWrite(LEDG2, LOW);
        }
      }
      
      else
      {
       digitalWrite(LEDG1, LOW);
      }
      
      
      
      if (sampleBuffer[i] >= 10000 || sampleBuffer[i] <= -10000)
      {
        switchLED = !switchLED;
        if (switchLED)
        {
          digitalWrite(LED_BUILTIN, HIGH);
          digitalWrite(LEDC, HIGH);
          lED = true;
        }
        
        else 
        {
          digitalWrite(LED_BUILTIN, LOW);
          digitalWrite(LEDC, LOW);
          lED = false;
        }
      }
    }
    
    samplesRead = 0;
  }
  
  
}

void onPDMData()
{
  int bytesAvailable = PDM.available();
  
  PDM.read(sampleBuffer, bytesAvailable);
  
  samplesRead = bytesAvailable / 2;
}

Credits

buddhimaan
3 projects • 5 followers

Comments