Nucleo-transfer
Dependencies: ADS1015 MPU6050 PixelArray-Nucleo mbed
Fork of Nucleo-transfer by
Sensorplate/main.cpp@12:7b3a5940f911, 2017-09-28 (annotated)
- Committer:
- ricardo_95
- Date:
- Thu Sep 28 14:07:12 2017 +0000
- Revision:
- 12:7b3a5940f911
- Parent:
- 11:73c6def38fbd
- Child:
- 13:b85f41d6fe6f
- Child:
- 15:635303444c81
Pilot 1.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
ricardo_95 | 12:7b3a5940f911 | 1 | /* |
ricardo_95 | 12:7b3a5940f911 | 2 | Author : Danny Eldering & Ricardo Molenaar |
ricardo_95 | 12:7b3a5940f911 | 3 | Company : Momo Medical |
ricardo_95 | 12:7b3a5940f911 | 4 | Source : developer.mbed.org |
ricardo_95 | 12:7b3a5940f911 | 5 | File : main.cpp |
ricardo_95 | 12:7b3a5940f911 | 6 | Version | -date : 1.0 | 28-9-2017 |
ricardo_95 | 12:7b3a5940f911 | 7 | */ |
ricardo_95 | 12:7b3a5940f911 | 8 | |
DEldering | 0:c0e44c46c573 | 9 | #include "mbed.h" |
DEldering | 0:c0e44c46c573 | 10 | #include "Adafruit_ADS1015.h" |
DEldering | 0:c0e44c46c573 | 11 | #include "MPU6050.h" |
ricardo_95 | 7:dba5091c8b7d | 12 | #include "neopixel.h" |
ricardo_95 | 12:7b3a5940f911 | 13 | #define NLED (3) |
ricardo_95 | 7:dba5091c8b7d | 14 | #define ONE_COLOR |
ricardo_95 | 7:dba5091c8b7d | 15 | |
ricardo_95 | 7:dba5091c8b7d | 16 | InterruptIn lock(p16); // Interrupts for buttons. |
ricardo_95 | 7:dba5091c8b7d | 17 | InterruptIn reposition(p17); |
ricardo_95 | 7:dba5091c8b7d | 18 | InterruptIn mute(p15); |
ricardo_95 | 7:dba5091c8b7d | 19 | InterruptIn new_patient(p14); |
ricardo_95 | 12:7b3a5940f911 | 20 | AnalogIn batteryvoltage(p18); // Analog input between 0 and 1 (0 and 100 %) for reading batteryvoltage from accupack. |
ricardo_95 | 12:7b3a5940f911 | 21 | DigitalIn supplyvoltage(p20); // Analog input between 0 and 1 for reading supplyvoltage from measuringpoint before power supply. |
ricardo_95 | 7:dba5091c8b7d | 22 | |
ricardo_95 | 12:7b3a5940f911 | 23 | PwmOut LED_intern1(LED1); |
ricardo_95 | 12:7b3a5940f911 | 24 | DigitalOut LED_intern2(LED2); |
ricardo_95 | 12:7b3a5940f911 | 25 | DigitalOut LED_intern3(LED3); |
ricardo_95 | 12:7b3a5940f911 | 26 | DigitalOut LED_intern4(LED4); |
ricardo_95 | 7:dba5091c8b7d | 27 | neopixel::PixelArray array(p11); |
ricardo_95 | 7:dba5091c8b7d | 28 | |
ricardo_95 | 7:dba5091c8b7d | 29 | Timer hold_timer; |
ricardo_95 | 7:dba5091c8b7d | 30 | Timer delay; |
ricardo_95 | 7:dba5091c8b7d | 31 | Timer speaker_timer; |
ricardo_95 | 7:dba5091c8b7d | 32 | |
ricardo_95 | 7:dba5091c8b7d | 33 | DigitalOut speaker1(p21); |
ricardo_95 | 7:dba5091c8b7d | 34 | DigitalOut speaker2(p22); |
DEldering | 0:c0e44c46c573 | 35 | |
DEldering | 1:a8e61f3910ad | 36 | I2C i2c(p28, p27); // I2C |
DEldering | 1:a8e61f3910ad | 37 | MPU6050 agu(p28,p27); // Accelerometer/Gyroscope Unit |
DEldering | 1:a8e61f3910ad | 38 | Adafruit_ADS1115 pr1(&i2c, 0x48); // first PiëzoResistive ADC |
DEldering | 1:a8e61f3910ad | 39 | Adafruit_ADS1115 pr2(&i2c, 0x49); // second PiëzoResistive ADC |
DEldering | 1:a8e61f3910ad | 40 | Adafruit_ADS1115 pel(&i2c, 0x4B); // PiëzoElectric ADC |
DEldering | 1:a8e61f3910ad | 41 | Serial pc(USBTX, USBRX); // tx, rx // Serial USB connection |
ricardo_95 | 12:7b3a5940f911 | 42 | Serial pi(p9, p10); // tx, rx // Setup serial communication for pi. |
DEldering | 1:a8e61f3910ad | 43 | Timer t; // Timer for equally time-spaced samples |
DEldering | 1:a8e61f3910ad | 44 | Ticker sample_cycle; // Polling cycle |
ricardo_95 | 8:bf0f7a6fb1fd | 45 | |
ricardo_95 | 12:7b3a5940f911 | 46 | int boot_delay_ms = 500; |
DEldering | 1:a8e61f3910ad | 47 | int cycle_time = 100000; // Cycle time in us |
DEldering | 1:a8e61f3910ad | 48 | int i2c_freq = 400000; // I2C Frequency |
ricardo_95 | 12:7b3a5940f911 | 49 | int baud = 115200; // Baud rate |
DEldering | 1:a8e61f3910ad | 50 | short res[8] = {0,0,0,0,0,0,0,0}; // 8 PR sensors 1 time per cycle |
DEldering | 1:a8e61f3910ad | 51 | short elec[5] = {0,0,0,0,0}; // 1 PE sensor 5 times per cycle |
DEldering | 1:a8e61f3910ad | 52 | int angle = 0; // Accelerometer Z-axis |
DEldering | 1:a8e61f3910ad | 53 | int k = 0; |
DEldering | 1:a8e61f3910ad | 54 | float acce[3]; // Raw accelerometer data |
DEldering | 1:a8e61f3910ad | 55 | float gyro[3]; // Raw gyroscope data |
ricardo_95 | 7:dba5091c8b7d | 56 | char LED_colour; // Variable to set LED colour. |
ricardo_95 | 12:7b3a5940f911 | 57 | bool lock_state, lock_flag, mute_state, alarm, calibration_flag, intensity_select; // Boolean variables for states logging. |
ricardo_95 | 8:bf0f7a6fb1fd | 58 | bool mute_flag, new_patient_flag, reposition_flag; |
ricardo_95 | 8:bf0f7a6fb1fd | 59 | bool speaker_state, LED_red_state, LED_yellow_state, LED_green_state, power_plug_state; |
ricardo_95 | 12:7b3a5940f911 | 60 | bool speaker_logged, LED_red_logged, LED_yellow_logged, LED_green_logged, power_plug_logged; |
ricardo_95 | 11:73c6def38fbd | 61 | int locktime_ms = 2000; // Waittime for lock user interface in ms. |
ricardo_95 | 12:7b3a5940f911 | 62 | int calibrationtime_ms = 5000; // Time to press new_patient button for calibration system. |
ricardo_95 | 12:7b3a5940f911 | 63 | int calibration_flash; // Variable for flash LED's to indicate calibration. |
ricardo_95 | 7:dba5091c8b7d | 64 | int buttondelay_ms = 750; // Button delay in ms. |
ricardo_95 | 7:dba5091c8b7d | 65 | int delay_lock_interface = 3000*60; // Delay for non using interface locktime. |
ricardo_95 | 12:7b3a5940f911 | 66 | int speaker_active_ms = 750; // Time to iterate speaker on and off when alarm occurs. |
ricardo_95 | 7:dba5091c8b7d | 67 | double alarm_voltage = 0.2; // Needed voltage for alarm expressed as a percentage (0 - 100 % => 0 - 3.3 V). |
ricardo_95 | 12:7b3a5940f911 | 68 | int red_var, green_var, blue_var, intensity; // Variables to set LED intensity. |
ricardo_95 | 8:bf0f7a6fb1fd | 69 | int batteryvoltage_current = 0, batteryvoltage_last = 0; |
ricardo_95 | 12:7b3a5940f911 | 70 | int intensity_day = 50, intensity_night = 25; // Intensity settings for LED's to wall. |
ricardo_95 | 7:dba5091c8b7d | 71 | |
ricardo_95 | 11:73c6def38fbd | 72 | void set_intensity() // Function to set the intensity for the LED's. |
ricardo_95 | 7:dba5091c8b7d | 73 | { |
ricardo_95 | 11:73c6def38fbd | 74 | if (intensity_select == 1) { |
ricardo_95 | 12:7b3a5940f911 | 75 | intensity = intensity_day; |
ricardo_95 | 12:7b3a5940f911 | 76 | } else { |
ricardo_95 | 12:7b3a5940f911 | 77 | intensity = intensity_night; |
ricardo_95 | 7:dba5091c8b7d | 78 | } |
ricardo_95 | 7:dba5091c8b7d | 79 | } |
ricardo_95 | 7:dba5091c8b7d | 80 | |
ricardo_95 | 12:7b3a5940f911 | 81 | void serial_read() // Serial read for select LED intensity and colour. |
ricardo_95 | 12:7b3a5940f911 | 82 | { |
ricardo_95 | 12:7b3a5940f911 | 83 | pc.printf("It works :)!"); |
ricardo_95 | 12:7b3a5940f911 | 84 | |
ricardo_95 | 11:73c6def38fbd | 85 | if (pi.readable()) { |
ricardo_95 | 11:73c6def38fbd | 86 | char message[3]; |
ricardo_95 | 11:73c6def38fbd | 87 | pi.scanf("%s",message); |
ricardo_95 | 12:7b3a5940f911 | 88 | pc.printf("%s", message); |
ricardo_95 | 11:73c6def38fbd | 89 | message[strlen(message)] = '\n'; |
ricardo_95 | 12:7b3a5940f911 | 90 | |
ricardo_95 | 11:73c6def38fbd | 91 | if (message[0] == '0') { |
ricardo_95 | 11:73c6def38fbd | 92 | intensity_select = 0; |
ricardo_95 | 12:7b3a5940f911 | 93 | } |
ricardo_95 | 12:7b3a5940f911 | 94 | |
ricardo_95 | 12:7b3a5940f911 | 95 | if (message[0] == '1') { |
ricardo_95 | 12:7b3a5940f911 | 96 | intensity_select = 1; |
ricardo_95 | 12:7b3a5940f911 | 97 | } |
ricardo_95 | 12:7b3a5940f911 | 98 | |
ricardo_95 | 11:73c6def38fbd | 99 | if (message[1] == 'g') { |
ricardo_95 | 12:7b3a5940f911 | 100 | LED_colour = 'g'; |
ricardo_95 | 11:73c6def38fbd | 101 | } |
ricardo_95 | 11:73c6def38fbd | 102 | |
ricardo_95 | 11:73c6def38fbd | 103 | if (message[1] == 'y') { |
ricardo_95 | 12:7b3a5940f911 | 104 | LED_colour = 'y'; |
ricardo_95 | 11:73c6def38fbd | 105 | } |
ricardo_95 | 12:7b3a5940f911 | 106 | |
ricardo_95 | 11:73c6def38fbd | 107 | if (message[1] == 'r') { |
ricardo_95 | 12:7b3a5940f911 | 108 | LED_colour = 'r'; |
ricardo_95 | 11:73c6def38fbd | 109 | } |
ricardo_95 | 11:73c6def38fbd | 110 | } |
ricardo_95 | 11:73c6def38fbd | 111 | } |
ricardo_95 | 11:73c6def38fbd | 112 | |
ricardo_95 | 7:dba5091c8b7d | 113 | void colour_select(char LED_colour) // Function to select the colour. |
ricardo_95 | 7:dba5091c8b7d | 114 | { |
ricardo_95 | 7:dba5091c8b7d | 115 | set_intensity(); // Call function set_intensity |
ricardo_95 | 7:dba5091c8b7d | 116 | |
ricardo_95 | 7:dba5091c8b7d | 117 | if (LED_colour == 'r') { |
ricardo_95 | 7:dba5091c8b7d | 118 | red_var = (2.55*intensity); |
ricardo_95 | 7:dba5091c8b7d | 119 | green_var = 0; |
ricardo_95 | 7:dba5091c8b7d | 120 | blue_var = 0; |
ricardo_95 | 12:7b3a5940f911 | 121 | LED_red_state = 1; |
ricardo_95 | 8:bf0f7a6fb1fd | 122 | } else { |
ricardo_95 | 12:7b3a5940f911 | 123 | LED_red_state = 0; |
ricardo_95 | 7:dba5091c8b7d | 124 | } |
ricardo_95 | 7:dba5091c8b7d | 125 | |
ricardo_95 | 7:dba5091c8b7d | 126 | if (LED_colour == 'y') { |
ricardo_95 | 7:dba5091c8b7d | 127 | red_var = (2.55*intensity); |
ricardo_95 | 7:dba5091c8b7d | 128 | green_var = (2.55*intensity); |
ricardo_95 | 12:7b3a5940f911 | 129 | blue_var = 0; |
ricardo_95 | 8:bf0f7a6fb1fd | 130 | LED_yellow_state = 1; |
ricardo_95 | 8:bf0f7a6fb1fd | 131 | } else { |
ricardo_95 | 8:bf0f7a6fb1fd | 132 | LED_green_state = 0; |
ricardo_95 | 7:dba5091c8b7d | 133 | } |
ricardo_95 | 7:dba5091c8b7d | 134 | |
ricardo_95 | 7:dba5091c8b7d | 135 | if (LED_colour == 'g') { |
ricardo_95 | 7:dba5091c8b7d | 136 | red_var = 0; |
ricardo_95 | 7:dba5091c8b7d | 137 | green_var = (2.55*intensity); |
ricardo_95 | 7:dba5091c8b7d | 138 | blue_var = 0; |
ricardo_95 | 12:7b3a5940f911 | 139 | LED_green_state = 1; |
ricardo_95 | 8:bf0f7a6fb1fd | 140 | } else { |
ricardo_95 | 8:bf0f7a6fb1fd | 141 | LED_green_state = 0; |
ricardo_95 | 7:dba5091c8b7d | 142 | } |
ricardo_95 | 7:dba5091c8b7d | 143 | |
ricardo_95 | 7:dba5091c8b7d | 144 | if (calibration_flash >= 1) { |
ricardo_95 | 7:dba5091c8b7d | 145 | if ((calibration_flash % 2) == 0) { |
ricardo_95 | 7:dba5091c8b7d | 146 | red_var = 255; |
ricardo_95 | 7:dba5091c8b7d | 147 | green_var = 255; |
ricardo_95 | 7:dba5091c8b7d | 148 | blue_var = 255; |
ricardo_95 | 7:dba5091c8b7d | 149 | } else { |
ricardo_95 | 7:dba5091c8b7d | 150 | red_var = 0; |
ricardo_95 | 7:dba5091c8b7d | 151 | green_var = 0; |
ricardo_95 | 7:dba5091c8b7d | 152 | blue_var = 0; |
ricardo_95 | 7:dba5091c8b7d | 153 | } |
ricardo_95 | 7:dba5091c8b7d | 154 | calibration_flash--; |
ricardo_95 | 7:dba5091c8b7d | 155 | } |
ricardo_95 | 7:dba5091c8b7d | 156 | } |
ricardo_95 | 7:dba5091c8b7d | 157 | |
ricardo_95 | 7:dba5091c8b7d | 158 | void trigger_lock() // If rising edge lock button is detected start locktimer. |
ricardo_95 | 7:dba5091c8b7d | 159 | { |
ricardo_95 | 7:dba5091c8b7d | 160 | hold_timer.start(); |
ricardo_95 | 7:dba5091c8b7d | 161 | delay.reset(); |
ricardo_95 | 7:dba5091c8b7d | 162 | delay.start(); |
ricardo_95 | 7:dba5091c8b7d | 163 | } |
ricardo_95 | 7:dba5091c8b7d | 164 | |
ricardo_95 | 7:dba5091c8b7d | 165 | void timer_lock() // End timer lock. |
ricardo_95 | 7:dba5091c8b7d | 166 | { |
ricardo_95 | 7:dba5091c8b7d | 167 | lock_flag = 0; // Set lock_flag off. |
ricardo_95 | 7:dba5091c8b7d | 168 | hold_timer.stop(); // Stop and reset holdtimer |
ricardo_95 | 7:dba5091c8b7d | 169 | hold_timer.reset(); |
ricardo_95 | 7:dba5091c8b7d | 170 | } |
ricardo_95 | 7:dba5091c8b7d | 171 | |
ricardo_95 | 7:dba5091c8b7d | 172 | void trigger_reposition() |
ricardo_95 | 7:dba5091c8b7d | 173 | { |
ricardo_95 | 7:dba5091c8b7d | 174 | if (lock_state == 1 | (delay.read_ms() < buttondelay_ms)) { // Control statement for lock interface and delay for non using buttons at the same time. |
ricardo_95 | 7:dba5091c8b7d | 175 | } else { |
ricardo_95 | 7:dba5091c8b7d | 176 | delay.reset(); |
ricardo_95 | 7:dba5091c8b7d | 177 | delay.start(); |
ricardo_95 | 7:dba5091c8b7d | 178 | |
ricardo_95 | 7:dba5091c8b7d | 179 | if (LED_intern1 == 0) { |
ricardo_95 | 7:dba5091c8b7d | 180 | LED_intern1 = 1.0; |
ricardo_95 | 7:dba5091c8b7d | 181 | } else { |
ricardo_95 | 7:dba5091c8b7d | 182 | LED_intern1 = 0.0; |
ricardo_95 | 7:dba5091c8b7d | 183 | } |
ricardo_95 | 7:dba5091c8b7d | 184 | |
ricardo_95 | 8:bf0f7a6fb1fd | 185 | reposition_flag = 1; |
ricardo_95 | 7:dba5091c8b7d | 186 | } |
ricardo_95 | 7:dba5091c8b7d | 187 | } |
ricardo_95 | 7:dba5091c8b7d | 188 | |
ricardo_95 | 7:dba5091c8b7d | 189 | void trigger_mute() |
ricardo_95 | 7:dba5091c8b7d | 190 | { |
ricardo_95 | 7:dba5091c8b7d | 191 | if (lock_state == 1 | (delay.read_ms() < buttondelay_ms)) { // Control statement for lock interface and delay for non using buttons at the same time. |
ricardo_95 | 7:dba5091c8b7d | 192 | mute_state = 0; |
ricardo_95 | 7:dba5091c8b7d | 193 | } else { |
ricardo_95 | 7:dba5091c8b7d | 194 | delay.reset(); |
ricardo_95 | 7:dba5091c8b7d | 195 | delay.start(); |
ricardo_95 | 7:dba5091c8b7d | 196 | pi.printf("01\n"); |
ricardo_95 | 7:dba5091c8b7d | 197 | mute_state = !mute_state; |
ricardo_95 | 7:dba5091c8b7d | 198 | |
ricardo_95 | 7:dba5091c8b7d | 199 | if (LED_intern1 == 0) { |
ricardo_95 | 7:dba5091c8b7d | 200 | LED_intern1 = 1.0; |
ricardo_95 | 7:dba5091c8b7d | 201 | } else { |
ricardo_95 | 7:dba5091c8b7d | 202 | LED_intern1 = 0.0; |
ricardo_95 | 7:dba5091c8b7d | 203 | } |
ricardo_95 | 12:7b3a5940f911 | 204 | |
ricardo_95 | 8:bf0f7a6fb1fd | 205 | mute_flag = 1; |
ricardo_95 | 7:dba5091c8b7d | 206 | } |
ricardo_95 | 7:dba5091c8b7d | 207 | } |
ricardo_95 | 7:dba5091c8b7d | 208 | |
ricardo_95 | 7:dba5091c8b7d | 209 | void trigger_new_patient() // Function to trigger hold timer for new patient calibration function. |
ricardo_95 | 7:dba5091c8b7d | 210 | { |
ricardo_95 | 7:dba5091c8b7d | 211 | if (lock_state == 1) { |
ricardo_95 | 7:dba5091c8b7d | 212 | } else { |
ricardo_95 | 7:dba5091c8b7d | 213 | hold_timer.start(); |
ricardo_95 | 8:bf0f7a6fb1fd | 214 | new_patient_flag = 1; |
ricardo_95 | 7:dba5091c8b7d | 215 | } |
ricardo_95 | 7:dba5091c8b7d | 216 | } |
ricardo_95 | 7:dba5091c8b7d | 217 | |
ricardo_95 | 7:dba5091c8b7d | 218 | void timer_calibration() // Timer calibration function. |
ricardo_95 | 7:dba5091c8b7d | 219 | { |
ricardo_95 | 7:dba5091c8b7d | 220 | hold_timer.stop(); |
ricardo_95 | 7:dba5091c8b7d | 221 | hold_timer.reset(); |
ricardo_95 | 12:7b3a5940f911 | 222 | |
ricardo_95 | 7:dba5091c8b7d | 223 | if (lock_state == 1 | (delay.read_ms() < buttondelay_ms)) { // Control statement for lock interface and delay for non using buttons at the same time. |
ricardo_95 | 7:dba5091c8b7d | 224 | } else { |
ricardo_95 | 7:dba5091c8b7d | 225 | if (calibration_flag == 0) { |
ricardo_95 | 12:7b3a5940f911 | 226 | |
ricardo_95 | 7:dba5091c8b7d | 227 | if (LED_intern1 == 0) { |
ricardo_95 | 7:dba5091c8b7d | 228 | LED_intern1 = 1.0; |
ricardo_95 | 7:dba5091c8b7d | 229 | } else { |
ricardo_95 | 7:dba5091c8b7d | 230 | LED_intern1 = 0.0; |
ricardo_95 | 7:dba5091c8b7d | 231 | } |
ricardo_95 | 12:7b3a5940f911 | 232 | |
ricardo_95 | 7:dba5091c8b7d | 233 | } else { |
ricardo_95 | 7:dba5091c8b7d | 234 | calibration_flag = 0; |
ricardo_95 | 7:dba5091c8b7d | 235 | } |
ricardo_95 | 7:dba5091c8b7d | 236 | } |
ricardo_95 | 7:dba5091c8b7d | 237 | } |
ricardo_95 | 7:dba5091c8b7d | 238 | |
ricardo_95 | 7:dba5091c8b7d | 239 | void generate(neopixel::Pixel * out, uint32_t index, uintptr_t val) // Generate LED colour. |
ricardo_95 | 7:dba5091c8b7d | 240 | { |
ricardo_95 | 7:dba5091c8b7d | 241 | out->red = red_var; |
ricardo_95 | 7:dba5091c8b7d | 242 | out->green = green_var; |
ricardo_95 | 7:dba5091c8b7d | 243 | out->blue = blue_var; |
ricardo_95 | 7:dba5091c8b7d | 244 | } |
ricardo_95 | 7:dba5091c8b7d | 245 | |
ricardo_95 | 7:dba5091c8b7d | 246 | void read_voltage() |
ricardo_95 | 7:dba5091c8b7d | 247 | { |
ricardo_95 | 7:dba5091c8b7d | 248 | LED_intern3 = 0; |
ricardo_95 | 12:7b3a5940f911 | 249 | |
ricardo_95 | 8:bf0f7a6fb1fd | 250 | if (batteryvoltage.read() > alarm_voltage) { // If supplyvoltage (readed from input) is greater then the setted alarmvoltage. |
ricardo_95 | 7:dba5091c8b7d | 251 | alarm = 0; // Alarm is off. |
ricardo_95 | 12:7b3a5940f911 | 252 | speaker_state = 0; |
ricardo_95 | 7:dba5091c8b7d | 253 | } else { |
ricardo_95 | 7:dba5091c8b7d | 254 | alarm = 1; // Else alarm is on. |
ricardo_95 | 12:7b3a5940f911 | 255 | speaker_state = 1; |
ricardo_95 | 7:dba5091c8b7d | 256 | } |
ricardo_95 | 12:7b3a5940f911 | 257 | |
ricardo_95 | 7:dba5091c8b7d | 258 | if (alarm == 1 && mute_state == 0 && (speaker_timer.read_ms() < speaker_active_ms)) { // Set speaker on for 750 ms. |
ricardo_95 | 7:dba5091c8b7d | 259 | speaker1 = 1; // Set speaker. |
ricardo_95 | 7:dba5091c8b7d | 260 | speaker2 = 1; |
ricardo_95 | 7:dba5091c8b7d | 261 | speaker_timer.start(); // Set timer for speaker to iterate on and off. |
ricardo_95 | 7:dba5091c8b7d | 262 | LED_intern3 = !LED_intern3; |
ricardo_95 | 7:dba5091c8b7d | 263 | } |
ricardo_95 | 7:dba5091c8b7d | 264 | |
ricardo_95 | 7:dba5091c8b7d | 265 | if (alarm == 1 && mute_state == 1 && (speaker_timer.read_ms() < speaker_active_ms)) { // Set speaker on for 750 ms. |
ricardo_95 | 7:dba5091c8b7d | 266 | speaker1 = 0; // Set speaker. |
ricardo_95 | 7:dba5091c8b7d | 267 | speaker2 = 0; |
ricardo_95 | 7:dba5091c8b7d | 268 | speaker_timer.start(); // Set timer for speaker to iterate on and off. |
ricardo_95 | 7:dba5091c8b7d | 269 | LED_intern3 = !LED_intern3; |
ricardo_95 | 7:dba5091c8b7d | 270 | } |
ricardo_95 | 7:dba5091c8b7d | 271 | |
ricardo_95 | 7:dba5091c8b7d | 272 | if ((speaker_timer.read_ms() > speaker_active_ms) && (speaker_timer.read_ms() < (speaker_active_ms*2))) { |
ricardo_95 | 7:dba5091c8b7d | 273 | speaker1 = 0; // Turn off speaker (use two outputs because of currentlimiting of one). |
ricardo_95 | 7:dba5091c8b7d | 274 | speaker2 = 0; |
ricardo_95 | 7:dba5091c8b7d | 275 | } |
ricardo_95 | 7:dba5091c8b7d | 276 | |
ricardo_95 | 7:dba5091c8b7d | 277 | if (speaker_timer.read_ms() > (speaker_active_ms*2)) { |
ricardo_95 | 7:dba5091c8b7d | 278 | speaker_timer.stop(); // Stop speaker timer. |
ricardo_95 | 7:dba5091c8b7d | 279 | speaker_timer.reset(); |
ricardo_95 | 7:dba5091c8b7d | 280 | } |
ricardo_95 | 12:7b3a5940f911 | 281 | |
ricardo_95 | 12:7b3a5940f911 | 282 | batteryvoltage_current = batteryvoltage.read(); |
ricardo_95 | 12:7b3a5940f911 | 283 | |
ricardo_95 | 8:bf0f7a6fb1fd | 284 | if (supplyvoltage.read() == 0) { |
ricardo_95 | 12:7b3a5940f911 | 285 | power_plug_state = 1; |
ricardo_95 | 8:bf0f7a6fb1fd | 286 | } else { |
ricardo_95 | 12:7b3a5940f911 | 287 | power_plug_state = 0; |
ricardo_95 | 8:bf0f7a6fb1fd | 288 | } |
ricardo_95 | 7:dba5091c8b7d | 289 | } |
DEldering | 0:c0e44c46c573 | 290 | |
DEldering | 0:c0e44c46c573 | 291 | void read_adc() |
DEldering | 0:c0e44c46c573 | 292 | { |
DEldering | 1:a8e61f3910ad | 293 | t.reset(); |
DEldering | 1:a8e61f3910ad | 294 | t.start(); |
DEldering | 1:a8e61f3910ad | 295 | |
DEldering | 4:367af005956b | 296 | elec[0] = pel.readADC_SingleEnded(0); //First PE readout |
DEldering | 1:a8e61f3910ad | 297 | |
DEldering | 0:c0e44c46c573 | 298 | for (k = 0; k < 4; k = k + 1) { |
DEldering | 4:367af005956b | 299 | res[k] = pr1.readADC_SingleEnded(k); //First 4 PR readout |
DEldering | 1:a8e61f3910ad | 300 | } |
DEldering | 4:367af005956b | 301 | while(t.read_us()<(1*(cycle_time/5))) {} //Wait untill 20% of cycle |
DEldering | 1:a8e61f3910ad | 302 | |
DEldering | 4:367af005956b | 303 | elec[1] = pel.readADC_SingleEnded(0); //Second PE readout |
DEldering | 1:a8e61f3910ad | 304 | |
DEldering | 1:a8e61f3910ad | 305 | for (k = 0; k < 4; k = k + 1) { |
DEldering | 4:367af005956b | 306 | res[k+4] = pr2.readADC_SingleEnded(k); //Last 4 PR readout |
DEldering | 0:c0e44c46c573 | 307 | } |
ricardo_95 | 7:dba5091c8b7d | 308 | while(t.read_us()<(2*(cycle_time/5))) {} //Wait untill 40% of cycle |
DEldering | 1:a8e61f3910ad | 309 | |
DEldering | 4:367af005956b | 310 | elec[2] = pel.readADC_SingleEnded(0); //Third PE readout |
DEldering | 1:a8e61f3910ad | 311 | |
DEldering | 4:367af005956b | 312 | agu.getAccelero(acce); //Get accelerometer data |
DEldering | 1:a8e61f3910ad | 313 | angle = acce[2]*10; |
ricardo_95 | 7:dba5091c8b7d | 314 | agu.getGyro(gyro); //Get gyroscope data |
ricardo_95 | 7:dba5091c8b7d | 315 | |
DEldering | 4:367af005956b | 316 | while(t.read_us()<(3*(cycle_time/5))) {} //Wait untill 60% of cycle |
DEldering | 1:a8e61f3910ad | 317 | |
DEldering | 4:367af005956b | 318 | elec[3] = pel.readADC_SingleEnded(0); //Fourth PE readout |
DEldering | 1:a8e61f3910ad | 319 | |
ricardo_95 | 7:dba5091c8b7d | 320 | if ((hold_timer.read_ms() > locktime_ms) && lock_flag == 0 && lock == 1) { // If statement for lock function. |
ricardo_95 | 7:dba5091c8b7d | 321 | lock_flag = 1; |
ricardo_95 | 7:dba5091c8b7d | 322 | LED_intern2 = !LED_intern2; |
ricardo_95 | 7:dba5091c8b7d | 323 | lock_state = !lock_state; |
ricardo_95 | 7:dba5091c8b7d | 324 | } |
ricardo_95 | 7:dba5091c8b7d | 325 | |
ricardo_95 | 7:dba5091c8b7d | 326 | if ((hold_timer.read_ms() > calibrationtime_ms) && calibration_flag == 0 && new_patient == 1) { // If statement for calibration system. |
ricardo_95 | 7:dba5091c8b7d | 327 | calibration_flag = 1; |
ricardo_95 | 7:dba5091c8b7d | 328 | calibration_flash = 11; |
ricardo_95 | 7:dba5091c8b7d | 329 | pi.printf("Calibration button is pressed."); // Print statement for serial communication to inform algorithm to calibrate. |
ricardo_95 | 7:dba5091c8b7d | 330 | } |
ricardo_95 | 12:7b3a5940f911 | 331 | |
ricardo_95 | 7:dba5091c8b7d | 332 | if (delay.read_ms() > delay_lock_interface) { // If buttons are not pressed for 3 minutes, set lock active. |
ricardo_95 | 7:dba5091c8b7d | 333 | lock_state = 1; |
ricardo_95 | 7:dba5091c8b7d | 334 | LED_intern2 = 1; |
ricardo_95 | 7:dba5091c8b7d | 335 | } |
ricardo_95 | 7:dba5091c8b7d | 336 | |
ricardo_95 | 8:bf0f7a6fb1fd | 337 | batteryvoltage_current = batteryvoltage_current*100; |
ricardo_95 | 8:bf0f7a6fb1fd | 338 | batteryvoltage_current = batteryvoltage_last; |
ricardo_95 | 7:dba5091c8b7d | 339 | read_voltage(); // Supplyvoltage control for alarm. |
ricardo_95 | 8:bf0f7a6fb1fd | 340 | |
ricardo_95 | 7:dba5091c8b7d | 341 | uint32_t val = 0; |
ricardo_95 | 7:dba5091c8b7d | 342 | colour_select(LED_colour); |
ricardo_95 | 7:dba5091c8b7d | 343 | array.update(generate, NLED, val); |
ricardo_95 | 7:dba5091c8b7d | 344 | |
DEldering | 4:367af005956b | 345 | while(t.read_us()<(4*(cycle_time/5))) {} //Wait untill 80% of cycle |
DEldering | 1:a8e61f3910ad | 346 | |
DEldering | 4:367af005956b | 347 | elec[4] = pel.readADC_SingleEnded(0); //Fifth PE readout |
DEldering | 1:a8e61f3910ad | 348 | |
DEldering | 4:367af005956b | 349 | while(t.read_us()<(4.5*(cycle_time/5))) {} //Wait untill 90% of cycle |
ricardo_95 | 11:73c6def38fbd | 350 | pi.printf("!,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,\n", res[4], res[7], res[6], res[5], res[1], res[0], res[2], res[3], elec[0], elec[1], elec[2], elec[3], elec[4], acce[0]*100, acce[1]*100, acce[2]*100, gyro[0]*100, gyro[1]*100, gyro[2]*100); // print all to serial port |
DEldering | 6:9c1944f3ebe5 | 351 | //receiving order: 8 resistive sensors, 5 electric readings, 3 accelerometer axes, 3 gyroscope axes |
ricardo_95 | 7:dba5091c8b7d | 352 | |
ricardo_95 | 12:7b3a5940f911 | 353 | serial_read(); |
ricardo_95 | 12:7b3a5940f911 | 354 | |
ricardo_95 | 7:dba5091c8b7d | 355 | if (mute_flag == 1) { |
ricardo_95 | 7:dba5091c8b7d | 356 | pi.printf(">01\n"); |
ricardo_95 | 7:dba5091c8b7d | 357 | mute_flag = 0; |
ricardo_95 | 12:7b3a5940f911 | 358 | LED_intern4 = 1; |
ricardo_95 | 11:73c6def38fbd | 359 | } else { |
ricardo_95 | 11:73c6def38fbd | 360 | LED_intern4 = 0; |
ricardo_95 | 7:dba5091c8b7d | 361 | } |
ricardo_95 | 12:7b3a5940f911 | 362 | |
ricardo_95 | 7:dba5091c8b7d | 363 | if (new_patient_flag == 1) { |
ricardo_95 | 7:dba5091c8b7d | 364 | pi.printf(">02\n"); |
ricardo_95 | 7:dba5091c8b7d | 365 | new_patient_flag = 0; |
ricardo_95 | 7:dba5091c8b7d | 366 | } |
ricardo_95 | 12:7b3a5940f911 | 367 | |
ricardo_95 | 7:dba5091c8b7d | 368 | if (reposition_flag == 1) { |
ricardo_95 | 7:dba5091c8b7d | 369 | pi.printf(">03\n"); |
ricardo_95 | 7:dba5091c8b7d | 370 | reposition_flag = 0; |
ricardo_95 | 7:dba5091c8b7d | 371 | } |
ricardo_95 | 12:7b3a5940f911 | 372 | |
ricardo_95 | 8:bf0f7a6fb1fd | 373 | if (batteryvoltage_current != batteryvoltage_last) { |
ricardo_95 | 8:bf0f7a6fb1fd | 374 | pi.printf("%%d\n", batteryvoltage_current); |
ricardo_95 | 12:7b3a5940f911 | 375 | } |
ricardo_95 | 12:7b3a5940f911 | 376 | |
ricardo_95 | 9:514a44bf510f | 377 | if (LED_red_logged != LED_red_state) { |
ricardo_95 | 12:7b3a5940f911 | 378 | if (LED_red_state == 1) { |
ricardo_95 | 9:514a44bf510f | 379 | pi.printf("&04\n"); |
ricardo_95 | 9:514a44bf510f | 380 | LED_red_logged = LED_red_state; |
ricardo_95 | 12:7b3a5940f911 | 381 | } |
ricardo_95 | 9:514a44bf510f | 382 | if (LED_red_state == 0) { |
ricardo_95 | 9:514a44bf510f | 383 | pi.printf("&40\n"); |
ricardo_95 | 12:7b3a5940f911 | 384 | LED_red_logged = LED_red_state; |
ricardo_95 | 9:514a44bf510f | 385 | } |
ricardo_95 | 8:bf0f7a6fb1fd | 386 | } |
ricardo_95 | 12:7b3a5940f911 | 387 | |
ricardo_95 | 9:514a44bf510f | 388 | if (LED_yellow_logged != LED_yellow_state) { |
ricardo_95 | 12:7b3a5940f911 | 389 | if (LED_yellow_state == 1) { |
ricardo_95 | 9:514a44bf510f | 390 | pi.printf("&06\n"); |
ricardo_95 | 9:514a44bf510f | 391 | LED_yellow_logged = LED_yellow_state; |
ricardo_95 | 12:7b3a5940f911 | 392 | } |
ricardo_95 | 9:514a44bf510f | 393 | if (LED_yellow_state == 0) { |
ricardo_95 | 9:514a44bf510f | 394 | pi.printf("&60\n"); |
ricardo_95 | 12:7b3a5940f911 | 395 | LED_yellow_logged = LED_yellow_state; |
ricardo_95 | 9:514a44bf510f | 396 | } |
ricardo_95 | 7:dba5091c8b7d | 397 | } |
ricardo_95 | 12:7b3a5940f911 | 398 | |
ricardo_95 | 9:514a44bf510f | 399 | if (LED_green_logged != LED_green_state) { |
ricardo_95 | 12:7b3a5940f911 | 400 | if (LED_green_state == 1) { |
ricardo_95 | 9:514a44bf510f | 401 | pi.printf("&05\n"); |
ricardo_95 | 9:514a44bf510f | 402 | LED_green_logged = LED_green_state; |
ricardo_95 | 12:7b3a5940f911 | 403 | } |
ricardo_95 | 9:514a44bf510f | 404 | if (LED_green_state == 0) { |
ricardo_95 | 9:514a44bf510f | 405 | pi.printf("&50\n"); |
ricardo_95 | 12:7b3a5940f911 | 406 | LED_green_logged = LED_green_state; |
ricardo_95 | 9:514a44bf510f | 407 | } |
ricardo_95 | 7:dba5091c8b7d | 408 | } |
ricardo_95 | 12:7b3a5940f911 | 409 | |
ricardo_95 | 9:514a44bf510f | 410 | if (speaker_logged != speaker_state) { |
ricardo_95 | 12:7b3a5940f911 | 411 | if (speaker_state == 1) { |
ricardo_95 | 9:514a44bf510f | 412 | pi.printf("&07\n"); |
ricardo_95 | 9:514a44bf510f | 413 | speaker_logged = speaker_state; |
ricardo_95 | 12:7b3a5940f911 | 414 | } |
ricardo_95 | 9:514a44bf510f | 415 | if (speaker_state == 0) { |
ricardo_95 | 9:514a44bf510f | 416 | pi.printf("&70\n"); |
ricardo_95 | 12:7b3a5940f911 | 417 | speaker_logged = speaker_state; |
ricardo_95 | 9:514a44bf510f | 418 | } |
ricardo_95 | 8:bf0f7a6fb1fd | 419 | } |
ricardo_95 | 9:514a44bf510f | 420 | |
ricardo_95 | 9:514a44bf510f | 421 | if (power_plug_logged != power_plug_state) { |
ricardo_95 | 12:7b3a5940f911 | 422 | if (power_plug_state == 1) { |
ricardo_95 | 10:6b3034ec3c47 | 423 | pi.printf("#08\n"); |
ricardo_95 | 9:514a44bf510f | 424 | power_plug_logged = power_plug_state; |
ricardo_95 | 12:7b3a5940f911 | 425 | } |
ricardo_95 | 9:514a44bf510f | 426 | if (power_plug_state == 0) { |
ricardo_95 | 10:6b3034ec3c47 | 427 | pi.printf("#80\n"); |
ricardo_95 | 12:7b3a5940f911 | 428 | power_plug_logged = power_plug_state; |
ricardo_95 | 9:514a44bf510f | 429 | } |
ricardo_95 | 9:514a44bf510f | 430 | } |
DEldering | 0:c0e44c46c573 | 431 | } |
DEldering | 0:c0e44c46c573 | 432 | |
DEldering | 0:c0e44c46c573 | 433 | int main() |
DEldering | 0:c0e44c46c573 | 434 | { |
ricardo_95 | 12:7b3a5940f911 | 435 | wait_ms(boot_delay_ms); // Wait to boot sensorplate first |
DEldering | 1:a8e61f3910ad | 436 | i2c.frequency(i2c_freq); |
ricardo_95 | 12:7b3a5940f911 | 437 | pc.baud(baud); |
ricardo_95 | 12:7b3a5940f911 | 438 | pi.baud(baud); |
DEldering | 1:a8e61f3910ad | 439 | pr1.setGain(GAIN_TWOTHIRDS); // set range to +/-6.144V |
DEldering | 1:a8e61f3910ad | 440 | pr2.setGain(GAIN_TWOTHIRDS); // set range to +/-6.144V |
DEldering | 1:a8e61f3910ad | 441 | pel.setGain(GAIN_TWOTHIRDS); // set range to +/-6.144V |
ricardo_95 | 7:dba5091c8b7d | 442 | pi.format(8, SerialBase::None, 1); |
ricardo_95 | 7:dba5091c8b7d | 443 | |
ricardo_95 | 7:dba5091c8b7d | 444 | lock.rise(&trigger_lock); // Interrupt for rising edge lock button. |
ricardo_95 | 7:dba5091c8b7d | 445 | lock.fall(&timer_lock); |
ricardo_95 | 7:dba5091c8b7d | 446 | reposition.rise(&trigger_reposition); |
ricardo_95 | 7:dba5091c8b7d | 447 | mute.rise(&trigger_mute); |
ricardo_95 | 7:dba5091c8b7d | 448 | new_patient.rise(&trigger_new_patient); // New patient/calibration button rising event. |
ricardo_95 | 7:dba5091c8b7d | 449 | new_patient.fall(&timer_calibration); // Falling edge for calibration algorithm option. |
ricardo_95 | 7:dba5091c8b7d | 450 | delay.reset(); // Delaytimer reset en start. |
ricardo_95 | 7:dba5091c8b7d | 451 | delay.start(); |
ricardo_95 | 7:dba5091c8b7d | 452 | |
DEldering | 0:c0e44c46c573 | 453 | while (1) { |
DEldering | 1:a8e61f3910ad | 454 | wait_us(cycle_time+1); // wait indefinitely because the ticker restarts every 50 ms |
DEldering | 0:c0e44c46c573 | 455 | } |
ricardo_95 | 12:7b3a5940f911 | 456 | } |