Accelerometer game
Dependencies: 4DGL-uLCD-SE ADXL345 mbed-rtos mbed
Diff: main.cpp
- Revision:
- 0:c69d1ec4d395
- Child:
- 1:54ed477da4d3
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Thu Mar 20 03:22:57 2014 +0000 @@ -0,0 +1,263 @@ +#include "mbed.h" +#include "rtos.h" +#include "uLCD_4DGL.h" +#include "ADXL345.h" + + +PwmOut speaker(p21); +uLCD_4DGL uLCD(p28, p27, p29); // create a global lcd object +ADXL345 accelerometer(p5, p6, p7, p8); +Serial pc(USBTX, USBRX); +Mutex lcd_mutex; + +int red_car_x, red_car_y,blue_car_x,blue_car_y,frog_x,frog_y,i,j; +int x=0,y=0; +void thread1(void const *args) +{ + + while(true) { + + + if(red_car_x>127){ + red_car_x=-16; + red_car_y=32; + + } + lcd_mutex.lock(); + uLCD.filled_rectangle(red_car_x,red_car_y,red_car_x+15,red_car_y+15,0x000000); + red_car_x=red_car_x+16; + + for(i=0;i<10;i++){ + uLCD.filled_rectangle(red_car_x,red_car_y,red_car_x+15,red_car_y+15,0xFF3300);//change position + + } + + + lcd_mutex.unlock(); + Thread::wait(500); + + } +} + + +void thread2(void const *args) +{ + + while(true) { + + + if(blue_car_x>127){ + blue_car_x=-16; + blue_car_y=64; + + } + lcd_mutex.lock(); + uLCD.filled_rectangle(blue_car_x,blue_car_y,blue_car_x+15,blue_car_y+15,0x000000); + blue_car_x=blue_car_x+16; + for(i=0;i<5;i++){ + uLCD.filled_rectangle(blue_car_x,blue_car_y,blue_car_x+15,blue_car_y+15,BLUE);//change position + + } + + + lcd_mutex.unlock(); + Thread::wait(200); + + } +} + +void thread3(void const *args) +{ + + + while(true) { + + + speaker.period(1.0/150.0); // 500hz period + speaker =0.25; //25% duty cycle - mid range volume + wait(.02); + speaker=0.0; + + + Thread::wait(500); + + } +} + + + + + + +int main() +{ + + + A:uLCD.cls(); + + uLCD.text_width(2); //2X size text + uLCD.text_height(2); + + + uLCD.locate(2,2); + + uLCD.printf("\n Frogger\n"); + wait(0.1); + + + for (i=0; i<500; i=i+100) { + speaker.period(1.0/float(i)); + speaker=0.25; + wait(.1); + } + wait(2); + uLCD.cls(); + uLCD.text_width(2); //2X size text + uLCD.text_height(2); + uLCD.locate(0,0); + uLCD.color( 0xFF00FF); + uLCD.printf("\n Help the frog \n cross \nthe road!\n"); + wait (2); + + uLCD.cls(); + + + red_car_x=0; + red_car_y=32; + blue_car_x=0; + blue_car_y=64; + frog_x=32; + frog_y=96; + uLCD.filled_rectangle(frog_x,frog_y,frog_x+15,frog_y+15,0x99FF00); + uLCD.filled_rectangle(red_car_x,red_car_y,red_car_x+15,red_car_y+15,0xff3300); + uLCD.filled_rectangle(blue_car_x,blue_car_y,blue_car_x+15,blue_car_y+15,BLUE); + + int readings[3] = {0, 0, 0}; + + // pc.printf("Starting ADXL345 test...\n"); + // pc.printf("Device ID is: 0x%02x\n", accelerometer.getDevId()); + + //Go into standby mode to configure the device. + accelerometer.setPowerControl(0x00); + + //Full resolution, +/-16g, 4mg/LSB. + accelerometer.setDataFormatControl(0x0B); + + //3.2kHz data rate. + accelerometer.setDataRate(ADXL345_3200HZ); + + //Measurement mode. + accelerometer.setPowerControl(0x08); + + Thread t1(thread1); //start thread1 + Thread t2(thread2); + Thread t3(thread3); + + + + while (1) { + + + for(i=0;i<5;i++) + { + accelerometer.getOutput(readings); + pc.printf("%i, %i, %i ", (int16_t)readings[0], (int16_t)readings[1], (int16_t)readings[2]); + x=x+int16_t(readings[0]); + y=y+int16_t(readings[1]); + } + x=int(x/5); + y=int(y/5); + + //13-bit, sign extended values. + pc.printf("%d, %d ", int(x),int(y) ); + //right + + + if(y>0){ + lcd_mutex.lock(); + uLCD.filled_rectangle(frog_x,frog_y,frog_x+15,frog_y+15,0x000000); + frog_x=frog_x+16; + + uLCD.filled_rectangle(frog_x,frog_y,frog_x+15,frog_y+15,0x99FF00); + lcd_mutex.unlock(); + } + //up + if(x<70){ + lcd_mutex.lock(); + uLCD.filled_rectangle(frog_x,frog_y,frog_x+15,frog_y+15,0x000000); + frog_y=frog_y-16; + + uLCD.filled_rectangle(frog_x,frog_y,frog_x+15,frog_y+15,0x99FF00); + lcd_mutex.unlock(); + } + //left + if(y<-70){ + lcd_mutex.lock(); + uLCD.filled_rectangle(frog_x,frog_y,frog_x+15,frog_y+15,0x000000); + frog_x=frog_x-16; + + uLCD.filled_rectangle(frog_x,frog_y,frog_x+15,frog_y+15,0x99FF00); + lcd_mutex.unlock(); + } + //down + if(x>180){ + lcd_mutex.lock(); + uLCD.filled_rectangle(frog_x,frog_y,frog_x+15,frog_y+15,0x000000); + frog_y=frog_y+16; + + uLCD.filled_rectangle(frog_x,frog_y,frog_x+15,frog_y+15,0x99FF00); + lcd_mutex.unlock(); + } + + if ((frog_x==red_car_x & frog_y==red_car_y)|(frog_x==blue_car_x & frog_y==blue_car_y)) + { + + lcd_mutex.lock(); + uLCD.cls(); + + + uLCD.text_width(2); //4X size text + uLCD.text_height(2); + uLCD.color(RED); + uLCD.locate(2,2); + uLCD.printf("\n GAME \n OVER!\n"); + speaker.period(1.0/500.0); // 500hz period + speaker =0.5; //50% duty cycle - max volume + wait(3); + speaker=0.0; // turn off audio + + wait(2); + lcd_mutex.unlock(); + goto A; + } + + if (frog_y<32) + { + + lcd_mutex.lock(); + uLCD.cls(); + + + uLCD.text_width(2); //4X size text + uLCD.text_height(2); + uLCD.color(0xffff00); + uLCD.locate(2,2); + uLCD.printf("\n You \n WIN!\n"); + + for (i=0; i<500; i=i+100) { + speaker.period(1.0/float(i)); + speaker=0.25; + wait(.1); + } + wait(5); + lcd_mutex.unlock(); + goto A; + } + + + Thread::wait(50); // wait 0.5s + } + + + +} \ No newline at end of file