Kartik Sastry / Mbed 2 deprecated 4180Final

Dependencies:   4DGL-uLCD-SE LSM9DS1_Library-KVS MBed_Adafruit-GPS-Library PinDetect X_NUCLEO_53L0A1 mbed-rtos mbed

Committer:
ksastry3
Date:
Thu Dec 14 07:21:52 2017 +0000
Revision:
1:abc522e41d63
Parent:
0:8a797b9e2fe4
Final Version 12/14/2017 by Kartik V. Sastry

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ksastry3 0:8a797b9e2fe4 1 /* Code for ECE 4180-A Final Design Project */
ksastry3 1:abc522e41d63 2 /* Kartik Sastry, Krishna Peri, Robert Walsh */
ksastry3 0:8a797b9e2fe4 3 /* mbed Based Fitness Wearable Prototype */
ksastry3 0:8a797b9e2fe4 4
ksastry3 1:abc522e41d63 5 /**
ksastry3 1:abc522e41d63 6 * Acknowledgements:
ksastry3 1:abc522e41d63 7 *
ksastry3 1:abc522e41d63 8 * The core of the GPS and Heart Rate code used in this project was supplied
ksastry3 1:abc522e41d63 9 * as demonstration code by the manufacturer. The drivers written for the Heart
ksastry3 1:abc522e41d63 10 * Rate Monitor were altered by Kartik Sastry in order to allow the device
ksastry3 1:abc522e41d63 11 * to function with the mbed LPC1768 specifically.
ksastry3 1:abc522e41d63 12 *
ksastry3 1:abc522e41d63 13 * The uLCD, Temperature, Accelerometer, Control, and data processing are all
ksastry3 1:abc522e41d63 14 * our original work. The Temperature feature uses a class for the TMP36 written
ksastry3 1:abc522e41d63 15 * by Prof. James Hamblen, our ECE 4180 professor.
ksastry3 1:abc522e41d63 16 */
ksastry3 1:abc522e41d63 17
ksastry3 0:8a797b9e2fe4 18 /******************************************************************************/
ksastry3 1:abc522e41d63 19 /* Devices Used, Wiring, Hardware Info */
ksastry3 0:8a797b9e2fe4 20 /******************************************************************************/
ksastry3 0:8a797b9e2fe4 21 /*
ksastry3 0:8a797b9e2fe4 22 - mbed LPC1768 Microcontroller
ksastry3 1:abc522e41d63 23 5V, (2A) External Power Supply or 4.5 V, (3 AA Batteries) Power
ksastry3 1:abc522e41d63 24 Debugging and Additional Feedback over USB Virtual COM Port
ksastry3 1:abc522e41d63 25 - Heart Rate Sensor / Pulse Oximeter - Maxim Integrated MAXREFDES117# (HR)
ksastry3 1:abc522e41d63 26 I2C p27, p28
ksastry3 1:abc522e41d63 27 DigitalOut p20
ksastry3 1:abc522e41d63 28 - SparkFun Triple Axis Accelerometer Breakout - ADXL335 (IMU)
ksastry3 1:abc522e41d63 29 AnalogIn p15, p16, p17 (X, Y, Z axes respectively)
ksastry3 0:8a797b9e2fe4 30 - Adafruit Ultimate GPS Breakout V3 (GPS)
ksastry3 1:abc522e41d63 31 Serial p13, p14
ksastry3 0:8a797b9e2fe4 32 - 4D Systems 4DGL-uLCD LCD Display (LCD)
ksastry3 1:abc522e41d63 33 Serial p9, p10
ksastry3 1:abc522e41d63 34 DigitalOut p8
ksastry3 0:8a797b9e2fe4 35 - Pushbutton (Wire one switch pole to p7, the other directly to ground. No need for external pullup resistor.)
ksastry3 0:8a797b9e2fe4 36 PinDetect p7
ksastry3 1:abc522e41d63 37 - Adafruit TMP36 Temperature Sensor
ksastry3 1:abc522e41d63 38 AnalogIn p19
ksastry3 0:8a797b9e2fe4 39 */
ksastry3 0:8a797b9e2fe4 40
ksastry3 0:8a797b9e2fe4 41 /******************************************************************************/
ksastry3 0:8a797b9e2fe4 42 /* Libraries and Include Files */
ksastry3 0:8a797b9e2fe4 43 /******************************************************************************/
ksastry3 0:8a797b9e2fe4 44 #include "mbed.h"
ksastry3 1:abc522e41d63 45 //#include "rtos.h"
ksastry3 0:8a797b9e2fe4 46 //#include "SDFileSystem.h"
ksastry3 0:8a797b9e2fe4 47 #include "uLCD_4DGL.h"
ksastry3 1:abc522e41d63 48 //#include "LSM9DS1.h"
ksastry3 0:8a797b9e2fe4 49 #include "MBed_Adafruit_GPS.h"
ksastry3 1:abc522e41d63 50 // #include "XNucleo53L0A1.h"
ksastry3 0:8a797b9e2fe4 51 #include "math.h"
ksastry3 0:8a797b9e2fe4 52 #include <stdio.h>
ksastry3 0:8a797b9e2fe4 53 #include "PinDetect.h"
ksastry3 1:abc522e41d63 54 #include "algorithm.h"
ksastry3 1:abc522e41d63 55 #include "MAX30102.h"
ksastry3 1:abc522e41d63 56 #include "TMP36.h"
ksastry3 0:8a797b9e2fe4 57
ksastry3 0:8a797b9e2fe4 58 /******************************************************************************/
ksastry3 0:8a797b9e2fe4 59 /* I/O Object Declarations */
ksastry3 0:8a797b9e2fe4 60 /******************************************************************************/
ksastry3 1:abc522e41d63 61 PinDetect myPushbutton(p7); // For Mode Selection Feature
ksastry3 1:abc522e41d63 62 Serial pc(USBTX, USBRX); // Interface to PC over virtual COM
ksastry3 1:abc522e41d63 63 uLCD_4DGL uLCD(p9, p10, p8); // uLCD
ksastry3 1:abc522e41d63 64 AnalogIn Xval(p15); // IMU: Output of X-axis at analog p15
ksastry3 1:abc522e41d63 65 AnalogIn Yval(p16); // IMU: Output of y-axis at analog p16
ksastry3 1:abc522e41d63 66 AnalogIn Zval(p17); // IMU: Output of z-axis at analog p17
ksastry3 1:abc522e41d63 67 TMP36 myTMP36(p19); // Analog in // GPS
ksastry3 1:abc522e41d63 68 // #define VL53L0_I2C_SDA p28 // LIDAR
ksastry3 1:abc522e41d63 69 // #define VL53L0_I2C_SCL p27 // I2C sensor pins for LIDAR
ksastry3 1:abc522e41d63 70 // DigitalOut shdn(p26); // This VL53L0X board test application performs a range measurement in polling mode
ksastry3 1:abc522e41d63 71 // // Use 3.3(Vout) for Vin, p9 for SDA, p10 for SCL, P26 for shdn on mbed LPC1768
ksastry3 0:8a797b9e2fe4 72
ksastry3 0:8a797b9e2fe4 73 /******************************************************************************/
ksastry3 0:8a797b9e2fe4 74 /* Global Variables (Carefully Managed) */
ksastry3 0:8a797b9e2fe4 75 /******************************************************************************/
ksastry3 1:abc522e41d63 76 // // Globals For LIDAR
ksastry3 1:abc522e41d63 77 // static XNucleo53L0A1 *board = NULL;
ksastry3 1:abc522e41d63 78 // int status;
ksastry3 1:abc522e41d63 79 // uint32_t distance;
ksastry3 0:8a797b9e2fe4 80
ksastry3 0:8a797b9e2fe4 81 // Globals For GPS
ksastry3 1:abc522e41d63 82 Serial * gps_Serial;
ksastry3 0:8a797b9e2fe4 83
ksastry3 1:abc522e41d63 84 // Globals for Heart Rate Sensor
ksastry3 1:abc522e41d63 85 #define MAX_BRIGHTNESS 255
ksastry3 1:abc522e41d63 86 uint32_t aun_ir_buffer[500]; //IR LED sensor data
ksastry3 1:abc522e41d63 87 int32_t n_ir_buffer_length; //data length
ksastry3 1:abc522e41d63 88 uint32_t aun_red_buffer[500]; //Red LED sensor data
ksastry3 1:abc522e41d63 89 int32_t n_sp02; //SPO2 value
ksastry3 1:abc522e41d63 90 int8_t ch_spo2_valid; //indicator to show if the SP02 calculation is valid
ksastry3 1:abc522e41d63 91 int32_t n_heart_rate; //heart rate value
ksastry3 1:abc522e41d63 92 int8_t ch_hr_valid; //indicator to show if the heart rate calculation is valid
ksastry3 1:abc522e41d63 93 uint8_t uch_dummy;
ksastry3 1:abc522e41d63 94 // Serial pc(USBTX, USBRX); //initializes the serial port
ksastry3 1:abc522e41d63 95 // #ifdef TARGET_KL25Z
ksastry3 1:abc522e41d63 96 // PwmOut led(PTB18); //initializes the pwm output that connects to the on board LED
ksastry3 1:abc522e41d63 97 // DigitalIn myINT(PTD1); //pin PTD1 connects to the interrupt output pin of the MAX30102
ksastry3 1:abc522e41d63 98 // #endif
ksastry3 1:abc522e41d63 99 // #ifdef TARGET_K64F
ksastry3 1:abc522e41d63 100 // DigitalIn myINT(PTD1); //pin PTD1 connects to the interrupt output pin of the MAX30102
ksastry3 1:abc522e41d63 101 // #endif
ksastry3 1:abc522e41d63 102 // #ifdef TARGET_MAX32600MBED
ksastry3 1:abc522e41d63 103 PwmOut led(LED1); // initializes the pwm output that connects to the on board LED
ksastry3 1:abc522e41d63 104 DigitalIn myINT(p20); // pin p20 connects to the interrupt output pin of the MAX30102
ksastry3 1:abc522e41d63 105 // #endif
ksastry3 0:8a797b9e2fe4 106
ksastry3 0:8a797b9e2fe4 107 /******************************************************************************/
ksastry3 0:8a797b9e2fe4 108 /* Device Selection / Thread Control */
ksastry3 0:8a797b9e2fe4 109 /******************************************************************************/
ksastry3 1:abc522e41d63 110 // Add MODE_LIDAR_SELECT if we can get LIDAR to work
ksastry3 1:abc522e41d63 111 enum DATA_ACQ_MODE {MODE_IMU_SELECT, MODE_GPS_SELECT, MODE_TEMP_SELECT, MODE_HR_SELECT};
ksastry3 0:8a797b9e2fe4 112 volatile int myMode = MODE_IMU_SELECT; // To be changed by pushbutton presses
ksastry3 0:8a797b9e2fe4 113
ksastry3 0:8a797b9e2fe4 114 // Short ISR - serviced when interrupt given by myPushbutton hit
ksastry3 0:8a797b9e2fe4 115 void changeMode_ISR(void) {
ksastry3 1:abc522e41d63 116 myMode = (myMode + 1) % 4; // mod 4 makes it periodic (0,1,2,3,0)
ksastry3 0:8a797b9e2fe4 117 }
ksastry3 0:8a797b9e2fe4 118
ksastry3 0:8a797b9e2fe4 119 /******************************************************************************/
ksastry3 0:8a797b9e2fe4 120 /* Function Prototypes of Threads */
ksastry3 0:8a797b9e2fe4 121 /******************************************************************************/
ksastry3 0:8a797b9e2fe4 122 void IMU_THREAD();
ksastry3 0:8a797b9e2fe4 123 void GPS_THREAD();
ksastry3 1:abc522e41d63 124 void TEMP_THREAD();
ksastry3 1:abc522e41d63 125 void HR_THREAD();
ksastry3 1:abc522e41d63 126 // void LIDAR_THREAD();
ksastry3 0:8a797b9e2fe4 127
ksastry3 0:8a797b9e2fe4 128 /******************************************************************************/
ksastry3 1:abc522e41d63 129 /* Main Thread: Initialization */
ksastry3 0:8a797b9e2fe4 130 /******************************************************************************/
ksastry3 1:abc522e41d63 131
ksastry3 0:8a797b9e2fe4 132 int main() {
ksastry3 0:8a797b9e2fe4 133
ksastry3 1:abc522e41d63 134 // // Set up LIDAR
ksastry3 1:abc522e41d63 135 // pc.printf("\rSetting Up LIDAR...\n");
ksastry3 1:abc522e41d63 136 // DevI2C *device_i2c = new DevI2C(VL53L0_I2C_SDA, VL53L0_I2C_SCL); // LIDAR Objects:
ksastry3 1:abc522e41d63 137 // board = XNucleo53L0A1::instance(device_i2c, A2, D8, D2); // creates the 53L0A1 expansion board singleton obj
ksastry3 1:abc522e41d63 138 // shdn = 0; // must reset sensor for an mbed reset to work
ksastry3 1:abc522e41d63 139 // wait(0.1);
ksastry3 1:abc522e41d63 140 // shdn = 1;
ksastry3 1:abc522e41d63 141 // wait(0.1);
ksastry3 1:abc522e41d63 142
ksastry3 1:abc522e41d63 143 // status = board->init_board(); // init the 53L0A1 board with default values
ksastry3 1:abc522e41d63 144 // while (status) {
ksastry3 1:abc522e41d63 145 // pc.printf("\r(LIDAR) Failed to init board! \r\n");
ksastry3 1:abc522e41d63 146 // status = board->init_board();
ksastry3 1:abc522e41d63 147 // }
ksastry3 1:abc522e41d63 148 // pc.printf("\rSet Up LIDAR.\n");
ksastry3 0:8a797b9e2fe4 149
ksastry3 1:abc522e41d63 150 // Set up uLCD
ksastry3 1:abc522e41d63 151 pc.printf("\rSetting Up uLCD...\n");
ksastry3 1:abc522e41d63 152 uLCD.baudrate(31250);
ksastry3 1:abc522e41d63 153 pc.printf("\rSet Up uLCD.\n");
ksastry3 1:abc522e41d63 154 uLCD.printf("Welcome!");
ksastry3 0:8a797b9e2fe4 155
ksastry3 1:abc522e41d63 156 // // Set up GPS
ksastry3 1:abc522e41d63 157 // pc.printf("\rSetting Up GPS...\n");
ksastry3 1:abc522e41d63 158 // myGPS.begin(9600); // sets baud rate for GPS communication; note this may be changed via Adafruit_GPS::sendCommand(char *)
ksastry3 1:abc522e41d63 159 // // a list of GPS commands is available at http://www.adafruit.com/datasheets/PMTK_A08.pdf
ksastry3 1:abc522e41d63 160 // myGPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA); // these commands are defined in MBed_Adafruit_GPS.h; a link is provided there for command creation
ksastry3 1:abc522e41d63 161 // myGPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ);
ksastry3 1:abc522e41d63 162 // myGPS.sendCommand(PGCMD_ANTENNA);
ksastry3 1:abc522e41d63 163 // pc.printf("\r(GPS) Connection established at 9600 baud...\n");
ksastry3 1:abc522e41d63 164 // wait(1);
ksastry3 1:abc522e41d63 165 // refresh_Timer.start(); // starts the clock on the timer
ksastry3 1:abc522e41d63 166 // pc.printf("\rSet Up GPS.\n");
ksastry3 0:8a797b9e2fe4 167
ksastry3 0:8a797b9e2fe4 168 // Set up Mode Selecting Pushbutton (Debounced, Interrupt Based)
ksastry3 1:abc522e41d63 169 pc.printf("\rSetting Up Mode Changing PB...\n");
ksastry3 1:abc522e41d63 170 myPushbutton.mode(PullUp); // Use internal pullups for pushbutton
ksastry3 1:abc522e41d63 171 wait(.01); // Delay for initial pullup to take effect
ksastry3 1:abc522e41d63 172 myPushbutton.attach_deasserted(&changeMode_ISR); // Setup Interrupt Service Routines. PullUp implies 1->0 change means hit
ksastry3 1:abc522e41d63 173 myPushbutton.setSampleFrequency(); // Start sampling pushbutton inputs using interruptsUsing default 50 Hz (20 ms period)
ksastry3 1:abc522e41d63 174 pc.printf("\rSet Up Mode Changing PB.\n");
ksastry3 1:abc522e41d63 175
ksastry3 1:abc522e41d63 176 /******************************************************************************/
ksastry3 1:abc522e41d63 177 /* Main Thread: Devices */
ksastry3 1:abc522e41d63 178 /******************************************************************************/
ksastry3 1:abc522e41d63 179
ksastry3 1:abc522e41d63 180 while(true) {
ksastry3 1:abc522e41d63 181 pc.printf("Entered Main Loop\n");
ksastry3 1:abc522e41d63 182
ksastry3 1:abc522e41d63 183 // Print Current Mode on Top
ksastry3 1:abc522e41d63 184 uLCD.text_width(1); // normal size text
ksastry3 1:abc522e41d63 185 uLCD.text_height(1);
ksastry3 1:abc522e41d63 186 uLCD.background_color(BLACK);
ksastry3 1:abc522e41d63 187 uLCD.color(GREEN);
ksastry3 1:abc522e41d63 188 uLCD.locate(0, 0);
ksastry3 1:abc522e41d63 189 uLCD.printf(" ");
ksastry3 1:abc522e41d63 190 uLCD.locate(0, 0);
ksastry3 1:abc522e41d63 191 uLCD.printf("Mode: %d", myMode);
ksastry3 1:abc522e41d63 192 pc.printf("\rMode: %d", myMode);
ksastry3 1:abc522e41d63 193
ksastry3 1:abc522e41d63 194 // Depending on Mode:
ksastry3 1:abc522e41d63 195 switch (myMode) {
ksastry3 1:abc522e41d63 196 case MODE_IMU_SELECT:
ksastry3 1:abc522e41d63 197 // Print Current Mode on Top
ksastry3 1:abc522e41d63 198 uLCD.text_width(1); // normal size text
ksastry3 1:abc522e41d63 199 uLCD.text_height(1);
ksastry3 1:abc522e41d63 200 uLCD.background_color(BLACK);
ksastry3 1:abc522e41d63 201 uLCD.color(GREEN);
ksastry3 1:abc522e41d63 202 uLCD.locate(0, 0);
ksastry3 1:abc522e41d63 203 uLCD.printf(" ");
ksastry3 1:abc522e41d63 204 uLCD.locate(0, 0);
ksastry3 1:abc522e41d63 205 uLCD.printf("Mode: %d", myMode);
ksastry3 1:abc522e41d63 206 pc.printf("\rMode: %d", myMode);
ksastry3 1:abc522e41d63 207
ksastry3 1:abc522e41d63 208 // Create a RED Outline of the screen
ksastry3 1:abc522e41d63 209 uLCD.background_color(RED);
ksastry3 1:abc522e41d63 210 uLCD.cls();
ksastry3 1:abc522e41d63 211 uLCD.filled_rectangle(4, 4, 124, 124, BLACK);
ksastry3 1:abc522e41d63 212 while (myMode == MODE_IMU_SELECT) {
ksastry3 1:abc522e41d63 213 IMU_THREAD();
ksastry3 1:abc522e41d63 214 }
ksastry3 1:abc522e41d63 215 break;
ksastry3 1:abc522e41d63 216
ksastry3 1:abc522e41d63 217 case MODE_GPS_SELECT:
ksastry3 1:abc522e41d63 218 // Print Current Mode on Top
ksastry3 1:abc522e41d63 219 uLCD.text_width(1); // normal size text
ksastry3 1:abc522e41d63 220 uLCD.text_height(1);
ksastry3 1:abc522e41d63 221 uLCD.background_color(BLACK);
ksastry3 1:abc522e41d63 222 uLCD.color(GREEN);
ksastry3 1:abc522e41d63 223 uLCD.locate(0, 0);
ksastry3 1:abc522e41d63 224 uLCD.printf(" ");
ksastry3 1:abc522e41d63 225 uLCD.locate(0, 0);
ksastry3 1:abc522e41d63 226 uLCD.printf("Mode: %d", myMode);
ksastry3 1:abc522e41d63 227 pc.printf("\rMode: %d", myMode);
ksastry3 1:abc522e41d63 228
ksastry3 1:abc522e41d63 229 // Create a BLUE Outline of the screen
ksastry3 1:abc522e41d63 230 uLCD.background_color(BLUE);
ksastry3 1:abc522e41d63 231 uLCD.cls();
ksastry3 1:abc522e41d63 232 uLCD.filled_rectangle(4, 4, 124, 124, BLACK);
ksastry3 1:abc522e41d63 233 while (myMode == MODE_GPS_SELECT) {
ksastry3 1:abc522e41d63 234 GPS_THREAD();
ksastry3 1:abc522e41d63 235 }
ksastry3 1:abc522e41d63 236 break;
ksastry3 1:abc522e41d63 237
ksastry3 1:abc522e41d63 238 case MODE_TEMP_SELECT:
ksastry3 1:abc522e41d63 239 // Print Current Mode on Top
ksastry3 1:abc522e41d63 240 uLCD.text_width(1); // normal size text
ksastry3 1:abc522e41d63 241 uLCD.text_height(1);
ksastry3 1:abc522e41d63 242 uLCD.background_color(BLACK);
ksastry3 1:abc522e41d63 243 uLCD.color(GREEN);
ksastry3 1:abc522e41d63 244 uLCD.locate(0, 0);
ksastry3 1:abc522e41d63 245 uLCD.printf(" ");
ksastry3 1:abc522e41d63 246 uLCD.locate(0, 0);
ksastry3 1:abc522e41d63 247 uLCD.printf("Mode: %d", myMode);
ksastry3 1:abc522e41d63 248 pc.printf("\rMode: %d", myMode);
ksastry3 1:abc522e41d63 249
ksastry3 1:abc522e41d63 250 // Create a GREEN Outline of the screen
ksastry3 1:abc522e41d63 251 uLCD.background_color(GREEN);
ksastry3 1:abc522e41d63 252 uLCD.cls();
ksastry3 1:abc522e41d63 253 uLCD.filled_rectangle(4, 4, 124, 124, BLACK);
ksastry3 1:abc522e41d63 254 while (myMode == MODE_TEMP_SELECT) {
ksastry3 1:abc522e41d63 255 TEMP_THREAD();
ksastry3 1:abc522e41d63 256 }
ksastry3 1:abc522e41d63 257 break;
ksastry3 1:abc522e41d63 258 case MODE_HR_SELECT:
ksastry3 1:abc522e41d63 259 // Print Current Mode on Top
ksastry3 1:abc522e41d63 260 uLCD.text_width(1); // normal size text
ksastry3 1:abc522e41d63 261 uLCD.text_height(1);
ksastry3 1:abc522e41d63 262 uLCD.background_color(BLACK);
ksastry3 1:abc522e41d63 263 uLCD.color(GREEN);
ksastry3 1:abc522e41d63 264 uLCD.locate(0, 0);
ksastry3 1:abc522e41d63 265 uLCD.printf(" ");
ksastry3 1:abc522e41d63 266 uLCD.locate(0, 0);
ksastry3 1:abc522e41d63 267 uLCD.printf("Mode: %d", myMode);
ksastry3 1:abc522e41d63 268 pc.printf("\rMode: %d", myMode);
ksastry3 1:abc522e41d63 269
ksastry3 1:abc522e41d63 270 // Create a WHITE Outline of the screen
ksastry3 1:abc522e41d63 271 uLCD.background_color(WHITE);
ksastry3 1:abc522e41d63 272 uLCD.cls();
ksastry3 1:abc522e41d63 273 uLCD.filled_rectangle(4, 4, 124, 124, BLACK);
ksastry3 1:abc522e41d63 274 // Graphics Boilerplate
ksastry3 1:abc522e41d63 275 uLCD.text_width(2); // 2X size text
ksastry3 1:abc522e41d63 276 uLCD.text_height(2);
ksastry3 1:abc522e41d63 277 uLCD.color(WHITE);
ksastry3 1:abc522e41d63 278 uLCD.locate(0,0);
ksastry3 1:abc522e41d63 279 uLCD.printf("HEARTRATE");
ksastry3 1:abc522e41d63 280 while (myMode == MODE_HR_SELECT) {
ksastry3 1:abc522e41d63 281 HR_THREAD();
ksastry3 1:abc522e41d63 282 }
ksastry3 1:abc522e41d63 283 break;
ksastry3 1:abc522e41d63 284 // case MODE_LIDAR_SELECT:
ksastry3 1:abc522e41d63 285 // // Print Current Mode on Top
ksastry3 1:abc522e41d63 286 // uLCD.text_width(1); // normal size text
ksastry3 1:abc522e41d63 287 // uLCD.text_height(1);
ksastry3 1:abc522e41d63 288 // uLCD.background_color(BLACK);
ksastry3 1:abc522e41d63 289 // uLCD.color(GREEN);
ksastry3 1:abc522e41d63 290 // uLCD.locate(0, 0);
ksastry3 1:abc522e41d63 291 // uLCD.printf(" ");
ksastry3 1:abc522e41d63 292 // uLCD.locate(0, 0);
ksastry3 1:abc522e41d63 293 // uLCD.printf("Mode: %d", myMode);
ksastry3 1:abc522e41d63 294 // pc.printf("\rMode: %d", myMode);
ksastry3 0:8a797b9e2fe4 295
ksastry3 1:abc522e41d63 296 // // Create a LGREY Outline of the screen
ksastry3 1:abc522e41d63 297 // uLCD.background_color(LGREY);
ksastry3 1:abc522e41d63 298 // uLCD.cls();
ksastry3 1:abc522e41d63 299 // uLCD.filled_rectangle(4, 4, 124, 124, BLACK);
ksastry3 1:abc522e41d63 300 // // Graphics Boilerplate
ksastry3 1:abc522e41d63 301 // uLCD.text_width(2); // 2X size text
ksastry3 1:abc522e41d63 302 // uLCD.text_height(2);
ksastry3 1:abc522e41d63 303 // uLCD.color(LGREY);
ksastry3 1:abc522e41d63 304 // uLCD.locate(0,0);
ksastry3 1:abc522e41d63 305 // uLCD.printf("PUSH-UPS");
ksastry3 1:abc522e41d63 306 // while (myMode == MODE_LIDAR_SELECT) {
ksastry3 1:abc522e41d63 307 // LIDAR_THREAD();
ksastry3 1:abc522e41d63 308 // }
ksastry3 1:abc522e41d63 309 // break;
ksastry3 1:abc522e41d63 310 default:
ksastry3 1:abc522e41d63 311 // Print Current Mode on Top
ksastry3 1:abc522e41d63 312 uLCD.text_width(1); // normal size text
ksastry3 1:abc522e41d63 313 uLCD.text_height(1);
ksastry3 1:abc522e41d63 314 uLCD.background_color(BLACK);
ksastry3 1:abc522e41d63 315 uLCD.color(GREEN);
ksastry3 1:abc522e41d63 316 uLCD.locate(0, 0);
ksastry3 1:abc522e41d63 317 uLCD.printf(" ");
ksastry3 1:abc522e41d63 318 uLCD.locate(0, 0);
ksastry3 1:abc522e41d63 319 uLCD.printf("Mode: %d", myMode);
ksastry3 1:abc522e41d63 320 pc.printf("\rMode: %d", myMode);
ksastry3 1:abc522e41d63 321 uLCD.cls();
ksastry3 1:abc522e41d63 322 uLCD.printf("INVALID MODE.");
ksastry3 1:abc522e41d63 323
ksastry3 1:abc522e41d63 324 }
ksastry3 1:abc522e41d63 325 }
ksastry3 1:abc522e41d63 326 } // END OF MAIN!!!!
ksastry3 1:abc522e41d63 327
ksastry3 1:abc522e41d63 328
ksastry3 1:abc522e41d63 329 /******************************************************************************/
ksastry3 1:abc522e41d63 330 /* Thread 1: Heart Rate Monitoring */
ksastry3 1:abc522e41d63 331 /******************************************************************************/
ksastry3 1:abc522e41d63 332 void HR_THREAD() {
ksastry3 1:abc522e41d63 333 uint32_t un_min, un_max, un_prev_data; //variables to calculate the on-board LED brightness that reflects the heartbeats
ksastry3 1:abc522e41d63 334 int i;
ksastry3 1:abc522e41d63 335 int32_t n_brightness;
ksastry3 1:abc522e41d63 336 float f_temp;
ksastry3 1:abc522e41d63 337 int32_t myOldHeartRate;
ksastry3 1:abc522e41d63 338
ksastry3 1:abc522e41d63 339 maxim_max30102_reset(); //resets the MAX30102
ksastry3 1:abc522e41d63 340
ksastry3 1:abc522e41d63 341 // // initialize serial communication at 115200 bits per second:
ksastry3 1:abc522e41d63 342 // pc.baud(9600);
ksastry3 1:abc522e41d63 343 // pc.format(8,SerialBase::None,1);
ksastry3 1:abc522e41d63 344 // wait(1);
ksastry3 1:abc522e41d63 345
ksastry3 1:abc522e41d63 346 //read and clear status register
ksastry3 1:abc522e41d63 347 maxim_max30102_read_reg(0,&uch_dummy);
ksastry3 1:abc522e41d63 348
ksastry3 1:abc522e41d63 349 // //wait until the user presses a key
ksastry3 1:abc522e41d63 350 // while(pc.readable()==0)
ksastry3 1:abc522e41d63 351 // {
ksastry3 1:abc522e41d63 352 // pc.printf("\x1B[2J"); //clear terminal program screen
ksastry3 1:abc522e41d63 353 // pc.printf("Press any key to start conversion\n\r");
ksastry3 1:abc522e41d63 354 // wait(1);
ksastry3 1:abc522e41d63 355 // }
ksastry3 1:abc522e41d63 356 // uch_dummy=getchar();
ksastry3 1:abc522e41d63 357
ksastry3 1:abc522e41d63 358 maxim_max30102_init(); //initializes the MAX30102
ksastry3 1:abc522e41d63 359 // pc.printf("\rInitialization Complete - HR\n");
ksastry3 1:abc522e41d63 360
ksastry3 1:abc522e41d63 361 n_brightness=0;
ksastry3 1:abc522e41d63 362 un_min=0x3FFFF;
ksastry3 1:abc522e41d63 363 un_max=0;
ksastry3 1:abc522e41d63 364
ksastry3 1:abc522e41d63 365 n_ir_buffer_length=500; //buffer length of 100 stores 5 seconds of samples running at 100sps
ksastry3 1:abc522e41d63 366
ksastry3 1:abc522e41d63 367 //read the first 500 samples, and determine the signal range
ksastry3 1:abc522e41d63 368 for(i=0;i<n_ir_buffer_length;i++)
ksastry3 1:abc522e41d63 369 {
ksastry3 1:abc522e41d63 370 while(myINT.read()==1); //wait until the interrupt pin asserts
ksastry3 1:abc522e41d63 371
ksastry3 1:abc522e41d63 372 maxim_max30102_read_fifo((aun_red_buffer+i), (aun_ir_buffer+i)); //read from MAX30102 FIFO
ksastry3 0:8a797b9e2fe4 373
ksastry3 1:abc522e41d63 374 if(un_min>aun_red_buffer[i])
ksastry3 1:abc522e41d63 375 un_min=aun_red_buffer[i]; //update signal min
ksastry3 1:abc522e41d63 376 if(un_max<aun_red_buffer[i])
ksastry3 1:abc522e41d63 377 un_max=aun_red_buffer[i]; //update signal max
ksastry3 1:abc522e41d63 378 // pc.printf("red=");
ksastry3 1:abc522e41d63 379 // pc.printf("%i", aun_red_buffer[i]);
ksastry3 1:abc522e41d63 380 // pc.printf(", ir=");
ksastry3 1:abc522e41d63 381 // pc.printf("%i\n\r", aun_ir_buffer[i]);
ksastry3 1:abc522e41d63 382 }
ksastry3 1:abc522e41d63 383 un_prev_data=aun_red_buffer[i];
ksastry3 1:abc522e41d63 384
ksastry3 1:abc522e41d63 385
ksastry3 1:abc522e41d63 386 //calculate heart rate and SpO2 after first 500 samples (first 5 seconds of samples)
ksastry3 1:abc522e41d63 387 maxim_heart_rate_and_oxygen_saturation(aun_ir_buffer, n_ir_buffer_length, aun_red_buffer, &n_sp02, &ch_spo2_valid, &n_heart_rate, &ch_hr_valid);
ksastry3 1:abc522e41d63 388
ksastry3 1:abc522e41d63 389 //Continuously taking samples from MAX30102. Heart rate and SpO2 are calculated every 1 second
ksastry3 1:abc522e41d63 390 while (myMode == MODE_HR_SELECT) {
ksastry3 1:abc522e41d63 391 i=0;
ksastry3 1:abc522e41d63 392 un_min=0x3FFFF;
ksastry3 1:abc522e41d63 393 un_max=0;
ksastry3 1:abc522e41d63 394
ksastry3 1:abc522e41d63 395 //dumping the first 100 sets of samples in the memory and shift the last 400 sets of samples to the top
ksastry3 1:abc522e41d63 396 for(i=100;i<500;i++)
ksastry3 1:abc522e41d63 397 {
ksastry3 1:abc522e41d63 398 aun_red_buffer[i-100]=aun_red_buffer[i];
ksastry3 1:abc522e41d63 399 aun_ir_buffer[i-100]=aun_ir_buffer[i];
ksastry3 1:abc522e41d63 400
ksastry3 1:abc522e41d63 401 //update the signal min and max
ksastry3 1:abc522e41d63 402 if(un_min>aun_red_buffer[i])
ksastry3 1:abc522e41d63 403 un_min=aun_red_buffer[i];
ksastry3 1:abc522e41d63 404 if(un_max<aun_red_buffer[i])
ksastry3 1:abc522e41d63 405 un_max=aun_red_buffer[i];
ksastry3 1:abc522e41d63 406 }
ksastry3 1:abc522e41d63 407
ksastry3 1:abc522e41d63 408 //take 100 sets of samples before calculating the heart rate.
ksastry3 1:abc522e41d63 409 for(i=400;i<500;i++)
ksastry3 1:abc522e41d63 410 {
ksastry3 1:abc522e41d63 411 un_prev_data=aun_red_buffer[i-1];
ksastry3 1:abc522e41d63 412 while(myINT.read()==1);
ksastry3 1:abc522e41d63 413 maxim_max30102_read_fifo((aun_red_buffer+i), (aun_ir_buffer+i));
ksastry3 1:abc522e41d63 414
ksastry3 1:abc522e41d63 415 if(aun_red_buffer[i]>un_prev_data)
ksastry3 1:abc522e41d63 416 {
ksastry3 1:abc522e41d63 417 f_temp=aun_red_buffer[i]-un_prev_data;
ksastry3 1:abc522e41d63 418 f_temp/=(un_max-un_min);
ksastry3 1:abc522e41d63 419 f_temp*=MAX_BRIGHTNESS;
ksastry3 1:abc522e41d63 420 n_brightness-=(int)f_temp;
ksastry3 1:abc522e41d63 421 if(n_brightness<0)
ksastry3 1:abc522e41d63 422 n_brightness=0;
ksastry3 1:abc522e41d63 423 }
ksastry3 1:abc522e41d63 424 else
ksastry3 1:abc522e41d63 425 {
ksastry3 1:abc522e41d63 426 f_temp=un_prev_data-aun_red_buffer[i];
ksastry3 1:abc522e41d63 427 f_temp/=(un_max-un_min);
ksastry3 1:abc522e41d63 428 f_temp*=MAX_BRIGHTNESS;
ksastry3 1:abc522e41d63 429 n_brightness+=(int)f_temp;
ksastry3 1:abc522e41d63 430 if(n_brightness>MAX_BRIGHTNESS)
ksastry3 1:abc522e41d63 431 n_brightness=MAX_BRIGHTNESS;
ksastry3 1:abc522e41d63 432 }
ksastry3 1:abc522e41d63 433 //#if defined(TARGET_KL25Z) || defined(TARGET_MAX32600MBED)
ksastry3 1:abc522e41d63 434 led.write(1-(float)n_brightness/256);
ksastry3 1:abc522e41d63 435 //#endif
ksastry3 1:abc522e41d63 436 //send samples and calculation result to terminal program through UART
ksastry3 1:abc522e41d63 437 // pc.printf("red=");
ksastry3 1:abc522e41d63 438 // pc.printf("%i", aun_red_buffer[i]);
ksastry3 1:abc522e41d63 439 // pc.printf(", ir=");
ksastry3 1:abc522e41d63 440 // pc.printf("%i", aun_ir_buffer[i]);
ksastry3 1:abc522e41d63 441 // pc.printf(", HR=%i, ", n_heart_rate);
ksastry3 1:abc522e41d63 442 // pc.printf("HRvalid=%i, ", ch_hr_valid);
ksastry3 1:abc522e41d63 443 if (ch_hr_valid == 1) {
ksastry3 1:abc522e41d63 444 myOldHeartRate = n_heart_rate;
ksastry3 1:abc522e41d63 445 if ((myOldHeartRate >= 50) && (myOldHeartRate <= 200)) {
ksastry3 1:abc522e41d63 446 // Print Out on LCD
ksastry3 1:abc522e41d63 447 uLCD.text_width(2); // normal size text
ksastry3 1:abc522e41d63 448 uLCD.text_height(2);
ksastry3 1:abc522e41d63 449 uLCD.locate(1,3);
ksastry3 1:abc522e41d63 450 uLCD.printf("HR:\n\n %i", myOldHeartRate);
ksastry3 1:abc522e41d63 451 } else {
ksastry3 1:abc522e41d63 452 uLCD.text_width(2); // normal size text
ksastry3 1:abc522e41d63 453 uLCD.text_height(2);
ksastry3 1:abc522e41d63 454 uLCD.locate(1,3);
ksastry3 1:abc522e41d63 455 uLCD.printf("HR:\n\n --");
ksastry3 1:abc522e41d63 456 }
ksastry3 1:abc522e41d63 457
ksastry3 1:abc522e41d63 458 }
ksastry3 1:abc522e41d63 459 // pc.printf("SpO2=%i, ", n_sp02);
ksastry3 1:abc522e41d63 460 // pc.printf("SPO2Valid=%i\n\r", ch_spo2_valid);
ksastry3 1:abc522e41d63 461 }
ksastry3 1:abc522e41d63 462 maxim_heart_rate_and_oxygen_saturation(aun_ir_buffer, n_ir_buffer_length, aun_red_buffer, &n_sp02, &ch_spo2_valid, &n_heart_rate, &ch_hr_valid);
ksastry3 0:8a797b9e2fe4 463 }
ksastry3 0:8a797b9e2fe4 464 }
ksastry3 0:8a797b9e2fe4 465
ksastry3 0:8a797b9e2fe4 466 /******************************************************************************/
ksastry3 0:8a797b9e2fe4 467 /* Thread 2: IMU Measurement */
ksastry3 0:8a797b9e2fe4 468 /******************************************************************************/
ksastry3 0:8a797b9e2fe4 469 void IMU_THREAD() {
ksastry3 1:abc522e41d63 470 float x,y,z; // Raw data
ksastry3 1:abc522e41d63 471 float xG, yG, zG; // IN G
ksastry3 1:abc522e41d63 472 bool start = 0;
ksastry3 1:abc522e41d63 473 int count = 0;
ksastry3 1:abc522e41d63 474
ksastry3 0:8a797b9e2fe4 475 while (myMode == MODE_IMU_SELECT) {
ksastry3 1:abc522e41d63 476 // Graphics Boilerplate
ksastry3 1:abc522e41d63 477 uLCD.text_width(3); // 3X size text
ksastry3 1:abc522e41d63 478 uLCD.text_height(3);
ksastry3 1:abc522e41d63 479 uLCD.color(RED);
ksastry3 1:abc522e41d63 480 uLCD.locate(0,0);
ksastry3 1:abc522e41d63 481 uLCD.printf("IMU");
ksastry3 1:abc522e41d63 482
ksastry3 1:abc522e41d63 483 // Get Values
ksastry3 1:abc522e41d63 484 x = Xval.read(); // Reads X-axis value between 0 and 1
ksastry3 1:abc522e41d63 485 y = Yval.read(); // Reads Y-axis value
ksastry3 1:abc522e41d63 486 z = Zval.read(); // Reads Z-axis value
ksastry3 1:abc522e41d63 487
ksastry3 1:abc522e41d63 488 xG = (x * 6.6) - 3.3; // Scaling into G's
ksastry3 1:abc522e41d63 489 yG = (y * 6.6) - 3.3;
ksastry3 1:abc522e41d63 490 zG = (z * 6.6) - 3.3;
ksastry3 1:abc522e41d63 491
ksastry3 1:abc522e41d63 492 pc.printf("\r%f, %f, %f\n", xG, yG, zG);
ksastry3 1:abc522e41d63 493
ksastry3 1:abc522e41d63 494 if (zG > 0.7){
ksastry3 0:8a797b9e2fe4 495 start = 1;
ksastry3 0:8a797b9e2fe4 496 }
ksastry3 1:abc522e41d63 497
ksastry3 1:abc522e41d63 498 if (start==1 & zG < 0.5) {
ksastry3 1:abc522e41d63 499 count+=1;
ksastry3 0:8a797b9e2fe4 500 start = 0;
ksastry3 0:8a797b9e2fe4 501 }
ksastry3 1:abc522e41d63 502
ksastry3 1:abc522e41d63 503 // Print Out on LCD
ksastry3 1:abc522e41d63 504 uLCD.text_width(2); // normal size text
ksastry3 1:abc522e41d63 505 uLCD.text_height(2);
ksastry3 1:abc522e41d63 506 uLCD.locate(1,3);
ksastry3 1:abc522e41d63 507 uLCD.printf("Squats:\n\n %d", count);
ksastry3 1:abc522e41d63 508 wait(.25);
ksastry3 0:8a797b9e2fe4 509 }
ksastry3 0:8a797b9e2fe4 510 }
ksastry3 0:8a797b9e2fe4 511
ksastry3 0:8a797b9e2fe4 512 /******************************************************************************/
ksastry3 0:8a797b9e2fe4 513 /* Thread 3: GPS Measurement */
ksastry3 0:8a797b9e2fe4 514 /******************************************************************************/
ksastry3 0:8a797b9e2fe4 515 void GPS_THREAD() {
ksastry3 1:abc522e41d63 516 // Graphics Boilerplate
ksastry3 1:abc522e41d63 517 uLCD.text_width(3); // 3X size text
ksastry3 1:abc522e41d63 518 uLCD.text_height(3);
ksastry3 1:abc522e41d63 519 uLCD.color(BLUE);
ksastry3 1:abc522e41d63 520 uLCD.locate(0,0);
ksastry3 1:abc522e41d63 521 uLCD.printf("GPS");
ksastry3 1:abc522e41d63 522 uLCD.text_width(1); // normal size text
ksastry3 1:abc522e41d63 523 uLCD.text_height(1);
ksastry3 1:abc522e41d63 524 uLCD.locate(1,3);
ksastry3 1:abc522e41d63 525 uLCD.printf("GPS Data:\n");
ksastry3 1:abc522e41d63 526
ksastry3 1:abc522e41d63 527 pc.baud(9600); //sets virtual COM serial communication to high rate; this is to allow more time to be spent on GPS retrieval
ksastry3 1:abc522e41d63 528
ksastry3 1:abc522e41d63 529 gps_Serial = new Serial(p13,p14); //serial object for use w/ GPS
ksastry3 1:abc522e41d63 530 Adafruit_GPS myGPS(gps_Serial); //object of Adafruit's GPS class
ksastry3 1:abc522e41d63 531 char c; //when read via Adafruit_GPS::read(), the class returns single character stored here
ksastry3 1:abc522e41d63 532 Timer refresh_Timer; //sets up a timer for use in loop; how often do we print GPS info?
ksastry3 1:abc522e41d63 533 const int refresh_Time = 2000; //refresh time in ms
ksastry3 1:abc522e41d63 534
ksastry3 1:abc522e41d63 535 myGPS.begin(9600); //sets baud rate for GPS communication; note this may be changed via Adafruit_GPS::sendCommand(char *)
ksastry3 1:abc522e41d63 536 //a list of GPS commands is available at http://www.adafruit.com/datasheets/PMTK_A08.pdf
ksastry3 1:abc522e41d63 537
ksastry3 1:abc522e41d63 538 myGPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA); //these commands are defined in MBed_Adafruit_GPS.h; a link is provided there for command creation
ksastry3 1:abc522e41d63 539 myGPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ);
ksastry3 1:abc522e41d63 540 myGPS.sendCommand(PGCMD_ANTENNA);
ksastry3 1:abc522e41d63 541
ksastry3 1:abc522e41d63 542 pc.printf("Connection established at 9600 baud...\n");
ksastry3 1:abc522e41d63 543
ksastry3 1:abc522e41d63 544 wait(1);
ksastry3 1:abc522e41d63 545
ksastry3 1:abc522e41d63 546 refresh_Timer.start(); //starts the clock on the timer
ksastry3 0:8a797b9e2fe4 547
ksastry3 0:8a797b9e2fe4 548 while (myMode == MODE_GPS_SELECT) {
ksastry3 1:abc522e41d63 549 c = myGPS.read(); //queries the GPS
ksastry3 0:8a797b9e2fe4 550
ksastry3 1:abc522e41d63 551 //if (c) { pc.printf("%c", c); } //this line will echo the GPS data if not paused
ksastry3 0:8a797b9e2fe4 552
ksastry3 1:abc522e41d63 553 //check if we recieved a new message from GPS, if so, attempt to parse it,
ksastry3 0:8a797b9e2fe4 554 if ( myGPS.newNMEAreceived() ) {
ksastry3 0:8a797b9e2fe4 555 if ( !myGPS.parse(myGPS.lastNMEA()) ) {
ksastry3 0:8a797b9e2fe4 556 continue;
ksastry3 0:8a797b9e2fe4 557 }
ksastry3 0:8a797b9e2fe4 558 }
ksastry3 0:8a797b9e2fe4 559
ksastry3 1:abc522e41d63 560 //check if enough time has passed to warrant printing GPS info to screen
ksastry3 1:abc522e41d63 561 //note if refresh_Time is too low or pc.baud is too low, GPS data may be lost during printing
ksastry3 0:8a797b9e2fe4 562 if (refresh_Timer.read_ms() >= refresh_Time) {
ksastry3 0:8a797b9e2fe4 563 refresh_Timer.reset();
ksastry3 1:abc522e41d63 564 uLCD.locate(1, 4);
ksastry3 1:abc522e41d63 565 pc.printf("\rGPS SAYS:\n\r");
ksastry3 1:abc522e41d63 566 pc.printf("\rTime: %d:%d:%d.%u\n\r", myGPS.hour, myGPS.minute, myGPS.seconds, myGPS.milliseconds);
ksastry3 1:abc522e41d63 567 uLCD.printf("\rTime: %d:%d:%d.%u\n\r", myGPS.hour, myGPS.minute, myGPS.seconds, myGPS.milliseconds);
ksastry3 1:abc522e41d63 568 pc.printf("\rDate: %d/%d/20%d\n\r", myGPS.day, myGPS.month, myGPS.year);
ksastry3 1:abc522e41d63 569 uLCD.printf("\rDate: %d/%d/20%d\n\r", myGPS.day, myGPS.month, myGPS.year);
ksastry3 1:abc522e41d63 570 pc.printf("\rFix: %d\n\r", (int) myGPS.fix);
ksastry3 1:abc522e41d63 571 uLCD.printf("\rFix: %d\n\r", (int) myGPS.fix);
ksastry3 1:abc522e41d63 572 pc.printf("\rQuality: %d\n\r", (int) myGPS.fixquality);
ksastry3 1:abc522e41d63 573 if (myGPS.fix) {
ksastry3 1:abc522e41d63 574 pc.printf("\rLocation: %5.2f%c, %5.2f%c\n\r", myGPS.latitude, myGPS.lat, myGPS.longitude, myGPS.lon);
ksastry3 1:abc522e41d63 575 pc.printf("\rLocation: %5.2f%c, %5.2f%c\n\r", myGPS.latitude, myGPS.lat, myGPS.longitude, myGPS.lon);
ksastry3 1:abc522e41d63 576 pc.printf("\rSpeed: %5.2f knots\n\r", myGPS.speed);
ksastry3 1:abc522e41d63 577 uLCD.printf("\rSpeed: %5.2f mph\n\r", myGPS.speed * 1.15078); // CONVERT
ksastry3 1:abc522e41d63 578 pc.printf("\rAngle: %5.2f\n", myGPS.angle);
ksastry3 1:abc522e41d63 579 pc.printf("\rAltitude: %5.2f\n", myGPS.altitude);
ksastry3 1:abc522e41d63 580 uLCD.printf("\rAltitude: %5.2f\n", myGPS.altitude);
ksastry3 1:abc522e41d63 581 pc.printf("\rSatellites: %d\n\r", myGPS.satellites);
ksastry3 1:abc522e41d63 582 }
ksastry3 0:8a797b9e2fe4 583 }
ksastry3 0:8a797b9e2fe4 584 }
ksastry3 0:8a797b9e2fe4 585 }
ksastry3 0:8a797b9e2fe4 586
ksastry3 1:abc522e41d63 587 // /******************************************************************************/
ksastry3 1:abc522e41d63 588 // /* Thread 4: LIDAR Measurements */
ksastry3 1:abc522e41d63 589 // /******************************************************************************/
ksastry3 1:abc522e41d63 590 // void LIDAR_THREAD() {
ksastry3 1:abc522e41d63 591 // // loop taking and printing distance
ksastry3 1:abc522e41d63 592 // while (myMode == MODE_LIDAR_SELECT) {
ksastry3 1:abc522e41d63 593 // status = board->sensor_centre->get_distance(&distance);
ksastry3 1:abc522e41d63 594 // if (status == VL53L0X_ERROR_NONE) {
ksastry3 1:abc522e41d63 595 // pc.printf("\rLIDAR SAYS:\n\r");
ksastry3 1:abc522e41d63 596 // pc.printf("\rD=%ld mm\r\n", distance);
ksastry3 1:abc522e41d63 597 // }
ksastry3 1:abc522e41d63 598 // }
ksastry3 1:abc522e41d63 599 // }
ksastry3 1:abc522e41d63 600
ksastry3 0:8a797b9e2fe4 601 /******************************************************************************/
ksastry3 1:abc522e41d63 602 /* Thread 5: Temperature Measurements */
ksastry3 0:8a797b9e2fe4 603 /******************************************************************************/
ksastry3 1:abc522e41d63 604 void TEMP_THREAD() {
ksastry3 1:abc522e41d63 605
ksastry3 1:abc522e41d63 606 float myCurrentTemp;
ksastry3 1:abc522e41d63 607
ksastry3 1:abc522e41d63 608 while (myMode == MODE_TEMP_SELECT) {
ksastry3 1:abc522e41d63 609 // Graphics Boilerplate
ksastry3 1:abc522e41d63 610 uLCD.text_width(3); // 3X size text
ksastry3 1:abc522e41d63 611 uLCD.text_height(3);
ksastry3 1:abc522e41d63 612 uLCD.color(GREEN);
ksastry3 1:abc522e41d63 613 uLCD.locate(0,0);
ksastry3 1:abc522e41d63 614 uLCD.printf("TEMP");
ksastry3 1:abc522e41d63 615
ksastry3 1:abc522e41d63 616 // Get Temperature
ksastry3 1:abc522e41d63 617 myCurrentTemp = myTMP36.read(); // Floating Value
ksastry3 1:abc522e41d63 618
ksastry3 1:abc522e41d63 619 // Print Out on LCD
ksastry3 1:abc522e41d63 620 uLCD.text_width(2); // normal size text
ksastry3 1:abc522e41d63 621 uLCD.text_height(2);
ksastry3 1:abc522e41d63 622 uLCD.locate(1,3);
ksastry3 1:abc522e41d63 623 uLCD.printf("Temp:\n\n %0.1f C", myCurrentTemp);
ksastry3 1:abc522e41d63 624 wait(1);
ksastry3 0:8a797b9e2fe4 625 }
ksastry3 0:8a797b9e2fe4 626 }