blood pressure monitor
Dependencies: mbed wave_player mbed-rtos 4DGL-uLCD-SE SDFileSystem_OldbutworkswithRTOS
main.cpp@5:5a658d23eb45, 2019-04-25 (annotated)
- Committer:
- davidcho23
- Date:
- Thu Apr 25 18:09:06 2019 +0000
- Revision:
- 5:5a658d23eb45
- Parent:
- 4:972399c63a6e
f
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
flameoball | 3:621f4c21c8f1 | 1 | #include "mbed.h" |
4180_1 | 1:5b8e223e983d | 2 | |
4180_1 | 2:c2afd0c426af | 3 | #include "rtos.h" |
flameoball | 3:621f4c21c8f1 | 4 | #include "uLCD_4DGL.h" |
4180_1 | 1:5b8e223e983d | 5 | #include "SDFileSystem.h" |
4180_1 | 1:5b8e223e983d | 6 | #include "wave_player.h" |
4180_1 | 1:5b8e223e983d | 7 | |
4180_1 | 1:5b8e223e983d | 8 | |
flameoball | 3:621f4c21c8f1 | 9 | |
flameoball | 3:621f4c21c8f1 | 10 | uLCD_4DGL uLCD(p9,p10,p11); // serial tx, serial rx, reset pin; |
flameoball | 3:621f4c21c8f1 | 11 | |
flameoball | 3:621f4c21c8f1 | 12 | FILE *wave_file; |
flameoball | 3:621f4c21c8f1 | 13 | double t = 0; |
flameoball | 3:621f4c21c8f1 | 14 | double signal[200]; |
flameoball | 3:621f4c21c8f1 | 15 | Mutex lcd_mutex; |
flameoball | 3:621f4c21c8f1 | 16 | DigitalOut motor (p24); |
flameoball | 3:621f4c21c8f1 | 17 | DigitalOut valve (p25); |
flameoball | 3:621f4c21c8f1 | 18 | AnalogIn forceSensor (p15); |
flameoball | 3:621f4c21c8f1 | 19 | bool state = true; |
flameoball | 3:621f4c21c8f1 | 20 | double cur_data = 0.0; |
flameoball | 3:621f4c21c8f1 | 21 | double prev_data = 0.0; |
flameoball | 3:621f4c21c8f1 | 22 | int localMax[200]; |
flameoball | 3:621f4c21c8f1 | 23 | int diff [200]; |
flameoball | 3:621f4c21c8f1 | 24 | int index = 0; |
flameoball | 3:621f4c21c8f1 | 25 | int cur_diff; |
flameoball | 3:621f4c21c8f1 | 26 | int actual_diff; |
flameoball | 3:621f4c21c8f1 | 27 | double heartRate; |
flameoball | 3:621f4c21c8f1 | 28 | double high_pressure; |
flameoball | 3:621f4c21c8f1 | 29 | double low_pressure; |
flameoball | 3:621f4c21c8f1 | 30 | void thread1(void const *args) |
flameoball | 3:621f4c21c8f1 | 31 | { |
flameoball | 3:621f4c21c8f1 | 32 | while(1) { |
flameoball | 3:621f4c21c8f1 | 33 | cur_data = forceSensor; |
flameoball | 3:621f4c21c8f1 | 34 | } |
4180_1 | 1:5b8e223e983d | 35 | |
flameoball | 3:621f4c21c8f1 | 36 | } |
flameoball | 3:621f4c21c8f1 | 37 | void thread2(void const *args) |
flameoball | 3:621f4c21c8f1 | 38 | { |
flameoball | 3:621f4c21c8f1 | 39 | while(1) { |
flameoball | 3:621f4c21c8f1 | 40 | if (cur_data >.8 && state ) { |
flameoball | 3:621f4c21c8f1 | 41 | motor = 0; |
flameoball | 3:621f4c21c8f1 | 42 | for (int i = 0; i<200; i++) { |
flameoball | 3:621f4c21c8f1 | 43 | signal[i] = cur_data; |
flameoball | 3:621f4c21c8f1 | 44 | Thread::wait(50); |
flameoball | 3:621f4c21c8f1 | 45 | state = true; |
flameoball | 3:621f4c21c8f1 | 46 | } |
flameoball | 3:621f4c21c8f1 | 47 | for (int i = 2; i<198; i++) { |
flameoball | 3:621f4c21c8f1 | 48 | if (signal[i-1]<signal[i] && signal[i]>signal[i+1]&&signal[i-2] <signal[i] && signal[i+2]< signal[i]) { |
flameoball | 3:621f4c21c8f1 | 49 | localMax[index] = i*10; |
flameoball | 3:621f4c21c8f1 | 50 | index ++; |
flameoball | 3:621f4c21c8f1 | 51 | } |
flameoball | 3:621f4c21c8f1 | 52 | |
flameoball | 3:621f4c21c8f1 | 53 | valve = 0; |
flameoball | 3:621f4c21c8f1 | 54 | state = false; |
flameoball | 3:621f4c21c8f1 | 55 | } |
flameoball | 3:621f4c21c8f1 | 56 | for (int i = 0; i< index; i++) { |
4180_1 | 1:5b8e223e983d | 57 | |
flameoball | 3:621f4c21c8f1 | 58 | for (int j = 0; j< index; j++) { |
flameoball | 3:621f4c21c8f1 | 59 | cur_diff = localMax[j]-localMax[i]; |
flameoball | 4:972399c63a6e | 60 | if (cur_diff>500 && cur_diff <1500) { |
flameoball | 3:621f4c21c8f1 | 61 | actual_diff = cur_diff; |
flameoball | 3:621f4c21c8f1 | 62 | heartRate = 60*1000/(actual_diff); |
flameoball | 4:972399c63a6e | 63 | high_pressure = ((signal[i]-.799)+.8)*120/.8; |
flameoball | 4:972399c63a6e | 64 | low_pressure = ((signal[j]-.798) +.8)*80/.8; |
flameoball | 3:621f4c21c8f1 | 65 | } |
flameoball | 3:621f4c21c8f1 | 66 | } |
flameoball | 3:621f4c21c8f1 | 67 | } |
flameoball | 3:621f4c21c8f1 | 68 | |
flameoball | 3:621f4c21c8f1 | 69 | } |
flameoball | 3:621f4c21c8f1 | 70 | } |
flameoball | 3:621f4c21c8f1 | 71 | } |
flameoball | 3:621f4c21c8f1 | 72 | void thread3(void const *args) |
flameoball | 3:621f4c21c8f1 | 73 | { |
flameoball | 3:621f4c21c8f1 | 74 | while(1) { |
flameoball | 3:621f4c21c8f1 | 75 | lcd_mutex.lock(); |
flameoball | 3:621f4c21c8f1 | 76 | uLCD.locate(0,1); |
davidcho23 | 5:5a658d23eb45 | 77 | uLCD.printf("Systolic: %.3f", high_pressure); |
flameoball | 3:621f4c21c8f1 | 78 | uLCD.locate(0,3); |
davidcho23 | 5:5a658d23eb45 | 79 | uLCD.printf("Diastolic: %.3f", low_pressure); |
davidcho23 | 5:5a658d23eb45 | 80 | uLCD.locate(0,5); |
davidcho23 | 5:5a658d23eb45 | 81 | uLCD.printf("BPM: %.3f", heartRate); |
davidcho23 | 5:5a658d23eb45 | 82 | uLCD.locate(0,7); |
davidcho23 | 5:5a658d23eb45 | 83 | uLCD.printf("%3f",cur_data); |
flameoball | 3:621f4c21c8f1 | 84 | lcd_mutex.unlock(); |
flameoball | 3:621f4c21c8f1 | 85 | } |
flameoball | 3:621f4c21c8f1 | 86 | |
flameoball | 3:621f4c21c8f1 | 87 | } |
4180_1 | 1:5b8e223e983d | 88 | |
4180_1 | 1:5b8e223e983d | 89 | int main() |
4180_1 | 1:5b8e223e983d | 90 | { |
flameoball | 3:621f4c21c8f1 | 91 | uLCD.cls(); |
flameoball | 3:621f4c21c8f1 | 92 | uLCD.baudrate(3000000); |
flameoball | 3:621f4c21c8f1 | 93 | valve = 1; |
flameoball | 3:621f4c21c8f1 | 94 | motor = 1; |
flameoball | 3:621f4c21c8f1 | 95 | Thread t1(thread1); //start thread1 |
flameoball | 3:621f4c21c8f1 | 96 | Thread t2(thread2); //start thread2 |
flameoball | 3:621f4c21c8f1 | 97 | Thread t3(thread3); //start thread3 |
flameoball | 3:621f4c21c8f1 | 98 | while(1) { |
flameoball | 3:621f4c21c8f1 | 99 | |
flameoball | 3:621f4c21c8f1 | 100 | } |
flameoball | 3:621f4c21c8f1 | 101 | } |