A system to help you ride your bike better than you do right now.

Dependencies:   4DGL-uLCD-SE SDFileSystem mbed LSM9DS1_Library_cal

Committer:
kswanson31
Date:
Sun Dec 04 23:03:37 2016 +0000
Revision:
4:1928bf053958
Parent:
3:26e0c0d7984f
Child:
5:436b39863099
Finished everything aside from light states

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kswanson31 0:134f49df01f8 1 #include "mbed.h"
kswanson31 0:134f49df01f8 2 #include "SDFileSystem.h"
kswanson31 2:d08643ff3c62 3 #include "uLCD_4DGL.h"
kswanson31 3:26e0c0d7984f 4 #include <fstream>
kswanson31 3:26e0c0d7984f 5 #include <iomanip>
kswanson31 3:26e0c0d7984f 6 using namespace std;
kswanson31 0:134f49df01f8 7
kswanson31 3:26e0c0d7984f 8 #define START_S 1480719111
kswanson31 0:134f49df01f8 9
kswanson31 4:1928bf053958 10 #define LEFT 0xA
kswanson31 4:1928bf053958 11 #define RIGHT 0xB
kswanson31 4:1928bf053958 12 #define STOP 0xC
kswanson31 4:1928bf053958 13 #define GO 0xD
kswanson31 4:1928bf053958 14
kswanson31 4:1928bf053958 15 int lightState;
kswanson31 4:1928bf053958 16
kswanson31 3:26e0c0d7984f 17 DigitalOut led(LED1);
kswanson31 4:1928bf053958 18
kswanson31 3:26e0c0d7984f 19 SDFileSystem sd(p11, p12, p13, p14, "sd"); //mosi -> DI, miso <- DO, slck -> sclck, CS -> CS
kswanson31 3:26e0c0d7984f 20 uLCD_4DGL lcd(p28, p27, p29);
kswanson31 0:134f49df01f8 21
kswanson31 4:1928bf053958 22 // speed sensor
kswanson31 4:1928bf053958 23 InterruptIn hallSensor(p8);
kswanson31 4:1928bf053958 24 Timer hallT;
kswanson31 4:1928bf053958 25 int stopped;
kswanson31 4:1928bf053958 26
kswanson31 3:26e0c0d7984f 27 float miles = 0;
kswanson31 3:26e0c0d7984f 28 float speed = 0;
kswanson31 3:26e0c0d7984f 29 float maxSpeed = 0;
kswanson31 3:26e0c0d7984f 30 time_t seconds;
kswanson31 3:26e0c0d7984f 31
kswanson31 3:26e0c0d7984f 32 void store_trip();
kswanson31 3:26e0c0d7984f 33 void recall_trips();
kswanson31 4:1928bf053958 34 int get_state();
kswanson31 4:1928bf053958 35 void pass();
kswanson31 0:134f49df01f8 36
kswanson31 4:1928bf053958 37 int main() {
kswanson31 0:134f49df01f8 38 // open the file for reading and appending records
kswanson31 0:134f49df01f8 39 // recall last trip
kswanson31 3:26e0c0d7984f 40 recall_trips();
kswanson31 4:1928bf053958 41 wait(10);
kswanson31 0:134f49df01f8 42 lcd.cls();
kswanson31 0:134f49df01f8 43
kswanson31 0:134f49df01f8 44 // normal operation loop here
kswanson31 4:1928bf053958 45 int going = 1; // cyclist is moving
kswanson31 4:1928bf053958 46 set_time(START_S); // Set RTC time
kswanson31 4:1928bf053958 47
kswanson31 4:1928bf053958 48 hallSensor.fall(&pass);
kswanson31 4:1928bf053958 49 hallT.start(); // start the hall sensor timer
kswanson31 4:1928bf053958 50
kswanson31 3:26e0c0d7984f 51 while(going) {
kswanson31 4:1928bf053958 52
kswanson31 3:26e0c0d7984f 53 seconds = time(NULL) - START_S; // return the seconds passed since start
kswanson31 2:d08643ff3c62 54
kswanson31 4:1928bf053958 55 if (hallT.read() > 6.0 && !stopped) {
kswanson31 4:1928bf053958 56 speed = 0.0;
kswanson31 4:1928bf053958 57 stopped = 1;
kswanson31 4:1928bf053958 58 }
kswanson31 4:1928bf053958 59
kswanson31 4:1928bf053958 60 going = (hallT.read() > 20.0 && stopped) ? 0 : 1;
kswanson31 4:1928bf053958 61 maxSpeed = (speed > maxSpeed) ? speed : maxSpeed;
kswanson31 3:26e0c0d7984f 62
kswanson31 4:1928bf053958 63 lcd.locate(0, 1);
kswanson31 4:1928bf053958 64 lcd.printf("Distance : %3.1f\n\n", miles);
kswanson31 4:1928bf053958 65 lcd.printf("Top speed : %2.1f\n\n", speed);
kswanson31 4:1928bf053958 66 lcd.printf("Time : %1.1f\n\n", (float)seconds / 3600);
kswanson31 4:1928bf053958 67
kswanson31 4:1928bf053958 68 // light states code
kswanson31 4:1928bf053958 69 lightstates = get_state();
kswanson31 2:d08643ff3c62 70 }
kswanson31 0:134f49df01f8 71
kswanson31 0:134f49df01f8 72 // store this trip
kswanson31 0:134f49df01f8 73 lcd.cls();
kswanson31 3:26e0c0d7984f 74 store_trip();
kswanson31 0:134f49df01f8 75
kswanson31 0:134f49df01f8 76 // end everything
kswanson31 0:134f49df01f8 77 }
kswanson31 0:134f49df01f8 78
kswanson31 3:26e0c0d7984f 79 void recall_trips(void) {
kswanson31 0:134f49df01f8 80 // display the most recent trip made on the screen
kswanson31 0:134f49df01f8 81 // display the most impressive trip (longest distance, best speed, least time)
kswanson31 0:134f49df01f8 82
kswanson31 3:26e0c0d7984f 83 float f_miles;
kswanson31 3:26e0c0d7984f 84 float f_maxSpeed;
kswanson31 3:26e0c0d7984f 85 float f_hours;
kswanson31 3:26e0c0d7984f 86 ifstream file;
kswanson31 0:134f49df01f8 87
kswanson31 1:9d3f2e86392e 88 // read out the most recent trip
kswanson31 3:26e0c0d7984f 89 file.open("/sd/records/recent.txt");
kswanson31 1:9d3f2e86392e 90
kswanson31 3:26e0c0d7984f 91 if (!file.is_open()) {
kswanson31 1:9d3f2e86392e 92 lcd.locate(0, 1);
kswanson31 3:26e0c0d7984f 93 lcd.printf("Could not open file\n");
kswanson31 1:9d3f2e86392e 94 } else {
kswanson31 3:26e0c0d7984f 95 file >> f_miles >> f_maxSpeed >> f_hours;
kswanson31 1:9d3f2e86392e 96 lcd.locate(0, 1);
kswanson31 3:26e0c0d7984f 97 lcd.printf("Your last trip\n\n");
kswanson31 3:26e0c0d7984f 98 lcd.printf("Distance : %3.1f\n\n", f_miles);
kswanson31 3:26e0c0d7984f 99 lcd.printf("Top speed : %2.1f\n\n", f_maxSpeed);
kswanson31 3:26e0c0d7984f 100 lcd.printf("Time : %1.1f\n\n", f_hours);
kswanson31 1:9d3f2e86392e 101 }
kswanson31 1:9d3f2e86392e 102
kswanson31 3:26e0c0d7984f 103 file.close();
kswanson31 3:26e0c0d7984f 104 wait(0.5);
kswanson31 3:26e0c0d7984f 105
kswanson31 3:26e0c0d7984f 106 // display the best trip
kswanson31 3:26e0c0d7984f 107
kswanson31 3:26e0c0d7984f 108 file.open("/sd/records/best-of.txt");
kswanson31 3:26e0c0d7984f 109
kswanson31 3:26e0c0d7984f 110 if(!file.is_open()) {
kswanson31 3:26e0c0d7984f 111 lcd.printf("Could not open file\n");
kswanson31 3:26e0c0d7984f 112 } else {
kswanson31 3:26e0c0d7984f 113 // show the best trip
kswanson31 3:26e0c0d7984f 114 file >> f_miles >> f_maxSpeed >> f_hours;
kswanson31 3:26e0c0d7984f 115 lcd.printf("Your best trip\n\n");
kswanson31 3:26e0c0d7984f 116 lcd.printf("Distance : %3.1f\n\n", f_miles);
kswanson31 3:26e0c0d7984f 117 lcd.printf("Top speed : %2.1f\n\n", f_maxSpeed);
kswanson31 3:26e0c0d7984f 118 lcd.printf("Time : %1.1f\n\n", f_hours);
kswanson31 3:26e0c0d7984f 119 }
kswanson31 3:26e0c0d7984f 120
kswanson31 3:26e0c0d7984f 121 file.close();
kswanson31 3:26e0c0d7984f 122 wait(0.5);
kswanson31 3:26e0c0d7984f 123 }
kswanson31 1:9d3f2e86392e 124
kswanson31 3:26e0c0d7984f 125 void store_trip(void) {
kswanson31 3:26e0c0d7984f 126 // store the most recent trip completed
kswanson31 3:26e0c0d7984f 127 // determine whether this trip was a record, and indicate if so
kswanson31 3:26e0c0d7984f 128
kswanson31 3:26e0c0d7984f 129 float hours;
kswanson31 3:26e0c0d7984f 130 fstream file;
kswanson31 3:26e0c0d7984f 131
kswanson31 3:26e0c0d7984f 132 file.open("/sd/records/recent.txt");
kswanson31 3:26e0c0d7984f 133
kswanson31 3:26e0c0d7984f 134 if (!file.is_open()) {
kswanson31 3:26e0c0d7984f 135 lcd.locate(0, 1);
kswanson31 3:26e0c0d7984f 136 lcd.printf("Could not open file\n");
kswanson31 3:26e0c0d7984f 137 } else {
kswanson31 3:26e0c0d7984f 138 hours = (float)seconds / 3600;
kswanson31 0:134f49df01f8 139 lcd.locate(0, 1);
kswanson31 3:26e0c0d7984f 140 lcd.printf("This trip\n\n");
kswanson31 3:26e0c0d7984f 141 lcd.printf("Distance : %3.1f\n\n", miles);
kswanson31 3:26e0c0d7984f 142 lcd.printf("Top speed : %2.1f\n\n", maxSpeed);
kswanson31 3:26e0c0d7984f 143 lcd.printf("Time : %1.1f\n\n", hours);
kswanson31 3:26e0c0d7984f 144 // overwrite most recent
kswanson31 3:26e0c0d7984f 145 file << fixed << setprecision(1) << miles << " " << maxSpeed << " " << hours << endl;
kswanson31 3:26e0c0d7984f 146 }
kswanson31 3:26e0c0d7984f 147
kswanson31 3:26e0c0d7984f 148 file.close();
kswanson31 3:26e0c0d7984f 149 wait(0.5);
kswanson31 3:26e0c0d7984f 150
kswanson31 3:26e0c0d7984f 151 file.open("/sd/records/best-of.txt");
kswanson31 3:26e0c0d7984f 152
kswanson31 3:26e0c0d7984f 153 if (!file.is_open()) {
kswanson31 3:26e0c0d7984f 154 lcd.locate(0, 1);
kswanson31 3:26e0c0d7984f 155 lcd.printf("Could not open file\n");
kswanson31 0:134f49df01f8 156 } else {
kswanson31 0:134f49df01f8 157 lcd.locate(0, 1);
kswanson31 3:26e0c0d7984f 158 // check if you beat your best
kswanson31 0:134f49df01f8 159 }
kswanson31 3:26e0c0d7984f 160
kswanson31 3:26e0c0d7984f 161 file.close();
kswanson31 4:1928bf053958 162 }
kswanson31 4:1928bf053958 163
kswanson31 4:1928bf053958 164 void pass(void) {
kswanson31 4:1928bf053958 165 // interrupt, performed when the hallsensor passes the magnet
kswanson31 4:1928bf053958 166 stopped = 0; // reset the global
kswanson31 4:1928bf053958 167 hallT.stop();
kswanson31 4:1928bf053958 168 speed = 0.00136364 / (t.read() / 3600); // current speed
kswanson31 4:1928bf053958 169 miles += 0.00136364; // circumference of the tire in miles
kswanson31 4:1928bf053958 170 t.reset();
kswanson31 4:1928bf053958 171 t.start();
kswanson31 0:134f49df01f8 172 }