Smart watch for ECE4180 final design project. Walter Ley, Srinivas Ravindran, Nathan Weiss
Dependencies: 4DGL-uLCD-SE LSM9DS1_Library_cal_smart_watch MPL3115A2 PinDetect RTC SDFileSystem mbed-rtos mbed
main.cpp
- Committer:
- nsloth
- Date:
- 2016-04-28
- Revision:
- 1:65e1d74a137c
- Parent:
- 0:1dae141d9533
File content as of revision 1:65e1d74a137c:
/*Final Design Project Main File || ECE 4180 Section B Team members: Nathan Weiss Walter Ley Srinivas Ravindran */ #include "mbed.h" #include "rtos.h" #include "PinDetect.h" #include "MPL3115A2.h" #include "LSM9DS1.h" #include "uLCD_4DGL.h" #include "SDFileSystem.h" #include "RTC.h" #include <stdlib.h> #include <iostream> uLCD_4DGL uLCD(p13,p14,p17); // serial tx, serial rx, reset pin; I2C altI2C(p28,p27); Serial pc(USBTX, USBRX); MPL3115A2 sensor(&altI2C, NULL); RawSerial dev(p9,p10); LSM9DS1 lol(p28, p27, 0xD6, 0x3C); SDFileSystem sd(p5,p6,p7,p8,"sd"); Altitude alt; Temperature therm; Mutex mut; DigitalOut myled(LED1); PwmOut red(p21); // Red led PwmOut blue(p22); //blue led PwmOut green(p23); // green LED //Global variable declarations volatile int stepCount = 0; volatile bool yPassedMarker = true; //True if y passed 6000, false if y passed -6000 volatile float thermf = 0.0; volatile float oldthermf = 0.0; volatile float altf = 0.0; volatile float minAltitude = 5000.0; volatile float maxAltitude = 0.0; volatile float minTemp = 1000.0; volatile float maxTemp = 0.0; char currDate[9]; void altSensor(void const *args){ while(1){ mut.lock(); sensor.readAltitude(&alt); sensor.readTemperature(&therm); //pc.printf("Altitude: %sft, Temp: %sºF\r\n", alt.print(), therm.print()); //pc.printf("OFF_H: 0x%X, OFF_T: 0x%X\r\n", sensor.offsetAltitude(), sensor.offsetTemperature()); thermf = atof(therm.print()); altf = atof(alt.print()); if(thermf > maxTemp) {maxTemp=thermf;} if(thermf < minTemp) {minTemp=thermf;} if(altf > maxAltitude) {maxAltitude=altf;} if(altf < minAltitude) {minAltitude=altf;} //pc.printf("Max alt: %f, min alt: %f, max temp: %f, min temp: %f\n\r", maxAltitude, minAltitude, maxTemp, minTemp); mut.unlock(); Thread::wait(2000); } } void stepCounter(void const *args){ while(1){ mut.lock(); if(lol.accelAvailable()) { lol.readAccel(); //Step if y alternates between +/-6000 while x < -3000 if(lol.ax < -3000) { //pc.printf("accel: %d %d %d\n\r", lol.ax, lol.ay, lol.az); if(yPassedMarker && lol.ay < -600) { stepCount++; //pc.printf("Step!\n\r"); yPassedMarker = false; } else if (!yPassedMarker && lol.ay > 600) { stepCount++; //pc.printf("Step!\n\r"); yPassedMarker = true; } } } mut.unlock(); Thread::wait(250); } } void readSD(char testDate[], bool isBluetooth){ //Writes out the relevant data to the device //led4 = !led4; char data1[100]; char data2[100]; bool datePassed = false; bool data1Active = true; bool keepLooping = true; FILE *fp = fopen("/sd/mydir/info.txt", "r"); //Open file to append if(fp == NULL) { //uLCD.cls(); pc.printf("Could not open file for read\n"); return; } while(keepLooping) { //save the last string //read in string //if end of file, keep looping should be false if(data1Active) { data1Active = false; memset(data2, 0, sizeof(data2)); if (fgets (data2 , 100, fp) == NULL ) keepLooping = false; } else { data1Active = true; memset(data1, 0, sizeof(data1)); if (fgets (data1 , 100, fp) == NULL ) keepLooping = false; } if(keepLooping) { //if the string contains the date and the date hasn't yet been found, mark the date as found if(data1Active) { if(!datePassed && (strstr(data1,testDate) != NULL)) { datePassed = true; } else if(datePassed && strstr(data1, testDate) == NULL) { //if we have already found the date but now we've passed it, stop looping keepLooping = false; } } else { if(!datePassed && (strstr(data2,testDate) != NULL)) { datePassed = true; } else if(datePassed && strstr(data2, testDate) == NULL) { //if we have already found the date but now we've passed it, stop looping keepLooping = false; } } } } fclose (fp); //At the end of the loop, the relevant data is in the pastData string if(datePassed) { //Parse the data in pastData and store it in the variables if(isBluetooth) { int pastStepCount = 0; float pastMinAlt = 0; float pastMaxAlt = 0; float pastMinTemp = 0; float pastMaxTemp = 0; char output[100]; if(data1Active) { sscanf(data2, "%*s %*s %*s %i %*s %f %*s %f %*s %f %*s %f", &pastStepCount, &pastMinAlt, &pastMaxAlt, &pastMinTemp, &pastMaxTemp); pc.printf("Data Exists! And is %s", data2); } else { sscanf(data1, "%*s %*s %*s %i %*s %f %*s %f %*s %f %*s %f", &pastStepCount, &pastMinAlt, &pastMaxAlt, &pastMinTemp, &pastMaxTemp); pc.printf("Data Exists! And is %s", data1); } sprintf(output, "\n\rFor %s:\n\rStep count - %i\n\rMinimum altitude - %5.2f\n\rMaximum altitude - %5.2f\n\rMinimum temp - %5.2f\n\rMaximum temp - %5.2f\n\r", testDate, pastStepCount, pastMinAlt, pastMaxAlt, pastMinTemp, pastMaxTemp); pc.printf("Bluetooth output:%s", output); dev.puts(output); } else { if(data1Active) { //pc.printf("Data Exists! And is %s", data2); sscanf(data2, "%*s %*s %*s %i %*s %f %*s %f %*s %f %*s %f", &stepCount, &minAltitude, &maxAltitude, &minTemp, &maxTemp); } else { //pc.printf("Data Exists! And is %s", data1); sscanf(data1, "%*s %*s %*s %i %*s %f %*s %f %*s %f %*s %f", &stepCount, &minAltitude, &maxAltitude, &minTemp, &maxTemp); } /*minAltitude = 5000.0; maxAltitude = 0.0; minTemp = 5000.0; maxTemp = 0.0;*/ } } else { //No prexisting data for that day, so load null data into the variables if(isBluetooth) { //No data for that day char output[80]; sprintf(output, "\n\rNo data available for %s.\n\r", testDate); pc.printf("Bluetooth output:%s", output); dev.puts(output); } else { pc.printf("Data does not exist!\n\r"); stepCount = 0; } } pc.printf("\n\rWatch stepcount = %i\n\r", stepCount); } void dev_recv(void const *args) { char inputString[9]; memset(inputString, 0, sizeof(inputString)); int inputIndex = 0; while(1) { if(dev.readable()) { while(dev.readable()) { inputString[inputIndex] = dev.getc(); inputIndex++; Thread::wait(100); } pc.printf("search for date:\n\r%s\n\r", inputString); readSD(inputString, true); memset(inputString, 0, sizeof(inputString)); inputIndex = 0; } } } void updateSD(){ mut.lock(); FILE *fp = fopen("/sd/mydir/info.txt", "a"); //Open file to append if(fp == NULL) { //pc.cls(); pc.printf("Could not open file for write\n"); } fprintf(fp,"date: %s steps: %i min_alt: %5.2f max_alt: %5.2f min_temp: %5.2f max_temp: %5.2f\n\r", currDate, stepCount, minAltitude, maxAltitude, minTemp, maxTemp); fclose(fp); mut.unlock(); } void temperatureRGB(void const *args){ while(1){ mut.lock(); if (thermf > oldthermf && ((thermf-oldthermf)>0.5)) { red = 1.0; green = 0.0; blue = 0.0; } else if (thermf < oldthermf && ((oldthermf-thermf)>0.5)) { red= 0.0; green = 0.0; blue =1.0; } else if (thermf < oldthermf && ((oldthermf-thermf)<=0.5) && ((oldthermf-thermf)>=0.15)) { red= 0.0; green =0.8; blue =0.6; } else if (thermf > oldthermf && ((thermf-oldthermf)<=0.5) && ((thermf-oldthermf)>=0.15)) { red = 0.6; green=0.8; blue = 0.0; } else { red=0.0; green=1.0; blue=0.0; } oldthermf = thermf; mut.unlock(); Thread::wait(1500); } } void lcdDisplay(void const *args){ while(1) { mut.lock(); uLCD.locate(0,0); uLCD.filled_rectangle(50,66,128,128,BLACK); uLCD.filled_rectangle(0,0,128,64,WHITE); time_t seconds = time(NULL); //uLCD.locate(19,19); //time_t seconds = time(NULL); // uLCD.printf("%s", ctime(&seconds)); //uLCD.printf("%s", time_buffer); //Print data uLCD.text_width(1); uLCD.text_height(1); uLCD.textbackground_color(BLACK); //uLCD.set_font(FONT_8X12); uLCD.color(BLUE); uLCD.locate(0,9); uLCD.printf("Steps: %*d", 5, stepCount); uLCD.color(GREEN); uLCD.locate(0,11); uLCD.printf("Alt: %*sft", 7, alt.print()); uLCD.color(RED); uLCD.locate(0,13); uLCD.printf("Temp: %*sF", 6, therm.print()); //Print time uLCD.locate(1,2); uLCD.textbackground_color(WHITE); uLCD.color(BLACK); //uLCD.set_font(FONT_8X12); uLCD.text_width(2); uLCD.text_height(2); //uLCD.text_bold(ON); //uLCD.printf("%s", ctime(&seconds)); char buffer[32]; strftime(buffer, 32, "%I:%M %p", localtime(&seconds)); uLCD.printf("%s", buffer); mut.unlock(); Thread::wait(1000); } } int main(){ pc.printf("Program starting!\n\r"); myled = 0; uLCD.baudrate(3000000); sensor.init(); wait_ms(300); sensor.setOffsetAltitude(113); sensor.setOffsetTemperature(20); //set_time(1460806560); //mkdir("/sd/mydir", 0777); time_t seconds = time(NULL); strftime(currDate, 9, "%m-%d-%y", localtime(&seconds)); pc.printf("Today's date: %s\n\r", currDate); readSD(currDate, false); lol.begin(); if (!lol.begin()) { pc.printf("Failed to communicate with LSM9DS1.\n"); } lol.calibrate(); uLCD.cls(); uLCD.background_color(BLACK); red=0;//red=0; green=0; //green=0; blue=0; //blue=0; Thread th1(altSensor); Thread th2(stepCounter); Thread th3(lcdDisplay); Thread th4(temperatureRGB); Thread th5(dev_recv); while(1){ pc.printf("Saving data!\n\r"); myled != myled; Thread::wait(30000); updateSD(); } }