Updated OCE 360 Assignment 4
Dependencies: 4DGL-uLCD-SE MMA8452Q mbed physics_ball
main.cpp@2:8085bd89612b, 2017-11-17 (annotated)
- 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?
User | Revision | Line number | New 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 | } |