ECE56810 Project 2 - Runner's Monitor
Dependencies: mbed rohm-bh1790glc-driver mbed-http FXAS21000 FXOS8700Q ESP8266 RegisterWriter
main.cpp@12:2dde21ae53c4, 2022-04-29 (annotated)
- Committer:
- ndnafzig
- Date:
- Fri Apr 29 16:52:11 2022 +0000
- Revision:
- 12:2dde21ae53c4
- Parent:
- 11:756321f0b0cd
Standard
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
andcor02 | 8:25138f7b9309 | 1 | #include "mbed.h" |
andcor02 | 8:25138f7b9309 | 2 | #include "hcsr04.h" |
jamiedillion2019 | 10:e4b6bc6d9b07 | 3 | #include "ESP8266.h" |
jamiedillion2019 | 10:e4b6bc6d9b07 | 4 | #include "math.h" |
ndnafzig | 12:2dde21ae53c4 | 5 | #include "FXOS8700Q.h" |
ndnafzig | 12:2dde21ae53c4 | 6 | #include "FXAS21000.h" |
ndnafzig | 12:2dde21ae53c4 | 7 | #include "RegisterWriter/RegisterWriter/rohm_hal2.h" |
ndnafzig | 12:2dde21ae53c4 | 8 | #include "rohm-bh1790glc-driver/bh1790glc_registers.h" |
ndnafzig | 12:2dde21ae53c4 | 9 | #include "rohm-bh1790glc-driver/bh1790glc.h" |
andcor02 | 8:25138f7b9309 | 10 | |
ndnafzig | 12:2dde21ae53c4 | 11 | #define CloudIP "184.106.153.149" //Raw IP Address of ThingSpeak Cloud Server |
ndnafzig | 12:2dde21ae53c4 | 12 | #define SSID "SSID" |
ndnafzig | 12:2dde21ae53c4 | 13 | #define Password "Password" |
ndnafzig | 12:2dde21ae53c4 | 14 | |
ndnafzig | 12:2dde21ae53c4 | 15 | HCSR04 usensor1(D10,D11); //ECHO Pin=D11, TRIG Pin=D10 |
jamiedillion2019 | 10:e4b6bc6d9b07 | 16 | Serial pc(USBTX,USBRX); //Serial Communication with PC |
jamiedillion2019 | 10:e4b6bc6d9b07 | 17 | ESP8266 wifi(PTC17, PTC16, 115200); //Tx Pin:PTC17; Rx Pin:PTC17; Baud rate:115200 |
jamiedillion2019 | 10:e4b6bc6d9b07 | 18 | |
ndnafzig | 12:2dde21ae53c4 | 19 | I2C i2c(PTE25, PTE24); |
ndnafzig | 12:2dde21ae53c4 | 20 | FXOS8700QAccelerometer acc(i2c, FXOS8700CQ_SLAVE_ADDR1); // Configured for the FRDM-K64F with onboard sensors |
ndnafzig | 12:2dde21ae53c4 | 21 | FXOS8700QMagnetometer mag(i2c, FXOS8700CQ_SLAVE_ADDR1); |
ndnafzig | 12:2dde21ae53c4 | 22 | FXAS21000 gyro(D14,D15); |
ndnafzig | 12:2dde21ae53c4 | 23 | |
ndnafzig | 12:2dde21ae53c4 | 24 | I2C i2chm(I2C_SDA, I2C_SCL); |
ndnafzig | 12:2dde21ae53c4 | 25 | RegisterWriter i2c_rw(i2chm); |
ndnafzig | 12:2dde21ae53c4 | 26 | BH1790GLC bh1790glc(i2c_rw); |
ndnafzig | 12:2dde21ae53c4 | 27 | |
ndnafzig | 12:2dde21ae53c4 | 28 | DigitalOut buzzer(D7); |
ndnafzig | 12:2dde21ae53c4 | 29 | |
ndnafzig | 12:2dde21ae53c4 | 30 | int on = 1, off = 0; |
ndnafzig | 12:2dde21ae53c4 | 31 | |
ndnafzig | 12:2dde21ae53c4 | 32 | void wifi_send(void); //Connect and Push Data Channel to Cloud Server |
ndnafzig | 12:2dde21ae53c4 | 33 | void US_Sensor(void); //Take ultrasonic measurement and send to cloud |
ndnafzig | 12:2dde21ae53c4 | 34 | void Acc_Mag_Gyro(void); //Take measurements from acceleromter, magnetometer, and gyroscope and send to cloud |
ndnafzig | 12:2dde21ae53c4 | 35 | void Heart_Monitor(void); |
jamiedillion2019 | 10:e4b6bc6d9b07 | 36 | |
jamiedillion2019 | 10:e4b6bc6d9b07 | 37 | int num = 0; |
ndnafzig | 12:2dde21ae53c4 | 38 | char snd[255],rcv[1000]; //snd: send command to ESP8266, rcv: receive response from ESP8266 |
ndnafzig | 12:2dde21ae53c4 | 39 | |
ndnafzig | 12:2dde21ae53c4 | 40 | //Ultrasonic sensor variable |
ndnafzig | 12:2dde21ae53c4 | 41 | int distance1 = 100; |
ndnafzig | 12:2dde21ae53c4 | 42 | |
ndnafzig | 12:2dde21ae53c4 | 43 | //acc, mag, and gryo variables |
ndnafzig | 12:2dde21ae53c4 | 44 | float gyro_data[3]; |
ndnafzig | 12:2dde21ae53c4 | 45 | motion_data_units_t acc_data, mag_data; |
ndnafzig | 12:2dde21ae53c4 | 46 | motion_data_counts_t acc_raw, mag_raw; |
ndnafzig | 12:2dde21ae53c4 | 47 | float faX, faY, faZ, fmX, fmY, fmZ, tmp_float; |
ndnafzig | 12:2dde21ae53c4 | 48 | int16_t raX, raY, raZ, rmX, rmY, rmZ, tmp_int; |
ndnafzig | 12:2dde21ae53c4 | 49 | |
ndnafzig | 12:2dde21ae53c4 | 50 | //heart monitor variables |
ndnafzig | 12:2dde21ae53c4 | 51 | bool interval_elapsed; |
ndnafzig | 12:2dde21ae53c4 | 52 | Ticker ticker; |
ndnafzig | 12:2dde21ae53c4 | 53 | uint16_t data[2]; |
ndnafzig | 12:2dde21ae53c4 | 54 | |
ndnafzig | 12:2dde21ae53c4 | 55 | void timer_isr() |
ndnafzig | 12:2dde21ae53c4 | 56 | { |
ndnafzig | 12:2dde21ae53c4 | 57 | interval_elapsed = true; |
ndnafzig | 12:2dde21ae53c4 | 58 | } |
jakobjohn949 | 9:607ee6e92552 | 59 | |
andcor02 | 8:25138f7b9309 | 60 | int main() |
andcor02 | 8:25138f7b9309 | 61 | { |
ndnafzig | 12:2dde21ae53c4 | 62 | buzzer = off; |
jamiedillion2019 | 10:e4b6bc6d9b07 | 63 | pc.baud(115200); //Baud Rate of 115200 for Tera Term |
jamiedillion2019 | 10:e4b6bc6d9b07 | 64 | |
ndnafzig | 12:2dde21ae53c4 | 65 | acc.enable(); |
ndnafzig | 12:2dde21ae53c4 | 66 | mag.enable(); |
ndnafzig | 12:2dde21ae53c4 | 67 | |
ndnafzig | 12:2dde21ae53c4 | 68 | pc.baud(115200); |
ndnafzig | 12:2dde21ae53c4 | 69 | i2c.frequency(400000); |
ndnafzig | 12:2dde21ae53c4 | 70 | |
ndnafzig | 12:2dde21ae53c4 | 71 | int error; |
ndnafzig | 12:2dde21ae53c4 | 72 | |
ndnafzig | 12:2dde21ae53c4 | 73 | wait(0.1); |
ndnafzig | 12:2dde21ae53c4 | 74 | |
ndnafzig | 12:2dde21ae53c4 | 75 | do |
ndnafzig | 12:2dde21ae53c4 | 76 | { //until init OK. |
ndnafzig | 12:2dde21ae53c4 | 77 | error = bh1790glc.set_default_on(); |
ndnafzig | 12:2dde21ae53c4 | 78 | wait_ms(500); |
ndnafzig | 12:2dde21ae53c4 | 79 | wait_ms(200); |
ndnafzig | 12:2dde21ae53c4 | 80 | } |
ndnafzig | 12:2dde21ae53c4 | 81 | while (error); |
ndnafzig | 12:2dde21ae53c4 | 82 | |
ndnafzig | 12:2dde21ae53c4 | 83 | bh1790glc.set_default_on(); |
ndnafzig | 12:2dde21ae53c4 | 84 | |
ndnafzig | 12:2dde21ae53c4 | 85 | interval_elapsed = false; |
ndnafzig | 12:2dde21ae53c4 | 86 | ticker.attach(&timer_isr, 0.03125); //32Hz |
jamiedillion2019 | 10:e4b6bc6d9b07 | 87 | |
jamiedillion2019 | 10:e4b6bc6d9b07 | 88 | pc.printf("Initial Setup\r\n"); |
jamiedillion2019 | 10:e4b6bc6d9b07 | 89 | wifi.SetMode(1); //Set ESP mode to 1 |
jamiedillion2019 | 10:e4b6bc6d9b07 | 90 | wifi.RcvReply(rcv, 1000); //Receive a response from ESP |
jamiedillion2019 | 10:e4b6bc6d9b07 | 91 | pc.printf("%s\r", rcv); |
jamiedillion2019 | 10:e4b6bc6d9b07 | 92 | |
jamiedillion2019 | 10:e4b6bc6d9b07 | 93 | pc.printf("Connecting to WiFi\r\n"); //AP Setup Initialization |
ndnafzig | 12:2dde21ae53c4 | 94 | wifi.Join(SSID, Password); //Put your Wifi SSID followed by Password |
jamiedillion2019 | 10:e4b6bc6d9b07 | 95 | wifi.RcvReply(rcv, 1000); |
jamiedillion2019 | 10:e4b6bc6d9b07 | 96 | pc.printf("%s\n", rcv); |
ndnafzig | 12:2dde21ae53c4 | 97 | wait(2); |
jamiedillion2019 | 10:e4b6bc6d9b07 | 98 | |
jamiedillion2019 | 10:e4b6bc6d9b07 | 99 | wifi.GetIP(rcv); //Obtains an IP address from the AP |
jamiedillion2019 | 10:e4b6bc6d9b07 | 100 | |
jamiedillion2019 | 10:e4b6bc6d9b07 | 101 | while (1) |
jamiedillion2019 | 10:e4b6bc6d9b07 | 102 | { |
jamiedillion2019 | 10:e4b6bc6d9b07 | 103 | wifi_send(); |
jamiedillion2019 | 10:e4b6bc6d9b07 | 104 | |
ndnafzig | 12:2dde21ae53c4 | 105 | wait(1.0f); |
jamiedillion2019 | 10:e4b6bc6d9b07 | 106 | } |
jamiedillion2019 | 10:e4b6bc6d9b07 | 107 | } |
jamiedillion2019 | 10:e4b6bc6d9b07 | 108 | |
jamiedillion2019 | 10:e4b6bc6d9b07 | 109 | void wifi_send(void) |
jamiedillion2019 | 10:e4b6bc6d9b07 | 110 | { |
jamiedillion2019 | 10:e4b6bc6d9b07 | 111 | while(num<1000000000000) |
jamiedillion2019 | 10:e4b6bc6d9b07 | 112 | { |
jamiedillion2019 | 10:e4b6bc6d9b07 | 113 | num=num+1; |
ndnafzig | 12:2dde21ae53c4 | 114 | pc.printf("\nSyncing to Thingspeak #: %d\n\r", num); |
ndnafzig | 12:2dde21ae53c4 | 115 | |
ndnafzig | 12:2dde21ae53c4 | 116 | US_Sensor(); |
ndnafzig | 12:2dde21ae53c4 | 117 | |
ndnafzig | 12:2dde21ae53c4 | 118 | Acc_Mag_Gyro(); |
jamiedillion2019 | 10:e4b6bc6d9b07 | 119 | |
ndnafzig | 12:2dde21ae53c4 | 120 | Heart_Monitor(); |
ndnafzig | 12:2dde21ae53c4 | 121 | } |
ndnafzig | 12:2dde21ae53c4 | 122 | } |
ndnafzig | 12:2dde21ae53c4 | 123 | |
ndnafzig | 12:2dde21ae53c4 | 124 | void US_Sensor(void) |
ndnafzig | 12:2dde21ae53c4 | 125 | { |
jamiedillion2019 | 10:e4b6bc6d9b07 | 126 | //Ultrasound Sensor (HC-SR04) #1 Initialization |
ndnafzig | 12:2dde21ae53c4 | 127 | usensor1.start(); |
ndnafzig | 12:2dde21ae53c4 | 128 | wait_ms(100); |
jakobjohn949 | 9:607ee6e92552 | 129 | |
jamiedillion2019 | 10:e4b6bc6d9b07 | 130 | //Calculating Distance Percentage Remaining for Sensor # 1 |
ndnafzig | 12:2dde21ae53c4 | 131 | distance1 = usensor1.get_dist_cm(); |
jamiedillion2019 | 10:e4b6bc6d9b07 | 132 | |
jamiedillion2019 | 10:e4b6bc6d9b07 | 133 | //Sending Data to the Cloud Server via ESP8266 WiFi Module |
ndnafzig | 12:2dde21ae53c4 | 134 | strcpy(snd,"AT+CIPMUX=0\n\r"); //AT+CIPMUX: Enabling Single Channel Mode |
ndnafzig | 12:2dde21ae53c4 | 135 | wifi.SendCMD(snd); |
ndnafzig | 12:2dde21ae53c4 | 136 | wait(0.1); |
ndnafzig | 12:2dde21ae53c4 | 137 | wifi.RcvReply(rcv, 1000); |
ndnafzig | 12:2dde21ae53c4 | 138 | wait(0.1); |
jamiedillion2019 | 10:e4b6bc6d9b07 | 139 | |
jamiedillion2019 | 10:e4b6bc6d9b07 | 140 | //Establish TCP connection w/ Cloud Server |
ndnafzig | 12:2dde21ae53c4 | 141 | sprintf(snd,"AT+CIPSTART=4,\"TCP\",\"%s\",80\n",CloudIP); |
ndnafzig | 12:2dde21ae53c4 | 142 | wait(0.1); |
ndnafzig | 12:2dde21ae53c4 | 143 | wifi.RcvReply(rcv, 1000); |
ndnafzig | 12:2dde21ae53c4 | 144 | wait(0.1); |
ndnafzig | 12:2dde21ae53c4 | 145 | |
ndnafzig | 12:2dde21ae53c4 | 146 | //Set length of the data that will be sent |
ndnafzig | 12:2dde21ae53c4 | 147 | strcpy(snd,"AT+CIPSEND=100\n\r"); |
ndnafzig | 12:2dde21ae53c4 | 148 | wifi.SendCMD(snd); |
ndnafzig | 12:2dde21ae53c4 | 149 | pc.printf("%s\r", rcv); |
ndnafzig | 12:2dde21ae53c4 | 150 | wait(0.1); |
ndnafzig | 12:2dde21ae53c4 | 151 | wifi.RcvReply(rcv, 1000); |
ndnafzig | 12:2dde21ae53c4 | 152 | pc.printf("%s\r", rcv); |
ndnafzig | 12:2dde21ae53c4 | 153 | wait(0.1); |
ndnafzig | 12:2dde21ae53c4 | 154 | |
ndnafzig | 12:2dde21ae53c4 | 155 | //Pushing the data acquired from HC-SR04 Ultrasonic Sensor to Cloud Server via API |
ndnafzig | 12:2dde21ae53c4 | 156 | sprintf(snd,"\rhttps://api.thingspeak.com/update?api_key=MR7SIH7MSC5KIIH0&field1=%d\r", distance1); |
ndnafzig | 12:2dde21ae53c4 | 157 | printf("Distance from Object: %dcm\n\r", distance1); |
ndnafzig | 12:2dde21ae53c4 | 158 | |
ndnafzig | 12:2dde21ae53c4 | 159 | |
ndnafzig | 12:2dde21ae53c4 | 160 | |
ndnafzig | 12:2dde21ae53c4 | 161 | if(distance1 < 6) |
ndnafzig | 12:2dde21ae53c4 | 162 | { |
ndnafzig | 12:2dde21ae53c4 | 163 | buzzer = on; |
ndnafzig | 12:2dde21ae53c4 | 164 | wait(.3); |
ndnafzig | 12:2dde21ae53c4 | 165 | buzzer = off; |
ndnafzig | 12:2dde21ae53c4 | 166 | wait(0.3); |
ndnafzig | 12:2dde21ae53c4 | 167 | buzzer = on; |
ndnafzig | 12:2dde21ae53c4 | 168 | wait(0.3); |
ndnafzig | 12:2dde21ae53c4 | 169 | buzzer = off; |
ndnafzig | 12:2dde21ae53c4 | 170 | wait(0.3); |
ndnafzig | 12:2dde21ae53c4 | 171 | buzzer = on; |
ndnafzig | 12:2dde21ae53c4 | 172 | wait(0.3); |
ndnafzig | 12:2dde21ae53c4 | 173 | buzzer = off; |
ndnafzig | 12:2dde21ae53c4 | 174 | } |
ndnafzig | 12:2dde21ae53c4 | 175 | |
ndnafzig | 12:2dde21ae53c4 | 176 | wifi.SendCMD(snd); |
ndnafzig | 12:2dde21ae53c4 | 177 | pc.printf("%s\r",snd); |
ndnafzig | 12:2dde21ae53c4 | 178 | wait(0.1); |
ndnafzig | 12:2dde21ae53c4 | 179 | wifi.RcvReply(rcv, 1000); |
ndnafzig | 12:2dde21ae53c4 | 180 | pc.printf("%s\r", rcv); |
ndnafzig | 12:2dde21ae53c4 | 181 | } |
ndnafzig | 12:2dde21ae53c4 | 182 | |
ndnafzig | 12:2dde21ae53c4 | 183 | void Acc_Mag_Gyro(void) |
ndnafzig | 12:2dde21ae53c4 | 184 | { |
ndnafzig | 12:2dde21ae53c4 | 185 | //counts based results |
ndnafzig | 12:2dde21ae53c4 | 186 | acc.getAxis(acc_raw); |
ndnafzig | 12:2dde21ae53c4 | 187 | mag.getAxis(mag_raw); |
ndnafzig | 12:2dde21ae53c4 | 188 | acc.getX(raX); |
ndnafzig | 12:2dde21ae53c4 | 189 | acc.getY(raY); |
ndnafzig | 12:2dde21ae53c4 | 190 | acc.getZ(raZ); |
ndnafzig | 12:2dde21ae53c4 | 191 | mag.getX(rmX); |
ndnafzig | 12:2dde21ae53c4 | 192 | mag.getY(rmY); |
ndnafzig | 12:2dde21ae53c4 | 193 | mag.getZ(rmZ); |
ndnafzig | 12:2dde21ae53c4 | 194 | |
ndnafzig | 12:2dde21ae53c4 | 195 | //unit based results |
ndnafzig | 12:2dde21ae53c4 | 196 | acc.getAxis(acc_data); |
ndnafzig | 12:2dde21ae53c4 | 197 | mag.getAxis(mag_data); |
ndnafzig | 12:2dde21ae53c4 | 198 | acc.getX(faX); |
ndnafzig | 12:2dde21ae53c4 | 199 | acc.getY(faY); |
ndnafzig | 12:2dde21ae53c4 | 200 | acc.getZ(faZ); |
ndnafzig | 12:2dde21ae53c4 | 201 | mag.getX(fmX); |
ndnafzig | 12:2dde21ae53c4 | 202 | mag.getY(fmY); |
ndnafzig | 12:2dde21ae53c4 | 203 | mag.getZ(fmZ); |
ndnafzig | 12:2dde21ae53c4 | 204 | pc.printf("Acellerometer: X=%1.4fY=%1.4fZ=%1.4f\n\r", acc.getX(faX),acc.getY(faY),acc.getZ(faZ)); |
ndnafzig | 12:2dde21ae53c4 | 205 | pc.printf("Magnetometer: X=%4.1fY=%4.1fZ=%4.1f\n\r", mag.getX(fmX),mag.getY(fmY), mag.getZ(fmZ)); |
ndnafzig | 12:2dde21ae53c4 | 206 | gyro.ReadXYZ(gyro_data); |
ndnafzig | 12:2dde21ae53c4 | 207 | pc.printf("Gyro: X=%6.2f Y=%6.2f Z=%6.2f\n\r", gyro_data[0],gyro_data[1], gyro_data[2]); |
ndnafzig | 12:2dde21ae53c4 | 208 | wait(0.5f); |
ndnafzig | 12:2dde21ae53c4 | 209 | |
ndnafzig | 12:2dde21ae53c4 | 210 | //Sending Data to the Cloud Server via ESP8266 WiFi Module |
ndnafzig | 12:2dde21ae53c4 | 211 | strcpy(snd,"AT+CIPMUX=0\n\r"); //AT+CIPMUX: Enabling Single Channel Mode |
ndnafzig | 12:2dde21ae53c4 | 212 | wifi.SendCMD(snd); |
ndnafzig | 12:2dde21ae53c4 | 213 | wait(0.1); |
ndnafzig | 12:2dde21ae53c4 | 214 | wifi.RcvReply(rcv, 1000); |
ndnafzig | 12:2dde21ae53c4 | 215 | wait(0.1); |
ndnafzig | 12:2dde21ae53c4 | 216 | |
ndnafzig | 12:2dde21ae53c4 | 217 | //Establish TCP connection w/ Cloud Server |
ndnafzig | 12:2dde21ae53c4 | 218 | sprintf(snd,"AT+CIPSTART=4,\"TCP\",\"%s\",80\n",CloudIP); |
ndnafzig | 12:2dde21ae53c4 | 219 | wait(0.1); |
ndnafzig | 12:2dde21ae53c4 | 220 | wifi.RcvReply(rcv, 1000); |
ndnafzig | 12:2dde21ae53c4 | 221 | wait(0.1); |
jamiedillion2019 | 10:e4b6bc6d9b07 | 222 | |
jamiedillion2019 | 10:e4b6bc6d9b07 | 223 | //Set length of the data that will be sent |
ndnafzig | 12:2dde21ae53c4 | 224 | strcpy(snd,"AT+CIPSEND=100\n\r"); |
ndnafzig | 12:2dde21ae53c4 | 225 | wifi.SendCMD(snd); |
ndnafzig | 12:2dde21ae53c4 | 226 | pc.printf("%s\r", rcv); |
ndnafzig | 12:2dde21ae53c4 | 227 | wait(0.1); |
ndnafzig | 12:2dde21ae53c4 | 228 | wifi.RcvReply(rcv, 1000); |
ndnafzig | 12:2dde21ae53c4 | 229 | pc.printf("%s\r", rcv); |
ndnafzig | 12:2dde21ae53c4 | 230 | wait(0.1); |
jamiedillion2019 | 10:e4b6bc6d9b07 | 231 | |
ndnafzig | 12:2dde21ae53c4 | 232 | //Pushing the data acquired from Acc to Cloud Server via API |
ndnafzig | 12:2dde21ae53c4 | 233 | //Sends only X data for simplicity of testing purposes |
ndnafzig | 12:2dde21ae53c4 | 234 | sprintf(snd,"\rhttps://api.thingspeak.com/update?api_key=MR7SIH7MSC5KIIH0&field2=%f\r", acc.getX(faX)); |
ndnafzig | 12:2dde21ae53c4 | 235 | printf("Current X Acceleration: %f\n\r", acc.getX(faX)); |
ndnafzig | 12:2dde21ae53c4 | 236 | wifi.SendCMD(snd); |
ndnafzig | 12:2dde21ae53c4 | 237 | pc.printf("%s\r",snd); |
ndnafzig | 12:2dde21ae53c4 | 238 | wait(0.1); |
ndnafzig | 12:2dde21ae53c4 | 239 | wifi.RcvReply(rcv, 1000); |
ndnafzig | 12:2dde21ae53c4 | 240 | pc.printf("%s\r", rcv); |
ndnafzig | 12:2dde21ae53c4 | 241 | |
ndnafzig | 12:2dde21ae53c4 | 242 | //Pushing the data acquired from Mag to Cloud Server via API |
ndnafzig | 12:2dde21ae53c4 | 243 | //Sends only X data for simplicity of testing purposes |
ndnafzig | 12:2dde21ae53c4 | 244 | sprintf(snd,"\rhttps://api.thingspeak.com/update?api_key=MR7SIH7MSC5KIIH0&field3=%f\r", mag.getX(fmX)); |
ndnafzig | 12:2dde21ae53c4 | 245 | printf("Current X Position: %f\n\r", mag.getX(fmX)); |
ndnafzig | 12:2dde21ae53c4 | 246 | wifi.SendCMD(snd); |
ndnafzig | 12:2dde21ae53c4 | 247 | pc.printf("%s\r",snd); |
ndnafzig | 12:2dde21ae53c4 | 248 | wait(0.1); |
ndnafzig | 12:2dde21ae53c4 | 249 | wifi.RcvReply(rcv, 1000); |
ndnafzig | 12:2dde21ae53c4 | 250 | pc.printf("%s\r", rcv); |
ndnafzig | 12:2dde21ae53c4 | 251 | |
ndnafzig | 12:2dde21ae53c4 | 252 | //Pushing the data acquired from Gyro to Cloud Server via API |
ndnafzig | 12:2dde21ae53c4 | 253 | //Sends only X data for simplicity of testing purposes |
ndnafzig | 12:2dde21ae53c4 | 254 | sprintf(snd,"\rhttps://api.thingspeak.com/update?api_key=MR7SIH7MSC5KIIH0&field4=%f\r", gyro_data[0]); |
ndnafzig | 12:2dde21ae53c4 | 255 | printf("Current X Orientation: %f\n\r", gyro_data[0]); |
ndnafzig | 12:2dde21ae53c4 | 256 | wifi.SendCMD(snd); |
ndnafzig | 12:2dde21ae53c4 | 257 | pc.printf("%s\r",snd); |
ndnafzig | 12:2dde21ae53c4 | 258 | wait(0.1); |
ndnafzig | 12:2dde21ae53c4 | 259 | wifi.RcvReply(rcv, 1000); |
ndnafzig | 12:2dde21ae53c4 | 260 | pc.printf("%s\r", rcv); |
ndnafzig | 12:2dde21ae53c4 | 261 | } |
ndnafzig | 12:2dde21ae53c4 | 262 | |
ndnafzig | 12:2dde21ae53c4 | 263 | void Heart_Monitor(void) |
ndnafzig | 12:2dde21ae53c4 | 264 | { |
ndnafzig | 12:2dde21ae53c4 | 265 | int i = 0; |
ndnafzig | 12:2dde21ae53c4 | 266 | int sum = 0; |
ndnafzig | 12:2dde21ae53c4 | 267 | int count = 0; |
ndnafzig | 12:2dde21ae53c4 | 268 | float average = 0; |
ndnafzig | 12:2dde21ae53c4 | 269 | int error; |
ndnafzig | 12:2dde21ae53c4 | 270 | |
ndnafzig | 12:2dde21ae53c4 | 271 | wait_ms(500); |
ndnafzig | 12:2dde21ae53c4 | 272 | |
ndnafzig | 12:2dde21ae53c4 | 273 | while(i < 10) |
ndnafzig | 12:2dde21ae53c4 | 274 | { |
ndnafzig | 12:2dde21ae53c4 | 275 | if (interval_elapsed) //Wait until ISR |
ndnafzig | 12:2dde21ae53c4 | 276 | { |
ndnafzig | 12:2dde21ae53c4 | 277 | error = bh1790glc.getresults(data); |
ndnafzig | 12:2dde21ae53c4 | 278 | |
ndnafzig | 12:2dde21ae53c4 | 279 | if (!error) |
ndnafzig | 12:2dde21ae53c4 | 280 | { |
ndnafzig | 12:2dde21ae53c4 | 281 | //get data, print to serial, update flags |
ndnafzig | 12:2dde21ae53c4 | 282 | pc.printf("%d, \t%d\n\r", data[1], data[0]); |
ndnafzig | 12:2dde21ae53c4 | 283 | interval_elapsed = false; |
ndnafzig | 12:2dde21ae53c4 | 284 | i++; |
ndnafzig | 12:2dde21ae53c4 | 285 | sum += data[1]; |
ndnafzig | 12:2dde21ae53c4 | 286 | count++; |
ndnafzig | 12:2dde21ae53c4 | 287 | } |
ndnafzig | 12:2dde21ae53c4 | 288 | } |
ndnafzig | 12:2dde21ae53c4 | 289 | } |
ndnafzig | 12:2dde21ae53c4 | 290 | |
ndnafzig | 12:2dde21ae53c4 | 291 | average = sum/10; |
ndnafzig | 12:2dde21ae53c4 | 292 | |
ndnafzig | 12:2dde21ae53c4 | 293 | if(average > 3500) |
ndnafzig | 12:2dde21ae53c4 | 294 | { |
ndnafzig | 12:2dde21ae53c4 | 295 | buzzer = on; |
ndnafzig | 12:2dde21ae53c4 | 296 | wait(.1); |
ndnafzig | 12:2dde21ae53c4 | 297 | buzzer = off; |
ndnafzig | 12:2dde21ae53c4 | 298 | wait(0.1); |
ndnafzig | 12:2dde21ae53c4 | 299 | buzzer = on; |
ndnafzig | 12:2dde21ae53c4 | 300 | wait(0.1); |
ndnafzig | 12:2dde21ae53c4 | 301 | buzzer = off; |
ndnafzig | 12:2dde21ae53c4 | 302 | wait(0.1); |
ndnafzig | 12:2dde21ae53c4 | 303 | buzzer = on; |
ndnafzig | 12:2dde21ae53c4 | 304 | wait(.1); |
ndnafzig | 12:2dde21ae53c4 | 305 | buzzer = off; |
ndnafzig | 12:2dde21ae53c4 | 306 | wait(0.1); |
ndnafzig | 12:2dde21ae53c4 | 307 | buzzer = on; |
ndnafzig | 12:2dde21ae53c4 | 308 | wait(0.1); |
ndnafzig | 12:2dde21ae53c4 | 309 | buzzer = off; |
ndnafzig | 12:2dde21ae53c4 | 310 | wait(0.1); |
ndnafzig | 12:2dde21ae53c4 | 311 | buzzer = on; |
ndnafzig | 12:2dde21ae53c4 | 312 | wait(.1); |
ndnafzig | 12:2dde21ae53c4 | 313 | buzzer = off; |
ndnafzig | 12:2dde21ae53c4 | 314 | wait(0.1); |
ndnafzig | 12:2dde21ae53c4 | 315 | buzzer = on; |
ndnafzig | 12:2dde21ae53c4 | 316 | wait(0.1); |
ndnafzig | 12:2dde21ae53c4 | 317 | buzzer = off; |
andcor02 | 8:25138f7b9309 | 318 | } |
ndnafzig | 12:2dde21ae53c4 | 319 | |
ndnafzig | 12:2dde21ae53c4 | 320 | //Sending Data to the Cloud Server via ESP8266 WiFi Module |
ndnafzig | 12:2dde21ae53c4 | 321 | strcpy(snd,"AT+CIPMUX=0\n\r"); //AT+CIPMUX: Enabling Single Channel Mode |
ndnafzig | 12:2dde21ae53c4 | 322 | wifi.SendCMD(snd); |
ndnafzig | 12:2dde21ae53c4 | 323 | wait(0.1); |
ndnafzig | 12:2dde21ae53c4 | 324 | wifi.RcvReply(rcv, 1000); |
ndnafzig | 12:2dde21ae53c4 | 325 | wait(0.1); |
ndnafzig | 12:2dde21ae53c4 | 326 | |
ndnafzig | 12:2dde21ae53c4 | 327 | //Establish TCP connection w/ Cloud Server |
ndnafzig | 12:2dde21ae53c4 | 328 | sprintf(snd,"AT+CIPSTART=4,\"TCP\",\"%s\",80\n",CloudIP); |
ndnafzig | 12:2dde21ae53c4 | 329 | wait(0.1); |
ndnafzig | 12:2dde21ae53c4 | 330 | wifi.RcvReply(rcv, 1000); |
ndnafzig | 12:2dde21ae53c4 | 331 | wait(0.1); |
ndnafzig | 12:2dde21ae53c4 | 332 | |
ndnafzig | 12:2dde21ae53c4 | 333 | //Set length of the data that will be sent |
ndnafzig | 12:2dde21ae53c4 | 334 | strcpy(snd,"AT+CIPSEND=100\n\r"); |
ndnafzig | 12:2dde21ae53c4 | 335 | wifi.SendCMD(snd); |
ndnafzig | 12:2dde21ae53c4 | 336 | pc.printf("%s\r", rcv); |
ndnafzig | 12:2dde21ae53c4 | 337 | wait(0.1); |
ndnafzig | 12:2dde21ae53c4 | 338 | wifi.RcvReply(rcv, 1000); |
ndnafzig | 12:2dde21ae53c4 | 339 | pc.printf("%s\r", rcv); |
ndnafzig | 12:2dde21ae53c4 | 340 | wait(0.1); |
ndnafzig | 12:2dde21ae53c4 | 341 | |
ndnafzig | 12:2dde21ae53c4 | 342 | //Pushing the data acquired from heart monitor to Cloud Server via API |
ndnafzig | 12:2dde21ae53c4 | 343 | //Sends only X data for simplicity of testing purposes |
ndnafzig | 12:2dde21ae53c4 | 344 | sprintf(snd,"\rhttps://api.thingspeak.com/update?api_key=MR7SIH7MSC5KIIH0&field5=%f\r", average); |
ndnafzig | 12:2dde21ae53c4 | 345 | printf("Current average heart rate: %f\n\r", average); |
ndnafzig | 12:2dde21ae53c4 | 346 | wifi.SendCMD(snd); |
ndnafzig | 12:2dde21ae53c4 | 347 | pc.printf("%s\r",snd); |
ndnafzig | 12:2dde21ae53c4 | 348 | wait(0.1); |
ndnafzig | 12:2dde21ae53c4 | 349 | wifi.RcvReply(rcv, 1000); |
ndnafzig | 12:2dde21ae53c4 | 350 | pc.printf("%s\r", rcv); |
ndnafzig | 12:2dde21ae53c4 | 351 | } |