Miranda Hansen
Published © GPL3+

Pmod MIC Audio Visualizer

Build a dynamic audio visualizer that responds to music, voices and other auditory input using Pmod MIC, Arduino Uno and Processing.

EasyFull instructions provided15 hours251
Pmod MIC Audio Visualizer

Things used in this project

Hardware components

Pmod MIC3
Digilent Pmod MIC3
Arduino UNO & Genuino UNO
Arduino UNO & Genuino UNO

Software apps and online services

The Processing Foundation Processing


Read more


Circuit Diagram

PmodMIC VCC-->5V on UNO
PmodMIC SCK --> Digital Pin 13 on UNO
PmodMIC MISO--> Digital Pin 12 on UNO
PmodMIC N/A--> No Connection
PmodMIC SS --> Digital Pin 10 on UNO
Cir yg8jsgbxwo


Arduino Code

For use with the Pmod MIC circuit. Upload this code to your board first, and keep it connected to the computer before attempting to launch the Processing code. If you are stuck feel free to peek at the serial monitor in the Arduino IDE to make sure it is sending data. The normal numbers I was getting when I did this were around 2000-2200.
* Test of the Pmod 
* Description: Pmod_MIC3
* The sound captured by the module is displayed in the serial plotter.
* Material
* 1. Arduino Uno
* 2. Pmod MIC3
* Code courtesy of this project and it's authors Alex Wong and Martha Migliacio of Digilent Inc
* https://www.hackster.io/56469/using-the-pmod-mic3-with-arduino-uno-fc0daa

#define CS 10 // Assignment of the CS pin

#include <SPI.h> // call library

int i;
byte recu[3]; // storage of data of the module
int X;
long somme = 0;

void setup()
 Serial.begin(9600); // initialization of serial communication
 SPI.begin(); // initialization of SPI port
 SPI.setDataMode(SPI_MODE0); // configuration of SPI communication in mode 0
 SPI.setClockDivider(SPI_CLOCK_DIV16); // configuration of clock at 1MHz
 pinMode(CS, OUTPUT);

void loop()
 digitalWrite(CS, LOW); // activation of CS line
 for (i=0;i<2;i=i+1)
    recu[i] = SPI.transfer(0); // send 2 data to retrieve the value of the two-byte conversion
 digitalWrite(CS, HIGH); // deactivation of CS line
 X = recu[1]; // X is on 12 bit format
 X |= (recu[0] << 8);
for(int i=0; i<32; i++) // Development of the sound curve
   somme = somme + X;

 somme >>= 5;
 Serial.println(somme); // Display in serial plotter


Run this after you have connected the Arduino and MIC circuit, and uploaded the PmodMIC code. If you are having issues with it selecting the correct serial port, change the [1] on line 25 to a [0].
* Author: Miranda Hansen and Joshua Cummings
* File: Visualizer.pde
* Date: 2019-01-15
* License: MIT
* Description: Reads serial data and displays it as a bar graph.

import processing.serial.*;

// Configurable Graph Variables
int barCount = 20; // Max number of bars
int barWidth = 20; // In Pixels
int centerLineY = 400; // Set the Y position of our center line
int barPadding = 2; // Adjust the space between each bar
int scale = 10; // Value to divide the serial values by. Larger values results in a shorter graph.

// Global Variables
Serial myPort;
String val;   
StringList numbers;

void setup() {
  size(600, 800);
  String portName = Serial.list()[1]; // Adjust index to proper serial port
  myPort = new Serial(this, portName, 9600);
  numbers = new StringList();

void draw() {
  if ( myPort.available() > 0) { // Check if there is data available
    val = myPort.readStringUntil('\n'); // Read serial data
    // Clear the screen
    fill(255, 0, 0);      

    if (val != null) {      
      if (numbers.size() < barCount) { // Start of the program, just fill the array until we reach the target size
      } else {
        for (int i = 0; i < numbers.size() - 1; i++){ // We've filled the list, shift values up 1 index
          numbers.set(i, numbers.get(i+1));
        numbers.set(numbers.size()-1, val.trim()); // Update the last value with our new serial value

  int posX = 0;
  for (int i = 0; i < numbers.size(); i++){ // For each value in our array, draw a rectangle with the appropriate graph settings
    rect(posX, centerLineY, barWidth, Integer.parseInt(numbers.get(i)) / scale);
    rect(posX, centerLineY - Integer.parseInt(numbers.get(i)) / scale, barWidth, Integer.parseInt(numbers.get(i)) / scale);
    posX = posX + barWidth + barPadding;
  // delay(100); //optional delay to slow speed of bars for better visual effect.
  myPort.clear(); // Remove any serial data that queued to prevent the buffer from filling ahead of how fast we can draw the values


Miranda Hansen

Miranda Hansen

2 projects • 4 followers
Thanks to Joshua Cummings .


Add projectSign up / Login