A system to help you ride your bike better than you do right now.
Dependencies: 4DGL-uLCD-SE SDFileSystem mbed LSM9DS1_Library_cal
main.cpp
- Committer:
- kswanson31
- Date:
- 2016-12-05
- Revision:
- 6:45a5043acc7e
- Parent:
- 5:436b39863099
- Child:
- 7:0d5396762696
File content as of revision 6:45a5043acc7e:
#include "mbed.h" #include "SDFileSystem.h" #include "uLCD_4DGL.h" #include <fstream> #include <iomanip> using namespace std; #define START_S 1480719111 #define LEFT 0xA #define RIGHT 0xB #define STOP 0xC #define GO 0xD int lightState; DigitalOut leftBlinker(LED1); DigitalOut rightBlinker(LED1); DigitalOut brakeLight(LED1); Timer blinkT; SDFileSystem sd(p11, p12, p13, p14, "sd"); //mosi -> DI, miso <- DO, slck -> sclck, CS -> CS uLCD_4DGL lcd(p28, p27, p29); // speed sensor InterruptIn hallSensor(p8); Timer hallT; int stopped; float miles = 0; float speed = 0; float maxSpeed = 0; time_t seconds; void store_trip(); void recall_trips(); int get_state(); void pass(); int main() { // open the file for reading and appending records // recall last trip recall_trips(); wait(10); lcd.cls(); // normal operation loop here int going = 1; // cyclist is moving set_time(START_S); // Set RTC time hallSensor.fall(&pass); hallT.start(); // start the hall sensor timer int blinks; while(going) { seconds = time(NULL) - START_S; // return the seconds passed since start if (hallT.read() > 6.0 && !stopped) { speed = 0.0; stopped = 1; } going = (hallT.read() > 20.0 && stopped) ? 0 : 1; maxSpeed = (speed > maxSpeed) ? speed : maxSpeed; lcd.locate(0, 1); lcd.printf("Distance : %3.1f\n\n", miles); lcd.printf("Top speed : %2.1f\n\n", speed); lcd.printf("Time : %1.1f\n\n", (float)seconds / 3600); // light states code lightState = get_state(); if (lightState == STOP) { brakeLight = 1; } else if (lightState == GO) { brakeLight = 0; } else { blinkT.start(); } if (blinks > 10) { rightBlinker = 0; leftBlinker = 0; blinks = 0; } else { blinkT.stop(); rightBlinker = ((0.5 - blinkT.read() == 0) && lightState == RIGHT) ? ~rightBlinker : rightBlinker; leftBlinker = ((0.5 - blinkT.read() == 0) && lightState == LEFT) ? ~leftBlinker : leftBlinker; blinkT.reset(); blinkT.start(); blinks++; } } // store this trip lcd.cls(); store_trip(); // end everything } void recall_trips(void) { // display the most recent trip made on the screen // display the most impressive trip (longest distance, best speed, least time) float f_miles; float f_maxSpeed; float f_hours; ifstream file; // read out the most recent trip file.open("/sd/records/recent.txt"); if (!file.is_open()) { lcd.locate(0, 1); lcd.printf("Could not open file\n"); } else { file >> f_miles >> f_maxSpeed >> f_hours; lcd.locate(0, 1); lcd.printf("Your last trip\n\n"); lcd.printf("Distance : %3.1f\n\n", f_miles); lcd.printf("Top speed : %2.1f\n\n", f_maxSpeed); lcd.printf("Time : %1.1f\n\n", f_hours); } file.close(); wait(0.5); // display the best trip file.open("/sd/records/best-of.txt"); if(!file.is_open()) { lcd.printf("Could not open file\n"); } else { // show the best trip file >> f_miles >> f_maxSpeed >> f_hours; lcd.printf("Your best trip\n\n"); lcd.printf("Distance : %3.1f\n\n", f_miles); lcd.printf("Top speed : %2.1f\n\n", f_maxSpeed); lcd.printf("Time : %1.1f\n\n", f_hours); } file.close(); wait(0.5); } void store_trip(void) { // store the most recent trip completed // determine whether this trip was a record, and indicate if so float hours; fstream file; file.open("/sd/records/recent.txt"); if (!file.is_open()) { lcd.locate(0, 1); lcd.printf("Could not open file\n"); } else { hours = (float)seconds / 3600; lcd.locate(0, 1); lcd.printf("This trip\n\n"); lcd.printf("Distance : %3.1f\n\n", miles); lcd.printf("Top speed : %2.1f\n\n", maxSpeed); lcd.printf("Time : %1.1f\n\n", hours); // overwrite most recent file << fixed << setprecision(1) << miles << " " << maxSpeed << " " << hours << endl; } file.close(); wait(0.5); file.open("/sd/records/best-of.txt"); if (!file.is_open()) { lcd.locate(0, 1); lcd.printf("Could not open file\n"); } else { lcd.locate(0, 1); // check if you beat your best } file.close(); } int get_state(void) { // } void pass(void) { // interrupt, performed when the hallsensor passes the magnet stopped = 0; // reset the global hallT.stop(); speed = 0.00136364 / (hallT.read() / 3600); // current speed miles += 0.00136364; // circumference of the tire in miles hallT.reset(); hallT.start(); }