mbed-os github
Dependencies: ADS1015 Faulhaber HTU21D_mod MS5837_potless Sensor_Head_RevB_3 USBDevice_dfu Utilsdfu beep
Fork of ARNSRS_testDFU by
main.cpp@16:917656586772, 2017-11-27 (annotated)
- Committer:
- POTLESS_2
- Date:
- Mon Nov 27 16:33:13 2017 +0000
- Revision:
- 16:917656586772
- Parent:
- 15:efd3b3bf3f37
- Child:
- 17:bef8abc445f2
Reprise du thread, enregistrement des valeurs du PID, changement init de la lib sensor, warning emp?chant un loop trop court, reset du PID quand on change une valeur...et je me rappel plus le reste....
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
potless | 1:bef7856b5c0a | 1 | #include "mbed.h" |
potless | 2:4a8bf1d53439 | 2 | #include <string> |
POTLESS_2 | 7:ad15c386e960 | 3 | #include "Sensor_head_revB.h" |
POTLESS_2 | 8:a750d531b381 | 4 | #include "HTU21D.h" |
POTLESS_2 | 12:7f3aadd79f89 | 5 | #include "PID.h" |
POTLESS_2 | 4:d84250f67dec | 6 | |
POTLESS_2 | 10:aca745a66d51 | 7 | //Commandes des servos |
POTLESS_2 | 10:aca745a66d51 | 8 | #define PWM_SERVO_POUMON PB_15 |
POTLESS_2 | 10:aca745a66d51 | 9 | #define PWM_SERVO_FUITE PB_1 |
POTLESS_2 | 10:aca745a66d51 | 10 | //Retour des servos |
POTLESS_2 | 10:aca745a66d51 | 11 | #define FEED_BACK_SERVO_POUMON PC_2 |
POTLESS_2 | 10:aca745a66d51 | 12 | #define FEED_BACK_SERVO_FUITE PC_3 |
POTLESS_2 | 9:04bfdfc029cb | 13 | |
POTLESS_2 | 9:04bfdfc029cb | 14 | //Ecrit dans le moniteur série de la tablette à 9600 bds si sur 1, penser à mettre NEED_CONSOLE_OUTPUT à 0 |
POTLESS_2 | 9:04bfdfc029cb | 15 | #define NEED_ANDROID_OUTPUT 1 |
POTLESS_2 | 9:04bfdfc029cb | 16 | |
POTLESS_2 | 10:aca745a66d51 | 17 | //Sortie en mode VT100, à commenter si on veut une sortie type Arduino |
POTLESS_2 | 10:aca745a66d51 | 18 | //#define VT100 |
POTLESS_2 | 9:04bfdfc029cb | 19 | |
POTLESS_2 | 12:7f3aadd79f89 | 20 | //Mode PID, STD et DELTA, à commenter / décommenter |
POTLESS_2 | 12:7f3aadd79f89 | 21 | //#define STD_MODE |
POTLESS_2 | 12:7f3aadd79f89 | 22 | #define PID_MODE |
POTLESS_2 | 11:b2feed92584a | 23 | //#define DELTA_MODE |
POTLESS_2 | 12:7f3aadd79f89 | 24 | |
POTLESS_2 | 11:b2feed92584a | 25 | float delta = 0.0f; |
POTLESS_2 | 11:b2feed92584a | 26 | |
POTLESS_2 | 12:7f3aadd79f89 | 27 | #ifdef STD_MODE |
POTLESS_2 | 12:7f3aadd79f89 | 28 | int MODE_FLAG = 0; |
POTLESS_2 | 11:b2feed92584a | 29 | #endif |
POTLESS_2 | 11:b2feed92584a | 30 | |
POTLESS_2 | 11:b2feed92584a | 31 | #ifdef DELTA_MODE |
POTLESS_2 | 12:7f3aadd79f89 | 32 | int MODE_FLAG = 1; |
POTLESS_2 | 12:7f3aadd79f89 | 33 | #endif |
POTLESS_2 | 12:7f3aadd79f89 | 34 | |
POTLESS_2 | 12:7f3aadd79f89 | 35 | #ifdef PID_MODE |
POTLESS_2 | 12:7f3aadd79f89 | 36 | int MODE_FLAG = 2; |
POTLESS_2 | 11:b2feed92584a | 37 | #endif |
POTLESS_2 | 11:b2feed92584a | 38 | |
POTLESS_2 | 9:04bfdfc029cb | 39 | #if NEED_ANDROID_OUTPUT |
POTLESS_2 | 9:04bfdfc029cb | 40 | #define ANDROID(...) { android.printf(__VA_ARGS__); } |
POTLESS_2 | 9:04bfdfc029cb | 41 | #else |
POTLESS_2 | 9:04bfdfc029cb | 42 | #define ANDROID(...) |
POTLESS_2 | 9:04bfdfc029cb | 43 | #endif |
POTLESS_2 | 9:04bfdfc029cb | 44 | |
POTLESS_2 | 7:ad15c386e960 | 45 | //Moniteur série |
POTLESS_2 | 9:04bfdfc029cb | 46 | Serial serialMonit(USBTX,USBRX,9600); |
POTLESS_2 | 10:aca745a66d51 | 47 | |
POTLESS_2 | 9:04bfdfc029cb | 48 | //COM Série vers Android, Serial 3 |
POTLESS_2 | 9:04bfdfc029cb | 49 | Serial android(PC_10,PC_11,9600); |
POTLESS_2 | 4:d84250f67dec | 50 | |
POTLESS_2 | 7:ad15c386e960 | 51 | //Init de la lib ARNSRS; |
POTLESS_2 | 7:ad15c386e960 | 52 | SENSOR_HEAD_REV_B sensors; |
potless | 2:4a8bf1d53439 | 53 | |
POTLESS_2 | 6:ebed9093d661 | 54 | //pour Param Cozir |
POTLESS_2 | 9:04bfdfc029cb | 55 | const int sizeParam = 20; |
POTLESS_2 | 11:b2feed92584a | 56 | char param[sizeParam]; |
POTLESS_2 | 11:b2feed92584a | 57 | volatile int indexParam = 0; |
POTLESS_2 | 6:ebed9093d661 | 58 | bool newParamFlag = false; |
potless | 2:4a8bf1d53439 | 59 | |
POTLESS_2 | 9:04bfdfc029cb | 60 | //pour Commandes Android |
POTLESS_2 | 9:04bfdfc029cb | 61 | const int sizeAndroid = 20; |
POTLESS_2 | 11:b2feed92584a | 62 | char Android[sizeAndroid]; |
POTLESS_2 | 11:b2feed92584a | 63 | volatile int indexAndroid = 0; |
POTLESS_2 | 9:04bfdfc029cb | 64 | bool newAndroidFlag = false; |
POTLESS_2 | 12:7f3aadd79f89 | 65 | char to_android[100]; |
POTLESS_2 | 9:04bfdfc029cb | 66 | |
POTLESS_2 | 7:ad15c386e960 | 67 | //Variables de stockage des infos capteurs |
POTLESS_2 | 7:ad15c386e960 | 68 | int co2 = 0; |
POTLESS_2 | 7:ad15c386e960 | 69 | float pression = 0; |
POTLESS_2 | 9:04bfdfc029cb | 70 | float Temp1 = 0; |
POTLESS_2 | 7:ad15c386e960 | 71 | int ppO2 = 0; |
POTLESS_2 | 7:ad15c386e960 | 72 | int CellO2_1 = 0; |
POTLESS_2 | 7:ad15c386e960 | 73 | int CellO2_2 = 0; |
POTLESS_2 | 7:ad15c386e960 | 74 | |
POTLESS_2 | 7:ad15c386e960 | 75 | //Mesure du tempsd'éxecution du loop |
POTLESS_2 | 7:ad15c386e960 | 76 | Timer REAL_RATE; |
POTLESS_2 | 7:ad15c386e960 | 77 | float RATE = 0; |
POTLESS_2 | 11:b2feed92584a | 78 | float RATE_TRUE = 0; |
POTLESS_2 | 12:7f3aadd79f89 | 79 | float Ref_Time = 1.0; //La durée de la boucle désirée... |
POTLESS_2 | 7:ad15c386e960 | 80 | |
POTLESS_2 | 8:a750d531b381 | 81 | //HTU21D |
POTLESS_2 | 8:a750d531b381 | 82 | HTU21D temphumid(PB_9, PB_8); //Temp humid sensor || SDA, SCL |
POTLESS_2 | 9:04bfdfc029cb | 83 | float Temp2; |
POTLESS_2 | 9:04bfdfc029cb | 84 | int Humid; |
POTLESS_2 | 9:04bfdfc029cb | 85 | |
POTLESS_2 | 9:04bfdfc029cb | 86 | //Data LOG |
POTLESS_2 | 9:04bfdfc029cb | 87 | char to_store[50]; |
POTLESS_2 | 9:04bfdfc029cb | 88 | time_t seconds; |
POTLESS_2 | 8:a750d531b381 | 89 | |
POTLESS_2 | 8:a750d531b381 | 90 | //VT100 |
POTLESS_2 | 8:a750d531b381 | 91 | static const char CLS[] = "\x1B[2J"; |
POTLESS_2 | 8:a750d531b381 | 92 | static const char HOME[] = "\x1B[H"; |
POTLESS_2 | 8:a750d531b381 | 93 | |
POTLESS_2 | 7:ad15c386e960 | 94 | //Thread d'intérogation des capteurs |
POTLESS_2 | 7:ad15c386e960 | 95 | Thread thread; |
POTLESS_2 | 7:ad15c386e960 | 96 | |
POTLESS_2 | 10:aca745a66d51 | 97 | //Contrôle des servos |
POTLESS_2 | 10:aca745a66d51 | 98 | PwmOut servo_poumon(PWM_SERVO_POUMON); |
POTLESS_2 | 10:aca745a66d51 | 99 | AnalogIn FeedBack_Servo_Poumon(FEED_BACK_SERVO_POUMON); |
POTLESS_2 | 10:aca745a66d51 | 100 | float volet_poumon_Position; |
POTLESS_2 | 10:aca745a66d51 | 101 | float Limit_min_Servo_Poumon, Limit_max_Servo_Poumon; |
POTLESS_2 | 10:aca745a66d51 | 102 | float Delta_FB_1; |
POTLESS_2 | 10:aca745a66d51 | 103 | |
POTLESS_2 | 10:aca745a66d51 | 104 | PwmOut servo_fuite(PWM_SERVO_FUITE); |
POTLESS_2 | 10:aca745a66d51 | 105 | AnalogIn FeedBack_Servo_Fuite(FEED_BACK_SERVO_FUITE); |
POTLESS_2 | 10:aca745a66d51 | 106 | float volet_fuite_Position; |
POTLESS_2 | 10:aca745a66d51 | 107 | float Limit_min_Servo_Fuite, Limit_max_Servo_Fuite; |
POTLESS_2 | 10:aca745a66d51 | 108 | float Delta_FB_2; |
POTLESS_2 | 10:aca745a66d51 | 109 | |
POTLESS_2 | 12:7f3aadd79f89 | 110 | #ifdef PID_MODE |
POTLESS_2 | 12:7f3aadd79f89 | 111 | //Paramètre du PID |
POTLESS_2 | 12:7f3aadd79f89 | 112 | float Kc = 40; |
POTLESS_2 | 12:7f3aadd79f89 | 113 | float Ti = 0; |
POTLESS_2 | 12:7f3aadd79f89 | 114 | float Td = 0; |
POTLESS_2 | 12:7f3aadd79f89 | 115 | float RATE_PID = Ref_Time; |
POTLESS_2 | 12:7f3aadd79f89 | 116 | float Commande_PID; |
POTLESS_2 | 15:efd3b3bf3f37 | 117 | float consigne = 210; |
POTLESS_2 | 15:efd3b3bf3f37 | 118 | float Max_Input = 1000; |
POTLESS_2 | 15:efd3b3bf3f37 | 119 | float Min_Input = 80; |
POTLESS_2 | 15:efd3b3bf3f37 | 120 | float Max_Output = 1;//Vérifier la valeur pour angle à laisser ouvert... |
POTLESS_2 | 15:efd3b3bf3f37 | 121 | float Min_Output = 0; |
POTLESS_2 | 10:aca745a66d51 | 122 | |
POTLESS_2 | 12:7f3aadd79f89 | 123 | //Init PID |
POTLESS_2 | 12:7f3aadd79f89 | 124 | PID control_Servo(Kc, Ti, Td, RATE_PID);//Kc, Ti, Td, interval |
POTLESS_2 | 12:7f3aadd79f89 | 125 | #endif |
POTLESS_2 | 10:aca745a66d51 | 126 | |
POTLESS_2 | 10:aca745a66d51 | 127 | //Remap d'une valeur |
POTLESS_2 | 10:aca745a66d51 | 128 | float remap(float x, float in_min, float in_max, float out_min, float out_max) |
POTLESS_2 | 10:aca745a66d51 | 129 | { |
POTLESS_2 | 10:aca745a66d51 | 130 | return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; |
POTLESS_2 | 10:aca745a66d51 | 131 | } |
POTLESS_2 | 10:aca745a66d51 | 132 | |
POTLESS_2 | 10:aca745a66d51 | 133 | |
POTLESS_2 | 12:7f3aadd79f89 | 134 | //Thread d'intérogation des capteurs, positions servo et constitution de la chaine |
POTLESS_2 | 10:aca745a66d51 | 135 | void Get_Info_thread() |
POTLESS_2 | 6:ebed9093d661 | 136 | { |
POTLESS_2 | 7:ad15c386e960 | 137 | while (true) { |
POTLESS_2 | 7:ad15c386e960 | 138 | |
POTLESS_2 | 7:ad15c386e960 | 139 | //CO2 sur Cozir |
POTLESS_2 | 7:ad15c386e960 | 140 | co2 = sensors.requestCO2(); |
POTLESS_2 | 7:ad15c386e960 | 141 | //P / T sur MS5837 |
POTLESS_2 | 7:ad15c386e960 | 142 | pression = sensors.requestPress(); |
POTLESS_2 | 9:04bfdfc029cb | 143 | Temp1 = sensors.requestTemp(); |
POTLESS_2 | 7:ad15c386e960 | 144 | //PPO2 sur ADS1015 |
POTLESS_2 | 7:ad15c386e960 | 145 | ppO2 = sensors.requestPpO2(); |
POTLESS_2 | 7:ad15c386e960 | 146 | //Cell O2 en mV |
POTLESS_2 | 7:ad15c386e960 | 147 | CellO2_1 = sensors.requestCellO2_1(); |
POTLESS_2 | 7:ad15c386e960 | 148 | CellO2_2 = sensors.requestCellO2_2(); |
POTLESS_2 | 9:04bfdfc029cb | 149 | |
POTLESS_2 | 8:a750d531b381 | 150 | //HTU21D |
POTLESS_2 | 9:04bfdfc029cb | 151 | Temp2 = temphumid.sample_ctemp(); |
POTLESS_2 | 9:04bfdfc029cb | 152 | Humid = temphumid.sample_humid(); |
POTLESS_2 | 9:04bfdfc029cb | 153 | |
POTLESS_2 | 10:aca745a66d51 | 154 | //Retour position des servos |
POTLESS_2 | 10:aca745a66d51 | 155 | volet_poumon_Position = 90 - remap(FeedBack_Servo_Poumon, Limit_max_Servo_Poumon, Limit_min_Servo_Poumon, 0, 90); |
POTLESS_2 | 10:aca745a66d51 | 156 | volet_fuite_Position = remap(FeedBack_Servo_Fuite, Limit_max_Servo_Fuite, Limit_min_Servo_Fuite, 0, 90); |
POTLESS_2 | 12:7f3aadd79f89 | 157 | |
POTLESS_2 | 15:efd3b3bf3f37 | 158 | } |
potless | 2:4a8bf1d53439 | 159 | } |
POTLESS_2 | 4:d84250f67dec | 160 | |
POTLESS_2 | 7:ad15c386e960 | 161 | void Affichage_moniteur() |
POTLESS_2 | 4:d84250f67dec | 162 | { |
POTLESS_2 | 12:7f3aadd79f89 | 163 | #ifndef VT100 |
POTLESS_2 | 9:04bfdfc029cb | 164 | printf("\r\n"); |
POTLESS_2 | 9:04bfdfc029cb | 165 | printf(" CO2 = %d ppm\r\n" , co2); |
POTLESS_2 | 9:04bfdfc029cb | 166 | printf(" PPO2 = %d mb\r\n", ppO2); |
POTLESS_2 | 9:04bfdfc029cb | 167 | printf(" Pression = %f msw\r\n", pression); |
POTLESS_2 | 10:aca745a66d51 | 168 | printf(" Temp MS5837 = %f C\r\n", Temp1); |
POTLESS_2 | 10:aca745a66d51 | 169 | printf(" Temp HTU21D = %f C\n\r", Temp2); |
POTLESS_2 | 9:04bfdfc029cb | 170 | printf(" Humidity = %d %%\n\r", Humid); |
POTLESS_2 | 8:a750d531b381 | 171 | printf("\n\r"); |
POTLESS_2 | 8:a750d531b381 | 172 | printf(" Cell O2 n 1 = %d\r\n" , CellO2_1); |
POTLESS_2 | 8:a750d531b381 | 173 | printf(" Cell O2 n 2 = %d\r\n" , CellO2_2); |
POTLESS_2 | 7:ad15c386e960 | 174 | printf("\r\n"); |
POTLESS_2 | 9:04bfdfc029cb | 175 | printf("\n"); |
POTLESS_2 | 10:aca745a66d51 | 176 | printf(" Volet Poumon = %3.2f%\r\n" , volet_poumon_Position); |
POTLESS_2 | 10:aca745a66d51 | 177 | printf(" Volet Fuite = %3.2f%\r\n" , volet_fuite_Position); |
POTLESS_2 | 10:aca745a66d51 | 178 | printf("\r\n"); |
POTLESS_2 | 12:7f3aadd79f89 | 179 | printf("Temps d execution de la boucle = %f seconde(s)\n", (RATE + RATE_TRUE / 1000)); |
POTLESS_2 | 9:04bfdfc029cb | 180 | printf("\r\n", ""); |
POTLESS_2 | 9:04bfdfc029cb | 181 | printf("A enregistrer = %s\n", to_store); |
POTLESS_2 | 9:04bfdfc029cb | 182 | printf("\r\n"); |
POTLESS_2 | 10:aca745a66d51 | 183 | #endif |
POTLESS_2 | 9:04bfdfc029cb | 184 | |
POTLESS_2 | 12:7f3aadd79f89 | 185 | #ifdef VT100 |
POTLESS_2 | 8:a750d531b381 | 186 | printf(HOME); |
POTLESS_2 | 8:a750d531b381 | 187 | printf("\x1b[30m"); |
POTLESS_2 | 9:04bfdfc029cb | 188 | printf("\x1b[0m\r CO2 = \x1b[1m\x1b[K%d ppm\n", co2); |
POTLESS_2 | 9:04bfdfc029cb | 189 | printf("\x1b[0m\r PPO2 = \x1b[1m\x1b[K%d mb\n", ppO2); |
POTLESS_2 | 9:04bfdfc029cb | 190 | printf("\n"); |
POTLESS_2 | 9:04bfdfc029cb | 191 | printf("\x1b[0m\r Pression = \x1b[1m\x1b[K%.2f msw\n", pression); |
POTLESS_2 | 9:04bfdfc029cb | 192 | printf("\n"); |
POTLESS_2 | 10:aca745a66d51 | 193 | printf("\x1b[0m\r Temp MS5837 = \x1b[1m\x1b[K%.2f C\n", Temp1); |
POTLESS_2 | 10:aca745a66d51 | 194 | printf("\x1b[0m\r Temp HTU21D = \x1b[1m\x1b[K%.2f C\n", Temp2); |
POTLESS_2 | 9:04bfdfc029cb | 195 | printf("\n"); |
POTLESS_2 | 9:04bfdfc029cb | 196 | printf("\x1b[0m\r Humidity = \x1b[1m\x1b[K%d %\n", Humid); |
POTLESS_2 | 9:04bfdfc029cb | 197 | printf("\n"); |
POTLESS_2 | 8:a750d531b381 | 198 | printf("\x1b[0m\r Cell O2 n 1 = \x1b[1m\x1b[K%d\n", CellO2_1); |
POTLESS_2 | 8:a750d531b381 | 199 | printf("\x1b[0m\r Cell O2 n 2 = \x1b[1m\x1b[K%d\n", CellO2_2); |
POTLESS_2 | 8:a750d531b381 | 200 | printf("\n"); |
POTLESS_2 | 10:aca745a66d51 | 201 | printf("\x1b[0m\r Volet Poumon = \x1b[1m\x1b[K%3.2f%\n", volet_poumon_Position); |
POTLESS_2 | 10:aca745a66d51 | 202 | printf("\x1b[0m\r Volet Fuite = \x1b[1m\x1b[K%3.2f%\n", volet_fuite_Position); |
POTLESS_2 | 10:aca745a66d51 | 203 | printf("\n"); |
POTLESS_2 | 13:22a96dc67e85 | 204 | printf("\x1b[0m\r Temps d execution de la boucle = \x1b[1m\x1b[K%f seconde(s)\n", (RATE + RATE_TRUE / 1000)); |
POTLESS_2 | 9:04bfdfc029cb | 205 | printf("\r\n", ""); |
POTLESS_2 | 9:04bfdfc029cb | 206 | printf("\x1b[0m\r A enregistrer = \x1b[1m\x1b[K%s\n", to_store); |
POTLESS_2 | 9:04bfdfc029cb | 207 | printf("\r\n", ""); |
POTLESS_2 | 12:7f3aadd79f89 | 208 | #endif |
POTLESS_2 | 4:d84250f67dec | 209 | } |
POTLESS_2 | 4:d84250f67dec | 210 | |
POTLESS_2 | 11:b2feed92584a | 211 | //Callback de l'intérruption des envois de commandes depuis le terminal |
POTLESS_2 | 6:ebed9093d661 | 212 | void callbackParam() |
POTLESS_2 | 4:d84250f67dec | 213 | { |
POTLESS_2 | 6:ebed9093d661 | 214 | while(serialMonit.readable()) { |
POTLESS_2 | 6:ebed9093d661 | 215 | if (indexParam == sizeParam) //éviter la saturation du buffer |
POTLESS_2 | 6:ebed9093d661 | 216 | serialMonit.getc(); |
POTLESS_2 | 6:ebed9093d661 | 217 | else |
POTLESS_2 | 6:ebed9093d661 | 218 | param [indexParam++] = serialMonit.getc();//chargement du buffer dans le message |
POTLESS_2 | 6:ebed9093d661 | 219 | if ((indexParam == sizeParam) || (param[indexParam -1] == '\n')) {//le message est complet ou nouvelle ligne ou autre si on veut... |
POTLESS_2 | 6:ebed9093d661 | 220 | param[indexParam] = 0; |
POTLESS_2 | 6:ebed9093d661 | 221 | newParamFlag = true; |
POTLESS_2 | 6:ebed9093d661 | 222 | } |
POTLESS_2 | 4:d84250f67dec | 223 | } |
POTLESS_2 | 6:ebed9093d661 | 224 | } |
POTLESS_2 | 4:d84250f67dec | 225 | |
POTLESS_2 | 9:04bfdfc029cb | 226 | //Callback de l'intérruption des envois de commandes depuis Android |
POTLESS_2 | 9:04bfdfc029cb | 227 | void callbackAndroid() |
POTLESS_2 | 9:04bfdfc029cb | 228 | { |
POTLESS_2 | 9:04bfdfc029cb | 229 | while(android.readable()) { |
POTLESS_2 | 9:04bfdfc029cb | 230 | if (indexAndroid == sizeAndroid) //éviter la saturation du buffer |
POTLESS_2 | 9:04bfdfc029cb | 231 | android.getc(); |
POTLESS_2 | 9:04bfdfc029cb | 232 | else |
POTLESS_2 | 9:04bfdfc029cb | 233 | Android [indexAndroid++] = android.getc();//chargement du buffer dans le message |
POTLESS_2 | 9:04bfdfc029cb | 234 | if ((indexAndroid == sizeAndroid) || (Android[indexAndroid -1] == '\n')) {//le message est complet ou nouvelle ligne ou autre si on veut... |
POTLESS_2 | 9:04bfdfc029cb | 235 | Android[indexAndroid] = 0; |
POTLESS_2 | 9:04bfdfc029cb | 236 | newAndroidFlag = true; |
POTLESS_2 | 9:04bfdfc029cb | 237 | } |
POTLESS_2 | 9:04bfdfc029cb | 238 | } |
POTLESS_2 | 9:04bfdfc029cb | 239 | } |
POTLESS_2 | 11:b2feed92584a | 240 | |
POTLESS_2 | 9:04bfdfc029cb | 241 | void Decoding_Message(char message []) |
POTLESS_2 | 9:04bfdfc029cb | 242 | { |
POTLESS_2 | 9:04bfdfc029cb | 243 | char *commande = 0; |
POTLESS_2 | 14:b5e0e882205e | 244 | float valeur = 0; |
POTLESS_2 | 9:04bfdfc029cb | 245 | |
POTLESS_2 | 14:b5e0e882205e | 246 | sscanf(message,"%s %f",&commande , &valeur); |
POTLESS_2 | 9:04bfdfc029cb | 247 | |
POTLESS_2 | 9:04bfdfc029cb | 248 | if ((char)commande == 'T') { |
POTLESS_2 | 9:04bfdfc029cb | 249 | set_time(valeur); |
POTLESS_2 | 12:7f3aadd79f89 | 250 | } else if ((char)commande == 'I') { |
POTLESS_2 | 10:aca745a66d51 | 251 | servo_poumon = remap(valeur, 0, 90, 0, 100) / 100.f; |
POTLESS_2 | 12:7f3aadd79f89 | 252 | #ifdef DELTA_MODE |
POTLESS_2 | 11:b2feed92584a | 253 | float Sf = servo_poumon + remap(delta, 0, 90, 0, 100) / 100.f; |
POTLESS_2 | 13:22a96dc67e85 | 254 | if(Sf >= 0 && Sf <= 90)//Pas bon, à retravailler.... |
POTLESS_2 | 12:7f3aadd79f89 | 255 | servo_fuite = Sf; |
POTLESS_2 | 12:7f3aadd79f89 | 256 | #endif |
POTLESS_2 | 10:aca745a66d51 | 257 | printf(" Servo Poumon = %f\r\n", remap(valeur, 0, 90, 0, 100) / 100.f); |
POTLESS_2 | 12:7f3aadd79f89 | 258 | } else if ((char)commande == 'O') { |
POTLESS_2 | 10:aca745a66d51 | 259 | servo_fuite = 1 - remap(valeur, 0, 90, 0, 100) / 100.f; |
POTLESS_2 | 12:7f3aadd79f89 | 260 | printf(" Servo Fuite = %f\r\n", 1 - remap(valeur, 0, 90, 0, 100) / 100.f); |
POTLESS_2 | 11:b2feed92584a | 261 | } else if ((char)commande == 'D') { |
POTLESS_2 | 11:b2feed92584a | 262 | delta = valeur; |
POTLESS_2 | 12:7f3aadd79f89 | 263 | #ifdef DELTA_MODE |
POTLESS_2 | 11:b2feed92584a | 264 | float Sf = servo_poumon + remap(delta, 0, 90, 0, 100) / 100.f; |
POTLESS_2 | 13:22a96dc67e85 | 265 | if(Sf >= 0 && Sf <= 90)//Pas bon, à retravailler.... |
POTLESS_2 | 12:7f3aadd79f89 | 266 | servo_fuite = Sf; |
POTLESS_2 | 12:7f3aadd79f89 | 267 | #endif |
POTLESS_2 | 10:aca745a66d51 | 268 | } else if ((char)commande == 'R') { |
POTLESS_2 | 10:aca745a66d51 | 269 | NVIC_SystemReset(); |
POTLESS_2 | 12:7f3aadd79f89 | 270 | ///////////////////////////////////////// |
POTLESS_2 | 12:7f3aadd79f89 | 271 | //Pour rajouter une commande |
POTLESS_2 | 12:7f3aadd79f89 | 272 | //} else if ((char)commande == 'X') { |
POTLESS_2 | 12:7f3aadd79f89 | 273 | // attribuer à une VARIABLE = valeur; |
POTLESS_2 | 12:7f3aadd79f89 | 274 | // ou une action, avec ou sans valeur |
POTLESS_2 | 12:7f3aadd79f89 | 275 | ///////////////////////////////////////// |
POTLESS_2 | 12:7f3aadd79f89 | 276 | } else { |
POTLESS_2 | 9:04bfdfc029cb | 277 | sensors.cozirSend(message); |
POTLESS_2 | 9:04bfdfc029cb | 278 | } |
POTLESS_2 | 9:04bfdfc029cb | 279 | |
POTLESS_2 | 11:b2feed92584a | 280 | //wait_ms(100); |
POTLESS_2 | 9:04bfdfc029cb | 281 | strcpy(param," "); |
POTLESS_2 | 9:04bfdfc029cb | 282 | indexParam = 0; |
POTLESS_2 | 9:04bfdfc029cb | 283 | newParamFlag = false; |
POTLESS_2 | 9:04bfdfc029cb | 284 | } |
POTLESS_2 | 9:04bfdfc029cb | 285 | |
POTLESS_2 | 9:04bfdfc029cb | 286 | void Decoding_Message_Android(char message []) |
POTLESS_2 | 9:04bfdfc029cb | 287 | { |
POTLESS_2 | 9:04bfdfc029cb | 288 | char *commande = 0; |
POTLESS_2 | 14:b5e0e882205e | 289 | float valeur = 0; |
POTLESS_2 | 9:04bfdfc029cb | 290 | |
POTLESS_2 | 14:b5e0e882205e | 291 | sscanf(message,"%s %f",&commande , &valeur); |
POTLESS_2 | 9:04bfdfc029cb | 292 | |
POTLESS_2 | 9:04bfdfc029cb | 293 | if ((char)commande == 'T') { |
POTLESS_2 | 9:04bfdfc029cb | 294 | set_time(valeur); |
POTLESS_2 | 12:7f3aadd79f89 | 295 | } else if ((char)commande == 'I') { |
POTLESS_2 | 10:aca745a66d51 | 296 | servo_poumon = remap(valeur, 0, 90, 0, 100) / 100.f; |
POTLESS_2 | 12:7f3aadd79f89 | 297 | #ifdef DELTA_MODE |
POTLESS_2 | 11:b2feed92584a | 298 | float Sf = servo_poumon + remap(delta, 0, 90, 0, 100) / 100.f; |
POTLESS_2 | 13:22a96dc67e85 | 299 | if(Sf >= 0 && Sf <= 90)//Pas bon, à retravailler.... |
POTLESS_2 | 12:7f3aadd79f89 | 300 | servo_fuite = Sf; |
POTLESS_2 | 12:7f3aadd79f89 | 301 | #endif |
POTLESS_2 | 10:aca745a66d51 | 302 | printf(" Servo Poumon = %f\r\n", remap(valeur, 0, 90, 0, 100) / 100.f); |
POTLESS_2 | 12:7f3aadd79f89 | 303 | } else if ((char)commande == 'O') { |
POTLESS_2 | 10:aca745a66d51 | 304 | servo_fuite = 1 - remap(valeur, 0, 90, 0, 100) / 100.f; |
POTLESS_2 | 11:b2feed92584a | 305 | printf(" Servo Fuite = %f\r\n", 1 - remap(valeur, 0, 90, 0, 100) / 100.f); |
POTLESS_2 | 11:b2feed92584a | 306 | } else if ((char)commande == 'D') { |
POTLESS_2 | 11:b2feed92584a | 307 | delta = valeur; |
POTLESS_2 | 12:7f3aadd79f89 | 308 | #ifdef DELTA_MODE |
POTLESS_2 | 11:b2feed92584a | 309 | float Sf = servo_poumon + remap(delta, 0, 90, 0, 100) / 100.f; |
POTLESS_2 | 13:22a96dc67e85 | 310 | if(Sf >= 0 && Sf <= 90)//Pas bon, à retravailler.... |
POTLESS_2 | 12:7f3aadd79f89 | 311 | servo_fuite = Sf; |
POTLESS_2 | 12:7f3aadd79f89 | 312 | #endif |
POTLESS_2 | 12:7f3aadd79f89 | 313 | ///////////////////////////////////////// |
POTLESS_2 | 12:7f3aadd79f89 | 314 | //Pour rajouter une commande |
POTLESS_2 | 12:7f3aadd79f89 | 315 | //} else if ((char)commande == 'X') { |
POTLESS_2 | 12:7f3aadd79f89 | 316 | // attribuer à une VARIABLE = valeur; |
POTLESS_2 | 12:7f3aadd79f89 | 317 | // ou une action, avec ou sans valeur |
POTLESS_2 | 12:7f3aadd79f89 | 318 | ///////////////////////////////////////// |
POTLESS_2 | 9:04bfdfc029cb | 319 | } else if ((char)commande == 'R') { |
POTLESS_2 | 9:04bfdfc029cb | 320 | NVIC_SystemReset(); |
POTLESS_2 | 9:04bfdfc029cb | 321 | } |
POTLESS_2 | 12:7f3aadd79f89 | 322 | #ifdef PID_MODE |
POTLESS_2 | 12:7f3aadd79f89 | 323 | else if ((char)commande == 'p') { |
POTLESS_2 | 12:7f3aadd79f89 | 324 | Kc = (float)valeur; |
POTLESS_2 | 16:917656586772 | 325 | control_Servo.reset(); |
POTLESS_2 | 12:7f3aadd79f89 | 326 | control_Servo.setTunings(Kc, Ti, Td); |
POTLESS_2 | 14:b5e0e882205e | 327 | printf(" UPDATE PID --> Kc = %f Ti = %f Td = %f\r\n\n", Kc, Ti, Td); |
POTLESS_2 | 15:efd3b3bf3f37 | 328 | } else if ((char)commande == 'i') { |
POTLESS_2 | 12:7f3aadd79f89 | 329 | Ti = (float)valeur; |
POTLESS_2 | 16:917656586772 | 330 | control_Servo.reset(); |
POTLESS_2 | 12:7f3aadd79f89 | 331 | control_Servo.setTunings(Kc, Ti, Td); |
POTLESS_2 | 14:b5e0e882205e | 332 | printf(" UPDATE PID --> Kc = %f Ti = %f Td = %f\r\n\n", Kc, Ti, Td); |
POTLESS_2 | 15:efd3b3bf3f37 | 333 | } else if ((char)commande == 'd') { |
POTLESS_2 | 12:7f3aadd79f89 | 334 | Td = (float)valeur; |
POTLESS_2 | 16:917656586772 | 335 | control_Servo.reset(); |
POTLESS_2 | 12:7f3aadd79f89 | 336 | control_Servo.setTunings(Kc, Ti, Td); |
POTLESS_2 | 14:b5e0e882205e | 337 | printf(" UPDATE PID --> Kc = %f Ti = %f Td = %f\r\n\n", Kc, Ti, Td); |
POTLESS_2 | 15:efd3b3bf3f37 | 338 | } else if ((char)commande == 'c') { |
POTLESS_2 | 12:7f3aadd79f89 | 339 | consigne = valeur; |
POTLESS_2 | 15:efd3b3bf3f37 | 340 | control_Servo.setSetPoint(consigne); |
POTLESS_2 | 14:b5e0e882205e | 341 | printf(" UPDATE CONSIGNE PID --> Consigne = %d\r\n\n", consigne); |
POTLESS_2 | 12:7f3aadd79f89 | 342 | } |
POTLESS_2 | 15:efd3b3bf3f37 | 343 | #endif |
POTLESS_2 | 11:b2feed92584a | 344 | //wait_ms(100); |
POTLESS_2 | 9:04bfdfc029cb | 345 | strcpy(Android," "); |
POTLESS_2 | 9:04bfdfc029cb | 346 | indexAndroid = 0; |
POTLESS_2 | 9:04bfdfc029cb | 347 | newAndroidFlag = false; |
POTLESS_2 | 9:04bfdfc029cb | 348 | } |
POTLESS_2 | 9:04bfdfc029cb | 349 | |
POTLESS_2 | 10:aca745a66d51 | 350 | //Calibration des limites de feedback des servos |
POTLESS_2 | 10:aca745a66d51 | 351 | void Calibration_servo() |
POTLESS_2 | 10:aca745a66d51 | 352 | { |
POTLESS_2 | 10:aca745a66d51 | 353 | //Servos, calibration du feedback |
POTLESS_2 | 10:aca745a66d51 | 354 | printf(" Check Servos :\r\n"); |
POTLESS_2 | 10:aca745a66d51 | 355 | printf("\r\n"); |
POTLESS_2 | 10:aca745a66d51 | 356 | servo_poumon.period(0.001); // à mettre dans le setup si cette calib n'est pas appelée (je l ai trouvée commentée) |
POTLESS_2 | 10:aca745a66d51 | 357 | servo_fuite.period(0.001); |
POTLESS_2 | 10:aca745a66d51 | 358 | //Rentrer les servos à fond |
POTLESS_2 | 10:aca745a66d51 | 359 | servo_poumon = 0; |
POTLESS_2 | 10:aca745a66d51 | 360 | servo_fuite = 0; |
POTLESS_2 | 10:aca745a66d51 | 361 | wait(4); |
POTLESS_2 | 10:aca745a66d51 | 362 | |
POTLESS_2 | 10:aca745a66d51 | 363 | Limit_min_Servo_Poumon = FeedBack_Servo_Poumon.read(); |
POTLESS_2 | 10:aca745a66d51 | 364 | wait_ms(100); |
POTLESS_2 | 10:aca745a66d51 | 365 | Limit_min_Servo_Fuite = FeedBack_Servo_Fuite.read(); |
POTLESS_2 | 10:aca745a66d51 | 366 | |
POTLESS_2 | 10:aca745a66d51 | 367 | printf(" FeedBack Servo POUMON min = %f\n", Limit_min_Servo_Poumon); |
POTLESS_2 | 10:aca745a66d51 | 368 | printf(" FeedBack Servo FUITE min = %f\n", Limit_min_Servo_Fuite); |
POTLESS_2 | 10:aca745a66d51 | 369 | printf("\r\n"); |
POTLESS_2 | 10:aca745a66d51 | 370 | |
POTLESS_2 | 10:aca745a66d51 | 371 | //Sortir les servos à fond |
POTLESS_2 | 10:aca745a66d51 | 372 | servo_poumon = 1; |
POTLESS_2 | 10:aca745a66d51 | 373 | servo_fuite = 1; |
POTLESS_2 | 10:aca745a66d51 | 374 | wait(4); |
POTLESS_2 | 10:aca745a66d51 | 375 | |
POTLESS_2 | 10:aca745a66d51 | 376 | Limit_max_Servo_Poumon = FeedBack_Servo_Poumon.read(); |
POTLESS_2 | 10:aca745a66d51 | 377 | wait_ms(100); |
POTLESS_2 | 10:aca745a66d51 | 378 | Limit_max_Servo_Fuite = FeedBack_Servo_Fuite.read(); |
POTLESS_2 | 10:aca745a66d51 | 379 | |
POTLESS_2 | 10:aca745a66d51 | 380 | printf(" FeedBack Servo POUMON Max = %f\n", Limit_max_Servo_Poumon); |
POTLESS_2 | 10:aca745a66d51 | 381 | printf(" FeedBack Servo FUITE Max = %f\n", Limit_max_Servo_Fuite); |
POTLESS_2 | 10:aca745a66d51 | 382 | printf("\r\n"); |
POTLESS_2 | 10:aca745a66d51 | 383 | |
POTLESS_2 | 10:aca745a66d51 | 384 | //Position milieu |
POTLESS_2 | 10:aca745a66d51 | 385 | servo_poumon = 0.5; |
POTLESS_2 | 10:aca745a66d51 | 386 | servo_fuite = 0.5; |
POTLESS_2 | 10:aca745a66d51 | 387 | wait(4); |
POTLESS_2 | 10:aca745a66d51 | 388 | |
POTLESS_2 | 10:aca745a66d51 | 389 | //Mesure du delta consigne / feedback |
POTLESS_2 | 10:aca745a66d51 | 390 | Delta_FB_1 = abs(remap(FeedBack_Servo_Poumon.read(), Limit_max_Servo_Poumon, Limit_min_Servo_Poumon, 0, 90) - 45); |
POTLESS_2 | 10:aca745a66d51 | 391 | Delta_FB_2 = abs(remap(FeedBack_Servo_Fuite.read(), Limit_max_Servo_Fuite, Limit_min_Servo_Fuite, 0, 90) - 45); |
POTLESS_2 | 10:aca745a66d51 | 392 | |
POTLESS_2 | 10:aca745a66d51 | 393 | printf(" Delta Servo 1 = %f\n", Delta_FB_1); |
POTLESS_2 | 10:aca745a66d51 | 394 | printf(" Delta Servo 2 = %f\n", Delta_FB_2); |
POTLESS_2 | 10:aca745a66d51 | 395 | |
POTLESS_2 | 10:aca745a66d51 | 396 | if(Delta_FB_1 > 10 || Delta_FB_2 > 10) printf(" Delta Servos non satisfaisant...\r\n\r\n"); |
POTLESS_2 | 12:7f3aadd79f89 | 397 | |
POTLESS_2 | 11:b2feed92584a | 398 | #ifdef DELTA_MODE |
POTLESS_2 | 11:b2feed92584a | 399 | //Position initial delta |
POTLESS_2 | 11:b2feed92584a | 400 | servo_poumon = 0.5; |
POTLESS_2 | 11:b2feed92584a | 401 | servo_fuite = 0.5 + remap(delta, 0, 90, 0, 100) / 100.f; |
POTLESS_2 | 12:7f3aadd79f89 | 402 | #endif |
POTLESS_2 | 10:aca745a66d51 | 403 | } |
POTLESS_2 | 10:aca745a66d51 | 404 | |
POTLESS_2 | 4:d84250f67dec | 405 | int main() |
POTLESS_2 | 12:7f3aadd79f89 | 406 | { |
POTLESS_2 | 11:b2feed92584a | 407 | //UNIX TIMESTAMP depuis le erminal MAC = date +%s + 7200 pour heure d'été..... |
POTLESS_2 | 12:7f3aadd79f89 | 408 | |
POTLESS_2 | 10:aca745a66d51 | 409 | Calibration_servo(); |
POTLESS_2 | 12:7f3aadd79f89 | 410 | |
POTLESS_2 | 16:917656586772 | 411 | /* |
POTLESS_2 | 16:917656586772 | 412 | Par défaut les valeur en cas de calibration sur true sont les suivant |
POTLESS_2 | 6:ebed9093d661 | 413 | |
POTLESS_2 | 16:917656586772 | 414 | nbCalibO2 = 5 |
POTLESS_2 | 16:917656586772 | 415 | Mode = SPOOLING |
POTLESS_2 | 16:917656586772 | 416 | Filtre = DIGI_FILTER32 |
POTLESS_2 | 16:917656586772 | 417 | CalibrationCO2 = "CALIB_AIR" |
POTLESS_2 | 16:917656586772 | 418 | |
POTLESS_2 | 16:917656586772 | 419 | Parfois la calibration du Cozir coince...faire reset et relancer... |
POTLESS_2 | 16:917656586772 | 420 | |
POTLESS_2 | 16:917656586772 | 421 | Pour calibrer avec ces paramètres : |
POTLESS_2 | 16:917656586772 | 422 | |
POTLESS_2 | 16:917656586772 | 423 | sensors.Sensors_INIT(true, true); |
POTLESS_2 | 16:917656586772 | 424 | |
POTLESS_2 | 16:917656586772 | 425 | Pour changer utiliser la syntaxe suivante : |
POTLESS_2 | 16:917656586772 | 426 | |
POTLESS_2 | 16:917656586772 | 427 | sensors.Sensors_INIT(true, true, 5, SPOOLING, DIGI_FILTER32, CALIB_AIR); |
POTLESS_2 | 16:917656586772 | 428 | |
POTLESS_2 | 16:917656586772 | 429 | */ |
POTLESS_2 | 16:917656586772 | 430 | |
POTLESS_2 | 16:917656586772 | 431 | sensors.Sensors_INIT(false, true); |
POTLESS_2 | 16:917656586772 | 432 | |
POTLESS_2 | 6:ebed9093d661 | 433 | serialMonit.attach(&callbackParam, Serial::RxIrq); |
POTLESS_2 | 6:ebed9093d661 | 434 | |
POTLESS_2 | 9:04bfdfc029cb | 435 | android.attach(&callbackAndroid, Serial::RxIrq); |
POTLESS_2 | 9:04bfdfc029cb | 436 | |
POTLESS_2 | 7:ad15c386e960 | 437 | serialMonit.printf(" Demarrage...\r\n\r\n Entrez les comandes COZIR si besoin :\r\n"); |
POTLESS_2 | 6:ebed9093d661 | 438 | |
POTLESS_2 | 15:efd3b3bf3f37 | 439 | /* |
POTLESS_2 | 15:efd3b3bf3f37 | 440 | |
POTLESS_2 | 15:efd3b3bf3f37 | 441 | Pour mémoire, les réglage de priorité des thread |
POTLESS_2 | 15:efd3b3bf3f37 | 442 | |
POTLESS_2 | 15:efd3b3bf3f37 | 443 | osPriorityIdle = -3, ///< priority: idle (lowest) |
POTLESS_2 | 15:efd3b3bf3f37 | 444 | osPriorityLow = -2, ///< priority: low |
POTLESS_2 | 15:efd3b3bf3f37 | 445 | osPriorityBelowNormal = -1, ///< priority: below normal |
POTLESS_2 | 15:efd3b3bf3f37 | 446 | osPriorityNormal = 0, ///< priority: normal (default) |
POTLESS_2 | 15:efd3b3bf3f37 | 447 | osPriorityAboveNormal = +1, ///< priority: above normal |
POTLESS_2 | 15:efd3b3bf3f37 | 448 | osPriorityHigh = +2, ///< priority: high |
POTLESS_2 | 15:efd3b3bf3f37 | 449 | osPriorityRealtime = +3, ///< priority: realtime (highest) |
POTLESS_2 | 15:efd3b3bf3f37 | 450 | osPriorityError = 0x84 ///< system cannot determine priority or thread has illegal priority |
POTLESS_2 | 15:efd3b3bf3f37 | 451 | */ |
POTLESS_2 | 15:efd3b3bf3f37 | 452 | |
POTLESS_2 | 10:aca745a66d51 | 453 | thread.start(Get_Info_thread); |
POTLESS_2 | 9:04bfdfc029cb | 454 | |
POTLESS_2 | 16:917656586772 | 455 | thread.set_priority(osPriorityNormal); |
POTLESS_2 | 12:7f3aadd79f89 | 456 | |
POTLESS_2 | 12:7f3aadd79f89 | 457 | #ifdef PID_MODE |
POTLESS_2 | 12:7f3aadd79f89 | 458 | //Init PID |
POTLESS_2 | 12:7f3aadd79f89 | 459 | //Entrée PPO2 entre 100 et 1000 mb |
POTLESS_2 | 12:7f3aadd79f89 | 460 | control_Servo.setInputLimits(Min_Input, Max_Input); |
POTLESS_2 | 12:7f3aadd79f89 | 461 | //Sortie servo entre 0 et 100 % |
POTLESS_2 | 12:7f3aadd79f89 | 462 | control_Servo.setOutputLimits(Min_Output, Max_Output); |
POTLESS_2 | 15:efd3b3bf3f37 | 463 | //Mode auto au démarrage |
POTLESS_2 | 12:7f3aadd79f89 | 464 | control_Servo.setMode(AUTO_MODE); |
POTLESS_2 | 12:7f3aadd79f89 | 465 | //Consigne à x mb |
POTLESS_2 | 12:7f3aadd79f89 | 466 | control_Servo.setSetPoint(consigne); |
POTLESS_2 | 12:7f3aadd79f89 | 467 | |
POTLESS_2 | 15:efd3b3bf3f37 | 468 | #endif |
POTLESS_2 | 15:efd3b3bf3f37 | 469 | |
POTLESS_2 | 11:b2feed92584a | 470 | #ifdef VT100 |
POTLESS_2 | 8:a750d531b381 | 471 | printf(CLS); |
POTLESS_2 | 11:b2feed92584a | 472 | #endif |
POTLESS_2 | 9:04bfdfc029cb | 473 | |
POTLESS_2 | 7:ad15c386e960 | 474 | while (true) { |
POTLESS_2 | 6:ebed9093d661 | 475 | |
POTLESS_2 | 7:ad15c386e960 | 476 | //Démarrage du Timer mesurant le temps d'éxecution du code |
POTLESS_2 | 7:ad15c386e960 | 477 | REAL_RATE.start(); |
POTLESS_2 | 7:ad15c386e960 | 478 | |
POTLESS_2 | 6:ebed9093d661 | 479 | if (newParamFlag) { |
POTLESS_2 | 6:ebed9093d661 | 480 | serialMonit.printf("Param = %s\r\n", param); |
POTLESS_2 | 9:04bfdfc029cb | 481 | Decoding_Message(param); |
POTLESS_2 | 9:04bfdfc029cb | 482 | } |
POTLESS_2 | 9:04bfdfc029cb | 483 | |
POTLESS_2 | 9:04bfdfc029cb | 484 | if (newAndroidFlag) { |
POTLESS_2 | 9:04bfdfc029cb | 485 | serialMonit.printf("Android = %s\r\n", Android); |
POTLESS_2 | 9:04bfdfc029cb | 486 | Decoding_Message_Android(Android); |
POTLESS_2 | 6:ebed9093d661 | 487 | } |
POTLESS_2 | 7:ad15c386e960 | 488 | |
POTLESS_2 | 15:efd3b3bf3f37 | 489 | //Fabrication de la chaine Date / heure |
POTLESS_2 | 15:efd3b3bf3f37 | 490 | seconds = time(NULL); |
POTLESS_2 | 15:efd3b3bf3f37 | 491 | char Time_buf[32]; |
POTLESS_2 | 15:efd3b3bf3f37 | 492 | strftime(Time_buf, 32, "%D %I-%M-%S ", localtime(&seconds)); |
POTLESS_2 | 15:efd3b3bf3f37 | 493 | |
POTLESS_2 | 15:efd3b3bf3f37 | 494 | //Fabrication de la chaine à enregistrer |
POTLESS_2 | 16:917656586772 | 495 | sprintf(to_store,"%s:%d:%d:%.2f:%.2f:%.2f:%d:%d:%d:%3.2f:%3.2f:%d:%.3f:%.3f:%.3f", |
POTLESS_2 | 15:efd3b3bf3f37 | 496 | Time_buf, |
POTLESS_2 | 15:efd3b3bf3f37 | 497 | co2, |
POTLESS_2 | 15:efd3b3bf3f37 | 498 | ppO2, |
POTLESS_2 | 15:efd3b3bf3f37 | 499 | pression, |
POTLESS_2 | 15:efd3b3bf3f37 | 500 | Temp1, |
POTLESS_2 | 15:efd3b3bf3f37 | 501 | Temp2, |
POTLESS_2 | 15:efd3b3bf3f37 | 502 | Humid, |
POTLESS_2 | 15:efd3b3bf3f37 | 503 | CellO2_1, |
POTLESS_2 | 15:efd3b3bf3f37 | 504 | CellO2_2, |
POTLESS_2 | 15:efd3b3bf3f37 | 505 | volet_poumon_Position, |
POTLESS_2 | 15:efd3b3bf3f37 | 506 | volet_fuite_Position, |
POTLESS_2 | 15:efd3b3bf3f37 | 507 | MODE_FLAG, |
POTLESS_2 | 15:efd3b3bf3f37 | 508 | Kc, |
POTLESS_2 | 15:efd3b3bf3f37 | 509 | Ti, |
POTLESS_2 | 15:efd3b3bf3f37 | 510 | Td); |
POTLESS_2 | 15:efd3b3bf3f37 | 511 | |
POTLESS_2 | 15:efd3b3bf3f37 | 512 | //Enregistrement de la chaine |
POTLESS_2 | 15:efd3b3bf3f37 | 513 | sensors.Write_SD((string)to_store); |
POTLESS_2 | 15:efd3b3bf3f37 | 514 | |
POTLESS_2 | 15:efd3b3bf3f37 | 515 | //Pour Android on ajoute < et > pour décoder l'arrivée du message |
POTLESS_2 | 9:04bfdfc029cb | 516 | if (NEED_ANDROID_OUTPUT == 1) { |
POTLESS_2 | 15:efd3b3bf3f37 | 517 | sprintf(to_android,"<%s>",to_store); |
POTLESS_2 | 12:7f3aadd79f89 | 518 | ANDROID(to_android); |
POTLESS_2 | 9:04bfdfc029cb | 519 | } |
POTLESS_2 | 15:efd3b3bf3f37 | 520 | |
POTLESS_2 | 13:22a96dc67e85 | 521 | //Vers le moniteur dérie |
POTLESS_2 | 13:22a96dc67e85 | 522 | Affichage_moniteur(); |
POTLESS_2 | 15:efd3b3bf3f37 | 523 | |
POTLESS_2 | 15:efd3b3bf3f37 | 524 | |
POTLESS_2 | 15:efd3b3bf3f37 | 525 | #ifdef PID_MODE |
POTLESS_2 | 15:efd3b3bf3f37 | 526 | //Update du PID |
POTLESS_2 | 15:efd3b3bf3f37 | 527 | control_Servo.setProcessValue(ppO2); |
POTLESS_2 | 15:efd3b3bf3f37 | 528 | //Nouvelle sortie servo |
POTLESS_2 | 15:efd3b3bf3f37 | 529 | Commande_PID = control_Servo.compute(); |
POTLESS_2 | 15:efd3b3bf3f37 | 530 | //Appliquer la consigne |
POTLESS_2 | 15:efd3b3bf3f37 | 531 | servo_fuite = Commande_PID; |
POTLESS_2 | 12:7f3aadd79f89 | 532 | #endif |
POTLESS_2 | 15:efd3b3bf3f37 | 533 | |
POTLESS_2 | 7:ad15c386e960 | 534 | //Arrêt du Timer mesurant le temps d'éxecution du code |
POTLESS_2 | 7:ad15c386e960 | 535 | REAL_RATE.stop(); |
POTLESS_2 | 7:ad15c386e960 | 536 | //Définition de la nouvelle valeur du temps d'échantillonage du PID. |
POTLESS_2 | 7:ad15c386e960 | 537 | RATE = REAL_RATE.read(); |
POTLESS_2 | 7:ad15c386e960 | 538 | //Reset du Timer |
POTLESS_2 | 7:ad15c386e960 | 539 | REAL_RATE.reset(); |
POTLESS_2 | 12:7f3aadd79f89 | 540 | |
POTLESS_2 | 16:917656586772 | 541 | //Pour ralentir le code à Ref_Time seconde fixe quelque soit les intéruptions du loop.... |
POTLESS_2 | 16:917656586772 | 542 | if (Ref_Time > RATE){ |
POTLESS_2 | 12:7f3aadd79f89 | 543 | RATE_TRUE = (Ref_Time - RATE) * 1000; |
POTLESS_2 | 16:917656586772 | 544 | }else{ |
POTLESS_2 | 16:917656586772 | 545 | RATE_TRUE = 0; |
POTLESS_2 | 16:917656586772 | 546 | #ifdef PID_MODE |
POTLESS_2 | 16:917656586772 | 547 | control_Servo.setInterval(RATE); |
POTLESS_2 | 16:917656586772 | 548 | #endif |
POTLESS_2 | 16:917656586772 | 549 | printf("Pour ralentir le code, Ref_Time doit être supérieur à %f seconde(s)\r\n\n", RATE); |
POTLESS_2 | 16:917656586772 | 550 | } |
POTLESS_2 | 16:917656586772 | 551 | |
POTLESS_2 | 11:b2feed92584a | 552 | wait_ms(RATE_TRUE); |
POTLESS_2 | 4:d84250f67dec | 553 | } |
POTLESS_2 | 4:d84250f67dec | 554 | } |