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-04
- Revision:
- 4:1928bf053958
- Parent:
- 3:26e0c0d7984f
- Child:
- 5:436b39863099
File content as of revision 4:1928bf053958:
#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 led(LED1); 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 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 lightstates = get_state(); } // 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(); } void pass(void) { // interrupt, performed when the hallsensor passes the magnet stopped = 0; // reset the global hallT.stop(); speed = 0.00136364 / (t.read() / 3600); // current speed miles += 0.00136364; // circumference of the tire in miles t.reset(); t.start(); }