Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed
main.cpp@1:417090fd8386, 2019-04-14 (annotated)
- Committer:
- tatsuyanah
- Date:
- Sun Apr 14 02:07:37 2019 +0000
- Revision:
- 1:417090fd8386
- Parent:
- 0:c837d6abadc5
SECOND
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| tatsuyanah | 0:c837d6abadc5 | 1 | // ESP8266 Static page WEB server to control Mbed |
| tatsuyanah | 0:c837d6abadc5 | 2 | |
| tatsuyanah | 0:c837d6abadc5 | 3 | #include "mbed.h" |
| tatsuyanah | 0:c837d6abadc5 | 4 | #include "algorithm.h" |
| tatsuyanah | 0:c837d6abadc5 | 5 | #include "MAX30102.h" |
| tatsuyanah | 1:417090fd8386 | 6 | #include "MAX30101.h" |
| tatsuyanah | 0:c837d6abadc5 | 7 | |
| tatsuyanah | 0:c837d6abadc5 | 8 | #define MAX_BRIGHTNESS 255 |
| tatsuyanah | 0:c837d6abadc5 | 9 | Serial pc(USBTX, USBRX); |
| tatsuyanah | 1:417090fd8386 | 10 | Serial esp(p13, p14); |
| tatsuyanah | 0:c837d6abadc5 | 11 | //Serial esp(p28, p27); // tx, rx |
| tatsuyanah | 0:c837d6abadc5 | 12 | |
| tatsuyanah | 0:c837d6abadc5 | 13 | |
| tatsuyanah | 0:c837d6abadc5 | 14 | // Standard Mbed LED definitions |
| tatsuyanah | 0:c837d6abadc5 | 15 | DigitalOut led1(LED1); |
| tatsuyanah | 0:c837d6abadc5 | 16 | DigitalOut led2(LED2); |
| tatsuyanah | 0:c837d6abadc5 | 17 | DigitalOut led3(LED3); |
| tatsuyanah | 0:c837d6abadc5 | 18 | DigitalOut led4(LED4); |
| tatsuyanah | 0:c837d6abadc5 | 19 | |
| tatsuyanah | 0:c837d6abadc5 | 20 | // some test values to show on web page |
| tatsuyanah | 0:c837d6abadc5 | 21 | AnalogIn Ain1(p18); |
| tatsuyanah | 1:417090fd8386 | 22 | AnalogIn LM35B(p19); |
| tatsuyanah | 1:417090fd8386 | 23 | AnalogIn LM35A(p20); |
| tatsuyanah | 1:417090fd8386 | 24 | DigitalIn INT(p8); |
| tatsuyanah | 1:417090fd8386 | 25 | DigitalIn INT1(p7); |
| tatsuyanah | 0:c837d6abadc5 | 26 | /* |
| tatsuyanah | 0:c837d6abadc5 | 27 | char ssid[32] = "hsd"; // enter WiFi router ssid inside the quotes |
| tatsuyanah | 0:c837d6abadc5 | 28 | char pwd [32] = "austin123"; // enter WiFi router password inside the quotes |
| tatsuyanah | 0:c837d6abadc5 | 29 | */ |
| tatsuyanah | 0:c837d6abadc5 | 30 | |
| tatsuyanah | 0:c837d6abadc5 | 31 | uint32_t aun_ir_buffer[500]; //IR LED sensor data |
| tatsuyanah | 0:c837d6abadc5 | 32 | int32_t n_ir_buffer_length; //data length |
| tatsuyanah | 0:c837d6abadc5 | 33 | uint32_t aun_red_buffer[500]; //Red LED sensor data |
| tatsuyanah | 0:c837d6abadc5 | 34 | int32_t n_sp02; //SPO2 value |
| tatsuyanah | 0:c837d6abadc5 | 35 | int8_t ch_spo2_valid; //indicator to show if the SP02 calculation is valid |
| tatsuyanah | 0:c837d6abadc5 | 36 | int32_t n_heart_rate; //heart rate value |
| tatsuyanah | 0:c837d6abadc5 | 37 | int8_t ch_hr_valid; //indicator to show if the heart rate calculation is valid |
| tatsuyanah | 0:c837d6abadc5 | 38 | uint8_t uch_dummy; |
| tatsuyanah | 1:417090fd8386 | 39 | |
| tatsuyanah | 1:417090fd8386 | 40 | uint32_t aun_ir_buffer1[500]; //IR LED sensor data |
| tatsuyanah | 1:417090fd8386 | 41 | int32_t n_ir_buffer_length1; //data length |
| tatsuyanah | 1:417090fd8386 | 42 | uint32_t aun_red_buffer1[500]; //Red LED sensor data |
| tatsuyanah | 1:417090fd8386 | 43 | int32_t n_sp021; //SPO2 value |
| tatsuyanah | 1:417090fd8386 | 44 | int8_t ch_spo2_valid1; //indicator to show if the SP02 calculation is valid |
| tatsuyanah | 1:417090fd8386 | 45 | int32_t n_heart_rate1; //heart rate value |
| tatsuyanah | 1:417090fd8386 | 46 | int8_t ch_hr_valid1; //indicator to show if the heart rate calculation is valid |
| tatsuyanah | 1:417090fd8386 | 47 | uint8_t uch_dummy1; |
| tatsuyanah | 1:417090fd8386 | 48 | |
| tatsuyanah | 1:417090fd8386 | 49 | |
| tatsuyanah | 0:c837d6abadc5 | 50 | char uploadTimeOut=1; |
| tatsuyanah | 0:c837d6abadc5 | 51 | Timer timer1second; |
| tatsuyanah | 0:c837d6abadc5 | 52 | |
| tatsuyanah | 0:c837d6abadc5 | 53 | float temperature, AdcIn, Ht; |
| tatsuyanah | 0:c837d6abadc5 | 54 | float R1=100000, R2=10000; // resistor values to give a 10:1 reduction of measured AnalogIn voltage |
| tatsuyanah | 0:c837d6abadc5 | 55 | char Vcc[10]; |
| tatsuyanah | 1:417090fd8386 | 56 | char TempA[10]; |
| tatsuyanah | 1:417090fd8386 | 57 | char TempB[10]; |
| tatsuyanah | 0:c837d6abadc5 | 58 | char Null[10]; |
| tatsuyanah | 0:c837d6abadc5 | 59 | |
| tatsuyanah | 1:417090fd8386 | 60 | float f_temp; |
| tatsuyanah | 1:417090fd8386 | 61 | uint32_t un_min, un_max, un_prev_data; //variables to calculate the on-board LED brightness that reflects the heartbeats |
| tatsuyanah | 1:417090fd8386 | 62 | |
| tatsuyanah | 1:417090fd8386 | 63 | float f_temp1; |
| tatsuyanah | 1:417090fd8386 | 64 | uint32_t un_min1, un_max1, un_prev_data1; //variables to calculate the on-board LED brightness that reflects the heartbeats |
| tatsuyanah | 1:417090fd8386 | 65 | int i1; |
| tatsuyanah | 1:417090fd8386 | 66 | int32_t n_brightness1; |
| tatsuyanah | 1:417090fd8386 | 67 | |
| tatsuyanah | 1:417090fd8386 | 68 | int i; |
| tatsuyanah | 1:417090fd8386 | 69 | int32_t n_brightness; |
| tatsuyanah | 1:417090fd8386 | 70 | |
| tatsuyanah | 0:c837d6abadc5 | 71 | // things for sending/receiving data over serial |
| tatsuyanah | 0:c837d6abadc5 | 72 | volatile int tx_in=0; |
| tatsuyanah | 0:c837d6abadc5 | 73 | volatile int tx_out=0; |
| tatsuyanah | 0:c837d6abadc5 | 74 | volatile int rx_in=0; |
| tatsuyanah | 0:c837d6abadc5 | 75 | volatile int rx_out=0; |
| tatsuyanah | 0:c837d6abadc5 | 76 | const int buffer_size = 4095; |
| tatsuyanah | 0:c837d6abadc5 | 77 | char tx_buffer[buffer_size+1]; |
| tatsuyanah | 0:c837d6abadc5 | 78 | char rx_buffer[buffer_size+1]; |
| tatsuyanah | 0:c837d6abadc5 | 79 | void Tx_interrupt(); |
| tatsuyanah | 0:c837d6abadc5 | 80 | void Rx_interrupt(); |
| tatsuyanah | 0:c837d6abadc5 | 81 | void send_line(); |
| tatsuyanah | 0:c837d6abadc5 | 82 | void read_line(); |
| tatsuyanah | 0:c837d6abadc5 | 83 | |
| tatsuyanah | 0:c837d6abadc5 | 84 | int DataRX; |
| tatsuyanah | 0:c837d6abadc5 | 85 | int update; |
| tatsuyanah | 0:c837d6abadc5 | 86 | int count; |
| tatsuyanah | 0:c837d6abadc5 | 87 | char cmdbuff[1024]; |
| tatsuyanah | 0:c837d6abadc5 | 88 | char replybuff[4096]; |
| tatsuyanah | 0:c837d6abadc5 | 89 | char webdata[4096]; // This may need to be bigger depending on WEB browser used |
| tatsuyanah | 0:c837d6abadc5 | 90 | char webbuff[4096]; // Currently using 1986 characters, Increase this if more web page data added |
| tatsuyanah | 0:c837d6abadc5 | 91 | char timebuf[30]; |
| tatsuyanah | 0:c837d6abadc5 | 92 | void SendCMD(),getreply(),ReadWebData(),startserver(); |
| tatsuyanah | 0:c837d6abadc5 | 93 | void gettime(),setRTC(),gettemp(),getbattery(); |
| tatsuyanah | 0:c837d6abadc5 | 94 | char rx_line[1024]; |
| tatsuyanah | 0:c837d6abadc5 | 95 | int port =80; // set server port |
| tatsuyanah | 0:c837d6abadc5 | 96 | int SERVtimeout =5; // set server timeout in seconds in case link breaks. |
| tatsuyanah | 0:c837d6abadc5 | 97 | struct tm t; |
| tatsuyanah | 0:c837d6abadc5 | 98 | // manual set RTC values |
| tatsuyanah | 0:c837d6abadc5 | 99 | int minute =20; // 0-59 |
| tatsuyanah | 0:c837d6abadc5 | 100 | int hour =11; // 2-23 |
| tatsuyanah | 0:c837d6abadc5 | 101 | int dayofmonth =13; // 1-31 |
| tatsuyanah | 0:c837d6abadc5 | 102 | int month =4; // 1-12 |
| tatsuyanah | 0:c837d6abadc5 | 103 | int year =19; // last 2 digits |
| tatsuyanah | 0:c837d6abadc5 | 104 | |
| tatsuyanah | 1:417090fd8386 | 105 | void gettemp() |
| tatsuyanah | 0:c837d6abadc5 | 106 | { |
| tatsuyanah | 1:417090fd8386 | 107 | float temp_C , temp_F, average[10], averageTemp; |
| tatsuyanah | 1:417090fd8386 | 108 | float tempB_C , tempB_F, averageB[10], averageTempB; |
| tatsuyanah | 1:417090fd8386 | 109 | int index; |
| tatsuyanah | 0:c837d6abadc5 | 110 | |
| tatsuyanah | 1:417090fd8386 | 111 | averageTemp=0; |
| tatsuyanah | 1:417090fd8386 | 112 | for(index=0; index<10; index++) |
| tatsuyanah | 1:417090fd8386 | 113 | { |
| tatsuyanah | 1:417090fd8386 | 114 | average[index]=LM35A.read(); |
| tatsuyanah | 1:417090fd8386 | 115 | //wait(0.02); |
| tatsuyanah | 1:417090fd8386 | 116 | } |
| tatsuyanah | 1:417090fd8386 | 117 | for(index=0; index<10; index++) |
| tatsuyanah | 1:417090fd8386 | 118 | { |
| tatsuyanah | 1:417090fd8386 | 119 | averageTemp = (averageTemp +(average[index]/10)); |
| tatsuyanah | 1:417090fd8386 | 120 | } |
| tatsuyanah | 1:417090fd8386 | 121 | temp_C=(averageTemp*3.685*100); |
| tatsuyanah | 1:417090fd8386 | 122 | temp_F=(((9.0*temp_C)/5.0) + 32.0); |
| tatsuyanah | 1:417090fd8386 | 123 | sprintf(TempA,"%2.3f",temp_C); |
| tatsuyanah | 1:417090fd8386 | 124 | |
| tatsuyanah | 1:417090fd8386 | 125 | averageTempB=0; |
| tatsuyanah | 1:417090fd8386 | 126 | for(index=0; index<10; index++) |
| tatsuyanah | 1:417090fd8386 | 127 | { |
| tatsuyanah | 1:417090fd8386 | 128 | average[index]=LM35B.read(); |
| tatsuyanah | 1:417090fd8386 | 129 | //wait(0.02); |
| tatsuyanah | 1:417090fd8386 | 130 | } |
| tatsuyanah | 1:417090fd8386 | 131 | for(index=0; index<10; index++) |
| tatsuyanah | 1:417090fd8386 | 132 | { |
| tatsuyanah | 1:417090fd8386 | 133 | averageTempB = (averageTempB +(averageB[index]/10)); |
| tatsuyanah | 1:417090fd8386 | 134 | } |
| tatsuyanah | 1:417090fd8386 | 135 | tempB_C=(averageTempB*3.685*100); |
| tatsuyanah | 1:417090fd8386 | 136 | tempB_F=(((9.0*tempB_C)/5.0) + 32.0); |
| tatsuyanah | 1:417090fd8386 | 137 | sprintf(TempB,"%2.3f",tempB_C); |
| tatsuyanah | 1:417090fd8386 | 138 | |
| tatsuyanah | 1:417090fd8386 | 139 | pc.printf("Temperature of Patient 1 is %.2f C, %.2f F \n\r ", temp_C,temp_F); |
| tatsuyanah | 1:417090fd8386 | 140 | pc.printf("Temperature of Patient 1 is %.2f C, %.2f F \n\r ", tempB_C,tempB_F); |
| tatsuyanah | 1:417090fd8386 | 141 | } |
| tatsuyanah | 0:c837d6abadc5 | 142 | |
| tatsuyanah | 1:417090fd8386 | 143 | |
| tatsuyanah | 1:417090fd8386 | 144 | void heartbeatInitA() |
| tatsuyanah | 1:417090fd8386 | 145 | { |
| tatsuyanah | 0:c837d6abadc5 | 146 | maxim_max30102_reset(); //resets the MAX30102 |
| tatsuyanah | 0:c837d6abadc5 | 147 | wait(1); |
| tatsuyanah | 0:c837d6abadc5 | 148 | //read and clear status register |
| tatsuyanah | 0:c837d6abadc5 | 149 | maxim_max30102_read_reg(0,&uch_dummy); |
| tatsuyanah | 0:c837d6abadc5 | 150 | |
| tatsuyanah | 0:c837d6abadc5 | 151 | //while(pc.readable()==0) |
| tatsuyanah | 0:c837d6abadc5 | 152 | { |
| tatsuyanah | 0:c837d6abadc5 | 153 | // pc.printf("\x1B[2J"); //clear terminal program screen |
| tatsuyanah | 0:c837d6abadc5 | 154 | pc.printf("Press any key to start conversion\n\r"); |
| tatsuyanah | 0:c837d6abadc5 | 155 | wait(1); |
| tatsuyanah | 0:c837d6abadc5 | 156 | } |
| tatsuyanah | 0:c837d6abadc5 | 157 | uch_dummy=getchar(); |
| tatsuyanah | 0:c837d6abadc5 | 158 | |
| tatsuyanah | 0:c837d6abadc5 | 159 | maxim_max30102_init(); //initializes the MAX30102 |
| tatsuyanah | 0:c837d6abadc5 | 160 | |
| tatsuyanah | 0:c837d6abadc5 | 161 | n_brightness=0; |
| tatsuyanah | 0:c837d6abadc5 | 162 | un_min=0x3FFFF; |
| tatsuyanah | 0:c837d6abadc5 | 163 | un_max=0; |
| tatsuyanah | 0:c837d6abadc5 | 164 | |
| tatsuyanah | 0:c837d6abadc5 | 165 | n_ir_buffer_length=500; //buffer length of 100 stores 5 seconds of samples running at 100sps |
| tatsuyanah | 0:c837d6abadc5 | 166 | |
| tatsuyanah | 0:c837d6abadc5 | 167 | //read the first 500 samples, and determine the signal range |
| tatsuyanah | 0:c837d6abadc5 | 168 | for(i=0;i<n_ir_buffer_length;i++) |
| tatsuyanah | 0:c837d6abadc5 | 169 | { |
| tatsuyanah | 1:417090fd8386 | 170 | while(INT.read()==1); //wait until the interrupt pin asserts |
| tatsuyanah | 0:c837d6abadc5 | 171 | |
| tatsuyanah | 0:c837d6abadc5 | 172 | maxim_max30102_read_fifo((aun_red_buffer+i), (aun_ir_buffer+i)); //read from MAX30102 FIFO |
| tatsuyanah | 0:c837d6abadc5 | 173 | |
| tatsuyanah | 0:c837d6abadc5 | 174 | if(un_min>aun_red_buffer[i]) |
| tatsuyanah | 0:c837d6abadc5 | 175 | un_min=aun_red_buffer[i]; //update signal min |
| tatsuyanah | 0:c837d6abadc5 | 176 | if(un_max<aun_red_buffer[i]) |
| tatsuyanah | 0:c837d6abadc5 | 177 | un_max=aun_red_buffer[i]; //update signal max |
| tatsuyanah | 0:c837d6abadc5 | 178 | pc.printf("red="); |
| tatsuyanah | 0:c837d6abadc5 | 179 | pc.printf("%i", aun_red_buffer[i]); |
| tatsuyanah | 0:c837d6abadc5 | 180 | pc.printf(", ir="); |
| tatsuyanah | 0:c837d6abadc5 | 181 | pc.printf("%i\n\r", aun_ir_buffer[i]); |
| tatsuyanah | 0:c837d6abadc5 | 182 | } |
| tatsuyanah | 0:c837d6abadc5 | 183 | un_prev_data=aun_red_buffer[i]; |
| tatsuyanah | 0:c837d6abadc5 | 184 | |
| tatsuyanah | 0:c837d6abadc5 | 185 | //calculate heart rate and SpO2 after first 500 samples (first 5 seconds of samples) |
| tatsuyanah | 1:417090fd8386 | 186 | 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); |
| tatsuyanah | 0:c837d6abadc5 | 187 | |
| tatsuyanah | 1:417090fd8386 | 188 | } |
| tatsuyanah | 1:417090fd8386 | 189 | |
| tatsuyanah | 1:417090fd8386 | 190 | |
| tatsuyanah | 1:417090fd8386 | 191 | void heartbeatInitB() |
| tatsuyanah | 1:417090fd8386 | 192 | { |
| tatsuyanah | 1:417090fd8386 | 193 | maxim_max30101_reset(); //resets the MAX30102 |
| tatsuyanah | 1:417090fd8386 | 194 | wait(1); |
| tatsuyanah | 1:417090fd8386 | 195 | //read and clear status register |
| tatsuyanah | 1:417090fd8386 | 196 | |
| tatsuyanah | 1:417090fd8386 | 197 | |
| tatsuyanah | 1:417090fd8386 | 198 | maxim_max30101_init(); //initializes the MAX30102 |
| tatsuyanah | 0:c837d6abadc5 | 199 | |
| tatsuyanah | 1:417090fd8386 | 200 | n_brightness1=0; |
| tatsuyanah | 1:417090fd8386 | 201 | un_min1=0x3FFFF; |
| tatsuyanah | 1:417090fd8386 | 202 | un_max1=0; |
| tatsuyanah | 0:c837d6abadc5 | 203 | |
| tatsuyanah | 1:417090fd8386 | 204 | n_ir_buffer_length1=500; //buffer length of 100 stores 5 seconds of samples running at 100sps |
| tatsuyanah | 0:c837d6abadc5 | 205 | |
| tatsuyanah | 0:c837d6abadc5 | 206 | //read the first 500 samples, and determine the signal range |
| tatsuyanah | 1:417090fd8386 | 207 | for(i=0;i<n_ir_buffer_length1;i++) |
| tatsuyanah | 0:c837d6abadc5 | 208 | { |
| tatsuyanah | 1:417090fd8386 | 209 | while(INT1.read()==1); //wait until the interrupt pin asserts |
| tatsuyanah | 0:c837d6abadc5 | 210 | |
| tatsuyanah | 1:417090fd8386 | 211 | maxim_max30101_read_fifo(((aun_red_buffer1)+i), ((aun_ir_buffer1)+i)); //read from MAX30102 FIFO |
| tatsuyanah | 0:c837d6abadc5 | 212 | |
| tatsuyanah | 1:417090fd8386 | 213 | if(un_min1>aun_red_buffer1[i]) |
| tatsuyanah | 1:417090fd8386 | 214 | un_min1=aun_red_buffer1[i]; //update signal min |
| tatsuyanah | 1:417090fd8386 | 215 | if(un_max1<aun_red_buffer1[i]) |
| tatsuyanah | 1:417090fd8386 | 216 | un_max1=aun_red_buffer1[i]; //update signal max |
| tatsuyanah | 0:c837d6abadc5 | 217 | pc.printf("red="); |
| tatsuyanah | 1:417090fd8386 | 218 | pc.printf("%i", aun_red_buffer1[i]); |
| tatsuyanah | 0:c837d6abadc5 | 219 | pc.printf(", ir="); |
| tatsuyanah | 1:417090fd8386 | 220 | pc.printf("%i\n\r", aun_ir_buffer1[i]); |
| tatsuyanah | 0:c837d6abadc5 | 221 | } |
| tatsuyanah | 1:417090fd8386 | 222 | un_prev_data1=aun_red_buffer1[i]; |
| tatsuyanah | 0:c837d6abadc5 | 223 | |
| tatsuyanah | 0:c837d6abadc5 | 224 | //calculate heart rate and SpO2 after first 500 samples (first 5 seconds of samples) |
| tatsuyanah | 1:417090fd8386 | 225 | maxim_heart_rate_and_oxygen_saturation(aun_ir_buffer1, n_ir_buffer_length1, aun_red_buffer1, &n_sp021, &ch_spo2_valid1, &n_heart_rate1, &ch_hr_valid1); |
| tatsuyanah | 1:417090fd8386 | 226 | } |
| tatsuyanah | 1:417090fd8386 | 227 | |
| tatsuyanah | 1:417090fd8386 | 228 | void heartbeatUpdateA() |
| tatsuyanah | 1:417090fd8386 | 229 | { |
| tatsuyanah | 0:c837d6abadc5 | 230 | i=0; |
| tatsuyanah | 0:c837d6abadc5 | 231 | un_min=0x3FFFF; |
| tatsuyanah | 0:c837d6abadc5 | 232 | un_max=0; |
| tatsuyanah | 0:c837d6abadc5 | 233 | |
| tatsuyanah | 0:c837d6abadc5 | 234 | //dumping the first 100 sets of samples in the memory and shift the last 400 sets of samples to the top |
| tatsuyanah | 0:c837d6abadc5 | 235 | for(i=100;i<500;i++) |
| tatsuyanah | 0:c837d6abadc5 | 236 | { |
| tatsuyanah | 0:c837d6abadc5 | 237 | aun_red_buffer[i-100]=aun_red_buffer[i]; |
| tatsuyanah | 0:c837d6abadc5 | 238 | aun_ir_buffer[i-100]=aun_ir_buffer[i]; |
| tatsuyanah | 0:c837d6abadc5 | 239 | |
| tatsuyanah | 0:c837d6abadc5 | 240 | //update the signal min and max |
| tatsuyanah | 0:c837d6abadc5 | 241 | if(un_min>aun_red_buffer[i]) |
| tatsuyanah | 0:c837d6abadc5 | 242 | un_min=aun_red_buffer[i]; |
| tatsuyanah | 0:c837d6abadc5 | 243 | if(un_max<aun_red_buffer[i]) |
| tatsuyanah | 0:c837d6abadc5 | 244 | un_max=aun_red_buffer[i]; |
| tatsuyanah | 1:417090fd8386 | 245 | |
| tatsuyanah | 0:c837d6abadc5 | 246 | } |
| tatsuyanah | 0:c837d6abadc5 | 247 | |
| tatsuyanah | 0:c837d6abadc5 | 248 | //take 100 sets of samples before calculating the heart rate. |
| tatsuyanah | 0:c837d6abadc5 | 249 | for(i=400;i<500;i++) |
| tatsuyanah | 0:c837d6abadc5 | 250 | { |
| tatsuyanah | 0:c837d6abadc5 | 251 | un_prev_data=aun_red_buffer[i-1]; |
| tatsuyanah | 0:c837d6abadc5 | 252 | while(INT.read()==1); |
| tatsuyanah | 0:c837d6abadc5 | 253 | maxim_max30102_read_fifo((aun_red_buffer+i), (aun_ir_buffer+i)); |
| tatsuyanah | 0:c837d6abadc5 | 254 | |
| tatsuyanah | 0:c837d6abadc5 | 255 | if(aun_red_buffer[i]>un_prev_data) |
| tatsuyanah | 0:c837d6abadc5 | 256 | { |
| tatsuyanah | 0:c837d6abadc5 | 257 | f_temp=aun_red_buffer[i]-un_prev_data; |
| tatsuyanah | 0:c837d6abadc5 | 258 | f_temp/=(un_max-un_min); |
| tatsuyanah | 0:c837d6abadc5 | 259 | f_temp*=MAX_BRIGHTNESS; |
| tatsuyanah | 0:c837d6abadc5 | 260 | n_brightness-=(int)f_temp; |
| tatsuyanah | 0:c837d6abadc5 | 261 | if(n_brightness<0) |
| tatsuyanah | 0:c837d6abadc5 | 262 | n_brightness=0; |
| tatsuyanah | 0:c837d6abadc5 | 263 | } |
| tatsuyanah | 0:c837d6abadc5 | 264 | else |
| tatsuyanah | 0:c837d6abadc5 | 265 | { |
| tatsuyanah | 0:c837d6abadc5 | 266 | f_temp=un_prev_data-aun_red_buffer[i]; |
| tatsuyanah | 0:c837d6abadc5 | 267 | f_temp/=(un_max-un_min); |
| tatsuyanah | 0:c837d6abadc5 | 268 | f_temp*=MAX_BRIGHTNESS; |
| tatsuyanah | 0:c837d6abadc5 | 269 | n_brightness+=(int)f_temp; |
| tatsuyanah | 0:c837d6abadc5 | 270 | if(n_brightness>MAX_BRIGHTNESS) |
| tatsuyanah | 0:c837d6abadc5 | 271 | n_brightness=MAX_BRIGHTNESS; |
| tatsuyanah | 0:c837d6abadc5 | 272 | } |
| tatsuyanah | 0:c837d6abadc5 | 273 | //pc.printf("red=%i, ir=%i, HR=%i,HRvalid=%i,SpO2=%i,SPO2Valid=%i\n\r",aun_red_buffer[i],aun_ir_buffer[i],n_heart_rate, ch_hr_valid, n_sp02, ch_spo2_valid); |
| tatsuyanah | 0:c837d6abadc5 | 274 | |
| tatsuyanah | 0:c837d6abadc5 | 275 | } |
| tatsuyanah | 0:c837d6abadc5 | 276 | 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); |
| tatsuyanah | 0:c837d6abadc5 | 277 | sprintf(Vcc,"%i",n_heart_rate); |
| tatsuyanah | 1:417090fd8386 | 278 | |
| tatsuyanah | 1:417090fd8386 | 279 | } |
| tatsuyanah | 1:417090fd8386 | 280 | |
| tatsuyanah | 1:417090fd8386 | 281 | void heartbeatUpdateB() |
| tatsuyanah | 1:417090fd8386 | 282 | { |
| tatsuyanah | 1:417090fd8386 | 283 | i=0; |
| tatsuyanah | 1:417090fd8386 | 284 | un_min1=0x3FFFF; |
| tatsuyanah | 1:417090fd8386 | 285 | un_max1=0; |
| tatsuyanah | 1:417090fd8386 | 286 | |
| tatsuyanah | 1:417090fd8386 | 287 | //dumping the first 100 sets of samples in the memory and shift the last 400 sets of samples to the top |
| tatsuyanah | 1:417090fd8386 | 288 | for(i=100;i<500;i++) |
| tatsuyanah | 1:417090fd8386 | 289 | { |
| tatsuyanah | 1:417090fd8386 | 290 | aun_red_buffer1[i-100]=aun_red_buffer1[i]; |
| tatsuyanah | 1:417090fd8386 | 291 | aun_ir_buffer1[i-100]=aun_ir_buffer1[i]; |
| tatsuyanah | 1:417090fd8386 | 292 | |
| tatsuyanah | 1:417090fd8386 | 293 | //update the signal min and max |
| tatsuyanah | 1:417090fd8386 | 294 | if(un_min1>aun_red_buffer1[i]) |
| tatsuyanah | 1:417090fd8386 | 295 | un_min1=aun_red_buffer1[i]; |
| tatsuyanah | 1:417090fd8386 | 296 | if(un_max1<aun_red_buffer1[i]) |
| tatsuyanah | 1:417090fd8386 | 297 | un_max1=aun_red_buffer1[i]; |
| tatsuyanah | 1:417090fd8386 | 298 | } |
| tatsuyanah | 1:417090fd8386 | 299 | |
| tatsuyanah | 1:417090fd8386 | 300 | //take 100 sets of samples before calculating the heart rate. |
| tatsuyanah | 1:417090fd8386 | 301 | for(i=400;i<500;i++) |
| tatsuyanah | 1:417090fd8386 | 302 | { |
| tatsuyanah | 1:417090fd8386 | 303 | un_prev_data1=aun_red_buffer1[i-1]; |
| tatsuyanah | 1:417090fd8386 | 304 | while(INT1.read()==1); |
| tatsuyanah | 1:417090fd8386 | 305 | maxim_max30101_read_fifo((aun_red_buffer1+i), (aun_ir_buffer1+i)); |
| tatsuyanah | 1:417090fd8386 | 306 | |
| tatsuyanah | 1:417090fd8386 | 307 | if(aun_red_buffer1[i]>un_prev_data1) |
| tatsuyanah | 1:417090fd8386 | 308 | { |
| tatsuyanah | 1:417090fd8386 | 309 | f_temp1=aun_red_buffer1[i]-un_prev_data1; |
| tatsuyanah | 1:417090fd8386 | 310 | f_temp1/=(un_max1-un_min1); |
| tatsuyanah | 1:417090fd8386 | 311 | f_temp1*=MAX_BRIGHTNESS; |
| tatsuyanah | 1:417090fd8386 | 312 | n_brightness1-=(int)f_temp1; |
| tatsuyanah | 1:417090fd8386 | 313 | if(n_brightness1<0) |
| tatsuyanah | 1:417090fd8386 | 314 | n_brightness1=0; |
| tatsuyanah | 1:417090fd8386 | 315 | } |
| tatsuyanah | 1:417090fd8386 | 316 | else |
| tatsuyanah | 1:417090fd8386 | 317 | { |
| tatsuyanah | 1:417090fd8386 | 318 | f_temp1=un_prev_data1-aun_red_buffer1[i]; |
| tatsuyanah | 1:417090fd8386 | 319 | f_temp1/=(un_max1-un_min1); |
| tatsuyanah | 1:417090fd8386 | 320 | f_temp1*=MAX_BRIGHTNESS; |
| tatsuyanah | 1:417090fd8386 | 321 | n_brightness1+=(int)f_temp1; |
| tatsuyanah | 1:417090fd8386 | 322 | if(n_brightness1>MAX_BRIGHTNESS) |
| tatsuyanah | 1:417090fd8386 | 323 | n_brightness1=MAX_BRIGHTNESS; |
| tatsuyanah | 1:417090fd8386 | 324 | } |
| tatsuyanah | 1:417090fd8386 | 325 | //pc.printf("red=%i, ir=%i, HR=%i,HRvalid=%i,SpO2=%i,SPO2Valid=%i\n\r",aun_red_buffer[i],aun_ir_buffer[i],n_heart_rate, ch_hr_valid, n_sp02, ch_spo2_valid); |
| tatsuyanah | 1:417090fd8386 | 326 | |
| tatsuyanah | 1:417090fd8386 | 327 | } |
| tatsuyanah | 1:417090fd8386 | 328 | maxim_heart_rate_and_oxygen_saturation(aun_ir_buffer1, n_ir_buffer_length1, aun_red_buffer1, &n_sp021, &ch_spo2_valid1, &n_heart_rate1, &ch_hr_valid1); |
| tatsuyanah | 1:417090fd8386 | 329 | sprintf(Vcc,"%i",n_heart_rate1); |
| tatsuyanah | 1:417090fd8386 | 330 | |
| tatsuyanah | 1:417090fd8386 | 331 | } |
| tatsuyanah | 1:417090fd8386 | 332 | |
| tatsuyanah | 1:417090fd8386 | 333 | int main() |
| tatsuyanah | 1:417090fd8386 | 334 | { |
| tatsuyanah | 1:417090fd8386 | 335 | pc.baud(115200); |
| tatsuyanah | 1:417090fd8386 | 336 | esp.baud(9600); |
| tatsuyanah | 1:417090fd8386 | 337 | led1=1,led2=0,led3=0, led4=0; |
| tatsuyanah | 1:417090fd8386 | 338 | // Setup a serial interrupt function to receive data |
| tatsuyanah | 1:417090fd8386 | 339 | esp.attach(&Rx_interrupt, Serial::RxIrq); |
| tatsuyanah | 1:417090fd8386 | 340 | // Setup a serial interrupt function to transmit data |
| tatsuyanah | 1:417090fd8386 | 341 | esp.attach(&Tx_interrupt, Serial::TxIrq); |
| tatsuyanah | 1:417090fd8386 | 342 | if (time(NULL) < 1420070400) { |
| tatsuyanah | 1:417090fd8386 | 343 | setRTC(); |
| tatsuyanah | 1:417090fd8386 | 344 | } |
| tatsuyanah | 1:417090fd8386 | 345 | startserver(); |
| tatsuyanah | 1:417090fd8386 | 346 | DataRX=0; |
| tatsuyanah | 1:417090fd8386 | 347 | count=0; |
| tatsuyanah | 1:417090fd8386 | 348 | heartbeatInitB(); |
| tatsuyanah | 1:417090fd8386 | 349 | heartbeatInitA(); |
| tatsuyanah | 1:417090fd8386 | 350 | timer1second.start(); |
| tatsuyanah | 1:417090fd8386 | 351 | while(1) { |
| tatsuyanah | 1:417090fd8386 | 352 | if(DataRX==1) |
| tatsuyanah | 1:417090fd8386 | 353 | { |
| tatsuyanah | 1:417090fd8386 | 354 | ReadWebData(); |
| tatsuyanah | 1:417090fd8386 | 355 | esp.attach(&Rx_interrupt, Serial::RxIrq); |
| tatsuyanah | 1:417090fd8386 | 356 | } |
| tatsuyanah | 1:417090fd8386 | 357 | |
| tatsuyanah | 1:417090fd8386 | 358 | heartbeatUpdateB(); |
| tatsuyanah | 1:417090fd8386 | 359 | heartbeatUpdateA(); |
| tatsuyanah | 0:c837d6abadc5 | 360 | |
| tatsuyanah | 0:c837d6abadc5 | 361 | if(timer1second.read()>2) |
| tatsuyanah | 0:c837d6abadc5 | 362 | { |
| tatsuyanah | 0:c837d6abadc5 | 363 | timer1second.reset(); |
| tatsuyanah | 1:417090fd8386 | 364 | |
| tatsuyanah | 0:c837d6abadc5 | 365 | gettime(); |
| tatsuyanah | 0:c837d6abadc5 | 366 | gettemp(); |
| tatsuyanah | 0:c837d6abadc5 | 367 | // getbattery(); |
| tatsuyanah | 0:c837d6abadc5 | 368 | |
| tatsuyanah | 1:417090fd8386 | 369 | count++; |
| tatsuyanah | 1:417090fd8386 | 370 | sprintf(cmdbuff, "count,time,analog1,analog2=%d,\"%s\",\"%s\",\"%s\"\r\n",count,timebuf,TempA,Vcc); |
| tatsuyanah | 1:417090fd8386 | 371 | |
| tatsuyanah | 0:c837d6abadc5 | 372 | SendCMD(); |
| tatsuyanah | 0:c837d6abadc5 | 373 | getreply(); |
| tatsuyanah | 0:c837d6abadc5 | 374 | |
| tatsuyanah | 0:c837d6abadc5 | 375 | update=0; |
| tatsuyanah | 0:c837d6abadc5 | 376 | |
| tatsuyanah | 0:c837d6abadc5 | 377 | } |
| tatsuyanah | 0:c837d6abadc5 | 378 | } |
| tatsuyanah | 0:c837d6abadc5 | 379 | } |
| tatsuyanah | 0:c837d6abadc5 | 380 | |
| tatsuyanah | 0:c837d6abadc5 | 381 | // Reads and processes GET and POST web data |
| tatsuyanah | 0:c837d6abadc5 | 382 | void ReadWebData() |
| tatsuyanah | 0:c837d6abadc5 | 383 | { |
| tatsuyanah | 0:c837d6abadc5 | 384 | wait_ms(200); |
| tatsuyanah | 0:c837d6abadc5 | 385 | esp.attach(NULL,Serial::RxIrq); |
| tatsuyanah | 0:c837d6abadc5 | 386 | DataRX=0; |
| tatsuyanah | 0:c837d6abadc5 | 387 | memset(webdata, '\0', sizeof(webdata)); |
| tatsuyanah | 0:c837d6abadc5 | 388 | strcpy(webdata, rx_buffer); |
| tatsuyanah | 0:c837d6abadc5 | 389 | memset(rx_buffer, '\0', sizeof(rx_buffer)); |
| tatsuyanah | 0:c837d6abadc5 | 390 | rx_in = 0; |
| tatsuyanah | 0:c837d6abadc5 | 391 | rx_out = 0; |
| tatsuyanah | 0:c837d6abadc5 | 392 | // check web data for form information |
| tatsuyanah | 0:c837d6abadc5 | 393 | if( strstr(webdata, "check=led1v") != NULL ) { |
| tatsuyanah | 0:c837d6abadc5 | 394 | led1=!led1; |
| tatsuyanah | 0:c837d6abadc5 | 395 | } |
| tatsuyanah | 0:c837d6abadc5 | 396 | if( strstr(webdata, "check=led2v") != NULL ) { |
| tatsuyanah | 0:c837d6abadc5 | 397 | led2=!led2; |
| tatsuyanah | 0:c837d6abadc5 | 398 | } |
| tatsuyanah | 0:c837d6abadc5 | 399 | if( strstr(webdata, "check=led3v") != NULL ) { |
| tatsuyanah | 0:c837d6abadc5 | 400 | led3=!led3; |
| tatsuyanah | 0:c837d6abadc5 | 401 | } |
| tatsuyanah | 0:c837d6abadc5 | 402 | if( strstr(webdata, "check=led4v") != NULL ) { |
| tatsuyanah | 0:c837d6abadc5 | 403 | led4=!led4; |
| tatsuyanah | 0:c837d6abadc5 | 404 | } |
| tatsuyanah | 0:c837d6abadc5 | 405 | if( strstr(webdata, "POST") != NULL ) { // set update flag if POST request |
| tatsuyanah | 0:c837d6abadc5 | 406 | update=1; |
| tatsuyanah | 0:c837d6abadc5 | 407 | } |
| tatsuyanah | 0:c837d6abadc5 | 408 | if( strstr(webdata, "GET") != NULL && strstr(webdata, "favicon") == NULL ) { // set update flag for GET request but do not want to update for favicon requests |
| tatsuyanah | 0:c837d6abadc5 | 409 | update=1; |
| tatsuyanah | 0:c837d6abadc5 | 410 | } |
| tatsuyanah | 0:c837d6abadc5 | 411 | } |
| tatsuyanah | 0:c837d6abadc5 | 412 | // Starts webserver |
| tatsuyanah | 0:c837d6abadc5 | 413 | void startserver() |
| tatsuyanah | 0:c837d6abadc5 | 414 | { |
| tatsuyanah | 0:c837d6abadc5 | 415 | gettime(); |
| tatsuyanah | 0:c837d6abadc5 | 416 | gettemp(); |
| tatsuyanah | 0:c837d6abadc5 | 417 | getbattery(); |
| tatsuyanah | 0:c837d6abadc5 | 418 | pc.printf("++++++++++ Resetting ESP ++++++++++\r\n"); |
| tatsuyanah | 0:c837d6abadc5 | 419 | strcpy(cmdbuff,"node.restart()\r\n"); |
| tatsuyanah | 0:c837d6abadc5 | 420 | SendCMD(); |
| tatsuyanah | 0:c837d6abadc5 | 421 | wait(2); |
| tatsuyanah | 0:c837d6abadc5 | 422 | getreply(); |
| tatsuyanah | 0:c837d6abadc5 | 423 | |
| tatsuyanah | 0:c837d6abadc5 | 424 | pc.printf("\n++++++++++ Starting Server ++++++++++\r\n> "); |
| tatsuyanah | 0:c837d6abadc5 | 425 | |
| tatsuyanah | 0:c837d6abadc5 | 426 | // initial values |
| tatsuyanah | 1:417090fd8386 | 427 | sprintf(cmdbuff, "count,time,analog1,analog2=0,\"%s\",\"%s\",\"%s\"\r\n",timebuf,TempA,Vcc); |
| tatsuyanah | 0:c837d6abadc5 | 428 | SendCMD(); |
| tatsuyanah | 0:c837d6abadc5 | 429 | getreply(); |
| tatsuyanah | 0:c837d6abadc5 | 430 | wait(0.5); |
| tatsuyanah | 0:c837d6abadc5 | 431 | |
| tatsuyanah | 0:c837d6abadc5 | 432 | //create server |
| tatsuyanah | 0:c837d6abadc5 | 433 | sprintf(cmdbuff, "srv=net.createServer(net.TCP,%d)\r\n",SERVtimeout); |
| tatsuyanah | 0:c837d6abadc5 | 434 | SendCMD(); |
| tatsuyanah | 0:c837d6abadc5 | 435 | getreply(); |
| tatsuyanah | 0:c837d6abadc5 | 436 | wait(0.5); |
| tatsuyanah | 0:c837d6abadc5 | 437 | strcpy(cmdbuff,"srv:listen(80,function(conn)\r\n"); |
| tatsuyanah | 0:c837d6abadc5 | 438 | SendCMD(); |
| tatsuyanah | 0:c837d6abadc5 | 439 | getreply(); |
| tatsuyanah | 0:c837d6abadc5 | 440 | wait(0.3); |
| tatsuyanah | 0:c837d6abadc5 | 441 | strcpy(cmdbuff,"conn:on(\"receive\",function(conn,payload) \r\n"); |
| tatsuyanah | 0:c837d6abadc5 | 442 | SendCMD(); |
| tatsuyanah | 0:c837d6abadc5 | 443 | getreply(); |
| tatsuyanah | 0:c837d6abadc5 | 444 | wait(0.3); |
| tatsuyanah | 0:c837d6abadc5 | 445 | |
| tatsuyanah | 0:c837d6abadc5 | 446 | //print data to mbed |
| tatsuyanah | 0:c837d6abadc5 | 447 | strcpy(cmdbuff,"print(payload)\r\n"); |
| tatsuyanah | 0:c837d6abadc5 | 448 | SendCMD(); |
| tatsuyanah | 0:c837d6abadc5 | 449 | getreply(); |
| tatsuyanah | 0:c837d6abadc5 | 450 | wait(0.2); |
| tatsuyanah | 0:c837d6abadc5 | 451 | |
| tatsuyanah | 0:c837d6abadc5 | 452 | //web page data |
| tatsuyanah | 0:c837d6abadc5 | 453 | strcpy(cmdbuff,"conn:send('<!DOCTYPE html><html><meta http-equiv=\"refresh\" content=\"2\"><body><h1>Meditek Web Monitor</h1>')\r\n"); |
| tatsuyanah | 0:c837d6abadc5 | 454 | SendCMD(); |
| tatsuyanah | 0:c837d6abadc5 | 455 | getreply(); |
| tatsuyanah | 0:c837d6abadc5 | 456 | wait(0.4); |
| tatsuyanah | 0:c837d6abadc5 | 457 | strcpy(cmdbuff,"conn:send('Hit count: '..count..'')\r\n"); |
| tatsuyanah | 0:c837d6abadc5 | 458 | SendCMD(); |
| tatsuyanah | 0:c837d6abadc5 | 459 | getreply(); |
| tatsuyanah | 0:c837d6abadc5 | 460 | wait(0.2); |
| tatsuyanah | 0:c837d6abadc5 | 461 | strcpy(cmdbuff,"conn:send('<br>Last hit (based on mbed RTC time): '..time..'<br><hr>')\r\n"); |
| tatsuyanah | 0:c837d6abadc5 | 462 | SendCMD(); |
| tatsuyanah | 0:c837d6abadc5 | 463 | getreply(); |
| tatsuyanah | 0:c837d6abadc5 | 464 | wait(0.4); |
| tatsuyanah | 0:c837d6abadc5 | 465 | |
| tatsuyanah | 0:c837d6abadc5 | 466 | strcpy(cmdbuff,"conn:send('Current Temp is : '..analog1..' C<br>Current HeartRate is : '..analog2..' count/min<br><hr>')\r\n"); |
| tatsuyanah | 0:c837d6abadc5 | 467 | SendCMD(); |
| tatsuyanah | 0:c837d6abadc5 | 468 | getreply(); |
| tatsuyanah | 0:c837d6abadc5 | 469 | wait(0.3); |
| tatsuyanah | 0:c837d6abadc5 | 470 | strcpy(cmdbuff,"conn:send('<form method=\"POST\"')\r\n"); |
| tatsuyanah | 0:c837d6abadc5 | 471 | SendCMD(); |
| tatsuyanah | 0:c837d6abadc5 | 472 | getreply(); |
| tatsuyanah | 0:c837d6abadc5 | 473 | wait(0.3); |
| tatsuyanah | 0:c837d6abadc5 | 474 | strcpy(cmdbuff, "conn:send('<p><input type=\"checkbox\" name=\"check\" value=\"led1v\"> flip LED1')\r\n"); |
| tatsuyanah | 0:c837d6abadc5 | 475 | SendCMD(); |
| tatsuyanah | 0:c837d6abadc5 | 476 | getreply(); |
| tatsuyanah | 0:c837d6abadc5 | 477 | wait(0.3); |
| tatsuyanah | 0:c837d6abadc5 | 478 | strcpy(cmdbuff, "conn:send('<p><input type=\"checkbox\" name=\"check\" value=\"led2v\"> flip LED2')\r\n"); |
| tatsuyanah | 0:c837d6abadc5 | 479 | SendCMD(); |
| tatsuyanah | 0:c837d6abadc5 | 480 | getreply(); |
| tatsuyanah | 0:c837d6abadc5 | 481 | wait(0.3); |
| tatsuyanah | 0:c837d6abadc5 | 482 | strcpy(cmdbuff, "conn:send('<p><input type=\"checkbox\" name=\"check\" value=\"led3v\"> flip LED3')\r\n"); |
| tatsuyanah | 0:c837d6abadc5 | 483 | SendCMD(); |
| tatsuyanah | 0:c837d6abadc5 | 484 | getreply(); |
| tatsuyanah | 0:c837d6abadc5 | 485 | wait(0.3); |
| tatsuyanah | 0:c837d6abadc5 | 486 | strcpy(cmdbuff, "conn:send('<p><input type=\"checkbox\" name=\"check\" value=\"led4v\"> flip LED4')\r\n"); |
| tatsuyanah | 0:c837d6abadc5 | 487 | SendCMD(); |
| tatsuyanah | 0:c837d6abadc5 | 488 | getreply(); |
| tatsuyanah | 0:c837d6abadc5 | 489 | wait(0.3); |
| tatsuyanah | 0:c837d6abadc5 | 490 | strcpy(cmdbuff,"conn:send('<p><input type=\"submit\" value=\"send-refresh\"></form>')\r\n"); |
| tatsuyanah | 0:c837d6abadc5 | 491 | SendCMD(); |
| tatsuyanah | 0:c837d6abadc5 | 492 | getreply(); |
| tatsuyanah | 0:c837d6abadc5 | 493 | wait(0.3); |
| tatsuyanah | 0:c837d6abadc5 | 494 | strcpy(cmdbuff, "conn:send('<p><h2>How to use:</h2><ul><li>Select a checkbox to flip on/off</li><li>Click Send-Refresh to send data and refresh values</li></ul></body></html>')\r\n"); |
| tatsuyanah | 0:c837d6abadc5 | 495 | SendCMD(); |
| tatsuyanah | 0:c837d6abadc5 | 496 | getreply(); |
| tatsuyanah | 0:c837d6abadc5 | 497 | wait(0.5); |
| tatsuyanah | 0:c837d6abadc5 | 498 | // end web page data |
| tatsuyanah | 0:c837d6abadc5 | 499 | strcpy(cmdbuff, "conn:on(\"sent\",function(conn) conn:close() end)\r\n"); // close current connection |
| tatsuyanah | 0:c837d6abadc5 | 500 | SendCMD(); |
| tatsuyanah | 0:c837d6abadc5 | 501 | getreply(); |
| tatsuyanah | 0:c837d6abadc5 | 502 | wait(0.3); |
| tatsuyanah | 0:c837d6abadc5 | 503 | strcpy(cmdbuff, "end)\r\n"); |
| tatsuyanah | 0:c837d6abadc5 | 504 | SendCMD(); |
| tatsuyanah | 0:c837d6abadc5 | 505 | getreply(); |
| tatsuyanah | 0:c837d6abadc5 | 506 | wait(0.2); |
| tatsuyanah | 0:c837d6abadc5 | 507 | strcpy(cmdbuff, "end)\r\n"); |
| tatsuyanah | 0:c837d6abadc5 | 508 | SendCMD(); |
| tatsuyanah | 0:c837d6abadc5 | 509 | getreply(); |
| tatsuyanah | 0:c837d6abadc5 | 510 | wait(0.2); |
| tatsuyanah | 0:c837d6abadc5 | 511 | |
| tatsuyanah | 0:c837d6abadc5 | 512 | strcpy(cmdbuff, "tmr.alarm(0, 1000, 1, function()\r\n"); |
| tatsuyanah | 0:c837d6abadc5 | 513 | SendCMD(); |
| tatsuyanah | 0:c837d6abadc5 | 514 | getreply(); |
| tatsuyanah | 0:c837d6abadc5 | 515 | wait(0.2); |
| tatsuyanah | 0:c837d6abadc5 | 516 | strcpy(cmdbuff, "if wifi.sta.getip() == nil then\r\n"); |
| tatsuyanah | 0:c837d6abadc5 | 517 | SendCMD(); |
| tatsuyanah | 0:c837d6abadc5 | 518 | getreply(); |
| tatsuyanah | 0:c837d6abadc5 | 519 | wait(0.2); |
| tatsuyanah | 0:c837d6abadc5 | 520 | strcpy(cmdbuff, "print(\"Connecting to AP...\\n\")\r\n"); |
| tatsuyanah | 0:c837d6abadc5 | 521 | SendCMD(); |
| tatsuyanah | 0:c837d6abadc5 | 522 | getreply(); |
| tatsuyanah | 0:c837d6abadc5 | 523 | wait(0.2); |
| tatsuyanah | 0:c837d6abadc5 | 524 | strcpy(cmdbuff, "else\r\n"); |
| tatsuyanah | 0:c837d6abadc5 | 525 | SendCMD(); |
| tatsuyanah | 0:c837d6abadc5 | 526 | getreply(); |
| tatsuyanah | 0:c837d6abadc5 | 527 | wait(0.2); |
| tatsuyanah | 0:c837d6abadc5 | 528 | strcpy(cmdbuff, "ip, nm, gw=wifi.sta.getip()\r\n"); |
| tatsuyanah | 0:c837d6abadc5 | 529 | SendCMD(); |
| tatsuyanah | 0:c837d6abadc5 | 530 | getreply(); |
| tatsuyanah | 0:c837d6abadc5 | 531 | wait(0.2); |
| tatsuyanah | 0:c837d6abadc5 | 532 | strcpy(cmdbuff,"print(\"IP Address: \",ip)\r\n"); |
| tatsuyanah | 0:c837d6abadc5 | 533 | SendCMD(); |
| tatsuyanah | 0:c837d6abadc5 | 534 | getreply(); |
| tatsuyanah | 0:c837d6abadc5 | 535 | wait(0.2); |
| tatsuyanah | 0:c837d6abadc5 | 536 | strcpy(cmdbuff,"tmr.stop(0)\r\n"); |
| tatsuyanah | 0:c837d6abadc5 | 537 | SendCMD(); |
| tatsuyanah | 0:c837d6abadc5 | 538 | getreply(); |
| tatsuyanah | 0:c837d6abadc5 | 539 | wait(0.2); |
| tatsuyanah | 0:c837d6abadc5 | 540 | strcpy(cmdbuff,"end\r\n"); |
| tatsuyanah | 0:c837d6abadc5 | 541 | SendCMD(); |
| tatsuyanah | 0:c837d6abadc5 | 542 | getreply(); |
| tatsuyanah | 0:c837d6abadc5 | 543 | wait(0.2); |
| tatsuyanah | 0:c837d6abadc5 | 544 | strcpy(cmdbuff,"end)\r\n"); |
| tatsuyanah | 0:c837d6abadc5 | 545 | SendCMD(); |
| tatsuyanah | 0:c837d6abadc5 | 546 | getreply(); |
| tatsuyanah | 0:c837d6abadc5 | 547 | wait(0.2); |
| tatsuyanah | 0:c837d6abadc5 | 548 | |
| tatsuyanah | 0:c837d6abadc5 | 549 | pc.printf("\n\n++++++++++ Ready ++++++++++\r\n\n"); |
| tatsuyanah | 0:c837d6abadc5 | 550 | } |
| tatsuyanah | 0:c837d6abadc5 | 551 | |
| tatsuyanah | 0:c837d6abadc5 | 552 | |
| tatsuyanah | 0:c837d6abadc5 | 553 | // ESP Command data send |
| tatsuyanah | 0:c837d6abadc5 | 554 | void SendCMD() |
| tatsuyanah | 0:c837d6abadc5 | 555 | { |
| tatsuyanah | 0:c837d6abadc5 | 556 | int i; |
| tatsuyanah | 0:c837d6abadc5 | 557 | char temp_char; |
| tatsuyanah | 0:c837d6abadc5 | 558 | bool empty; |
| tatsuyanah | 0:c837d6abadc5 | 559 | i = 0; |
| tatsuyanah | 0:c837d6abadc5 | 560 | // Start Critical Section - don't interrupt while changing global buffer variables |
| tatsuyanah | 0:c837d6abadc5 | 561 | NVIC_DisableIRQ(UART1_IRQn); |
| tatsuyanah | 0:c837d6abadc5 | 562 | empty = (tx_in == tx_out); |
| tatsuyanah | 0:c837d6abadc5 | 563 | while ((i==0) || (cmdbuff[i-1] != '\n')) { |
| tatsuyanah | 0:c837d6abadc5 | 564 | // Wait if buffer full |
| tatsuyanah | 0:c837d6abadc5 | 565 | if (((tx_in + 1) % buffer_size) == tx_out) { |
| tatsuyanah | 0:c837d6abadc5 | 566 | // End Critical Section - need to let interrupt routine empty buffer by sending |
| tatsuyanah | 0:c837d6abadc5 | 567 | NVIC_EnableIRQ(UART1_IRQn); |
| tatsuyanah | 0:c837d6abadc5 | 568 | while (((tx_in + 1) % buffer_size) == tx_out) { |
| tatsuyanah | 0:c837d6abadc5 | 569 | } |
| tatsuyanah | 0:c837d6abadc5 | 570 | // Start Critical Section - don't interrupt while changing global buffer variables |
| tatsuyanah | 0:c837d6abadc5 | 571 | NVIC_DisableIRQ(UART1_IRQn); |
| tatsuyanah | 0:c837d6abadc5 | 572 | } |
| tatsuyanah | 0:c837d6abadc5 | 573 | tx_buffer[tx_in] = cmdbuff[i]; |
| tatsuyanah | 0:c837d6abadc5 | 574 | i++; |
| tatsuyanah | 0:c837d6abadc5 | 575 | tx_in = (tx_in + 1) % buffer_size; |
| tatsuyanah | 0:c837d6abadc5 | 576 | } |
| tatsuyanah | 0:c837d6abadc5 | 577 | if (esp.writeable() && (empty)) { |
| tatsuyanah | 0:c837d6abadc5 | 578 | temp_char = tx_buffer[tx_out]; |
| tatsuyanah | 0:c837d6abadc5 | 579 | tx_out = (tx_out + 1) % buffer_size; |
| tatsuyanah | 0:c837d6abadc5 | 580 | // Send first character to start tx interrupts, if stopped |
| tatsuyanah | 0:c837d6abadc5 | 581 | esp.putc(temp_char); |
| tatsuyanah | 0:c837d6abadc5 | 582 | } |
| tatsuyanah | 0:c837d6abadc5 | 583 | // End Critical Section |
| tatsuyanah | 0:c837d6abadc5 | 584 | NVIC_EnableIRQ(UART1_IRQn); |
| tatsuyanah | 0:c837d6abadc5 | 585 | return; |
| tatsuyanah | 0:c837d6abadc5 | 586 | } |
| tatsuyanah | 0:c837d6abadc5 | 587 | |
| tatsuyanah | 0:c837d6abadc5 | 588 | // Get Command and ESP status replies |
| tatsuyanah | 0:c837d6abadc5 | 589 | void getreply() |
| tatsuyanah | 0:c837d6abadc5 | 590 | { |
| tatsuyanah | 0:c837d6abadc5 | 591 | read_line(); |
| tatsuyanah | 0:c837d6abadc5 | 592 | sscanf(rx_line,replybuff); |
| tatsuyanah | 0:c837d6abadc5 | 593 | } |
| tatsuyanah | 0:c837d6abadc5 | 594 | |
| tatsuyanah | 0:c837d6abadc5 | 595 | // Read a line from the large rx buffer from rx interrupt routine |
| tatsuyanah | 0:c837d6abadc5 | 596 | void read_line() { |
| tatsuyanah | 0:c837d6abadc5 | 597 | int i; |
| tatsuyanah | 0:c837d6abadc5 | 598 | i = 0; |
| tatsuyanah | 0:c837d6abadc5 | 599 | // Start Critical Section - don't interrupt while changing global buffer variables |
| tatsuyanah | 0:c837d6abadc5 | 600 | NVIC_DisableIRQ(UART1_IRQn); |
| tatsuyanah | 0:c837d6abadc5 | 601 | // Loop reading rx buffer characters until end of line character |
| tatsuyanah | 0:c837d6abadc5 | 602 | while ((i==0) || (rx_line[i-1] != '\r')) { |
| tatsuyanah | 0:c837d6abadc5 | 603 | // Wait if buffer empty |
| tatsuyanah | 0:c837d6abadc5 | 604 | if (rx_in == rx_out) { |
| tatsuyanah | 0:c837d6abadc5 | 605 | // End Critical Section - need to allow rx interrupt to get new characters for buffer |
| tatsuyanah | 0:c837d6abadc5 | 606 | NVIC_EnableIRQ(UART1_IRQn); |
| tatsuyanah | 0:c837d6abadc5 | 607 | while (rx_in == rx_out) { |
| tatsuyanah | 0:c837d6abadc5 | 608 | } |
| tatsuyanah | 0:c837d6abadc5 | 609 | // Start Critical Section - don't interrupt while changing global buffer variables |
| tatsuyanah | 0:c837d6abadc5 | 610 | NVIC_DisableIRQ(UART1_IRQn); |
| tatsuyanah | 0:c837d6abadc5 | 611 | } |
| tatsuyanah | 0:c837d6abadc5 | 612 | rx_line[i] = rx_buffer[rx_out]; |
| tatsuyanah | 0:c837d6abadc5 | 613 | i++; |
| tatsuyanah | 0:c837d6abadc5 | 614 | rx_out = (rx_out + 1) % buffer_size; |
| tatsuyanah | 0:c837d6abadc5 | 615 | } |
| tatsuyanah | 0:c837d6abadc5 | 616 | // End Critical Section |
| tatsuyanah | 0:c837d6abadc5 | 617 | NVIC_EnableIRQ(UART1_IRQn); |
| tatsuyanah | 0:c837d6abadc5 | 618 | rx_line[i-1] = 0; |
| tatsuyanah | 0:c837d6abadc5 | 619 | return; |
| tatsuyanah | 0:c837d6abadc5 | 620 | } |
| tatsuyanah | 0:c837d6abadc5 | 621 | |
| tatsuyanah | 0:c837d6abadc5 | 622 | |
| tatsuyanah | 0:c837d6abadc5 | 623 | // Interupt Routine to read in data from serial port |
| tatsuyanah | 0:c837d6abadc5 | 624 | void Rx_interrupt() { |
| tatsuyanah | 0:c837d6abadc5 | 625 | DataRX=1; |
| tatsuyanah | 0:c837d6abadc5 | 626 | //led3=1; |
| tatsuyanah | 0:c837d6abadc5 | 627 | // Loop just in case more than one character is in UART's receive FIFO buffer |
| tatsuyanah | 0:c837d6abadc5 | 628 | // Stop if buffer full |
| tatsuyanah | 0:c837d6abadc5 | 629 | while ((esp.readable()) && (((rx_in + 1) % buffer_size) != rx_out)) { |
| tatsuyanah | 0:c837d6abadc5 | 630 | rx_buffer[rx_in] = esp.getc(); |
| tatsuyanah | 0:c837d6abadc5 | 631 | // Uncomment to Echo to USB serial to watch data flow |
| tatsuyanah | 0:c837d6abadc5 | 632 | pc.putc(rx_buffer[rx_in]); |
| tatsuyanah | 0:c837d6abadc5 | 633 | rx_in = (rx_in + 1) % buffer_size; |
| tatsuyanah | 0:c837d6abadc5 | 634 | } |
| tatsuyanah | 0:c837d6abadc5 | 635 | //led3=0; |
| tatsuyanah | 0:c837d6abadc5 | 636 | return; |
| tatsuyanah | 0:c837d6abadc5 | 637 | } |
| tatsuyanah | 0:c837d6abadc5 | 638 | |
| tatsuyanah | 0:c837d6abadc5 | 639 | |
| tatsuyanah | 0:c837d6abadc5 | 640 | // Interupt Routine to write out data to serial port |
| tatsuyanah | 0:c837d6abadc5 | 641 | void Tx_interrupt() { |
| tatsuyanah | 0:c837d6abadc5 | 642 | //led2=1; |
| tatsuyanah | 0:c837d6abadc5 | 643 | // Loop to fill more than one character in UART's transmit FIFO buffer |
| tatsuyanah | 0:c837d6abadc5 | 644 | // Stop if buffer empty |
| tatsuyanah | 0:c837d6abadc5 | 645 | while ((esp.writeable()) && (tx_in != tx_out)) { |
| tatsuyanah | 0:c837d6abadc5 | 646 | esp.putc(tx_buffer[tx_out]); |
| tatsuyanah | 0:c837d6abadc5 | 647 | tx_out = (tx_out + 1) % buffer_size; |
| tatsuyanah | 0:c837d6abadc5 | 648 | } |
| tatsuyanah | 0:c837d6abadc5 | 649 | //led2=0; |
| tatsuyanah | 0:c837d6abadc5 | 650 | return; |
| tatsuyanah | 0:c837d6abadc5 | 651 | } |
| tatsuyanah | 0:c837d6abadc5 | 652 | |
| tatsuyanah | 0:c837d6abadc5 | 653 | void gettime() |
| tatsuyanah | 0:c837d6abadc5 | 654 | { |
| tatsuyanah | 0:c837d6abadc5 | 655 | time_t seconds = time(NULL); |
| tatsuyanah | 0:c837d6abadc5 | 656 | strftime(timebuf,50,"%H:%M:%S %a %d %b %y", localtime(&seconds)); |
| tatsuyanah | 0:c837d6abadc5 | 657 | } |
| tatsuyanah | 0:c837d6abadc5 | 658 | |
| tatsuyanah | 0:c837d6abadc5 | 659 | void setRTC() |
| tatsuyanah | 0:c837d6abadc5 | 660 | { |
| tatsuyanah | 0:c837d6abadc5 | 661 | t.tm_sec = (0); // 0-59 |
| tatsuyanah | 0:c837d6abadc5 | 662 | t.tm_min = (minute); // 0-59 |
| tatsuyanah | 0:c837d6abadc5 | 663 | t.tm_hour = (hour); // 0-23 |
| tatsuyanah | 0:c837d6abadc5 | 664 | t.tm_mday = (dayofmonth); // 1-31 |
| tatsuyanah | 0:c837d6abadc5 | 665 | t.tm_mon = (month-1); // 0-11 "0" = Jan, -1 added for Mbed RCT clock format |
| tatsuyanah | 0:c837d6abadc5 | 666 | t.tm_year = ((year)+100); // year since 1900, current DCF year + 100 + 1900 = correct year |
| tatsuyanah | 0:c837d6abadc5 | 667 | set_time(mktime(&t)); // set RTC clock |
| tatsuyanah | 0:c837d6abadc5 | 668 | } |
| tatsuyanah | 0:c837d6abadc5 | 669 | // Analog in example |
| tatsuyanah | 0:c837d6abadc5 | 670 | void getbattery() |
| tatsuyanah | 0:c837d6abadc5 | 671 | { |
| tatsuyanah | 0:c837d6abadc5 | 672 | |
| tatsuyanah | 0:c837d6abadc5 | 673 | } |
| tatsuyanah | 0:c837d6abadc5 | 674 | // Temperature example |
| tatsuyanah | 0:c837d6abadc5 | 675 |