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 01:13:48 2016 +0000
Revision:
6:45a5043acc7e
Parent:
5:436b39863099
Child:
7:0d5396762696
Finished blinker code

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