para el ventilador

Dependencies:   QEI FastPWM

Committer:
miguelangel_2511
Date:
Thu Apr 23 17:05:36 2020 +0000
Revision:
8:208d965a3bd2
Parent:
7:f4e248182d31
Child:
9:95fdcdc0977e
Se agrego la medicion y visualizacion grafica del volumen, el flujo y la presion. Sin embargo, aun no se han aplicado filtros a las seniales medidas.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
miguelangel_2511 0:9d0b9785d3d6 1
miguelangel_2511 0:9d0b9785d3d6 2 /* File inclusion */
miguelangel_2511 0:9d0b9785d3d6 3 #include "mbed.h"
miguelangel_2511 0:9d0b9785d3d6 4 #include "stdint.h"
miguelangel_2511 0:9d0b9785d3d6 5 #include "QEI.h"
miguelangel_2511 0:9d0b9785d3d6 6 #include "project_defines.h"
miguelangel_2511 0:9d0b9785d3d6 7 #include "buttons.h"
miguelangel_2511 0:9d0b9785d3d6 8 #include "encoder_interface.h"
miguelangel_2511 6:d38287621cca 9 #include "nextion_interface.h"
miguelangel_2511 7:f4e248182d31 10 #include "pressure_sensors.h"
miguelangel_2511 8:208d965a3bd2 11 #include "stepper_motor_driver.h"
miguelangel_2511 0:9d0b9785d3d6 12 #include "ventilator.h"
miguelangel_2511 0:9d0b9785d3d6 13
miguelangel_2511 8:208d965a3bd2 14 /* Object definition */
miguelangel_2511 8:208d965a3bd2 15 Ticker ticker_int_1ms; // Ticker interrupt
miguelangel_2511 8:208d965a3bd2 16
miguelangel_2511 0:9d0b9785d3d6 17
miguelangel_2511 2:6f618b905d4f 18 /* Global variable definition */
miguelangel_2511 7:f4e248182d31 19
miguelangel_2511 7:f4e248182d31 20 volatile uint8_t read_pressure_sensors_flag;
miguelangel_2511 7:f4e248182d31 21 volatile uint8_t pressure_sensor_display_update_flag;
miguelangel_2511 7:f4e248182d31 22 volatile uint8_t pressure_sensor_waveform_update_flag;
miguelangel_2511 7:f4e248182d31 23
miguelangel_2511 2:6f618b905d4f 24 uint16_t volume_setpoint = VOLUME_SETPOINT_VALUE_DEFAULT;
miguelangel_2511 2:6f618b905d4f 25 uint16_t volume_measured = 480;
miguelangel_2511 2:6f618b905d4f 26 uint8_t resp_frequency = RESP_FREQUENCY_VALUE_DEFAULT;
miguelangel_2511 2:6f618b905d4f 27 float inspiration_time = INSPIRATION_TIME_VALUE_DEFAULT;
miguelangel_2511 2:6f618b905d4f 28 float expiration_time = EXPIRATION_TIME_VALUE_DEFAULT;
miguelangel_2511 2:6f618b905d4f 29 uint8_t pressure_measured = 16;
miguelangel_2511 2:6f618b905d4f 30 uint8_t gas_input = AIR_INPUT;
miguelangel_2511 0:9d0b9785d3d6 31
miguelangel_2511 2:6f618b905d4f 32
miguelangel_2511 1:aa5df1878126 33 Main_Screen_State_t main_screen_state = MAIN_SCREEN_DEFAULT_STATE;
miguelangel_2511 0:9d0b9785d3d6 34 uint8_t first_time_in_state = 1;
miguelangel_2511 0:9d0b9785d3d6 35
miguelangel_2511 0:9d0b9785d3d6 36 /* Function definition */
miguelangel_2511 8:208d965a3bd2 37
miguelangel_2511 8:208d965a3bd2 38 void System_Initialize(void){
miguelangel_2511 8:208d965a3bd2 39 Buttons_Initialize();
miguelangel_2511 8:208d965a3bd2 40 Nextion_Interface_Initialize();
miguelangel_2511 8:208d965a3bd2 41 Pressure_Sensors_Initialize();
miguelangel_2511 8:208d965a3bd2 42 ticker_int_1ms.attach(&Ticker_ISR, 0.001);
miguelangel_2511 8:208d965a3bd2 43 Stepper_Driver_Init();
miguelangel_2511 8:208d965a3bd2 44 }
miguelangel_2511 8:208d965a3bd2 45
miguelangel_2511 8:208d965a3bd2 46
miguelangel_2511 6:d38287621cca 47 void Nextion_Encoder_Interaction(void){
miguelangel_2511 0:9d0b9785d3d6 48
miguelangel_2511 1:aa5df1878126 49 switch(main_screen_state){
miguelangel_2511 0:9d0b9785d3d6 50 case Main_Screen_Cursor_Disable:
miguelangel_2511 0:9d0b9785d3d6 51 if(Get_Button_Press(1 << ENTER_SW)){
miguelangel_2511 0:9d0b9785d3d6 52 rotary_encoder.reset();
miguelangel_2511 1:aa5df1878126 53 main_screen_state = Main_Screen_Cursor_Enable;
miguelangel_2511 8:208d965a3bd2 54 first_time_in_state = 1;
miguelangel_2511 0:9d0b9785d3d6 55 }
miguelangel_2511 0:9d0b9785d3d6 56
miguelangel_2511 0:9d0b9785d3d6 57 break;
miguelangel_2511 0:9d0b9785d3d6 58
miguelangel_2511 0:9d0b9785d3d6 59 case Main_Screen_Cursor_Enable:
miguelangel_2511 0:9d0b9785d3d6 60 if(first_time_in_state){
miguelangel_2511 0:9d0b9785d3d6 61 first_time_in_state = 0;
miguelangel_2511 0:9d0b9785d3d6 62 Parameter_Selection_Box_Update();
miguelangel_2511 0:9d0b9785d3d6 63 }else if(parameter_selection_index_change_flag){
miguelangel_2511 0:9d0b9785d3d6 64 parameter_selection_index_change_flag = 0;
miguelangel_2511 0:9d0b9785d3d6 65 Parameter_Selection_Box_Update();
miguelangel_2511 0:9d0b9785d3d6 66 }else{
miguelangel_2511 0:9d0b9785d3d6 67 //Does nothing
miguelangel_2511 0:9d0b9785d3d6 68 }
miguelangel_2511 0:9d0b9785d3d6 69
miguelangel_2511 0:9d0b9785d3d6 70 if(Get_Button_Press(1 << ENTER_SW)){
miguelangel_2511 1:aa5df1878126 71 main_screen_state = (Main_Screen_State_t)(2 + parameter_selection_index);
miguelangel_2511 0:9d0b9785d3d6 72 first_time_in_state = 1;
miguelangel_2511 0:9d0b9785d3d6 73 }
miguelangel_2511 0:9d0b9785d3d6 74
miguelangel_2511 0:9d0b9785d3d6 75 break;
miguelangel_2511 0:9d0b9785d3d6 76
miguelangel_2511 0:9d0b9785d3d6 77
miguelangel_2511 0:9d0b9785d3d6 78 case Main_Screen_Volume_Setpoint_Adjust:
miguelangel_2511 0:9d0b9785d3d6 79 if(first_time_in_state){
miguelangel_2511 0:9d0b9785d3d6 80 first_time_in_state = 0;
miguelangel_2511 8:208d965a3bd2 81 nextion_display.printf("t1.pco=%d", ADJUST_COLOR); // Change font color
miguelangel_2511 6:d38287621cca 82 nextion_display.printf("%c%c%c", 0xff, 0xff, 0xff);
miguelangel_2511 7:f4e248182d31 83 // pc.printf("t6.pco=%d\n\r", ADJUST_COLOR); // Change font color
miguelangel_2511 7:f4e248182d31 84 // pc.printf("%c%c%c\n\r", 0xff, 0xff, 0xff);
miguelangel_2511 0:9d0b9785d3d6 85 Volume_Setpoint_Display_Update();
miguelangel_2511 0:9d0b9785d3d6 86 }else if(volume_setpoint_index_change_flag){
miguelangel_2511 0:9d0b9785d3d6 87 volume_setpoint_index_change_flag = 0;
miguelangel_2511 0:9d0b9785d3d6 88 Volume_Setpoint_Display_Update();
miguelangel_2511 0:9d0b9785d3d6 89 }else{
miguelangel_2511 0:9d0b9785d3d6 90 //Does nothing
miguelangel_2511 0:9d0b9785d3d6 91 }
miguelangel_2511 0:9d0b9785d3d6 92
miguelangel_2511 0:9d0b9785d3d6 93 if(Get_Button_Press(1 << ENTER_SW)){
miguelangel_2511 1:aa5df1878126 94 main_screen_state = Main_Screen_Cursor_Disable;
miguelangel_2511 0:9d0b9785d3d6 95 first_time_in_state = 1;
miguelangel_2511 0:9d0b9785d3d6 96 Volume_Setpoint_Fix();
miguelangel_2511 0:9d0b9785d3d6 97 Parameter_Selection_Box_Remove();
miguelangel_2511 0:9d0b9785d3d6 98 }
miguelangel_2511 0:9d0b9785d3d6 99
miguelangel_2511 0:9d0b9785d3d6 100 break;
miguelangel_2511 0:9d0b9785d3d6 101
miguelangel_2511 0:9d0b9785d3d6 102 case Main_Screen_Resp_Frequency_Adjust:
miguelangel_2511 0:9d0b9785d3d6 103 if(first_time_in_state){
miguelangel_2511 0:9d0b9785d3d6 104 first_time_in_state = 0;
miguelangel_2511 8:208d965a3bd2 105 nextion_display.printf("t4.pco=%d", ADJUST_COLOR); // Change font color
miguelangel_2511 6:d38287621cca 106 nextion_display.printf("%c%c%c", 0xff, 0xff, 0xff);
miguelangel_2511 7:f4e248182d31 107 // pc.printf("t7.pco=%d\n\r", ADJUST_COLOR); // Change font color
miguelangel_2511 7:f4e248182d31 108 // pc.printf("%c%c%c\n\r", 0xff, 0xff, 0xff);
miguelangel_2511 0:9d0b9785d3d6 109 Resp_Frequency_Display_Update();
miguelangel_2511 0:9d0b9785d3d6 110 }else if(resp_frequency_index_change_flag){
miguelangel_2511 0:9d0b9785d3d6 111 resp_frequency_index_change_flag = 0;
miguelangel_2511 0:9d0b9785d3d6 112 Resp_Frequency_Display_Update();
miguelangel_2511 0:9d0b9785d3d6 113 }else{
miguelangel_2511 0:9d0b9785d3d6 114 //Does nothing
miguelangel_2511 0:9d0b9785d3d6 115 }
miguelangel_2511 0:9d0b9785d3d6 116
miguelangel_2511 0:9d0b9785d3d6 117 if(Get_Button_Press(1 << ENTER_SW)){
miguelangel_2511 1:aa5df1878126 118 main_screen_state = Main_Screen_Cursor_Disable;
miguelangel_2511 0:9d0b9785d3d6 119 first_time_in_state = 1;
miguelangel_2511 0:9d0b9785d3d6 120 Resp_Frequency_Fix();
miguelangel_2511 6:d38287621cca 121 Parameter_Selection_Box_Remove();
miguelangel_2511 0:9d0b9785d3d6 122 }
miguelangel_2511 0:9d0b9785d3d6 123
miguelangel_2511 0:9d0b9785d3d6 124 break;
miguelangel_2511 0:9d0b9785d3d6 125
miguelangel_2511 0:9d0b9785d3d6 126
miguelangel_2511 0:9d0b9785d3d6 127 case Main_Screen_I_E_Ratio_Adjust:
miguelangel_2511 0:9d0b9785d3d6 128 if(first_time_in_state){
miguelangel_2511 0:9d0b9785d3d6 129 first_time_in_state = 0;
miguelangel_2511 8:208d965a3bd2 130 nextion_display.printf("t7.pco=%d", ADJUST_COLOR); // Change font color
miguelangel_2511 6:d38287621cca 131 nextion_display.printf("%c%c%c", 0xff, 0xff, 0xff);
miguelangel_2511 7:f4e248182d31 132 //pc.printf("t8.pco=%d\n\r", ADJUST_COLOR); // Change font color
miguelangel_2511 7:f4e248182d31 133 // pc.printf("%c%c%c\n\r", 0xff, 0xff, 0xff);
miguelangel_2511 0:9d0b9785d3d6 134 I_E_Ratio_Display_Update();
miguelangel_2511 0:9d0b9785d3d6 135 }else if(i_e_ratio_index_change_flag){
miguelangel_2511 0:9d0b9785d3d6 136 i_e_ratio_index_change_flag = 0;
miguelangel_2511 0:9d0b9785d3d6 137 I_E_Ratio_Display_Update();
miguelangel_2511 0:9d0b9785d3d6 138 }else{
miguelangel_2511 0:9d0b9785d3d6 139 //Does nothing
miguelangel_2511 0:9d0b9785d3d6 140 }
miguelangel_2511 0:9d0b9785d3d6 141
miguelangel_2511 0:9d0b9785d3d6 142 if(Get_Button_Press(1 << ENTER_SW)){
miguelangel_2511 1:aa5df1878126 143 main_screen_state = Main_Screen_Cursor_Disable;
miguelangel_2511 0:9d0b9785d3d6 144 first_time_in_state = 1;
miguelangel_2511 0:9d0b9785d3d6 145 I_E_Ratio_Fix();
miguelangel_2511 0:9d0b9785d3d6 146 Parameter_Selection_Box_Remove();
miguelangel_2511 0:9d0b9785d3d6 147 }
miguelangel_2511 0:9d0b9785d3d6 148
miguelangel_2511 0:9d0b9785d3d6 149 break;
miguelangel_2511 0:9d0b9785d3d6 150
miguelangel_2511 0:9d0b9785d3d6 151 default:
miguelangel_2511 0:9d0b9785d3d6 152 break;
miguelangel_2511 0:9d0b9785d3d6 153
miguelangel_2511 6:d38287621cca 154 }
miguelangel_2511 7:f4e248182d31 155 }
miguelangel_2511 7:f4e248182d31 156
miguelangel_2511 7:f4e248182d31 157
miguelangel_2511 7:f4e248182d31 158 void Nextion_Update_Sensor_Values(void){
miguelangel_2511 7:f4e248182d31 159
miguelangel_2511 8:208d965a3bd2 160 static float previous_pressure_02_psi = 0;
miguelangel_2511 8:208d965a3bd2 161 static float previous_volume_ml = 0;
miguelangel_2511 8:208d965a3bd2 162 static float previous_flow_lpm = 0;
miguelangel_2511 7:f4e248182d31 163 float delta;
miguelangel_2511 7:f4e248182d31 164
miguelangel_2511 7:f4e248182d31 165 /* Check if anu value has change in a meningful way */
miguelangel_2511 8:208d965a3bd2 166 delta = volume_ml - previous_volume_ml;
miguelangel_2511 8:208d965a3bd2 167 if((delta > VOLUME_DISPLAY_THRESHOLD) || (delta < -PRESSURE_DISPLAY_THRESHOLD)){
miguelangel_2511 8:208d965a3bd2 168 Volume_Display_Update();
miguelangel_2511 7:f4e248182d31 169 }
miguelangel_2511 7:f4e248182d31 170
miguelangel_2511 7:f4e248182d31 171 delta = pressure_02_psi - previous_pressure_02_psi;
miguelangel_2511 7:f4e248182d31 172 if((delta > PRESSURE_DISPLAY_THRESHOLD) || (delta < -PRESSURE_DISPLAY_THRESHOLD)){
miguelangel_2511 8:208d965a3bd2 173 Pressure_Display_Update();
miguelangel_2511 7:f4e248182d31 174 }
miguelangel_2511 7:f4e248182d31 175
miguelangel_2511 8:208d965a3bd2 176 delta = flow_lpm - previous_flow_lpm;
miguelangel_2511 8:208d965a3bd2 177 if((delta > FLOW_DISPLAY_THRESHOLD) || (delta < -PRESSURE_DISPLAY_THRESHOLD)){
miguelangel_2511 8:208d965a3bd2 178 Flow_Display_Update();
miguelangel_2511 7:f4e248182d31 179 }
miguelangel_2511 7:f4e248182d31 180
miguelangel_2511 7:f4e248182d31 181
miguelangel_2511 7:f4e248182d31 182 /* Update the previous values */
miguelangel_2511 8:208d965a3bd2 183 previous_volume_ml = volume_ml;
miguelangel_2511 7:f4e248182d31 184 previous_pressure_02_psi = pressure_02_psi;
miguelangel_2511 8:208d965a3bd2 185 previous_flow_lpm = flow_lpm;
miguelangel_2511 8:208d965a3bd2 186
miguelangel_2511 7:f4e248182d31 187 }
miguelangel_2511 7:f4e248182d31 188
miguelangel_2511 7:f4e248182d31 189
miguelangel_2511 8:208d965a3bd2 190 void Nextion_Update_Waveform_Values(void){
miguelangel_2511 8:208d965a3bd2 191 Nextion_Plot_Volume_Waveform();
miguelangel_2511 8:208d965a3bd2 192 Nextion_Plot_Pressure_Waveform();
miguelangel_2511 8:208d965a3bd2 193 Nextion_Plot_Flow_Waveform();
miguelangel_2511 8:208d965a3bd2 194 }
miguelangel_2511 8:208d965a3bd2 195
miguelangel_2511 8:208d965a3bd2 196
miguelangel_2511 8:208d965a3bd2 197 // Ticker Interrupt Service Routine
miguelangel_2511 8:208d965a3bd2 198 void Ticker_ISR(void){
miguelangel_2511 8:208d965a3bd2 199
miguelangel_2511 8:208d965a3bd2 200 static uint8_t debounce_conta_1ms = 0;
miguelangel_2511 8:208d965a3bd2 201 static uint8_t encoder_conta_1ms = 0;
miguelangel_2511 8:208d965a3bd2 202 static uint8_t sensor_conta_1ms = 0;
miguelangel_2511 8:208d965a3bd2 203 static uint8_t sensor_waveform_conta_1ms = 0;
miguelangel_2511 8:208d965a3bd2 204 static uint8_t sensor_display_conta_1ms = 0;
miguelangel_2511 8:208d965a3bd2 205
miguelangel_2511 8:208d965a3bd2 206 debounce_conta_1ms++;
miguelangel_2511 8:208d965a3bd2 207 encoder_conta_1ms++;
miguelangel_2511 8:208d965a3bd2 208 sensor_conta_1ms++;
miguelangel_2511 8:208d965a3bd2 209 sensor_waveform_conta_1ms++;
miguelangel_2511 8:208d965a3bd2 210 sensor_display_conta_1ms++;
miguelangel_2511 7:f4e248182d31 211
miguelangel_2511 8:208d965a3bd2 212 // Read buttons and performs debounce action
miguelangel_2511 8:208d965a3bd2 213 if(debounce_conta_1ms == DEBOUNCE_PERIOD_MS){
miguelangel_2511 8:208d965a3bd2 214 debounce_conta_1ms = 0;
miguelangel_2511 8:208d965a3bd2 215 Button_Debounce();
miguelangel_2511 8:208d965a3bd2 216 }
miguelangel_2511 8:208d965a3bd2 217 // Read encoder and update the proper indexes
miguelangel_2511 8:208d965a3bd2 218 if(encoder_conta_1ms == ENCODER_READ_PERIOD_MS){
miguelangel_2511 8:208d965a3bd2 219 encoder_conta_1ms = 0;
miguelangel_2511 8:208d965a3bd2 220 Encoder_Read();
miguelangel_2511 8:208d965a3bd2 221 }
miguelangel_2511 8:208d965a3bd2 222 // Indicates if it is time to acquire a new sample from the sensors
miguelangel_2511 8:208d965a3bd2 223 if(sensor_conta_1ms == PRESSURE_SENSOR_READ_PERIOD_MS){
miguelangel_2511 8:208d965a3bd2 224 sensor_conta_1ms = 0;
miguelangel_2511 8:208d965a3bd2 225 read_pressure_sensors_flag = 1;
miguelangel_2511 8:208d965a3bd2 226 }
miguelangel_2511 8:208d965a3bd2 227 // Indicates if it is time to plot the volume, flow and pressure values */
miguelangel_2511 8:208d965a3bd2 228 if(sensor_waveform_conta_1ms == SENSOR_WAVEFORM_PLOT_PERIOD_MS){
miguelangel_2511 8:208d965a3bd2 229 sensor_waveform_conta_1ms = 0;
miguelangel_2511 8:208d965a3bd2 230 pressure_sensor_waveform_update_flag = 1;
miguelangel_2511 8:208d965a3bd2 231 }
miguelangel_2511 8:208d965a3bd2 232 // Indicates if it is time to display the volume, flow and pressure values */
miguelangel_2511 8:208d965a3bd2 233 if(sensor_display_conta_1ms == SENSOR_DISPLAY_PERIOD_MS){
miguelangel_2511 8:208d965a3bd2 234 sensor_display_conta_1ms = 0;
miguelangel_2511 8:208d965a3bd2 235 pressure_sensor_display_update_flag = 1;
miguelangel_2511 8:208d965a3bd2 236 }
miguelangel_2511 8:208d965a3bd2 237
miguelangel_2511 8:208d965a3bd2 238 }
miguelangel_2511 7:f4e248182d31 239
miguelangel_2511 7:f4e248182d31 240