Audio Reactive Infinity Mirror
Dependencies: mbed-dsp mbed-rtos mbed
Infinity Mirror Project Page https://developer.mbed.org/users/mgolino/notebook/infinity-mirror/
Diff: main.cpp
- 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