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

Dependencies:   4DGL-uLCD-SE SDFileSystem mbed LSM9DS1_Library_cal

Committer:
fkhan39
Date:
Mon Dec 05 01:59:24 2016 +0000
Revision:
7:0d5396762696
Parent:
6:45a5043acc7e
Child:
8:8c073046821d
Fixed time formatting. Added light state information;

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"
fkhan39 7:0d5396762696 4 #include "LSM9DS1.h"
kswanson31 3:26e0c0d7984f 5 #include <fstream>
kswanson31 3:26e0c0d7984f 6 #include <iomanip>
kswanson31 3:26e0c0d7984f 7 using namespace std;
kswanson31 0:134f49df01f8 8
kswanson31 3:26e0c0d7984f 9 #define START_S 1480719111
kswanson31 0:134f49df01f8 10
kswanson31 4:1928bf053958 11 #define LEFT 0xA
kswanson31 4:1928bf053958 12 #define RIGHT 0xB
kswanson31 4:1928bf053958 13 #define STOP 0xC
kswanson31 4:1928bf053958 14 #define GO 0xD
kswanson31 4:1928bf053958 15
kswanson31 4:1928bf053958 16 int lightState;
kswanson31 4:1928bf053958 17
fkhan39 7:0d5396762696 18 DigitalOut leftBlinker(p22);
fkhan39 7:0d5396762696 19 DigitalOut rightBlinker(p23);
fkhan39 7:0d5396762696 20 DigitalOut brakeLight(p21);
kswanson31 6:45a5043acc7e 21 Timer blinkT;
fkhan39 7:0d5396762696 22 AnalogIn flex(p15);
fkhan39 7:0d5396762696 23 LSM9DS1 imu(p9, p10, 0xD6, 0x3C);
kswanson31 4:1928bf053958 24
kswanson31 3:26e0c0d7984f 25 SDFileSystem sd(p11, p12, p13, p14, "sd"); //mosi -> DI, miso <- DO, slck -> sclck, CS -> CS
kswanson31 3:26e0c0d7984f 26 uLCD_4DGL lcd(p28, p27, p29);
kswanson31 0:134f49df01f8 27
kswanson31 4:1928bf053958 28 // speed sensor
kswanson31 4:1928bf053958 29 InterruptIn hallSensor(p8);
kswanson31 4:1928bf053958 30 Timer hallT;
kswanson31 4:1928bf053958 31 int stopped;
kswanson31 4:1928bf053958 32
kswanson31 3:26e0c0d7984f 33 float miles = 0;
kswanson31 3:26e0c0d7984f 34 float speed = 0;
kswanson31 3:26e0c0d7984f 35 float maxSpeed = 0;
kswanson31 3:26e0c0d7984f 36 time_t seconds;
kswanson31 3:26e0c0d7984f 37
kswanson31 3:26e0c0d7984f 38 void store_trip();
kswanson31 3:26e0c0d7984f 39 void recall_trips();
kswanson31 4:1928bf053958 40 int get_state();
kswanson31 4:1928bf053958 41 void pass();
kswanson31 0:134f49df01f8 42
kswanson31 4:1928bf053958 43 int main() {
kswanson31 0:134f49df01f8 44 // open the file for reading and appending records
kswanson31 0:134f49df01f8 45 // recall last trip
kswanson31 3:26e0c0d7984f 46 recall_trips();
kswanson31 4:1928bf053958 47 wait(10);
kswanson31 0:134f49df01f8 48 lcd.cls();
fkhan39 7:0d5396762696 49 /*
fkhan39 7:0d5396762696 50 imu.begin();
fkhan39 7:0d5396762696 51 if (!imu.begin()) {
fkhan39 7:0d5396762696 52 lcd.printf("Failed to communicate with LSM9DS1.\n");
fkhan39 7:0d5396762696 53 }
fkhan39 7:0d5396762696 54 imu.calibrate();
fkhan39 7:0d5396762696 55 */
kswanson31 0:134f49df01f8 56 // normal operation loop here
kswanson31 4:1928bf053958 57 int going = 1; // cyclist is moving
kswanson31 4:1928bf053958 58 set_time(START_S); // Set RTC time
kswanson31 4:1928bf053958 59
kswanson31 4:1928bf053958 60 hallSensor.fall(&pass);
kswanson31 4:1928bf053958 61 hallT.start(); // start the hall sensor timer
kswanson31 6:45a5043acc7e 62
kswanson31 6:45a5043acc7e 63 int blinks;
kswanson31 4:1928bf053958 64
kswanson31 3:26e0c0d7984f 65 while(going) {
kswanson31 4:1928bf053958 66
kswanson31 3:26e0c0d7984f 67 seconds = time(NULL) - START_S; // return the seconds passed since start
kswanson31 2:d08643ff3c62 68
kswanson31 4:1928bf053958 69 if (hallT.read() > 6.0 && !stopped) {
fkhan39 7:0d5396762696 70 speed = 0;
kswanson31 4:1928bf053958 71 stopped = 1;
kswanson31 4:1928bf053958 72 }
kswanson31 4:1928bf053958 73
kswanson31 4:1928bf053958 74 going = (hallT.read() > 20.0 && stopped) ? 0 : 1;
kswanson31 4:1928bf053958 75 maxSpeed = (speed > maxSpeed) ? speed : maxSpeed;
kswanson31 3:26e0c0d7984f 76
kswanson31 4:1928bf053958 77 lcd.locate(0, 1);
fkhan39 7:0d5396762696 78 lcd.color(GREEN);
fkhan39 7:0d5396762696 79 lcd.printf("Distance : %3.1f mi\n\n", miles);
fkhan39 7:0d5396762696 80 lcd.color(BLUE);
fkhan39 7:0d5396762696 81 lcd.printf("Speed : %2.1f mph\n\n", speed);
fkhan39 7:0d5396762696 82 lcd.color(LGREY);
fkhan39 7:0d5396762696 83 lcd.printf("Time : %3.1f min\n\n", (float)seconds / 60);
kswanson31 4:1928bf053958 84
kswanson31 4:1928bf053958 85 // light states code
fkhan39 7:0d5396762696 86 // lightState = get_state();
kswanson31 6:45a5043acc7e 87
kswanson31 6:45a5043acc7e 88 if (lightState == STOP) {
kswanson31 6:45a5043acc7e 89 brakeLight = 1;
kswanson31 6:45a5043acc7e 90 } else if (lightState == GO) {
kswanson31 6:45a5043acc7e 91 brakeLight = 0;
kswanson31 6:45a5043acc7e 92 } else {
kswanson31 6:45a5043acc7e 93 blinkT.start();
kswanson31 6:45a5043acc7e 94 }
kswanson31 6:45a5043acc7e 95
kswanson31 6:45a5043acc7e 96 if (blinks > 10) {
kswanson31 6:45a5043acc7e 97 rightBlinker = 0; leftBlinker = 0;
kswanson31 6:45a5043acc7e 98 blinks = 0;
kswanson31 6:45a5043acc7e 99 } else {
kswanson31 6:45a5043acc7e 100 blinkT.stop();
kswanson31 6:45a5043acc7e 101 rightBlinker = ((0.5 - blinkT.read() == 0) && lightState == RIGHT) ? ~rightBlinker : rightBlinker;
kswanson31 6:45a5043acc7e 102 leftBlinker = ((0.5 - blinkT.read() == 0) && lightState == LEFT) ? ~leftBlinker : leftBlinker;
kswanson31 6:45a5043acc7e 103 blinkT.reset();
kswanson31 6:45a5043acc7e 104 blinkT.start();
kswanson31 6:45a5043acc7e 105 blinks++;
kswanson31 6:45a5043acc7e 106 }
kswanson31 6:45a5043acc7e 107
kswanson31 6:45a5043acc7e 108
kswanson31 2:d08643ff3c62 109 }
kswanson31 0:134f49df01f8 110
kswanson31 0:134f49df01f8 111 // store this trip
kswanson31 0:134f49df01f8 112 lcd.cls();
kswanson31 3:26e0c0d7984f 113 store_trip();
kswanson31 0:134f49df01f8 114
kswanson31 0:134f49df01f8 115 // end everything
kswanson31 0:134f49df01f8 116 }
kswanson31 0:134f49df01f8 117
kswanson31 3:26e0c0d7984f 118 void recall_trips(void) {
kswanson31 0:134f49df01f8 119 // display the most recent trip made on the screen
kswanson31 0:134f49df01f8 120 // display the most impressive trip (longest distance, best speed, least time)
kswanson31 0:134f49df01f8 121
kswanson31 3:26e0c0d7984f 122 float f_miles;
kswanson31 3:26e0c0d7984f 123 float f_maxSpeed;
fkhan39 7:0d5396762696 124 float f_minutes;
kswanson31 3:26e0c0d7984f 125 ifstream file;
kswanson31 0:134f49df01f8 126
kswanson31 1:9d3f2e86392e 127 // read out the most recent trip
kswanson31 3:26e0c0d7984f 128 file.open("/sd/records/recent.txt");
kswanson31 1:9d3f2e86392e 129
kswanson31 3:26e0c0d7984f 130 if (!file.is_open()) {
kswanson31 1:9d3f2e86392e 131 lcd.locate(0, 1);
kswanson31 3:26e0c0d7984f 132 lcd.printf("Could not open file\n");
kswanson31 1:9d3f2e86392e 133 } else {
fkhan39 7:0d5396762696 134 file >> f_miles >> f_maxSpeed >> f_minutes;
kswanson31 1:9d3f2e86392e 135 lcd.locate(0, 1);
kswanson31 3:26e0c0d7984f 136 lcd.printf("Your last trip\n\n");
fkhan39 7:0d5396762696 137 lcd.printf("Distance : %3.1f mi\n\n", f_miles);
fkhan39 7:0d5396762696 138 lcd.printf("Top speed : %2.1f mph\n\n", f_maxSpeed);
fkhan39 7:0d5396762696 139 lcd.printf("Time : %3.1f min\n\n", f_minutes);
kswanson31 1:9d3f2e86392e 140 }
kswanson31 1:9d3f2e86392e 141
kswanson31 3:26e0c0d7984f 142 file.close();
kswanson31 3:26e0c0d7984f 143 wait(0.5);
kswanson31 3:26e0c0d7984f 144
kswanson31 3:26e0c0d7984f 145 // display the best trip
kswanson31 3:26e0c0d7984f 146
kswanson31 3:26e0c0d7984f 147 file.open("/sd/records/best-of.txt");
kswanson31 3:26e0c0d7984f 148
fkhan39 7:0d5396762696 149 lcd.color(WHITE);
kswanson31 3:26e0c0d7984f 150 if(!file.is_open()) {
kswanson31 3:26e0c0d7984f 151 lcd.printf("Could not open file\n");
kswanson31 3:26e0c0d7984f 152 } else {
kswanson31 3:26e0c0d7984f 153 // show the best trip
fkhan39 7:0d5396762696 154 file >> f_miles >> f_maxSpeed >> f_minutes;
kswanson31 3:26e0c0d7984f 155 lcd.printf("Your best trip\n\n");
fkhan39 7:0d5396762696 156 lcd.printf("Distance : %3.1f mi\n\n", f_miles);
fkhan39 7:0d5396762696 157 lcd.printf("Top speed : %2.1f mph\n\n", f_maxSpeed);
fkhan39 7:0d5396762696 158 lcd.printf("Time : %3.1f min\n\n", f_minutes);
kswanson31 3:26e0c0d7984f 159 }
kswanson31 3:26e0c0d7984f 160
kswanson31 3:26e0c0d7984f 161 file.close();
kswanson31 3:26e0c0d7984f 162 wait(0.5);
kswanson31 3:26e0c0d7984f 163 }
kswanson31 1:9d3f2e86392e 164
kswanson31 3:26e0c0d7984f 165 void store_trip(void) {
kswanson31 3:26e0c0d7984f 166 // store the most recent trip completed
kswanson31 3:26e0c0d7984f 167 // determine whether this trip was a record, and indicate if so
kswanson31 3:26e0c0d7984f 168
fkhan39 7:0d5396762696 169 float minutes;
kswanson31 3:26e0c0d7984f 170 fstream file;
kswanson31 3:26e0c0d7984f 171
kswanson31 3:26e0c0d7984f 172 file.open("/sd/records/recent.txt");
kswanson31 3:26e0c0d7984f 173
fkhan39 7:0d5396762696 174 lcd.color(WHITE);
kswanson31 3:26e0c0d7984f 175 if (!file.is_open()) {
kswanson31 3:26e0c0d7984f 176 lcd.locate(0, 1);
kswanson31 3:26e0c0d7984f 177 lcd.printf("Could not open file\n");
kswanson31 3:26e0c0d7984f 178 } else {
fkhan39 7:0d5396762696 179 minutes = (float)seconds / 60;
kswanson31 0:134f49df01f8 180 lcd.locate(0, 1);
kswanson31 3:26e0c0d7984f 181 lcd.printf("This trip\n\n");
fkhan39 7:0d5396762696 182 lcd.printf("Distance : %3.1f mi\n\n", miles);
fkhan39 7:0d5396762696 183 lcd.printf("Top speed : %2.1f mph\n\n", maxSpeed);
fkhan39 7:0d5396762696 184 lcd.printf("Time : %3.1f min\n\n", minutes);
kswanson31 3:26e0c0d7984f 185 // overwrite most recent
fkhan39 7:0d5396762696 186 file << fixed << setprecision(1) << miles << " " << maxSpeed << " " << minutes << endl;
kswanson31 3:26e0c0d7984f 187 }
kswanson31 3:26e0c0d7984f 188
kswanson31 3:26e0c0d7984f 189 file.close();
kswanson31 3:26e0c0d7984f 190 wait(0.5);
kswanson31 3:26e0c0d7984f 191
kswanson31 3:26e0c0d7984f 192 file.open("/sd/records/best-of.txt");
kswanson31 3:26e0c0d7984f 193
kswanson31 3:26e0c0d7984f 194 if (!file.is_open()) {
kswanson31 3:26e0c0d7984f 195 lcd.locate(0, 1);
kswanson31 3:26e0c0d7984f 196 lcd.printf("Could not open file\n");
kswanson31 0:134f49df01f8 197 } else {
kswanson31 0:134f49df01f8 198 lcd.locate(0, 1);
kswanson31 3:26e0c0d7984f 199 // check if you beat your best
kswanson31 0:134f49df01f8 200 }
kswanson31 3:26e0c0d7984f 201
kswanson31 3:26e0c0d7984f 202 file.close();
fkhan39 7:0d5396762696 203 wait(0.5);
kswanson31 4:1928bf053958 204 }
kswanson31 4:1928bf053958 205
kswanson31 6:45a5043acc7e 206 int get_state(void) {
fkhan39 7:0d5396762696 207 imu.readAccel();
fkhan39 7:0d5396762696 208 float f = flex.read();
fkhan39 7:0d5396762696 209 int x = imu.ax, y = imu.ay, z = imu.az;
fkhan39 7:0d5396762696 210 if (z > 0 && z > abs(y) && z > abs(x) && y < 0 && f >= 0.92)
fkhan39 7:0d5396762696 211 return STOP;
fkhan39 7:0d5396762696 212 if (x < 0 && abs(x) > abs(z) && abs(x) > abs(y) && f <= 0.87)
fkhan39 7:0d5396762696 213 return LEFT;
fkhan39 7:0d5396762696 214 if (y > 0 && y > abs(z) && y > abs(x) && f >= 0.87)
fkhan39 7:0d5396762696 215 return RIGHT;
fkhan39 7:0d5396762696 216 return GO;
kswanson31 6:45a5043acc7e 217 }
kswanson31 6:45a5043acc7e 218
kswanson31 4:1928bf053958 219 void pass(void) {
kswanson31 4:1928bf053958 220 // interrupt, performed when the hallsensor passes the magnet
kswanson31 4:1928bf053958 221 stopped = 0; // reset the global
kswanson31 4:1928bf053958 222 hallT.stop();
kswanson31 5:436b39863099 223 speed = 0.00136364 / (hallT.read() / 3600); // current speed
kswanson31 4:1928bf053958 224 miles += 0.00136364; // circumference of the tire in miles
kswanson31 5:436b39863099 225 hallT.reset();
kswanson31 5:436b39863099 226 hallT.start();
kswanson31 0:134f49df01f8 227 }