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:
Mon Dec 05 03:16:36 2016 +0000
Revision:
9:53bb4c706947
Parent:
8:8c073046821d
Child:
10:8593877172d4
Updated blinker logic;

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