mbed-os github

Dependencies:   ADS1015 Faulhaber HTU21D_mod MS5837_potless Sensor_Head_RevB_3 USBDevice_dfu Utilsdfu beep

Fork of ARNSRS_testDFU by POTLESS

Committer:
POTLESS_2
Date:
Thu Feb 08 12:56:44 2018 +0000
Revision:
23:7477dc855fad
Parent:
22:555c2930e8e0
Child:
24:44ef919899c1
dortie du deepsleep proprement

Who changed what in which revision?

UserRevisionLine numberNew contents of line
POTLESS_2 17:bef8abc445f2 1 /*
POTLESS_2 17:bef8abc445f2 2
POTLESS_2 17:bef8abc445f2 3 Câblage complet STM32L476RG :
POTLESS_2 17:bef8abc445f2 4
POTLESS_2 17:bef8abc445f2 5 - Port SPI carte SD :
POTLESS_2 17:bef8abc445f2 6
POTLESS_2 17:bef8abc445f2 7 MOSI -> PA_7
POTLESS_2 17:bef8abc445f2 8 MISO -> PA_6
POTLESS_2 17:bef8abc445f2 9 SCK -> PA_5
POTLESS_2 17:bef8abc445f2 10 CS -> PB_6
POTLESS_2 17:bef8abc445f2 11
POTLESS_2 17:bef8abc445f2 12 - Sensor Head :
POTLESS_2 17:bef8abc445f2 13
POTLESS_2 17:bef8abc445f2 14 Alim en 3.3v
POTLESS_2 17:bef8abc445f2 15
POTLESS_2 17:bef8abc445f2 16 SCL -> PB_8
POTLESS_2 17:bef8abc445f2 17 SDA -> PB_9
POTLESS_2 17:bef8abc445f2 18 TX -> PC_12
POTLESS_2 17:bef8abc445f2 19 RX -> PD_2
POTLESS_2 17:bef8abc445f2 20 AlertRdy -> PA_11
POTLESS_2 17:bef8abc445f2 21
POTLESS_2 17:bef8abc445f2 22
POTLESS_2 17:bef8abc445f2 23 - HC_06 :
POTLESS_2 17:bef8abc445f2 24
POTLESS_2 17:bef8abc445f2 25 Alim en 3.3v ou 5v
POTLESS_2 17:bef8abc445f2 26
POTLESS_2 17:bef8abc445f2 27 TX -> PC_10
POTLESS_2 17:bef8abc445f2 28 RX -> PC_11
POTLESS_2 17:bef8abc445f2 29
POTLESS_2 19:cac3761a5d0b 30 - STM32L476RG sur carte alim AQL :
POTLESS_2 17:bef8abc445f2 31
POTLESS_2 19:cac3761a5d0b 32 Reférence drv8839 : http://www.ti.com/lit/ds/symlink/drv8839.pdf
POTLESS_2 17:bef8abc445f2 33
POTLESS_2 19:cac3761a5d0b 34 Volet Fuite :
POTLESS_2 17:bef8abc445f2 35 PWM -> PB_5 -> 1
POTLESS_2 17:bef8abc445f2 36 FWD -> PB_4 -> 2
POTLESS_2 17:bef8abc445f2 37 REV -> PB_10 -> 7
POTLESS_2 17:bef8abc445f2 38
POTLESS_2 19:cac3761a5d0b 39 Volet Poumon :
POTLESS_2 17:bef8abc445f2 40 PWM -> PB_13 -> 9
POTLESS_2 17:bef8abc445f2 41 FWD -> PB_14 -> 10
POTLESS_2 17:bef8abc445f2 42 REV -> PB_15 -> 15
POTLESS_2 17:bef8abc445f2 43
POTLESS_2 17:bef8abc445f2 44 */
POTLESS_2 18:bfd78c05b589 45
potless 1:bef7856b5c0a 46 #include "mbed.h"
potless 2:4a8bf1d53439 47 #include <string>
POTLESS_2 7:ad15c386e960 48 #include "Sensor_head_revB.h"
POTLESS_2 8:a750d531b381 49 #include "HTU21D.h"
POTLESS_2 12:7f3aadd79f89 50 #include "PID.h"
POTLESS_2 19:cac3761a5d0b 51 #include "Faulhaber.h"
POTLESS_2 4:d84250f67dec 52
POTLESS_2 17:bef8abc445f2 53 //Commandes des servos
POTLESS_2 19:cac3761a5d0b 54 #define PWM_SERVO_POUMON PB_15
POTLESS_2 19:cac3761a5d0b 55 #define nSleep_SERVO_POUMON PC_6
POTLESS_2 19:cac3761a5d0b 56 #define FWD_SERVO_POUMON PB_14
POTLESS_2 19:cac3761a5d0b 57 #define REV_SERVO_POUMON PB_13
POTLESS_2 19:cac3761a5d0b 58 #define Channel_A_SERVO_POUMON PB_1
POTLESS_2 19:cac3761a5d0b 59 #define Channel_B_SERVO_POUMON PB_2
POTLESS_2 19:cac3761a5d0b 60 #define HOME_SERVO_POUMON 0
POTLESS_2 17:bef8abc445f2 61
POTLESS_2 19:cac3761a5d0b 62 #define PWM_SERVO_FUITE PB_10
POTLESS_2 19:cac3761a5d0b 63 #define nSleep_SERVO_FUITE PC_5
POTLESS_2 19:cac3761a5d0b 64 #define FWD_SERVO_FUITE PB_4
POTLESS_2 19:cac3761a5d0b 65 #define REV_SERVO_FUITE PB_5
POTLESS_2 19:cac3761a5d0b 66 #define Channel_A_SERVO_FUITE PB_8
POTLESS_2 19:cac3761a5d0b 67 #define Channel_B_SERVO_FUITE PB_9
POTLESS_2 19:cac3761a5d0b 68 #define HOME_SERVO_FUITE 90
POTLESS_2 17:bef8abc445f2 69
POTLESS_2 17:bef8abc445f2 70 //Ecrit dans le moniteur série de la tablette à 115200 bds si sur 1, penser à mettre NEED_CONSOLE_OUTPUT à 0
POTLESS_2 9:04bfdfc029cb 71 #define NEED_ANDROID_OUTPUT 1
POTLESS_2 9:04bfdfc029cb 72
POTLESS_2 17:bef8abc445f2 73 //Mode PID, STD à commenter / décommenter
POTLESS_2 17:bef8abc445f2 74 #define STD_MODE
POTLESS_2 17:bef8abc445f2 75 //#define PID_MODE
POTLESS_2 11:b2feed92584a 76
POTLESS_2 12:7f3aadd79f89 77 #ifdef STD_MODE
POTLESS_2 12:7f3aadd79f89 78 int MODE_FLAG = 0;
POTLESS_2 11:b2feed92584a 79 #endif
POTLESS_2 11:b2feed92584a 80
POTLESS_2 12:7f3aadd79f89 81 #ifdef PID_MODE
POTLESS_2 12:7f3aadd79f89 82 int MODE_FLAG = 2;
POTLESS_2 11:b2feed92584a 83 #endif
POTLESS_2 11:b2feed92584a 84
POTLESS_2 9:04bfdfc029cb 85 #if NEED_ANDROID_OUTPUT
POTLESS_2 9:04bfdfc029cb 86 #define ANDROID(...) { android.printf(__VA_ARGS__); }
POTLESS_2 9:04bfdfc029cb 87 #else
POTLESS_2 9:04bfdfc029cb 88 #define ANDROID(...)
POTLESS_2 9:04bfdfc029cb 89 #endif
POTLESS_2 9:04bfdfc029cb 90
POTLESS_2 19:cac3761a5d0b 91 //PinName pwm, PinName nSleep, PinName fwd, PinName rev, int brakeable, PinName channelA, PinName channelB, int pulsesPerRev, int Rapport, Encoding encoding = X2_ENCODING
POTLESS_2 19:cac3761a5d0b 92 Faulhaber Servo_Poumon("Servo_Poumon", PWM_SERVO_POUMON, nSleep_SERVO_POUMON, FWD_SERVO_POUMON, REV_SERVO_POUMON, 1, Channel_A_SERVO_POUMON, Channel_B_SERVO_POUMON, 16, 207, Faulhaber::X2_ENCODING);
POTLESS_2 22:555c2930e8e0 93 //Faulhaber Servo_Fuite("Servo_Fuite", PWM_SERVO_FUITE, nSleep_SERVO_FUITE, FWD_SERVO_FUITE, REV_SERVO_FUITE, 1, Channel_A_SERVO_FUITE, Channel_B_SERVO_FUITE, 16, 207, Faulhaber::X2_ENCODING);
POTLESS_2 17:bef8abc445f2 94
POTLESS_2 17:bef8abc445f2 95 //Moniteur série, Serial 2
POTLESS_2 17:bef8abc445f2 96 Serial serialMonit(USBTX,USBRX,115200);
POTLESS_2 10:aca745a66d51 97
POTLESS_2 9:04bfdfc029cb 98 //COM Série vers Android, Serial 3
POTLESS_2 17:bef8abc445f2 99 Serial android(PC_10,PC_11,115200);
POTLESS_2 4:d84250f67dec 100
POTLESS_2 7:ad15c386e960 101 //Init de la lib ARNSRS;
POTLESS_2 7:ad15c386e960 102 SENSOR_HEAD_REV_B sensors;
potless 2:4a8bf1d53439 103
POTLESS_2 6:ebed9093d661 104 //pour Param Cozir
POTLESS_2 9:04bfdfc029cb 105 const int sizeParam = 20;
POTLESS_2 11:b2feed92584a 106 char param[sizeParam];
POTLESS_2 11:b2feed92584a 107 volatile int indexParam = 0;
POTLESS_2 6:ebed9093d661 108 bool newParamFlag = false;
potless 2:4a8bf1d53439 109
POTLESS_2 9:04bfdfc029cb 110 //pour Commandes Android
POTLESS_2 9:04bfdfc029cb 111 const int sizeAndroid = 20;
POTLESS_2 11:b2feed92584a 112 char Android[sizeAndroid];
POTLESS_2 11:b2feed92584a 113 volatile int indexAndroid = 0;
POTLESS_2 9:04bfdfc029cb 114 bool newAndroidFlag = false;
POTLESS_2 12:7f3aadd79f89 115 char to_android[100];
POTLESS_2 9:04bfdfc029cb 116
POTLESS_2 7:ad15c386e960 117 //Variables de stockage des infos capteurs
POTLESS_2 7:ad15c386e960 118 int co2 = 0;
POTLESS_2 7:ad15c386e960 119 float pression = 0;
POTLESS_2 9:04bfdfc029cb 120 float Temp1 = 0;
POTLESS_2 7:ad15c386e960 121 int ppO2 = 0;
POTLESS_2 7:ad15c386e960 122 int CellO2_1 = 0;
POTLESS_2 7:ad15c386e960 123 int CellO2_2 = 0;
POTLESS_2 7:ad15c386e960 124
POTLESS_2 18:bfd78c05b589 125 //Variables et constantes OTU
POTLESS_2 18:bfd78c05b589 126 float OTU = 0;
POTLESS_2 18:bfd78c05b589 127 float COEF_OTU = 0.83;
POTLESS_2 18:bfd78c05b589 128
POTLESS_2 17:bef8abc445f2 129 //Mesure du temps d'éxecution du loop
POTLESS_2 7:ad15c386e960 130 Timer REAL_RATE;
POTLESS_2 7:ad15c386e960 131 float RATE = 0;
POTLESS_2 11:b2feed92584a 132 float RATE_TRUE = 0;
POTLESS_2 12:7f3aadd79f89 133 float Ref_Time = 1.0; //La durée de la boucle désirée...
POTLESS_2 7:ad15c386e960 134
POTLESS_2 17:bef8abc445f2 135 //HTU21D sur l'I2C
POTLESS_2 8:a750d531b381 136 HTU21D temphumid(PB_9, PB_8); //Temp humid sensor || SDA, SCL
POTLESS_2 9:04bfdfc029cb 137 float Temp2;
POTLESS_2 9:04bfdfc029cb 138 int Humid;
POTLESS_2 9:04bfdfc029cb 139
POTLESS_2 9:04bfdfc029cb 140 //Data LOG
POTLESS_2 9:04bfdfc029cb 141 char to_store[50];
POTLESS_2 9:04bfdfc029cb 142 time_t seconds;
POTLESS_2 8:a750d531b381 143
POTLESS_2 17:bef8abc445f2 144 //Thread d'intérogation des capteurs et de positionnement des volets
POTLESS_2 19:cac3761a5d0b 145 Thread thread_Sensors;
POTLESS_2 19:cac3761a5d0b 146 Thread thread_Volets;
POTLESS_2 20:5f79fb4565a7 147 Thread thread_Secu;
POTLESS_2 7:ad15c386e960 148
POTLESS_2 10:aca745a66d51 149 //Contrôle des servos
POTLESS_2 19:cac3761a5d0b 150 float Consigne_poumon = 0;
POTLESS_2 19:cac3761a5d0b 151 float volet_poumon_Position = 0;
POTLESS_2 19:cac3761a5d0b 152 float Consigne_fuite = 0;
POTLESS_2 19:cac3761a5d0b 153 float volet_fuite_Position = 0;
POTLESS_2 10:aca745a66d51 154
POTLESS_2 12:7f3aadd79f89 155 #ifdef PID_MODE
POTLESS_2 12:7f3aadd79f89 156 //Paramètre du PID
POTLESS_2 12:7f3aadd79f89 157 float Kc = 40;
POTLESS_2 12:7f3aadd79f89 158 float Ti = 0;
POTLESS_2 12:7f3aadd79f89 159 float Td = 0;
POTLESS_2 12:7f3aadd79f89 160 float RATE_PID = Ref_Time;
POTLESS_2 12:7f3aadd79f89 161 float Commande_PID;
POTLESS_2 15:efd3b3bf3f37 162 float consigne = 210;
POTLESS_2 15:efd3b3bf3f37 163 float Max_Input = 1000;
POTLESS_2 15:efd3b3bf3f37 164 float Min_Input = 80;
POTLESS_2 19:cac3761a5d0b 165 float Max_Output = 85;//Vérifier la valeur pour angle à laisser ouvert...
POTLESS_2 19:cac3761a5d0b 166 float Min_Output = 5;
POTLESS_2 10:aca745a66d51 167
POTLESS_2 12:7f3aadd79f89 168 //Init PID
POTLESS_2 17:bef8abc445f2 169 PID control_Servo(Kc, Ti, Td, RATE_PID);
POTLESS_2 12:7f3aadd79f89 170 #endif
POTLESS_2 10:aca745a66d51 171
POTLESS_2 19:cac3761a5d0b 172 //Boolean du status de l'appareil, en mode SECU ou nominal
POTLESS_2 19:cac3761a5d0b 173 bool EN_MODE_SECU = false;
POTLESS_2 20:5f79fb4565a7 174 AnalogIn V_USB(PC_4);
POTLESS_2 20:5f79fb4565a7 175 float Vusb = 1;
POTLESS_2 18:bfd78c05b589 176
POTLESS_2 21:b8900130ca05 177 //Interruption user button
POTLESS_2 21:b8900130ca05 178 InterruptIn button(USER_BUTTON);
POTLESS_2 23:7477dc855fad 179 volatile int GO = 0;
POTLESS_2 21:b8900130ca05 180
POTLESS_2 21:b8900130ca05 181 void pressed() {
POTLESS_2 21:b8900130ca05 182
POTLESS_2 23:7477dc855fad 183 GO = GO + 1;
POTLESS_2 23:7477dc855fad 184
POTLESS_2 23:7477dc855fad 185 if (GO > 1) {
POTLESS_2 23:7477dc855fad 186 GO = 1;
POTLESS_2 23:7477dc855fad 187 UTILS::Mount_SD();
POTLESS_2 23:7477dc855fad 188 Servo_Poumon.Wake_Up();
POTLESS_2 23:7477dc855fad 189 }
POTLESS_2 21:b8900130ca05 190 }
POTLESS_2 21:b8900130ca05 191
POTLESS_2 19:cac3761a5d0b 192 //Passage en mode SECU
POTLESS_2 19:cac3761a5d0b 193 void Mode_SECU()
POTLESS_2 18:bfd78c05b589 194 {
POTLESS_2 19:cac3761a5d0b 195 #ifdef PID_MODE
POTLESS_2 18:bfd78c05b589 196 //Mise du PID en mode manuel (desactivation...)
POTLESS_2 18:bfd78c05b589 197 control_Servo.setMode(MANUAL_MODE);
POTLESS_2 18:bfd78c05b589 198 #endif
POTLESS_2 19:cac3761a5d0b 199 Consigne_poumon = HOME_SERVO_POUMON;
POTLESS_2 19:cac3761a5d0b 200 Consigne_fuite = HOME_SERVO_FUITE;
POTLESS_2 19:cac3761a5d0b 201 while(1) {
POTLESS_2 19:cac3761a5d0b 202 wait_ms(300);
POTLESS_2 19:cac3761a5d0b 203 if (Servo_Poumon.Pos_OK() == true) break;
POTLESS_2 19:cac3761a5d0b 204 //if (Servo_Poumon.Pos_OK() == true && Servo_Fuite.Pos_OK() == true) break;
POTLESS_2 19:cac3761a5d0b 205 }
POTLESS_2 19:cac3761a5d0b 206 printf("-------------- Appareil en mode SECU ---------------\r\n");
POTLESS_2 19:cac3761a5d0b 207 EN_MODE_SECU = true;
POTLESS_2 19:cac3761a5d0b 208
POTLESS_2 19:cac3761a5d0b 209 int Pos = Servo_Poumon.getPulses();
POTLESS_2 19:cac3761a5d0b 210 UTILS::Store_A_Val((float)Pos, "Servo_Poumon");
POTLESS_2 19:cac3761a5d0b 211 printf(" position volet poumon sauvegardée = %d pulse(s)\r\n", Pos);
POTLESS_2 19:cac3761a5d0b 212 //Pos = Servo_Fuite.getPulses();
POTLESS_2 19:cac3761a5d0b 213 //UTILS::Store_A_Val((float)Pos, "Servo_Fuite");
POTLESS_2 19:cac3761a5d0b 214 //printf(" position volet fuite sauvegardée = %d pulse(s)\r\n", Pos);
POTLESS_2 22:555c2930e8e0 215 UTILS::UnMount_SD();
POTLESS_2 23:7477dc855fad 216 Servo_Poumon.Sleep();
POTLESS_2 22:555c2930e8e0 217 //thread_Volets.terminate();
POTLESS_2 19:cac3761a5d0b 218 }
POTLESS_2 19:cac3761a5d0b 219
POTLESS_2 19:cac3761a5d0b 220 //Sequence d'arrêt
POTLESS_2 19:cac3761a5d0b 221 void Stop_Sequence()
POTLESS_2 19:cac3761a5d0b 222 {
POTLESS_2 19:cac3761a5d0b 223 Mode_SECU();
POTLESS_2 21:b8900130ca05 224 wait(1);
POTLESS_2 21:b8900130ca05 225 //thread_Secu.terminate();
POTLESS_2 21:b8900130ca05 226 //thread_Sensors.terminate();
POTLESS_2 20:5f79fb4565a7 227 printf("----------------ARRET DE L'APPAREIL--------------------\r\n");
POTLESS_2 21:b8900130ca05 228 //wait(2);
POTLESS_2 19:cac3761a5d0b 229 deepsleep();
POTLESS_2 18:bfd78c05b589 230 }
POTLESS_2 18:bfd78c05b589 231
POTLESS_2 20:5f79fb4565a7 232 //Fonction test de valeur d'entrée convertie en Hight / Low
POTLESS_2 22:555c2930e8e0 233 float Power_Test(AnalogIn& pin)
POTLESS_2 20:5f79fb4565a7 234 {
POTLESS_2 20:5f79fb4565a7 235 float Val = pin.read();
POTLESS_2 22:555c2930e8e0 236 if(Val < 0.6) Stop_Sequence();
POTLESS_2 22:555c2930e8e0 237 return Val;
POTLESS_2 20:5f79fb4565a7 238 }
POTLESS_2 20:5f79fb4565a7 239
POTLESS_2 18:bfd78c05b589 240 //Contrôle du status de l'appareil / des constantes
POTLESS_2 18:bfd78c05b589 241 bool Check()
POTLESS_2 18:bfd78c05b589 242 {
POTLESS_2 18:bfd78c05b589 243 if (ppO2 > 100)
POTLESS_2 19:cac3761a5d0b 244 return true;//Situation OK
POTLESS_2 18:bfd78c05b589 245 else
POTLESS_2 19:cac3761a5d0b 246 return false;//Situation dégradée
POTLESS_2 18:bfd78c05b589 247 }
POTLESS_2 18:bfd78c05b589 248
POTLESS_2 18:bfd78c05b589 249 //Calcul des OTU
POTLESS_2 18:bfd78c05b589 250 float Calcul_OTU()
POTLESS_2 18:bfd78c05b589 251 {
POTLESS_2 18:bfd78c05b589 252 /*
POTLESS_2 18:bfd78c05b589 253 La formule suivante permet de calculer la quantité d' OTU accumulée
POTLESS_2 18:bfd78c05b589 254 OTU = T * (2* PpO2 -1)0,83
POTLESS_2 18:bfd78c05b589 255 avec :
POTLESS_2 18:bfd78c05b589 256 T = temps de plongée en minutes
POTLESS_2 18:bfd78c05b589 257 PpO2 = pression partielle d’ oxygène en bars
POTLESS_2 18:bfd78c05b589 258 */
POTLESS_2 18:bfd78c05b589 259
POTLESS_2 19:cac3761a5d0b 260 if (ppO2 > 500) {
POTLESS_2 18:bfd78c05b589 261 float val = (2 * (float)ppO2/1000 - 1);//je divise par 1000 car la PP est en mb...
POTLESS_2 18:bfd78c05b589 262 OTU += Ref_Time * pow(val, COEF_OTU);
POTLESS_2 19:cac3761a5d0b 263 }
POTLESS_2 18:bfd78c05b589 264 }
POTLESS_2 10:aca745a66d51 265
POTLESS_2 17:bef8abc445f2 266 //Thread d'intérogation des capteurs, positions servo
POTLESS_2 10:aca745a66d51 267 void Get_Info_thread()
POTLESS_2 6:ebed9093d661 268 {
POTLESS_2 7:ad15c386e960 269 while (true) {
POTLESS_2 7:ad15c386e960 270
POTLESS_2 7:ad15c386e960 271 //CO2 sur Cozir
POTLESS_2 7:ad15c386e960 272 co2 = sensors.requestCO2();
POTLESS_2 7:ad15c386e960 273 //P / T sur MS5837
POTLESS_2 7:ad15c386e960 274 pression = sensors.requestPress();
POTLESS_2 9:04bfdfc029cb 275 Temp1 = sensors.requestTemp();
POTLESS_2 7:ad15c386e960 276 //PPO2 sur ADS1015
POTLESS_2 7:ad15c386e960 277 ppO2 = sensors.requestPpO2();
POTLESS_2 7:ad15c386e960 278 //Cell O2 en mV
POTLESS_2 7:ad15c386e960 279 CellO2_1 = sensors.requestCellO2_1();
POTLESS_2 7:ad15c386e960 280 CellO2_2 = sensors.requestCellO2_2();
POTLESS_2 9:04bfdfc029cb 281
POTLESS_2 8:a750d531b381 282 //HTU21D
POTLESS_2 9:04bfdfc029cb 283 Temp2 = temphumid.sample_ctemp();
POTLESS_2 9:04bfdfc029cb 284 Humid = temphumid.sample_humid();
POTLESS_2 9:04bfdfc029cb 285
POTLESS_2 10:aca745a66d51 286 //Retour position des servos
POTLESS_2 17:bef8abc445f2 287 volet_poumon_Position = Servo_Poumon.Get_Position();
POTLESS_2 20:5f79fb4565a7 288 //volet_fuite_Position = Servo_Fuite.Get_Position();
POTLESS_2 22:555c2930e8e0 289
POTLESS_2 19:cac3761a5d0b 290 }
POTLESS_2 19:cac3761a5d0b 291 }
POTLESS_2 12:7f3aadd79f89 292
POTLESS_2 19:cac3761a5d0b 293 void GO_TO_thread()
POTLESS_2 19:cac3761a5d0b 294 {
POTLESS_2 19:cac3761a5d0b 295 while (true) {
POTLESS_2 19:cac3761a5d0b 296 //Servo_Poumon.Go_To_Prop(Consigne_poumon);
POTLESS_2 22:555c2930e8e0 297 //Servo_Poumon.Go_To_PID(Consigne_poumon);
POTLESS_2 22:555c2930e8e0 298 Servo_Poumon.Go_To(Consigne_poumon);
POTLESS_2 20:5f79fb4565a7 299
POTLESS_2 19:cac3761a5d0b 300 //Servo_Fuite.Go_To_Prop(Consigne_fuite);
POTLESS_2 19:cac3761a5d0b 301 //Servo_Fuite.Go_To_PID(Consigne_fuite);
POTLESS_2 15:efd3b3bf3f37 302 }
potless 2:4a8bf1d53439 303 }
POTLESS_2 4:d84250f67dec 304
POTLESS_2 20:5f79fb4565a7 305 void SECU_thread()
POTLESS_2 20:5f79fb4565a7 306 {
POTLESS_2 20:5f79fb4565a7 307 while (true) {
POTLESS_2 20:5f79fb4565a7 308 //Alim USB
POTLESS_2 22:555c2930e8e0 309 Vusb = Power_Test(V_USB);
POTLESS_2 20:5f79fb4565a7 310 //Divers problèmes à implémenter
POTLESS_2 20:5f79fb4565a7 311 //if(!Check()) Mode_SECU();
POTLESS_2 20:5f79fb4565a7 312 }
POTLESS_2 20:5f79fb4565a7 313 }
POTLESS_2 20:5f79fb4565a7 314
POTLESS_2 7:ad15c386e960 315 void Affichage_moniteur()
POTLESS_2 4:d84250f67dec 316 {
POTLESS_2 19:cac3761a5d0b 317
POTLESS_2 9:04bfdfc029cb 318 printf("\r\n");
POTLESS_2 9:04bfdfc029cb 319 printf(" CO2 = %d ppm\r\n" , co2);
POTLESS_2 9:04bfdfc029cb 320 printf(" PPO2 = %d mb\r\n", ppO2);
POTLESS_2 18:bfd78c05b589 321 printf(" OTU = %d \r\n", OTU);
POTLESS_2 9:04bfdfc029cb 322 printf(" Pression = %f msw\r\n", pression);
POTLESS_2 10:aca745a66d51 323 printf(" Temp MS5837 = %f C\r\n", Temp1);
POTLESS_2 10:aca745a66d51 324 printf(" Temp HTU21D = %f C\n\r", Temp2);
POTLESS_2 9:04bfdfc029cb 325 printf(" Humidity = %d %%\n\r", Humid);
POTLESS_2 8:a750d531b381 326 printf("\n\r");
POTLESS_2 8:a750d531b381 327 printf(" Cell O2 n 1 = %d\r\n" , CellO2_1);
POTLESS_2 8:a750d531b381 328 printf(" Cell O2 n 2 = %d\r\n" , CellO2_2);
POTLESS_2 7:ad15c386e960 329 printf("\r\n");
POTLESS_2 9:04bfdfc029cb 330 printf("\n");
POTLESS_2 17:bef8abc445f2 331 printf(" Volet Poumon = %f\r\n" , volet_poumon_Position);
POTLESS_2 17:bef8abc445f2 332 printf(" Volet Fuite = %f\r\n" , volet_fuite_Position);
POTLESS_2 10:aca745a66d51 333 printf("\r\n");
POTLESS_2 12:7f3aadd79f89 334 printf("Temps d execution de la boucle = %f seconde(s)\n", (RATE + RATE_TRUE / 1000));
POTLESS_2 17:bef8abc445f2 335 printf("\r\n");
POTLESS_2 9:04bfdfc029cb 336 printf("A enregistrer = %s\n", to_store);
POTLESS_2 9:04bfdfc029cb 337 printf("\r\n");
POTLESS_2 20:5f79fb4565a7 338 printf("V_USB = %f", Vusb);
POTLESS_2 20:5f79fb4565a7 339 printf("\r\n");
POTLESS_2 4:d84250f67dec 340 }
POTLESS_2 4:d84250f67dec 341
POTLESS_2 11:b2feed92584a 342 //Callback de l'intérruption des envois de commandes depuis le terminal
POTLESS_2 6:ebed9093d661 343 void callbackParam()
POTLESS_2 4:d84250f67dec 344 {
POTLESS_2 6:ebed9093d661 345 while(serialMonit.readable()) {
POTLESS_2 6:ebed9093d661 346 if (indexParam == sizeParam) //éviter la saturation du buffer
POTLESS_2 6:ebed9093d661 347 serialMonit.getc();
POTLESS_2 6:ebed9093d661 348 else
POTLESS_2 6:ebed9093d661 349 param [indexParam++] = serialMonit.getc();//chargement du buffer dans le message
POTLESS_2 6:ebed9093d661 350 if ((indexParam == sizeParam) || (param[indexParam -1] == '\n')) {//le message est complet ou nouvelle ligne ou autre si on veut...
POTLESS_2 6:ebed9093d661 351 param[indexParam] = 0;
POTLESS_2 6:ebed9093d661 352 newParamFlag = true;
POTLESS_2 6:ebed9093d661 353 }
POTLESS_2 4:d84250f67dec 354 }
POTLESS_2 6:ebed9093d661 355 }
POTLESS_2 4:d84250f67dec 356
POTLESS_2 9:04bfdfc029cb 357 //Callback de l'intérruption des envois de commandes depuis Android
POTLESS_2 9:04bfdfc029cb 358 void callbackAndroid()
POTLESS_2 9:04bfdfc029cb 359 {
POTLESS_2 9:04bfdfc029cb 360 while(android.readable()) {
POTLESS_2 9:04bfdfc029cb 361 if (indexAndroid == sizeAndroid) //éviter la saturation du buffer
POTLESS_2 9:04bfdfc029cb 362 android.getc();
POTLESS_2 9:04bfdfc029cb 363 else
POTLESS_2 9:04bfdfc029cb 364 Android [indexAndroid++] = android.getc();//chargement du buffer dans le message
POTLESS_2 9:04bfdfc029cb 365 if ((indexAndroid == sizeAndroid) || (Android[indexAndroid -1] == '\n')) {//le message est complet ou nouvelle ligne ou autre si on veut...
POTLESS_2 9:04bfdfc029cb 366 Android[indexAndroid] = 0;
POTLESS_2 9:04bfdfc029cb 367 newAndroidFlag = true;
POTLESS_2 9:04bfdfc029cb 368 }
POTLESS_2 9:04bfdfc029cb 369 }
POTLESS_2 9:04bfdfc029cb 370 }
POTLESS_2 11:b2feed92584a 371
POTLESS_2 9:04bfdfc029cb 372 void Decoding_Message(char message [])
POTLESS_2 9:04bfdfc029cb 373 {
POTLESS_2 9:04bfdfc029cb 374 char *commande = 0;
POTLESS_2 14:b5e0e882205e 375 float valeur = 0;
POTLESS_2 9:04bfdfc029cb 376
POTLESS_2 14:b5e0e882205e 377 sscanf(message,"%s %f",&commande , &valeur);
POTLESS_2 9:04bfdfc029cb 378
POTLESS_2 19:cac3761a5d0b 379 if ((char)commande == 'S') {
POTLESS_2 19:cac3761a5d0b 380 Mode_SECU();
POTLESS_2 20:5f79fb4565a7 381 } else if ((char)commande == 'r') {
POTLESS_2 20:5f79fb4565a7 382 Consigne_poumon = 0;
POTLESS_2 20:5f79fb4565a7 383 volet_poumon_Position = 0;
POTLESS_2 19:cac3761a5d0b 384 Servo_Poumon.reset();
POTLESS_2 19:cac3761a5d0b 385 } else if ((char)commande == 'Q') {
POTLESS_2 19:cac3761a5d0b 386 Stop_Sequence();
POTLESS_2 19:cac3761a5d0b 387 } else if ((char)commande == 'T') {
POTLESS_2 9:04bfdfc029cb 388 set_time(valeur);
POTLESS_2 12:7f3aadd79f89 389 } else if ((char)commande == 'I') {
POTLESS_2 17:bef8abc445f2 390 Consigne_poumon = (float)valeur;
POTLESS_2 17:bef8abc445f2 391 printf(" Servo Poumon = %f\r\n", Consigne_poumon);
POTLESS_2 12:7f3aadd79f89 392 } else if ((char)commande == 'O') {
POTLESS_2 17:bef8abc445f2 393 Consigne_fuite = (float)valeur;
POTLESS_2 17:bef8abc445f2 394 printf(" Servo Fuite = %f\r\n", Consigne_fuite);
POTLESS_2 10:aca745a66d51 395 } else if ((char)commande == 'R') {
POTLESS_2 10:aca745a66d51 396 NVIC_SystemReset();
POTLESS_2 12:7f3aadd79f89 397 /////////////////////////////////////////
POTLESS_2 12:7f3aadd79f89 398 //Pour rajouter une commande
POTLESS_2 12:7f3aadd79f89 399 //} else if ((char)commande == 'X') {
POTLESS_2 12:7f3aadd79f89 400 // attribuer à une VARIABLE = valeur;
POTLESS_2 12:7f3aadd79f89 401 // ou une action, avec ou sans valeur
POTLESS_2 12:7f3aadd79f89 402 /////////////////////////////////////////
POTLESS_2 12:7f3aadd79f89 403 } else {
POTLESS_2 9:04bfdfc029cb 404 sensors.cozirSend(message);
POTLESS_2 9:04bfdfc029cb 405 }
POTLESS_2 9:04bfdfc029cb 406
POTLESS_2 9:04bfdfc029cb 407 strcpy(param," ");
POTLESS_2 9:04bfdfc029cb 408 indexParam = 0;
POTLESS_2 9:04bfdfc029cb 409 newParamFlag = false;
POTLESS_2 9:04bfdfc029cb 410 }
POTLESS_2 9:04bfdfc029cb 411
POTLESS_2 9:04bfdfc029cb 412 void Decoding_Message_Android(char message [])
POTLESS_2 9:04bfdfc029cb 413 {
POTLESS_2 9:04bfdfc029cb 414 char *commande = 0;
POTLESS_2 14:b5e0e882205e 415 float valeur = 0;
POTLESS_2 9:04bfdfc029cb 416
POTLESS_2 14:b5e0e882205e 417 sscanf(message,"%s %f",&commande , &valeur);
POTLESS_2 9:04bfdfc029cb 418
POTLESS_2 9:04bfdfc029cb 419 if ((char)commande == 'T') {
POTLESS_2 9:04bfdfc029cb 420 set_time(valeur);
POTLESS_2 12:7f3aadd79f89 421 } else if ((char)commande == 'I') {
POTLESS_2 17:bef8abc445f2 422 Consigne_poumon = (float)valeur;
POTLESS_2 17:bef8abc445f2 423 printf(" Servo Poumon = %f\r\n", Consigne_poumon);
POTLESS_2 12:7f3aadd79f89 424 } else if ((char)commande == 'O') {
POTLESS_2 17:bef8abc445f2 425 Consigne_fuite = (float)valeur;
POTLESS_2 17:bef8abc445f2 426 printf(" Servo Fuite = %f\r\n", Consigne_fuite);
POTLESS_2 12:7f3aadd79f89 427 /////////////////////////////////////////
POTLESS_2 12:7f3aadd79f89 428 //Pour rajouter une commande
POTLESS_2 12:7f3aadd79f89 429 //} else if ((char)commande == 'X') {
POTLESS_2 12:7f3aadd79f89 430 // attribuer à une VARIABLE = valeur;
POTLESS_2 12:7f3aadd79f89 431 // ou une action, avec ou sans valeur
POTLESS_2 12:7f3aadd79f89 432 /////////////////////////////////////////
POTLESS_2 9:04bfdfc029cb 433 } else if ((char)commande == 'R') {
POTLESS_2 9:04bfdfc029cb 434 NVIC_SystemReset();
POTLESS_2 9:04bfdfc029cb 435 }
POTLESS_2 12:7f3aadd79f89 436 #ifdef PID_MODE
POTLESS_2 12:7f3aadd79f89 437 else if ((char)commande == 'p') {
POTLESS_2 12:7f3aadd79f89 438 Kc = (float)valeur;
POTLESS_2 16:917656586772 439 control_Servo.reset();
POTLESS_2 12:7f3aadd79f89 440 control_Servo.setTunings(Kc, Ti, Td);
POTLESS_2 14:b5e0e882205e 441 printf(" UPDATE PID --> Kc = %f Ti = %f Td = %f\r\n\n", Kc, Ti, Td);
POTLESS_2 15:efd3b3bf3f37 442 } else if ((char)commande == 'i') {
POTLESS_2 12:7f3aadd79f89 443 Ti = (float)valeur;
POTLESS_2 16:917656586772 444 control_Servo.reset();
POTLESS_2 12:7f3aadd79f89 445 control_Servo.setTunings(Kc, Ti, Td);
POTLESS_2 14:b5e0e882205e 446 printf(" UPDATE PID --> Kc = %f Ti = %f Td = %f\r\n\n", Kc, Ti, Td);
POTLESS_2 15:efd3b3bf3f37 447 } else if ((char)commande == 'd') {
POTLESS_2 12:7f3aadd79f89 448 Td = (float)valeur;
POTLESS_2 16:917656586772 449 control_Servo.reset();
POTLESS_2 12:7f3aadd79f89 450 control_Servo.setTunings(Kc, Ti, Td);
POTLESS_2 14:b5e0e882205e 451 printf(" UPDATE PID --> Kc = %f Ti = %f Td = %f\r\n\n", Kc, Ti, Td);
POTLESS_2 15:efd3b3bf3f37 452 } else if ((char)commande == 'c') {
POTLESS_2 12:7f3aadd79f89 453 consigne = valeur;
POTLESS_2 15:efd3b3bf3f37 454 control_Servo.setSetPoint(consigne);
POTLESS_2 14:b5e0e882205e 455 printf(" UPDATE CONSIGNE PID --> Consigne = %d\r\n\n", consigne);
POTLESS_2 12:7f3aadd79f89 456 }
POTLESS_2 15:efd3b3bf3f37 457 #endif
POTLESS_2 18:bfd78c05b589 458
POTLESS_2 9:04bfdfc029cb 459 strcpy(Android," ");
POTLESS_2 9:04bfdfc029cb 460 indexAndroid = 0;
POTLESS_2 9:04bfdfc029cb 461 newAndroidFlag = false;
POTLESS_2 9:04bfdfc029cb 462 }
POTLESS_2 9:04bfdfc029cb 463
POTLESS_2 4:d84250f67dec 464 int main()
POTLESS_2 12:7f3aadd79f89 465 {
POTLESS_2 21:b8900130ca05 466 button.fall(&pressed);
POTLESS_2 21:b8900130ca05 467 int count = 0;
POTLESS_2 21:b8900130ca05 468
POTLESS_2 21:b8900130ca05 469 while (1) {
POTLESS_2 21:b8900130ca05 470
POTLESS_2 21:b8900130ca05 471 if (count == 0) serialMonit.printf("Appuyez sur le User Button pour commencer...\r\n");
POTLESS_2 21:b8900130ca05 472
POTLESS_2 21:b8900130ca05 473 count = 1;
POTLESS_2 21:b8900130ca05 474
POTLESS_2 23:7477dc855fad 475 if (GO > 0) {
POTLESS_2 21:b8900130ca05 476
POTLESS_2 21:b8900130ca05 477 wait(1);
POTLESS_2 21:b8900130ca05 478
POTLESS_2 19:cac3761a5d0b 479 serialMonit.attach(&callbackParam, Serial::RxIrq);
POTLESS_2 12:7f3aadd79f89 480
POTLESS_2 19:cac3761a5d0b 481 android.attach(&callbackAndroid, Serial::RxIrq);
POTLESS_2 12:7f3aadd79f89 482
POTLESS_2 18:bfd78c05b589 483 /*
POTLESS_2 18:bfd78c05b589 484 Par défaut les valeur en cas de calibration sur true sont les suivant
POTLESS_2 18:bfd78c05b589 485
POTLESS_2 19:cac3761a5d0b 486 nbCalibO2 = 5
POTLESS_2 19:cac3761a5d0b 487 Mode = SPOOLING
POTLESS_2 19:cac3761a5d0b 488 Filtre = DIGI_FILTER32
POTLESS_2 19:cac3761a5d0b 489 CalibrationCO2 = "CALIB_AIR"
POTLESS_2 18:bfd78c05b589 490
POTLESS_2 19:cac3761a5d0b 491 Parfois la calibration du Cozir coince...faire reset et relancer...
POTLESS_2 6:ebed9093d661 492
POTLESS_2 19:cac3761a5d0b 493 Pour calibrer avec ces paramètres :
POTLESS_2 18:bfd78c05b589 494
POTLESS_2 19:cac3761a5d0b 495 sensors.Sensors_INIT(true, true);
POTLESS_2 18:bfd78c05b589 496
POTLESS_2 19:cac3761a5d0b 497 Pour changer utiliser la syntaxe suivante :
POTLESS_2 18:bfd78c05b589 498
POTLESS_2 19:cac3761a5d0b 499 sensors.Sensors_INIT(true, true, true, 5, SPOOLING, DIGI_FILTER32, CALIB_AIR);
POTLESS_2 18:bfd78c05b589 500
POTLESS_2 19:cac3761a5d0b 501 */
POTLESS_2 20:5f79fb4565a7 502 sensors.Sensors_INIT(false, false);
POTLESS_2 18:bfd78c05b589 503
POTLESS_2 19:cac3761a5d0b 504 wait(1);
POTLESS_2 6:ebed9093d661 505
POTLESS_2 20:5f79fb4565a7 506 Servo_Poumon.Init();
POTLESS_2 20:5f79fb4565a7 507 //Servo_Fuite.Init();
POTLESS_2 9:04bfdfc029cb 508
POTLESS_2 7:ad15c386e960 509 serialMonit.printf(" Demarrage...\r\n\r\n Entrez les comandes COZIR si besoin :\r\n");
POTLESS_2 6:ebed9093d661 510
POTLESS_2 18:bfd78c05b589 511 /*
POTLESS_2 15:efd3b3bf3f37 512
POTLESS_2 18:bfd78c05b589 513 Pour mémoire, les réglage de priorité des thread
POTLESS_2 15:efd3b3bf3f37 514
POTLESS_2 18:bfd78c05b589 515 osPriorityIdle = -3, ///< priority: idle (lowest)
POTLESS_2 18:bfd78c05b589 516 osPriorityLow = -2, ///< priority: low
POTLESS_2 18:bfd78c05b589 517 osPriorityBelowNormal = -1, ///< priority: below normal
POTLESS_2 18:bfd78c05b589 518 osPriorityNormal = 0, ///< priority: normal (default)
POTLESS_2 18:bfd78c05b589 519 osPriorityAboveNormal = +1, ///< priority: above normal
POTLESS_2 18:bfd78c05b589 520 osPriorityHigh = +2, ///< priority: high
POTLESS_2 18:bfd78c05b589 521 osPriorityRealtime = +3, ///< priority: realtime (highest)
POTLESS_2 18:bfd78c05b589 522 osPriorityError = 0x84 ///< system cannot determine priority or thread has illegal priority
POTLESS_2 18:bfd78c05b589 523 */
POTLESS_2 18:bfd78c05b589 524
POTLESS_2 19:cac3761a5d0b 525 thread_Sensors.start(Get_Info_thread);
POTLESS_2 19:cac3761a5d0b 526
POTLESS_2 19:cac3761a5d0b 527 thread_Sensors.set_priority(osPriorityNormal);
POTLESS_2 21:b8900130ca05 528
POTLESS_2 21:b8900130ca05 529 wait_ms(300);
POTLESS_2 9:04bfdfc029cb 530
POTLESS_2 19:cac3761a5d0b 531 thread_Volets.start(GO_TO_thread);
POTLESS_2 19:cac3761a5d0b 532
POTLESS_2 19:cac3761a5d0b 533 thread_Volets.set_priority(osPriorityNormal);
POTLESS_2 20:5f79fb4565a7 534
POTLESS_2 21:b8900130ca05 535 wait_ms(300);
POTLESS_2 21:b8900130ca05 536
POTLESS_2 20:5f79fb4565a7 537 thread_Secu.start(SECU_thread);
POTLESS_2 20:5f79fb4565a7 538
POTLESS_2 20:5f79fb4565a7 539 thread_Secu.set_priority(osPriorityNormal);
POTLESS_2 21:b8900130ca05 540
POTLESS_2 21:b8900130ca05 541 wait_ms(300);
POTLESS_2 12:7f3aadd79f89 542
POTLESS_2 12:7f3aadd79f89 543 #ifdef PID_MODE
POTLESS_2 12:7f3aadd79f89 544 //Init PID
POTLESS_2 12:7f3aadd79f89 545 //Entrée PPO2 entre 100 et 1000 mb
POTLESS_2 12:7f3aadd79f89 546 control_Servo.setInputLimits(Min_Input, Max_Input);
POTLESS_2 12:7f3aadd79f89 547 //Sortie servo entre 0 et 100 %
POTLESS_2 12:7f3aadd79f89 548 control_Servo.setOutputLimits(Min_Output, Max_Output);
POTLESS_2 15:efd3b3bf3f37 549 //Mode auto au démarrage
POTLESS_2 12:7f3aadd79f89 550 control_Servo.setMode(AUTO_MODE);
POTLESS_2 12:7f3aadd79f89 551 //Consigne à x mb
POTLESS_2 12:7f3aadd79f89 552 control_Servo.setSetPoint(consigne);
POTLESS_2 15:efd3b3bf3f37 553 #endif
POTLESS_2 15:efd3b3bf3f37 554
POTLESS_2 7:ad15c386e960 555 while (true) {
POTLESS_2 6:ebed9093d661 556
POTLESS_2 7:ad15c386e960 557 //Démarrage du Timer mesurant le temps d'éxecution du code
POTLESS_2 7:ad15c386e960 558 REAL_RATE.start();
POTLESS_2 7:ad15c386e960 559
POTLESS_2 6:ebed9093d661 560 if (newParamFlag) {
POTLESS_2 6:ebed9093d661 561 serialMonit.printf("Param = %s\r\n", param);
POTLESS_2 9:04bfdfc029cb 562 Decoding_Message(param);
POTLESS_2 9:04bfdfc029cb 563 }
POTLESS_2 9:04bfdfc029cb 564
POTLESS_2 9:04bfdfc029cb 565 if (newAndroidFlag) {
POTLESS_2 9:04bfdfc029cb 566 serialMonit.printf("Android = %s\r\n", Android);
POTLESS_2 9:04bfdfc029cb 567 Decoding_Message_Android(Android);
POTLESS_2 6:ebed9093d661 568 }
POTLESS_2 7:ad15c386e960 569
POTLESS_2 15:efd3b3bf3f37 570 //Fabrication de la chaine Date / heure
POTLESS_2 15:efd3b3bf3f37 571 seconds = time(NULL);
POTLESS_2 15:efd3b3bf3f37 572 char Time_buf[32];
POTLESS_2 15:efd3b3bf3f37 573 strftime(Time_buf, 32, "%D %I-%M-%S ", localtime(&seconds));
POTLESS_2 15:efd3b3bf3f37 574
POTLESS_2 17:bef8abc445f2 575 #ifdef PID_MODE
POTLESS_2 15:efd3b3bf3f37 576 //Fabrication de la chaine à enregistrer
POTLESS_2 17:bef8abc445f2 577 sprintf(to_store,"%s:%d:%d:%.2f:%.2f:%.2f:%d:%d:%d:%.2f:%.2f:%d:%.3f:%.3f:%.3f:%d",
POTLESS_2 15:efd3b3bf3f37 578 Time_buf,
POTLESS_2 15:efd3b3bf3f37 579 co2,
POTLESS_2 15:efd3b3bf3f37 580 ppO2,
POTLESS_2 15:efd3b3bf3f37 581 pression,
POTLESS_2 15:efd3b3bf3f37 582 Temp1,
POTLESS_2 15:efd3b3bf3f37 583 Temp2,
POTLESS_2 15:efd3b3bf3f37 584 Humid,
POTLESS_2 15:efd3b3bf3f37 585 CellO2_1,
POTLESS_2 15:efd3b3bf3f37 586 CellO2_2,
POTLESS_2 15:efd3b3bf3f37 587 volet_poumon_Position,
POTLESS_2 15:efd3b3bf3f37 588 volet_fuite_Position,
POTLESS_2 15:efd3b3bf3f37 589 MODE_FLAG,
POTLESS_2 15:efd3b3bf3f37 590 Kc,
POTLESS_2 15:efd3b3bf3f37 591 Ti,
POTLESS_2 18:bfd78c05b589 592 Td,
POTLESS_2 17:bef8abc445f2 593 (int)consigne
POTLESS_2 18:bfd78c05b589 594 );
POTLESS_2 17:bef8abc445f2 595 #endif
POTLESS_2 17:bef8abc445f2 596 #ifndef PID_MODE
POTLESS_2 17:bef8abc445f2 597 //Fabrication de la chaine à enregistrer sans les variables du PID
POTLESS_2 17:bef8abc445f2 598 sprintf(to_store,"%s:%d:%d:%.2f:%.2f:%.2f:%d:%d:%d:%.2f:%.2f:%d:%.3f:%.3f:%.3f:%d",
POTLESS_2 17:bef8abc445f2 599 Time_buf,
POTLESS_2 17:bef8abc445f2 600 co2,
POTLESS_2 17:bef8abc445f2 601 ppO2,
POTLESS_2 17:bef8abc445f2 602 pression,
POTLESS_2 17:bef8abc445f2 603 Temp1,
POTLESS_2 17:bef8abc445f2 604 Temp2,
POTLESS_2 17:bef8abc445f2 605 Humid,
POTLESS_2 17:bef8abc445f2 606 CellO2_1,
POTLESS_2 17:bef8abc445f2 607 CellO2_2,
POTLESS_2 17:bef8abc445f2 608 volet_poumon_Position,
POTLESS_2 17:bef8abc445f2 609 volet_fuite_Position,
POTLESS_2 17:bef8abc445f2 610 MODE_FLAG,
POTLESS_2 20:5f79fb4565a7 611 0.0,
POTLESS_2 20:5f79fb4565a7 612 0.0,
POTLESS_2 20:5f79fb4565a7 613 0.0,
POTLESS_2 17:bef8abc445f2 614 0
POTLESS_2 18:bfd78c05b589 615 );
POTLESS_2 17:bef8abc445f2 616 #endif
POTLESS_2 15:efd3b3bf3f37 617
POTLESS_2 15:efd3b3bf3f37 618 //Enregistrement de la chaine
POTLESS_2 19:cac3761a5d0b 619 UTILS::Write_SD_File((string)to_store);
POTLESS_2 15:efd3b3bf3f37 620
POTLESS_2 15:efd3b3bf3f37 621 //Pour Android on ajoute < et > pour décoder l'arrivée du message
POTLESS_2 9:04bfdfc029cb 622 if (NEED_ANDROID_OUTPUT == 1) {
POTLESS_2 15:efd3b3bf3f37 623 sprintf(to_android,"<%s>",to_store);
POTLESS_2 12:7f3aadd79f89 624 ANDROID(to_android);
POTLESS_2 9:04bfdfc029cb 625 }
POTLESS_2 15:efd3b3bf3f37 626
POTLESS_2 18:bfd78c05b589 627 //Calcul des OTU
POTLESS_2 18:bfd78c05b589 628 Calcul_OTU();
POTLESS_2 19:cac3761a5d0b 629
POTLESS_2 20:5f79fb4565a7 630 //Vers le moniteur série
POTLESS_2 13:22a96dc67e85 631 Affichage_moniteur();
POTLESS_2 15:efd3b3bf3f37 632
POTLESS_2 15:efd3b3bf3f37 633
POTLESS_2 15:efd3b3bf3f37 634 #ifdef PID_MODE
POTLESS_2 15:efd3b3bf3f37 635 //Update du PID
POTLESS_2 15:efd3b3bf3f37 636 control_Servo.setProcessValue(ppO2);
POTLESS_2 19:cac3761a5d0b 637 //Nouvelle sortie servo fuite si on est pas en mode SECU
POTLESS_2 19:cac3761a5d0b 638 if(!EN_MODE_SECU) Consigne_fuite = control_Servo.compute();
POTLESS_2 12:7f3aadd79f89 639 #endif
POTLESS_2 15:efd3b3bf3f37 640
POTLESS_2 7:ad15c386e960 641 //Arrêt du Timer mesurant le temps d'éxecution du code
POTLESS_2 7:ad15c386e960 642 REAL_RATE.stop();
POTLESS_2 7:ad15c386e960 643 //Définition de la nouvelle valeur du temps d'échantillonage du PID.
POTLESS_2 7:ad15c386e960 644 RATE = REAL_RATE.read();
POTLESS_2 7:ad15c386e960 645 //Reset du Timer
POTLESS_2 7:ad15c386e960 646 REAL_RATE.reset();
POTLESS_2 12:7f3aadd79f89 647
POTLESS_2 16:917656586772 648 //Pour ralentir le code à Ref_Time seconde fixe quelque soit les intéruptions du loop....
POTLESS_2 18:bfd78c05b589 649 if (Ref_Time > RATE) {
POTLESS_2 18:bfd78c05b589 650 RATE_TRUE = (Ref_Time - RATE) * 1000;
POTLESS_2 18:bfd78c05b589 651 } else {
POTLESS_2 18:bfd78c05b589 652 RATE_TRUE = 0;
POTLESS_2 16:917656586772 653 #ifdef PID_MODE
POTLESS_2 18:bfd78c05b589 654 control_Servo.setInterval(RATE);
POTLESS_2 18:bfd78c05b589 655 #endif
POTLESS_2 18:bfd78c05b589 656 printf("Pour ralentir le code, Ref_Time doit être supérieur à %f seconde(s)\r\n\n", RATE);
POTLESS_2 16:917656586772 657 }
POTLESS_2 18:bfd78c05b589 658
POTLESS_2 11:b2feed92584a 659 wait_ms(RATE_TRUE);
POTLESS_2 21:b8900130ca05 660 }
POTLESS_2 21:b8900130ca05 661 }
POTLESS_2 21:b8900130ca05 662 }
POTLESS_2 4:d84250f67dec 663 }