Blinks LED cube along with music
Dependencies: mbed mbed-rtos MCP23S17
main.cpp
- Committer:
- kgoins3
- Date:
- 2018-12-11
- Revision:
- 1:ef3ad9c720c9
- Parent:
- 0:b6451e68016a
File content as of revision 1:ef3ad9c720c9:
#include "mbed.h"
#include "adc.h"
#include "MCP23S17.h"
#include "rtos.h"
#define MN 256
#define SAMPLE_RATE 48000
// Create SPI bus
SPI spi(p5, p6, p7);
DigitalOut layer0(p24);
DigitalOut layer1(p23);
DigitalOut layer2(p22);
DigitalOut layer3(p21);
AnalogIn ain(p18);
char Opcode = 0x40;
MCP23S17 chip = MCP23S17(spi, p20, Opcode);
Timer timer;
Ticker ticker;
int Counter = 0;
int led_control = 1;
int16_t Buffer[5000];
unsigned char PowerInt[MN/2];
ADC adc(SAMPLE_RATE, 1);
float g;
void sample_ADC(int chan, uint32_t value) {
float s;
s = adc.read(p19);
Counter += 1;
g = abs(s-2048);
g = g/2048;
}
void LED_Thread(void const *args) {
chip.write(PORT_A, 0x00);
chip.write(PORT_B, 0x00);
layer0 = 1;
layer1 = 0;
layer2 = 0;
layer3 = 0;
// Set all 8 Port A bits to output direction
chip.direction(PORT_A, 0x00);
// Set all 8 Port B bits to output direction
chip.direction(PORT_B, 0x00);
unsigned char c[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
while(1){
switch(led_control){
case 0: //Standard Mode
chip.write(PORT_A, 0xFF);
chip.write(PORT_B, 0xFF);
if(g > 0 && g < .25){
layer3 = 1;
}else{
layer3 = 0;
}
if(g > .25 && g < .5){
layer2 = 1;
}else{
layer2 = 0;
}
if(g > .5 && g < .75){
layer1 = 1;
}else{
layer1 = 0;
}
if(g > .75 && g < 1){
layer0 = 1;
}else{
layer0 = 0;
}
break;
case 1: //Standard + Screensaver
char c_rand[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
if(g > 0 && g < .25){
layer3 = 1;
}else{
layer3 = 0;
}
if(g > .25 && g < .5){
layer2 = 1;
}else{
layer2 = 0;
}
if(g > .5 && g < .75){
layer1 = 1;
}else{
layer1 = 0;
}
if(g > .75 && g < 1){
layer0 = 1;
}else{
layer0 = 0;
}
for( int i = 0; i <=7; i++){chip.write(PORT_A, c[i]); //A loop
Thread::wait(10);}
chip.write(PORT_A, 0x00);
for( int i = 0; i <=7; i++){chip.write(PORT_B, c[i]); //A loop
Thread::wait(10);}
chip.write(PORT_B, 0x00); //CLEAR
break;
case 2: //Standard + Screensaver {{RANDOM}}
char c_rand[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
if(g > 0 && g < .25){
layer3 = 1;
}else{
layer3 = 0;
}
if(g > .25 && g < .5){
layer2 = 1;
}else{
layer2 = 0;
}
if(g > .5 && g < .75){
layer1 = 1;
}else{
layer1 = 0;
}
if(g > .75 && g < 1){
layer0 = 1;
}else{
layer0 = 0;
}
for (int i=0; i<7; i++) {
int r = rand() % 7; // generate a random position
int temp = c_rand[i]; c_rand[i] = c_rand[r]; c_rand[r] = temp;
}
for( int i = 0; i <=7; i++){chip.write(PORT_A, c_rand[i]); //A loop
Thread::wait(10);}
chip.write(PORT_A, 0x00);
for( int i = 0; i <=7; i++){chip.write(PORT_B, c_rand[i]); //A loop
Thread::wait(10);}
chip.write(PORT_B, 0x00); //CLEAR
break;
case 3: //Screensaver
for(int n = 0; n<= 3; n++){
switch(n){
case 1: layer0 = 0; layer1 = 1; layer2 = 0; layer3 = 0;
break;
case 2: layer0 = 0; layer1 = 0; layer2 = 1; layer3 = 0;
break;
case 3: layer0 = 0; layer1 = 0; layer2 = 0; layer3 = 1;
break;
default: layer0 = 1; layer1 = 0; layer2 = 0; layer3 = 0;
break;
}
for( int i = 0; i <=7; i++){chip.write(PORT_A, c[i]); //A loop
Thread::wait(100);}
chip.write(PORT_A, 0x00);
for( int i = 0; i <=7; i++){chip.write(PORT_B, c[i]); //A loop
Thread::wait(100);}
chip.write(PORT_B, 0x00); //CLEAR
}
break;
}
Thread::wait(25);
}
}
int main() {
Thread t1(LED_Thread);
while (1) {
//Prepare for burst mode on all ADC pins and set up interrupt handler
adc.append(sample_ADC);
adc.startmode(0,0);
adc.burst(1);
adc.setup(p19,1);
wait(.4);
adc.interrupt_state(p19,1);
wait(0.1);
adc.interrupt_state(p19,0);
adc.setup(p19,0);
int actual_rate = adc.actual_sample_rate();
}
}