Audio Reactive Infinity Mirror

Dependencies:   mbed-dsp mbed-rtos mbed

Infinity Mirror Project Page https://developer.mbed.org/users/mgolino/notebook/infinity-mirror/

Revision:
0:85385a11b2da
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sat Dec 12 01:22:30 2015 +0000
@@ -0,0 +1,252 @@
+// ECE 4180 Final Project
+// Fall 2015
+// Matthew Ashcraft 4th year EE
+// Matthew Golino   5th year CE
+//
+// Bluetooth Controlled Audio Reactive Infinity Mirror
+ 
+#include "mbed.h"
+#include "ble_mini.h"
+#include <iostream>
+#include "fftstuff.h"
+
+////////////////////////////////////////////////////////////////////////////////
+// MBED PIN DESIGNATION
+// DO NOT change unless accompanying hardware is altered
+////////////////////////////////////////////////////////////////////////////////
+// Analog
+//AnalogIn mic(p15);      // Analog input for the microphone
+//AnalogIn aux(p20);      // Analog input for the DC offset aux cable input
+// PWM outputs for RGB LEDs
+PwmOut gled(p23);
+PwmOut rled(p22);
+PwmOut bled(p21);
+// Serial Interface for Mbed to PC
+Serial pc(USBTX, USBRX);
+// Serial Interface for Bluetooth Module to Mbed
+Serial device(p9,p10);
+// END MBED PIN DESIGNATION
+
+////////////////////////////////////////////////////////////////////////////////
+// GLOBAL VARIABLES
+// Variables used across multiple functions, simpler than passing to functions
+////////////////////////////////////////////////////////////////////////////////
+
+char buf[4];            // Char buffer for bluetooth commands
+// Boolean flags for audio sampling
+bool AuxIn = false;
+bool MicIn = false;
+bool inputSelect = false; //false = aux --- true = mic
+// Float variable used to write to LED PWM outputs
+float redVal = -1;
+float greenVal = -1;
+float blueVal = -1;
+// Float used to "save" previous values for manual writing
+float redHold = -1;
+float greenHold = -1;
+float blueHold = -1;
+//strobe values
+float strobeVal = -1;
+float strobeHold = 0;
+// END GLOBAL VARIABLES  
+
+
+////////////////////////////////////////////////////////////////////////////////
+// LED WRITING FUNCTIONS
+////////////////////////////////////////////////////////////////////////////////
+// Write stored RGB values to PWM outputs
+void writeColors(float redVal, float greenVal, float blueVal, float strobeVal)
+{
+    if (strobeVal > 0) {
+        rled = 0;
+        gled = 0;
+        bled = 0;
+        wait(strobeVal);     
+    }
+    if ((redVal >= 0) || (greenVal >= 0) || (blueVal >= 0)) {
+        rled = redVal;
+        gled = greenVal;
+        bled = blueVal;
+    }
+}
+// END LED WRITING FUNCTIONS
+
+int main() {
+    // Initialize frequency window size
+    // Set BLE mini baud rate   
+    device.baud(57600);
+    // Floats used to "hold" RGB values
+//    float redHold = -1;
+//    float greenHold = -1;
+//    float blueHold = -1;
+    // Floats used to set and "hold" strobe setting
+
+    while(1) {
+        if(device.readable()) {
+            // Read in Bluetooth commands
+            for(int i = 0; i < 4; i++){
+                buf[i]=device.getc();
+                pc.printf("%x  ",buf[i]);
+            }
+            pc.printf("\n\r");
+            pc.printf("done\n");
+            
+            // Check cases for all different switch options based on buf[0];
+            char whichInput = buf[0];
+            // Check for Bluetooth Connectivity
+            if(whichInput == BLE_CONNECTED){        
+                pc.printf("case0\n\n");
+                //pretty lights for connect
+                rled = 255;
+                wait(0.25);
+                rled=0;
+                gled=255;
+                wait(0.25);
+                gled=0;
+                bled=255;
+                wait(0.25);
+                bled=0;
+            }
+            else if(whichInput == LIGHTS_OFF_SWITCH){ // Manually turn off lights
+                pc.printf("Turning All Lights Off\n\n");
+                strobeVal = -1;
+                if(buf[1]==0x01){
+                    redVal = 0.0f;
+                    greenVal = 0.0f;
+                    blueVal = 0.0f;
+                }
+                else if(buf[1]==0x00){
+                    redVal = -1.0f;
+                    greenVal = -1.0f;
+                    blueVal = -1.0f;
+                }
+            }
+            else if(whichInput == IR_SWITCH){       // React to IR remote
+                pc.printf("Listening to IR Remote\n\n");
+                strobeVal = -1;
+                //TBD
+                
+                
+            }
+            
+            else if(whichInput == MIC_SWITCH){      // React to microphone audio input
+                pc.printf("Listening to Microphone for FFT\n\n");
+                strobeVal = -1;
+                if(buf[1]==0x00){ //switched off
+                    redVal = 0;
+                    greenVal = 0;
+                    blueVal = 0;
+                }
+                else if (buf[1]==0x01){ //switched on
+                    //MicIn = true; //FALSE = MIC CONTROLS -- REMEMBER TO FIX IN CODE
+                    inputSelect = true;
+                    float colors[3] = {0.0f,0.0f,0.0f};
+
+                    while(!device.readable()){ // done to improve speed => bypass long if statement
+                            runFFT(inputSelect, colors); 
+                            redVal = colors[0];
+                            greenVal = colors[1];
+                            blueVal = colors[2];;
+                            writeColors(redVal, greenVal, blueVal, strobeVal);
+                    }
+                }    
+                redVal = -1;
+                greenVal = -1;
+                blueVal = -1;
+            }
+            else if(whichInput == AUX_SWITCH){      // React to aux cable audio input
+                pc.printf("Listening to Aux for FFT\n\n");
+                strobeVal = -1;
+                if(buf[1]==0x00){ //switched off
+                    redVal = 0;
+                    greenVal = 0;
+                    blueVal = 0;
+                }
+                else if (buf[1]==0x01){ //switched on
+                    inputSelect = false;
+                    float colors[3] = {0.0f,0.0f,0.0f};
+
+                    while(!device.readable()){ // done to improve speed => bypass long if statement
+                            runFFT(inputSelect, colors); 
+                            redVal = colors[0];
+                            greenVal = colors[1];
+                            blueVal = colors[2];;
+                            writeColors(redVal, greenVal, blueVal, strobeVal);
+                    }
+                }    
+                redVal = -1;
+                greenVal = -1;
+                blueVal = -1;
+            }
+            else if(whichInput == MANUAL_SWITCH){   // Manual color control
+                pc.printf("Colors are Being Controlled Manually\n\n");
+                strobeVal = strobeHold;
+                if ((redVal < 0) && (redHold < 0)){
+                    redVal   = 128.0f/255;
+                    greenVal = 128.0f/255;
+                    blueVal  = 128.0f/255;
+                }
+                else{
+                    redVal = redHold;
+                    greenVal = greenHold;
+                    blueVal = blueHold;    
+                }
+                
+                if(buf[1] == 0x00){
+                    redVal = -1;
+                    greenVal = -1;
+                    blueVal = -1;
+                }
+            }
+            else if(whichInput == STROBE_SPEED){ // Strobe feature for manual control
+                pc.printf("Strobe Speed Changed\n\n");
+                float strobeSpeed = buf[1]; // Value 0-255 to be used in determining strobe speed
+                //determine how to control strobe               
+                //pc.printf("Strobe rate: %f", strobeSpeed);
+                strobeVal = 0.35 - (strobeSpeed*0.35/255);
+                if(strobeSpeed == 0){
+                    strobeVal=0;
+                }
+                strobeHold = strobeVal;
+            }
+            else if(whichInput == COLOR_SELECT){
+                pc.printf("case7\n\n");
+                // Convert from hex to float
+                redVal = buf[1];
+                greenVal = buf[2];
+                blueVal = buf[3];
+                
+                // Put in range from 0-1
+                redVal=redVal/255;
+                greenVal=greenVal/255;
+                blueVal=blueVal/255;
+                
+                // Store for holding purposes
+                redHold = redVal;
+                greenHold = greenVal;
+                blueHold = blueVal;                
+            }
+            else{
+                pc.printf("CASE CONFUSED\n\n");
+            }
+        } // End readable
+    
+        else {
+            //if we can detect BT or no BT
+            //if(//conditions for aux mode)
+            //else if (conditions for mic mode)
+            //else IR mode
+        
+        } // End !readable
+        
+        if(redVal < 0){
+            writeColors(0,0,0,strobeVal);    
+        }
+        else{
+            writeColors(redVal, greenVal, blueVal, strobeVal);    
+        }    
+         
+        wait(0.1);
+    }// End while(1) loop
+}// End main
+  
\ No newline at end of file