Updated OCE 360 Assignment 4

Dependencies:   4DGL-uLCD-SE MMA8452Q mbed physics_ball

Committer:
Kaitlyn_Barros
Date:
Fri Nov 17 04:10:17 2017 +0000
Revision:
2:8085bd89612b
Parent:
0:2067ba6c5e74
Child:
4:241bf0f0e626
Logging doesn?t work. Sadly.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Kaitlyn_Barros 0:2067ba6c5e74 1 //Kaitlyn Barros
Kaitlyn_Barros 0:2067ba6c5e74 2 //OCE 360 Fall 2017
Kaitlyn_Barros 0:2067ba6c5e74 3
Kaitlyn_Barros 2:8085bd89612b 4 //Last Revised: Nov 16 2017
Kaitlyn_Barros 0:2067ba6c5e74 5
Kaitlyn_Barros 2:8085bd89612b 6 //Software Exercise 4:
Kaitlyn_Barros 0:2067ba6c5e74 7 //1. Update the software system by creating a new library, which includes
Kaitlyn_Barros 0:2067ba6c5e74 8 // a class that defines the behavior of a bouncing ball on the LCD screen.
Kaitlyn_Barros 0:2067ba6c5e74 9 //2. Demonstrate the system with two or more bouncing balls on the screen.
Kaitlyn_Barros 0:2067ba6c5e74 10 //3. Show that the system resets the ball locations when you hold the
Kaitlyn_Barros 0:2067ba6c5e74 11 // accelerometer upside down.
Kaitlyn_Barros 0:2067ba6c5e74 12
Kaitlyn_Barros 2:8085bd89612b 13 //Software Exercise 5:
Kaitlyn_Barros 2:8085bd89612b 14 //1. Update the ball postion using the accelerometer's data at 50Hz. Update the LCD display w/ ball postions at 11HZ.
Kaitlyn_Barros 2:8085bd89612b 15 //2. Use a buttom interrupt to turn data recording on/off. Use an onboard LED to indicate recording.
Kaitlyn_Barros 2:8085bd89612b 16
Kaitlyn_Barros 2:8085bd89612b 17 #include "mbed.h" //Mbed Header
Kaitlyn_Barros 2:8085bd89612b 18 #include "physics_ball.h" // Physics Ball Behavior Header
Kaitlyn_Barros 2:8085bd89612b 19 #include "uLCD_4DGL.h" // LCD Header
Kaitlyn_Barros 2:8085bd89612b 20 #include "MMA8452Q.h" // Accelerometer Header
Kaitlyn_Barros 2:8085bd89612b 21 #include "SDFileSystem.h" // SD Card Header
Kaitlyn_Barros 2:8085bd89612b 22
Kaitlyn_Barros 2:8085bd89612b 23 AnalogIn ain(p15); // Analog Input (pin 15) For Temp Sensor
Kaitlyn_Barros 0:2067ba6c5e74 24
Kaitlyn_Barros 2:8085bd89612b 25 Serial pc(USBTX, USBRX); // USB Serial (tx, rx)
Kaitlyn_Barros 2:8085bd89612b 26
Kaitlyn_Barros 2:8085bd89612b 27 SDFileSystem sd(p5, p6, p7, p8, "sd"); // SD card (SPI pins)
Kaitlyn_Barros 2:8085bd89612b 28
Kaitlyn_Barros 2:8085bd89612b 29 DigitalOut led1(LED1); //Onboard LED 1
Kaitlyn_Barros 2:8085bd89612b 30 DigitalOut led2(LED2); //Onboard LED 2
Kaitlyn_Barros 0:2067ba6c5e74 31
Kaitlyn_Barros 2:8085bd89612b 32
Kaitlyn_Barros 2:8085bd89612b 33 DigitalIn switchinput(p12); //Digital switch set in Pin 12
Kaitlyn_Barros 2:8085bd89612b 34
Kaitlyn_Barros 2:8085bd89612b 35 // Call out classes (For Ball 1 & 2)
Kaitlyn_Barros 2:8085bd89612b 36 physics_ball ball1;
Kaitlyn_Barros 2:8085bd89612b 37 physics_ball ball2;
Kaitlyn_Barros 2:8085bd89612b 38
Kaitlyn_Barros 0:2067ba6c5e74 39 // Graphic LCD - TX, RX, and RES pins
Kaitlyn_Barros 0:2067ba6c5e74 40 uLCD_4DGL uLCD(p9,p10,p11);
Kaitlyn_Barros 0:2067ba6c5e74 41
Kaitlyn_Barros 0:2067ba6c5e74 42 // Accelerometer - SDA, SCL, and I2C address
Kaitlyn_Barros 0:2067ba6c5e74 43 MMA8452Q accel(p28, p27, 0x1D);
Kaitlyn_Barros 0:2067ba6c5e74 44
Kaitlyn_Barros 2:8085bd89612b 45
Kaitlyn_Barros 2:8085bd89612b 46 // Call Out Variables
Kaitlyn_Barros 2:8085bd89612b 47 int status = 0; //"Logging" Status, i.e. 1 = Logging 0 - Not Logging
Kaitlyn_Barros 2:8085bd89612b 48 float voltage_in; //Temp Sensor
Kaitlyn_Barros 2:8085bd89612b 49 float degrees_c; //Temp Sensor
Kaitlyn_Barros 2:8085bd89612b 50 int i; //Temp Sensor
Kaitlyn_Barros 2:8085bd89612b 51 int c; //Temp Sensor
Kaitlyn_Barros 2:8085bd89612b 52
Kaitlyn_Barros 2:8085bd89612b 53 // Timestamp Timer
Kaitlyn_Barros 2:8085bd89612b 54 Timer timer;
Kaitlyn_Barros 2:8085bd89612b 55
Kaitlyn_Barros 2:8085bd89612b 56 // Call out Tickers
Kaitlyn_Barros 2:8085bd89612b 57 Ticker BallUpdate;
Kaitlyn_Barros 2:8085bd89612b 58 Ticker LCDUpdate;
Kaitlyn_Barros 2:8085bd89612b 59 Ticker Record;
Kaitlyn_Barros 2:8085bd89612b 60
Kaitlyn_Barros 2:8085bd89612b 61 //Ticker Function 1: Ball_Update_Pos
Kaitlyn_Barros 2:8085bd89612b 62 void BUP(){
Kaitlyn_Barros 2:8085bd89612b 63 //Update Ball Postion
Kaitlyn_Barros 2:8085bd89612b 64 ball1.update(accel);
Kaitlyn_Barros 2:8085bd89612b 65 ball2.update(accel);
Kaitlyn_Barros 2:8085bd89612b 66 }
Kaitlyn_Barros 2:8085bd89612b 67
Kaitlyn_Barros 2:8085bd89612b 68 //Ticker Function 2: LCD_Update_Pos
Kaitlyn_Barros 2:8085bd89612b 69 void LCDUP(){
Kaitlyn_Barros 2:8085bd89612b 70 // Draw new circle
Kaitlyn_Barros 2:8085bd89612b 71 uLCD.filled_circle(ball1.posx, ball1.posy, ball1.radius, BLUE);
Kaitlyn_Barros 2:8085bd89612b 72 uLCD.filled_circle(ball2.posx, ball2.posy, ball2.radius, RED);
Kaitlyn_Barros 2:8085bd89612b 73 led1 = 1;
Kaitlyn_Barros 2:8085bd89612b 74 // Erase old circle (For Ball 1 & 2)
Kaitlyn_Barros 2:8085bd89612b 75 uLCD.filled_circle(ball1.old_posx, ball1.old_posy, ball1.radius, BLACK);
Kaitlyn_Barros 2:8085bd89612b 76 uLCD.filled_circle(ball2.old_posx, ball2.old_posy, ball2.radius, BLACK);
Kaitlyn_Barros 2:8085bd89612b 77 led1= 0;
Kaitlyn_Barros 2:8085bd89612b 78
Kaitlyn_Barros 2:8085bd89612b 79 }
Kaitlyn_Barros 2:8085bd89612b 80
Kaitlyn_Barros 2:8085bd89612b 81 // Ticker Function 3: Record
Kaitlyn_Barros 2:8085bd89612b 82 void REC (){
Kaitlyn_Barros 2:8085bd89612b 83
Kaitlyn_Barros 2:8085bd89612b 84 //If the switch is pressed and the logging status is not logging, set the status to logging and turn the indicating LED on
Kaitlyn_Barros 2:8085bd89612b 85 if ((switchinput == 1) && (status == 0)) {
Kaitlyn_Barros 2:8085bd89612b 86 status = 1;
Kaitlyn_Barros 2:8085bd89612b 87 led2 = 1;
Kaitlyn_Barros 2:8085bd89612b 88 }
Kaitlyn_Barros 2:8085bd89612b 89
Kaitlyn_Barros 2:8085bd89612b 90 //If the switch is pressed and the logging status is logging, set the status to not logging and turn the indicating LED off
Kaitlyn_Barros 2:8085bd89612b 91 if ((switchinput == 1) && (status == 1)) {
Kaitlyn_Barros 2:8085bd89612b 92 status = 0;
Kaitlyn_Barros 2:8085bd89612b 93 led2 = 0;
Kaitlyn_Barros 2:8085bd89612b 94 }
Kaitlyn_Barros 2:8085bd89612b 95
Kaitlyn_Barros 2:8085bd89612b 96 if (status == 1){
Kaitlyn_Barros 2:8085bd89612b 97 FILE *file; //file descriptor
Kaitlyn_Barros 2:8085bd89612b 98
Kaitlyn_Barros 2:8085bd89612b 99 // Start our timer
Kaitlyn_Barros 2:8085bd89612b 100 timer.start();
Kaitlyn_Barros 2:8085bd89612b 101
Kaitlyn_Barros 2:8085bd89612b 102 // Open file for writing, if there is not a file with such a name, create one
Kaitlyn_Barros 2:8085bd89612b 103 file = fopen("/sd/BallData.txt", "w");
Kaitlyn_Barros 2:8085bd89612b 104 if ( file == NULL ) {
Kaitlyn_Barros 2:8085bd89612b 105 error("ERROR: Could not open file for writing!\n\r");
Kaitlyn_Barros 2:8085bd89612b 106 }
Kaitlyn_Barros 2:8085bd89612b 107
Kaitlyn_Barros 2:8085bd89612b 108 // Tell the user we need to wait while we collect some data
Kaitlyn_Barros 2:8085bd89612b 109 pc.printf("\nCollecting data (Do not remove SD Card!) ...\n\r");
Kaitlyn_Barros 2:8085bd89612b 110
Kaitlyn_Barros 2:8085bd89612b 111 // Collect Temperature
Kaitlyn_Barros 2:8085bd89612b 112 voltage_in = ain * 3.3;
Kaitlyn_Barros 2:8085bd89612b 113 degrees_c = (voltage_in - 0.5) * 100.0;
Kaitlyn_Barros 2:8085bd89612b 114 fprintf(file, "%2.2fs: %3.1f deg C\n\r", timer.read(), degrees_c);
Kaitlyn_Barros 2:8085bd89612b 115
Kaitlyn_Barros 2:8085bd89612b 116 // Collect Ball Data
Kaitlyn_Barros 2:8085bd89612b 117
Kaitlyn_Barros 2:8085bd89612b 118
Kaitlyn_Barros 2:8085bd89612b 119 if (status == 0){
Kaitlyn_Barros 2:8085bd89612b 120 // Close file and re-open it for reading
Kaitlyn_Barros 2:8085bd89612b 121 fclose(file);
Kaitlyn_Barros 2:8085bd89612b 122 file = fopen("/sd/BallData.txt", "r");
Kaitlyn_Barros 2:8085bd89612b 123 if ( file == NULL ) {
Kaitlyn_Barros 2:8085bd89612b 124 error("ERROR: Could not open file for reading!\n\r");
Kaitlyn_Barros 2:8085bd89612b 125 }
Kaitlyn_Barros 2:8085bd89612b 126
Kaitlyn_Barros 2:8085bd89612b 127 // Print results to console
Kaitlyn_Barros 2:8085bd89612b 128 pc.printf("Temperature data:\n\r");
Kaitlyn_Barros 2:8085bd89612b 129 while(1) {
Kaitlyn_Barros 2:8085bd89612b 130 c = fgetc(file);
Kaitlyn_Barros 2:8085bd89612b 131 if ( c == EOF ) {
Kaitlyn_Barros 2:8085bd89612b 132 break;
Kaitlyn_Barros 2:8085bd89612b 133 }
Kaitlyn_Barros 2:8085bd89612b 134 pc.putc(c);
Kaitlyn_Barros 2:8085bd89612b 135 }
Kaitlyn_Barros 2:8085bd89612b 136
Kaitlyn_Barros 2:8085bd89612b 137 // Close the file and finish
Kaitlyn_Barros 2:8085bd89612b 138 fclose(file);
Kaitlyn_Barros 2:8085bd89612b 139 pc.printf("Done! Safe to remove SD card\n\r");
Kaitlyn_Barros 2:8085bd89612b 140 }
Kaitlyn_Barros 2:8085bd89612b 141 }
Kaitlyn_Barros 2:8085bd89612b 142 }
Kaitlyn_Barros 2:8085bd89612b 143
Kaitlyn_Barros 0:2067ba6c5e74 144 int main() {
Kaitlyn_Barros 2:8085bd89612b 145 // pc.printf("I Print"); //Test: Make sure I can print to PC
Kaitlyn_Barros 2:8085bd89612b 146 // led1 = 1; //Test: Make sure led can turn on
Kaitlyn_Barros 2:8085bd89612b 147
Kaitlyn_Barros 0:2067ba6c5e74 148 // Initialize uLCD
Kaitlyn_Barros 0:2067ba6c5e74 149 uLCD.baudrate(115200);
Kaitlyn_Barros 0:2067ba6c5e74 150 uLCD.background_color(BLACK);
Kaitlyn_Barros 0:2067ba6c5e74 151 uLCD.cls();
Kaitlyn_Barros 0:2067ba6c5e74 152
Kaitlyn_Barros 0:2067ba6c5e74 153 // Initialize accelerometer
Kaitlyn_Barros 0:2067ba6c5e74 154 accel.init();
Kaitlyn_Barros 2:8085bd89612b 155
Kaitlyn_Barros 2:8085bd89612b 156 //Intial Ball Conditions & Reset Conditiosn
Kaitlyn_Barros 0:2067ba6c5e74 157 ball1.define_space(ball1.width, ball1.height);
Kaitlyn_Barros 0:2067ba6c5e74 158 ball2.define_space(ball2.width, ball2.height);
Kaitlyn_Barros 0:2067ba6c5e74 159
Kaitlyn_Barros 0:2067ba6c5e74 160 ball1.set_param(ball1.radius, BLUE);
Kaitlyn_Barros 2:8085bd89612b 161 ball2.set_param(ball2.radius, RED);
Kaitlyn_Barros 0:2067ba6c5e74 162
Kaitlyn_Barros 2:8085bd89612b 163 //Tickers
Kaitlyn_Barros 2:8085bd89612b 164 Record.attach(&REC, 0.1);
Kaitlyn_Barros 2:8085bd89612b 165 BallUpdate.attach(&BUP, 0.02); //50 Hz
Kaitlyn_Barros 2:8085bd89612b 166 LCDUpdate.attach(&LCDUP, 0.0909);//11 Hz
Kaitlyn_Barros 0:2067ba6c5e74 167
Kaitlyn_Barros 2:8085bd89612b 168 while (1) { }
Kaitlyn_Barros 2:8085bd89612b 169 }