![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
une 30aine passés sans pb entre les trames
Dependencies: ADS1015 ARNSRS_SENSORS DmTftLibrary MS5803_14BA SDFileSystem mbed
Fork of ARNSRS_SERVOS_USB_TFT by
main.cpp@20:bb8d2cea2076, 2017-05-18 (annotated)
- Committer:
- POTLESS_2
- Date:
- Thu May 18 06:03:24 2017 +0000
- Revision:
- 20:bb8d2cea2076
- Parent:
- 19:31ac20c07bb2
- Child:
- 21:28a3f60b4bc2
Version avec BLE, tft comment? pour que ?a marche, toutes les pin d?plac?es pour ?viter les croisements....A utiliser avec shiel carte sd et BLE...Pas en plus avec le TFT.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
POTLESS_2 | 19:31ac20c07bb2 | 1 | /* |
POTLESS_2 | 19:31ac20c07bb2 | 2 | Stm32L476RG |
potless | 2:4a8bf1d53439 | 3 | |
POTLESS_2 | 19:31ac20c07bb2 | 4 | 2 servos |
POTLESS_2 | 19:31ac20c07bb2 | 5 | BLE => Android |
potless | 2:4a8bf1d53439 | 6 | |
POTLESS_2 | 4:d84250f67dec | 7 | */ |
potless | 0:69d4b21d58e0 | 8 | |
potless | 1:bef7856b5c0a | 9 | #include "mbed.h" |
POTLESS_2 | 5:e1d0dc7940a6 | 10 | #include "SDFileSystem.h" |
POTLESS_2 | 5:e1d0dc7940a6 | 11 | #include "ARNSRS_SENSORS.h" |
POTLESS_2 | 13:aa620707126d | 12 | #include "ble/BLE.h" |
POTLESS_2 | 14:e6686a44db84 | 13 | |
POTLESS_2 | 13:aa620707126d | 14 | #include "ble/services/UARTService.h" |
POTLESS_2 | 13:aa620707126d | 15 | #include <string> |
POTLESS_2 | 13:aa620707126d | 16 | |
POTLESS_2 | 20:bb8d2cea2076 | 17 | //#include "DmTftHX8353C.h" |
POTLESS_2 | 20:bb8d2cea2076 | 18 | //#include "DmTftS6D0164.h" |
POTLESS_2 | 20:bb8d2cea2076 | 19 | //#include "DmTftIli9325.h" |
POTLESS_2 | 20:bb8d2cea2076 | 20 | //#include "DmTftIli9341.h" |
POTLESS_2 | 20:bb8d2cea2076 | 21 | //#include "DmTftSsd2119.h" |
POTLESS_2 | 20:bb8d2cea2076 | 22 | //#include "DmTftRa8875.h" |
POTLESS_2 | 20:bb8d2cea2076 | 23 | |
POTLESS_2 | 20:bb8d2cea2076 | 24 | |
POTLESS_2 | 15:c9205e490740 | 25 | //Ecrit dans le moniteur série de l'ordi à 9600 bds si sur 1 |
POTLESS_2 | 15:c9205e490740 | 26 | #define NEED_CONSOLE_OUTPUT 1 |
POTLESS_2 | 16:fc7d8cc6bf4b | 27 | //Pour utiliser le traceur du moniteur Arduino. Mettre NEED_CONSOLE_OUTPUT 0 si utilisé. |
POTLESS_2 | 16:fc7d8cc6bf4b | 28 | //En premier ouvrir le moniteur série pour régler la RTC, puis fermer et ouvrir le traceur série |
POTLESS_2 | 15:c9205e490740 | 29 | #define NEED_GRAPH_OUTPUT 0 |
POTLESS_2 | 15:c9205e490740 | 30 | //Datalog carte SD si sur 1 |
POTLESS_2 | 16:fc7d8cc6bf4b | 31 | #define NEED_SD_DATA_LOG 0 |
POTLESS_2 | 15:c9205e490740 | 32 | |
POTLESS_2 | 15:c9205e490740 | 33 | #if NEED_CONSOLE_OUTPUT |
POTLESS_2 | 20:bb8d2cea2076 | 34 | #define DEBUG(...) { serialMonit.printf(__VA_ARGS__); } //tft.drawString(0,0,__VA_ARGS__); |
POTLESS_2 | 15:c9205e490740 | 35 | #else |
POTLESS_2 | 15:c9205e490740 | 36 | #define DEBUG(...) |
POTLESS_2 | 15:c9205e490740 | 37 | #endif |
POTLESS_2 | 15:c9205e490740 | 38 | |
POTLESS_2 | 15:c9205e490740 | 39 | #if NEED_GRAPH_OUTPUT |
POTLESS_2 | 15:c9205e490740 | 40 | #define TRACE(...) { serialMonit.printf(__VA_ARGS__); } |
POTLESS_2 | 15:c9205e490740 | 41 | #else |
POTLESS_2 | 15:c9205e490740 | 42 | #define TRACE(...) |
POTLESS_2 | 15:c9205e490740 | 43 | #endif |
POTLESS_2 | 13:aa620707126d | 44 | |
POTLESS_2 | 19:31ac20c07bb2 | 45 | |
POTLESS_2 | 19:31ac20c07bb2 | 46 | //////////////////////////////////////////////////////////////////////////////// |
POTLESS_2 | 19:31ac20c07bb2 | 47 | //////////////////////////////////////////////////////////////////////////////// |
POTLESS_2 | 19:31ac20c07bb2 | 48 | |
POTLESS_2 | 18:e3827d5dbdd9 | 49 | //Contrôle des servos |
POTLESS_2 | 20:bb8d2cea2076 | 50 | PwmOut servo1(PB_15); |
POTLESS_2 | 20:bb8d2cea2076 | 51 | AnalogIn FeedBack1(PC_2); |
POTLESS_2 | 19:31ac20c07bb2 | 52 | float Servo1_POS; |
POTLESS_2 | 19:31ac20c07bb2 | 53 | float Limit_min_S1, Limit_max_S1; |
POTLESS_2 | 19:31ac20c07bb2 | 54 | float Delta_FB_1; |
POTLESS_2 | 19:31ac20c07bb2 | 55 | |
POTLESS_2 | 20:bb8d2cea2076 | 56 | PwmOut servo2(PB_1); |
POTLESS_2 | 20:bb8d2cea2076 | 57 | AnalogIn FeedBack2(PC_3); |
POTLESS_2 | 19:31ac20c07bb2 | 58 | float Servo2_POS; |
POTLESS_2 | 19:31ac20c07bb2 | 59 | float Limit_min_S2, Limit_max_S2; |
POTLESS_2 | 19:31ac20c07bb2 | 60 | float Delta_FB_2; |
POTLESS_2 | 18:e3827d5dbdd9 | 61 | |
POTLESS_2 | 13:aa620707126d | 62 | //Init BLE |
POTLESS_2 | 13:aa620707126d | 63 | BLEDevice ble; |
POTLESS_2 | 13:aa620707126d | 64 | UARTService *uartServicePtr; |
POTLESS_2 | 5:e1d0dc7940a6 | 65 | |
POTLESS_2 | 5:e1d0dc7940a6 | 66 | //Init de la lib ARNSRS; |
POTLESS_2 | 5:e1d0dc7940a6 | 67 | ARNSRS arnsrs; |
POTLESS_2 | 5:e1d0dc7940a6 | 68 | |
POTLESS_2 | 9:d945fa4be3a5 | 69 | //COM Série vers l'ordi, Serial 2 par défaut |
POTLESS_2 | 14:e6686a44db84 | 70 | Serial serialMonit (USBTX,USBRX); |
potless | 2:4a8bf1d53439 | 71 | |
POTLESS_2 | 5:e1d0dc7940a6 | 72 | //Variable des capteurs |
POTLESS_2 | 12:9ac5be447764 | 73 | int co2 = 0; |
POTLESS_2 | 12:9ac5be447764 | 74 | int ppO2 = 0; |
POTLESS_2 | 12:9ac5be447764 | 75 | float pression = 0; |
POTLESS_2 | 12:9ac5be447764 | 76 | float Temp1 = 0; |
POTLESS_2 | 12:9ac5be447764 | 77 | float Temp2 = 0; |
POTLESS_2 | 12:9ac5be447764 | 78 | float Humi = 0; |
POTLESS_2 | 12:9ac5be447764 | 79 | |
POTLESS_2 | 20:bb8d2cea2076 | 80 | //RTC |
POTLESS_2 | 15:c9205e490740 | 81 | //Pour stocker le format date / heure |
POTLESS_2 | 5:e1d0dc7940a6 | 82 | string DateHeure; |
POTLESS_2 | 20:bb8d2cea2076 | 83 | time_t seconds; |
potless | 2:4a8bf1d53439 | 84 | |
POTLESS_2 | 6:1c2212891714 | 85 | //SD card |
POTLESS_2 | 6:1c2212891714 | 86 | SDFileSystem sd(D11, D12, D13, D10, "sd"); // MOSI, MISO, SCK, CS |
POTLESS_2 | 20:bb8d2cea2076 | 87 | //DigitalInOut csSDCard(D10, PIN_OUTPUT, PullUp, 1); |
POTLESS_2 | 20:bb8d2cea2076 | 88 | |
POTLESS_2 | 20:bb8d2cea2076 | 89 | //TFT |
POTLESS_2 | 20:bb8d2cea2076 | 90 | //DmTftHX8353C tft(D2, D3, D4, D5, D6); /* DmTftHX8353C(PinName mosi, PinName clk, PinName cs, PinName dc, PinName rst) DM_TFT18_101 */ |
POTLESS_2 | 20:bb8d2cea2076 | 91 | |
POTLESS_2 | 6:1c2212891714 | 92 | FILE *fp; |
POTLESS_2 | 7:c5a5d8f678ff | 93 | char fileName[32]; |
POTLESS_2 | 7:c5a5d8f678ff | 94 | int points = 1; |
POTLESS_2 | 4:d84250f67dec | 95 | |
POTLESS_2 | 19:31ac20c07bb2 | 96 | //////////////////////////////////////////////////////////////////////////////// |
POTLESS_2 | 19:31ac20c07bb2 | 97 | //////////////////////////////////////////////////////////////////////////////// |
POTLESS_2 | 15:c9205e490740 | 98 | |
POTLESS_2 | 19:31ac20c07bb2 | 99 | |
POTLESS_2 | 19:31ac20c07bb2 | 100 | |
POTLESS_2 | 19:31ac20c07bb2 | 101 | //////////////////////////////////////////////////////////////////////////////// |
POTLESS_2 | 19:31ac20c07bb2 | 102 | ///// Remap d'une valeur ///// |
POTLESS_2 | 19:31ac20c07bb2 | 103 | //////////////////////////////////////////////////////////////////////////////// |
POTLESS_2 | 19:31ac20c07bb2 | 104 | |
POTLESS_2 | 19:31ac20c07bb2 | 105 | float remap(float x, float in_min, float in_max, float out_min, float out_max) |
POTLESS_2 | 19:31ac20c07bb2 | 106 | { |
POTLESS_2 | 19:31ac20c07bb2 | 107 | return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; |
POTLESS_2 | 19:31ac20c07bb2 | 108 | } |
POTLESS_2 | 19:31ac20c07bb2 | 109 | |
POTLESS_2 | 19:31ac20c07bb2 | 110 | //////////////////////////////////////////////////////////////////////////////// |
POTLESS_2 | 19:31ac20c07bb2 | 111 | //// Fonction pour créer et envoyer la chaine d'infos en BLE //// |
POTLESS_2 | 19:31ac20c07bb2 | 112 | //////////////////////////////////////////////////////////////////////////////// |
POTLESS_2 | 19:31ac20c07bb2 | 113 | |
POTLESS_2 | 19:31ac20c07bb2 | 114 | //On balance deux float |
POTLESS_2 | 17:6e0c4c0e0fe2 | 115 | void build_send_Message_float(string com, float A, float B) |
POTLESS_2 | 14:e6686a44db84 | 116 | { |
POTLESS_2 | 14:e6686a44db84 | 117 | char buf[50]; |
POTLESS_2 | 17:6e0c4c0e0fe2 | 118 | sprintf(buf,"%s%.1f:%.1f\r\n", com.c_str(), A, B); |
POTLESS_2 | 14:e6686a44db84 | 119 | uartServicePtr->writeString(buf); |
POTLESS_2 | 17:6e0c4c0e0fe2 | 120 | wait_ms(100); |
POTLESS_2 | 17:6e0c4c0e0fe2 | 121 | } |
POTLESS_2 | 17:6e0c4c0e0fe2 | 122 | |
POTLESS_2 | 19:31ac20c07bb2 | 123 | //On balance deux int |
POTLESS_2 | 17:6e0c4c0e0fe2 | 124 | void build_send_Message_int(string com, int A, int B) |
POTLESS_2 | 17:6e0c4c0e0fe2 | 125 | { |
POTLESS_2 | 17:6e0c4c0e0fe2 | 126 | char buf[50]; |
POTLESS_2 | 17:6e0c4c0e0fe2 | 127 | sprintf(buf,"%s%d:%d\r\n", com.c_str(), A, B); |
POTLESS_2 | 17:6e0c4c0e0fe2 | 128 | uartServicePtr->writeString(buf); |
POTLESS_2 | 17:6e0c4c0e0fe2 | 129 | wait_ms(100); |
POTLESS_2 | 14:e6686a44db84 | 130 | } |
POTLESS_2 | 13:aa620707126d | 131 | |
POTLESS_2 | 19:31ac20c07bb2 | 132 | //////////////////////////////////////////////////////////////////////////////// |
POTLESS_2 | 19:31ac20c07bb2 | 133 | //// BLE //// |
POTLESS_2 | 19:31ac20c07bb2 | 134 | //////////////////////////////////////////////////////////////////////////////// |
POTLESS_2 | 19:31ac20c07bb2 | 135 | |
POTLESS_2 | 13:aa620707126d | 136 | void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params) |
POTLESS_2 | 13:aa620707126d | 137 | { |
POTLESS_2 | 14:e6686a44db84 | 138 | //DEBUG("Disconnected!\n\r"); |
POTLESS_2 | 14:e6686a44db84 | 139 | //DEBUG("Restarting the advertising process\n\r"); |
POTLESS_2 | 13:aa620707126d | 140 | ble.startAdvertising(); |
POTLESS_2 | 13:aa620707126d | 141 | } |
POTLESS_2 | 13:aa620707126d | 142 | |
POTLESS_2 | 19:31ac20c07bb2 | 143 | //////////////////////////////////////////////////////////////////////////////// |
POTLESS_2 | 19:31ac20c07bb2 | 144 | //// Fonction commande servos par BLE //// |
POTLESS_2 | 19:31ac20c07bb2 | 145 | //////////////////////////////////////////////////////////////////////////////// |
POTLESS_2 | 19:31ac20c07bb2 | 146 | |
POTLESS_2 | 19:31ac20c07bb2 | 147 | void Servo_BLE(char message_Android []) |
POTLESS_2 | 19:31ac20c07bb2 | 148 | { |
POTLESS_2 | 19:31ac20c07bb2 | 149 | |
POTLESS_2 | 19:31ac20c07bb2 | 150 | //Variables pour décomposition du message |
POTLESS_2 | 19:31ac20c07bb2 | 151 | char *commande, *valeur; |
POTLESS_2 | 19:31ac20c07bb2 | 152 | |
POTLESS_2 | 19:31ac20c07bb2 | 153 | //La commande |
POTLESS_2 | 19:31ac20c07bb2 | 154 | commande = strtok(message_Android, ",;"); |
POTLESS_2 | 19:31ac20c07bb2 | 155 | DEBUG("Commande = %s\n", commande); |
POTLESS_2 | 19:31ac20c07bb2 | 156 | |
POTLESS_2 | 19:31ac20c07bb2 | 157 | //La valeur associée |
POTLESS_2 | 19:31ac20c07bb2 | 158 | valeur = strtok(NULL, ",;"); |
POTLESS_2 | 19:31ac20c07bb2 | 159 | DEBUG("Valeur = %s\n", valeur); |
POTLESS_2 | 19:31ac20c07bb2 | 160 | |
POTLESS_2 | 19:31ac20c07bb2 | 161 | //On compare la commande pour faire les actions |
POTLESS_2 | 19:31ac20c07bb2 | 162 | |
POTLESS_2 | 19:31ac20c07bb2 | 163 | //Commande servo1 |
POTLESS_2 | 19:31ac20c07bb2 | 164 | if(strcmp(commande, "[S1]") == 0) { |
POTLESS_2 | 19:31ac20c07bb2 | 165 | servo1 = atoi(valeur) / 100.f; |
POTLESS_2 | 19:31ac20c07bb2 | 166 | DEBUG(" Servo 1 = %s\n", valeur); |
POTLESS_2 | 19:31ac20c07bb2 | 167 | } |
POTLESS_2 | 19:31ac20c07bb2 | 168 | |
POTLESS_2 | 19:31ac20c07bb2 | 169 | //Commande servo2 |
POTLESS_2 | 19:31ac20c07bb2 | 170 | if(strcmp(commande, "[S2]") == 0) { |
POTLESS_2 | 19:31ac20c07bb2 | 171 | servo2 = atoi(valeur) / 100.f; |
POTLESS_2 | 19:31ac20c07bb2 | 172 | DEBUG("Servo 2 = %f\r\n", valeur); |
POTLESS_2 | 19:31ac20c07bb2 | 173 | } |
POTLESS_2 | 19:31ac20c07bb2 | 174 | } |
POTLESS_2 | 19:31ac20c07bb2 | 175 | |
POTLESS_2 | 19:31ac20c07bb2 | 176 | //////////////////////////////////////////////////////////////////////////////// |
POTLESS_2 | 19:31ac20c07bb2 | 177 | //// Echanges UART //// |
POTLESS_2 | 19:31ac20c07bb2 | 178 | //////////////////////////////////////////////////////////////////////////////// |
POTLESS_2 | 19:31ac20c07bb2 | 179 | |
POTLESS_2 | 13:aa620707126d | 180 | void onDataWritten(const GattWriteCallbackParams *params) |
POTLESS_2 | 13:aa620707126d | 181 | { |
POTLESS_2 | 13:aa620707126d | 182 | if ((uartServicePtr != NULL) && (params->handle == uartServicePtr->getTXCharacteristicHandle())) { |
POTLESS_2 | 13:aa620707126d | 183 | uint16_t bytesRead = params->len; |
POTLESS_2 | 14:e6686a44db84 | 184 | |
POTLESS_2 | 14:e6686a44db84 | 185 | // chaine reçue de l'app android (à dimensionner selon besoin) |
POTLESS_2 | 18:e3827d5dbdd9 | 186 | char message [bytesRead] ; |
POTLESS_2 | 14:e6686a44db84 | 187 | |
POTLESS_2 | 13:aa620707126d | 188 | // conversion de la commande uint8_t en chaine pour permettre comparaison avec commandes connues |
POTLESS_2 | 14:e6686a44db84 | 189 | for (int j=0; j<bytesRead; j++) { |
POTLESS_2 | 18:e3827d5dbdd9 | 190 | message [j] = (*((params->data)+j)); |
POTLESS_2 | 13:aa620707126d | 191 | } |
POTLESS_2 | 19:31ac20c07bb2 | 192 | |
POTLESS_2 | 19:31ac20c07bb2 | 193 | Servo_BLE(message); |
POTLESS_2 | 19:31ac20c07bb2 | 194 | } |
POTLESS_2 | 19:31ac20c07bb2 | 195 | } |
POTLESS_2 | 14:e6686a44db84 | 196 | |
POTLESS_2 | 19:31ac20c07bb2 | 197 | //////////////////////////////////////////////////////////////////////////////// |
POTLESS_2 | 19:31ac20c07bb2 | 198 | //// Fonction qui change le nom du fichier ouvert pour le LOG //// |
POTLESS_2 | 19:31ac20c07bb2 | 199 | //////////////////////////////////////////////////////////////////////////////// |
POTLESS_2 | 17:6e0c4c0e0fe2 | 200 | |
POTLESS_2 | 7:c5a5d8f678ff | 201 | FILE *nextLogFile(void) |
POTLESS_2 | 7:c5a5d8f678ff | 202 | { |
POTLESS_2 | 7:c5a5d8f678ff | 203 | static unsigned int fileNumber = 0; |
POTLESS_2 | 7:c5a5d8f678ff | 204 | FILE *filePtr = NULL; |
POTLESS_2 | 7:c5a5d8f678ff | 205 | do { |
POTLESS_2 | 7:c5a5d8f678ff | 206 | if (filePtr != NULL) |
POTLESS_2 | 7:c5a5d8f678ff | 207 | fclose(filePtr); |
POTLESS_2 | 7:c5a5d8f678ff | 208 | sprintf(fileName,"/sd/LOG_Capteurs_%04u.txt",fileNumber++); |
POTLESS_2 | 7:c5a5d8f678ff | 209 | filePtr = fopen(fileName,"r"); |
POTLESS_2 | 7:c5a5d8f678ff | 210 | } while (filePtr != NULL); |
POTLESS_2 | 7:c5a5d8f678ff | 211 | return fopen( fileName,"w"); |
POTLESS_2 | 7:c5a5d8f678ff | 212 | } |
POTLESS_2 | 15:c9205e490740 | 213 | |
POTLESS_2 | 19:31ac20c07bb2 | 214 | //////////////////////////////////////////////////////////////////////////////// |
POTLESS_2 | 19:31ac20c07bb2 | 215 | //// Réglage de l'heure par le moniteur série //// |
POTLESS_2 | 19:31ac20c07bb2 | 216 | //////////////////////////////////////////////////////////////////////////////// |
POTLESS_2 | 19:31ac20c07bb2 | 217 | |
POTLESS_2 | 14:e6686a44db84 | 218 | void SetTime() |
POTLESS_2 | 14:e6686a44db84 | 219 | { |
POTLESS_2 | 14:e6686a44db84 | 220 | //Reglage date / heure depuis le terminal |
POTLESS_2 | 7:c5a5d8f678ff | 221 | struct tm t; |
POTLESS_2 | 20:bb8d2cea2076 | 222 | serialMonit.printf("Entrer la date et l'heure :\n"); |
POTLESS_2 | 20:bb8d2cea2076 | 223 | serialMonit.printf("YYYY MM DD HH MM SS [enter]\n"); |
POTLESS_2 | 20:bb8d2cea2076 | 224 | serialMonit.scanf("%d %d %d %d %d %d", &t.tm_year, &t.tm_mon, &t.tm_mday |
POTLESS_2 | 20:bb8d2cea2076 | 225 | , &t.tm_hour, &t.tm_min, &t.tm_sec); |
POTLESS_2 | 7:c5a5d8f678ff | 226 | t.tm_year = t.tm_year - 1900; |
POTLESS_2 | 7:c5a5d8f678ff | 227 | t.tm_mon = t.tm_mon - 1; |
POTLESS_2 | 14:e6686a44db84 | 228 | |
POTLESS_2 | 7:c5a5d8f678ff | 229 | // set the time |
POTLESS_2 | 14:e6686a44db84 | 230 | set_time(mktime(&t)); |
POTLESS_2 | 20:bb8d2cea2076 | 231 | |
POTLESS_2 | 20:bb8d2cea2076 | 232 | if(NEED_CONSOLE_OUTPUT == 0) serialMonit.printf("OK. Vous pouvez fermer le moniteur serie"); |
POTLESS_2 | 12:9ac5be447764 | 233 | } |
POTLESS_2 | 12:9ac5be447764 | 234 | |
POTLESS_2 | 19:31ac20c07bb2 | 235 | //////////////////////////////////////////////////////////////////////////////// |
POTLESS_2 | 19:31ac20c07bb2 | 236 | //// Initialisation DATA LOG //// |
POTLESS_2 | 19:31ac20c07bb2 | 237 | //////////////////////////////////////////////////////////////////////////////// |
POTLESS_2 | 19:31ac20c07bb2 | 238 | |
POTLESS_2 | 14:e6686a44db84 | 239 | void init_DATALOG() |
POTLESS_2 | 14:e6686a44db84 | 240 | { |
POTLESS_2 | 14:e6686a44db84 | 241 | DEBUG("Initialisation SD card\r\n"); |
POTLESS_2 | 15:c9205e490740 | 242 | DEBUG("\r\n", ""); |
POTLESS_2 | 12:9ac5be447764 | 243 | fp = nextLogFile(); |
POTLESS_2 | 14:e6686a44db84 | 244 | |
POTLESS_2 | 14:e6686a44db84 | 245 | if (!fp) { |
POTLESS_2 | 14:e6686a44db84 | 246 | DEBUG("Probleme SD card...Fin du programme...\r\n"); |
POTLESS_2 | 14:e6686a44db84 | 247 | //exit(0); |
POTLESS_2 | 14:e6686a44db84 | 248 | } else { |
POTLESS_2 | 14:e6686a44db84 | 249 | DEBUG("Nouveau fichier LOG cree = %s\r\n", fileName); |
POTLESS_2 | 14:e6686a44db84 | 250 | DEBUG("\r\n", ""); |
POTLESS_2 | 12:9ac5be447764 | 251 | } |
POTLESS_2 | 14:e6686a44db84 | 252 | } |
POTLESS_2 | 14:e6686a44db84 | 253 | |
POTLESS_2 | 19:31ac20c07bb2 | 254 | //////////////////////////////////////////////////////////////////////////////// |
POTLESS_2 | 19:31ac20c07bb2 | 255 | //// Fonction d'enregistrement des données sur carte SD //// |
POTLESS_2 | 19:31ac20c07bb2 | 256 | //////////////////////////////////////////////////////////////////////////////// |
POTLESS_2 | 19:31ac20c07bb2 | 257 | |
POTLESS_2 | 19:31ac20c07bb2 | 258 | void DATA_LOG() |
POTLESS_2 | 19:31ac20c07bb2 | 259 | { |
POTLESS_2 | 20:bb8d2cea2076 | 260 | seconds = time(NULL); |
POTLESS_2 | 20:bb8d2cea2076 | 261 | |
POTLESS_2 | 19:31ac20c07bb2 | 262 | if (fp) { |
POTLESS_2 | 19:31ac20c07bb2 | 263 | fprintf(fp, "%s,%d,%d,%f,%f,%f,%f\r\n", ctime(&seconds), co2 , ppO2, pression, Temp1, Temp2, Humi); |
POTLESS_2 | 19:31ac20c07bb2 | 264 | DEBUG(" Enregistrement d'un point sur la carte SD\r\n"); |
POTLESS_2 | 19:31ac20c07bb2 | 265 | DEBUG(" Nombre de points = %d\r\n", points); |
POTLESS_2 | 19:31ac20c07bb2 | 266 | DEBUG("\r\n", ""); |
POTLESS_2 | 19:31ac20c07bb2 | 267 | points++; |
POTLESS_2 | 19:31ac20c07bb2 | 268 | } else { |
POTLESS_2 | 19:31ac20c07bb2 | 269 | DEBUG(" Probleme carte SD\r\n"); |
POTLESS_2 | 19:31ac20c07bb2 | 270 | } |
POTLESS_2 | 19:31ac20c07bb2 | 271 | } |
POTLESS_2 | 19:31ac20c07bb2 | 272 | |
POTLESS_2 | 19:31ac20c07bb2 | 273 | //////////////////////////////////////////////////////////////////////////////// |
POTLESS_2 | 19:31ac20c07bb2 | 274 | //// Calibration des limites de feedback des servos //// |
POTLESS_2 | 19:31ac20c07bb2 | 275 | //////////////////////////////////////////////////////////////////////////////// |
POTLESS_2 | 19:31ac20c07bb2 | 276 | |
POTLESS_2 | 19:31ac20c07bb2 | 277 | void Calibration_servo() |
POTLESS_2 | 19:31ac20c07bb2 | 278 | { |
POTLESS_2 | 19:31ac20c07bb2 | 279 | //Servos, calibration du feedback |
POTLESS_2 | 20:bb8d2cea2076 | 280 | DEBUG(" Check Servos :\r\n") |
POTLESS_2 | 20:bb8d2cea2076 | 281 | DEBUG("\r\n"); |
POTLESS_2 | 19:31ac20c07bb2 | 282 | servo1.period(0.001); |
POTLESS_2 | 19:31ac20c07bb2 | 283 | servo2.period(0.001); |
POTLESS_2 | 20:bb8d2cea2076 | 284 | //Rentrer les servos à fond |
POTLESS_2 | 19:31ac20c07bb2 | 285 | servo1 = 0; |
POTLESS_2 | 19:31ac20c07bb2 | 286 | servo2 = 0; |
POTLESS_2 | 19:31ac20c07bb2 | 287 | wait(4); |
POTLESS_2 | 20:bb8d2cea2076 | 288 | Limit_max_S1 = FeedBack1.read(); |
POTLESS_2 | 20:bb8d2cea2076 | 289 | wait_ms(100); |
POTLESS_2 | 20:bb8d2cea2076 | 290 | Limit_max_S2 = FeedBack2.read(); |
POTLESS_2 | 20:bb8d2cea2076 | 291 | |
POTLESS_2 | 20:bb8d2cea2076 | 292 | DEBUG(" FeedBack 1 MIN = %f\n", Limit_max_S1); |
POTLESS_2 | 20:bb8d2cea2076 | 293 | DEBUG(" FeedBack 2 MIN = %f\n", Limit_max_S2); |
POTLESS_2 | 20:bb8d2cea2076 | 294 | DEBUG("\r\n"); |
POTLESS_2 | 20:bb8d2cea2076 | 295 | |
POTLESS_2 | 20:bb8d2cea2076 | 296 | //Sortir les servos à fond |
POTLESS_2 | 19:31ac20c07bb2 | 297 | servo1 = 1; |
POTLESS_2 | 19:31ac20c07bb2 | 298 | servo2 = 1; |
POTLESS_2 | 19:31ac20c07bb2 | 299 | wait(4); |
POTLESS_2 | 20:bb8d2cea2076 | 300 | Limit_min_S1 = FeedBack1.read(); |
POTLESS_2 | 20:bb8d2cea2076 | 301 | wait_ms(100); |
POTLESS_2 | 20:bb8d2cea2076 | 302 | Limit_min_S2 = FeedBack2.read(); |
POTLESS_2 | 20:bb8d2cea2076 | 303 | |
POTLESS_2 | 20:bb8d2cea2076 | 304 | DEBUG(" FeedBack 1 MAX = %f\n", Limit_min_S1); |
POTLESS_2 | 20:bb8d2cea2076 | 305 | DEBUG(" FeedBack 2 MAX = %f\n", Limit_min_S2); |
POTLESS_2 | 20:bb8d2cea2076 | 306 | DEBUG("\r\n"); |
POTLESS_2 | 20:bb8d2cea2076 | 307 | |
POTLESS_2 | 20:bb8d2cea2076 | 308 | //Position milieu |
POTLESS_2 | 19:31ac20c07bb2 | 309 | servo1 = 0.5; |
POTLESS_2 | 19:31ac20c07bb2 | 310 | servo2 = 0.5; |
POTLESS_2 | 20:bb8d2cea2076 | 311 | wait(2); |
POTLESS_2 | 20:bb8d2cea2076 | 312 | |
POTLESS_2 | 19:31ac20c07bb2 | 313 | //Mesure du delta consigne / feedback |
POTLESS_2 | 19:31ac20c07bb2 | 314 | Delta_FB_1 = abs(remap(FeedBack1, Limit_max_S1, Limit_min_S1, 0, 100) - 50); |
POTLESS_2 | 20:bb8d2cea2076 | 315 | Delta_FB_2 = abs(remap(FeedBack2, Limit_max_S2, Limit_min_S2, 0, 100) - 50); |
POTLESS_2 | 20:bb8d2cea2076 | 316 | |
POTLESS_2 | 19:31ac20c07bb2 | 317 | DEBUG(" Delta Servo 1 = %f\n", Delta_FB_1); |
POTLESS_2 | 19:31ac20c07bb2 | 318 | DEBUG(" Delta Servo 2 = %f\n", Delta_FB_2); |
POTLESS_2 | 19:31ac20c07bb2 | 319 | |
POTLESS_2 | 20:bb8d2cea2076 | 320 | if(Delta_FB_1 > 10 || Delta_FB_1 > 10) DEBUG(" Delta Servos non satisfaisant..."); |
POTLESS_2 | 19:31ac20c07bb2 | 321 | } |
POTLESS_2 | 19:31ac20c07bb2 | 322 | |
POTLESS_2 | 19:31ac20c07bb2 | 323 | //////////////////////////////////////////////////////////////////////////////// |
POTLESS_2 | 19:31ac20c07bb2 | 324 | //// Fonction d'affichage de tout dans le moniteur série ou le traceur //// |
POTLESS_2 | 19:31ac20c07bb2 | 325 | //////////////////////////////////////////////////////////////////////////////// |
POTLESS_2 | 19:31ac20c07bb2 | 326 | |
POTLESS_2 | 19:31ac20c07bb2 | 327 | void Debug_Complet() |
POTLESS_2 | 19:31ac20c07bb2 | 328 | { |
POTLESS_2 | 20:bb8d2cea2076 | 329 | //RTC |
POTLESS_2 | 20:bb8d2cea2076 | 330 | seconds = time(NULL); |
POTLESS_2 | 19:31ac20c07bb2 | 331 | |
POTLESS_2 | 19:31ac20c07bb2 | 332 | DEBUG(" Date / Heure = %s\r\n", ctime(&seconds)); |
POTLESS_2 | 19:31ac20c07bb2 | 333 | |
POTLESS_2 | 19:31ac20c07bb2 | 334 | //Retour capteurs |
POTLESS_2 | 19:31ac20c07bb2 | 335 | DEBUG(" CO2 = %d\r\n" , co2); |
POTLESS_2 | 19:31ac20c07bb2 | 336 | DEBUG(" Humidite = %f\r\n" , Humi); |
POTLESS_2 | 19:31ac20c07bb2 | 337 | DEBUG(" Temperature = %f\r\n" ,Temp1); |
POTLESS_2 | 19:31ac20c07bb2 | 338 | //P / T sur MS5803 |
POTLESS_2 | 19:31ac20c07bb2 | 339 | DEBUG(" Pression = %f\r\n", pression); |
POTLESS_2 | 19:31ac20c07bb2 | 340 | DEBUG(" Temperature = %f\r\n", Temp2); |
POTLESS_2 | 19:31ac20c07bb2 | 341 | //PPO2 sur ADS1015 |
POTLESS_2 | 19:31ac20c07bb2 | 342 | DEBUG(" PPO2 = %d\r\n", ppO2); |
POTLESS_2 | 19:31ac20c07bb2 | 343 | DEBUG("\r\n", ""); |
POTLESS_2 | 19:31ac20c07bb2 | 344 | |
POTLESS_2 | 19:31ac20c07bb2 | 345 | //Retour position des servos |
POTLESS_2 | 19:31ac20c07bb2 | 346 | DEBUG(" FeedBack 1 = %3.2f%%\n", Servo1_POS); |
POTLESS_2 | 19:31ac20c07bb2 | 347 | DEBUG(" FeedBack 2 = %3.2f%%\n", Servo2_POS); |
POTLESS_2 | 20:bb8d2cea2076 | 348 | DEBUG("\r\n", ""); |
POTLESS_2 | 19:31ac20c07bb2 | 349 | |
POTLESS_2 | 19:31ac20c07bb2 | 350 | //Traceur |
POTLESS_2 | 19:31ac20c07bb2 | 351 | TRACE("%d" , co2); |
POTLESS_2 | 19:31ac20c07bb2 | 352 | TRACE(", "); |
POTLESS_2 | 19:31ac20c07bb2 | 353 | TRACE("%d" , ppO2); |
POTLESS_2 | 19:31ac20c07bb2 | 354 | TRACE(", "); |
POTLESS_2 | 19:31ac20c07bb2 | 355 | TRACE("%f" , Humi); |
POTLESS_2 | 19:31ac20c07bb2 | 356 | TRACE(", "); |
POTLESS_2 | 19:31ac20c07bb2 | 357 | TRACE("%f" , Temp1); |
POTLESS_2 | 19:31ac20c07bb2 | 358 | TRACE(", "); |
POTLESS_2 | 19:31ac20c07bb2 | 359 | TRACE("%f" , Temp2); |
POTLESS_2 | 19:31ac20c07bb2 | 360 | TRACE(", "); |
POTLESS_2 | 19:31ac20c07bb2 | 361 | TRACE("%f" , pression); |
POTLESS_2 | 19:31ac20c07bb2 | 362 | TRACE("\r\n"); |
POTLESS_2 | 19:31ac20c07bb2 | 363 | } |
POTLESS_2 | 19:31ac20c07bb2 | 364 | |
POTLESS_2 | 19:31ac20c07bb2 | 365 | //////////////////////////////////////////////////////////////////////////////// |
POTLESS_2 | 19:31ac20c07bb2 | 366 | /// fonction initialisation // |
POTLESS_2 | 19:31ac20c07bb2 | 367 | //////////////////////////////////////////////////////////////////////////////// |
POTLESS_2 | 19:31ac20c07bb2 | 368 | |
POTLESS_2 | 19:31ac20c07bb2 | 369 | void setup() |
POTLESS_2 | 19:31ac20c07bb2 | 370 | { |
POTLESS_2 | 20:bb8d2cea2076 | 371 | |
POTLESS_2 | 19:31ac20c07bb2 | 372 | wait(2); |
POTLESS_2 | 19:31ac20c07bb2 | 373 | |
POTLESS_2 | 20:bb8d2cea2076 | 374 | DEBUG("Initialisation TFT\r\n"); |
POTLESS_2 | 20:bb8d2cea2076 | 375 | //tft.init(); |
POTLESS_2 | 20:bb8d2cea2076 | 376 | |
POTLESS_2 | 19:31ac20c07bb2 | 377 | //Réglage de l'heure |
POTLESS_2 | 20:bb8d2cea2076 | 378 | //SetTime(); |
POTLESS_2 | 19:31ac20c07bb2 | 379 | |
POTLESS_2 | 19:31ac20c07bb2 | 380 | //Calibration des limites des servos pour remapper les feedback |
POTLESS_2 | 19:31ac20c07bb2 | 381 | Calibration_servo(); |
POTLESS_2 | 19:31ac20c07bb2 | 382 | |
POTLESS_2 | 19:31ac20c07bb2 | 383 | //Initialisation du Data log |
POTLESS_2 | 19:31ac20c07bb2 | 384 | if (NEED_SD_DATA_LOG == 1) init_DATALOG(); |
POTLESS_2 | 19:31ac20c07bb2 | 385 | |
POTLESS_2 | 19:31ac20c07bb2 | 386 | //Initialisation capteurs |
POTLESS_2 | 19:31ac20c07bb2 | 387 | arnsrs.Sensors_INIT(false, 5, SPOOLING, DIGI_FILTER32, CALIB_AIR); |
POTLESS_2 | 19:31ac20c07bb2 | 388 | } |
POTLESS_2 | 19:31ac20c07bb2 | 389 | |
POTLESS_2 | 19:31ac20c07bb2 | 390 | //////////////////////////////////////////////////////////////////////////////// |
POTLESS_2 | 19:31ac20c07bb2 | 391 | //////////////////////////////////////////////////////////////////////////////// |
POTLESS_2 | 19:31ac20c07bb2 | 392 | |
POTLESS_2 | 19:31ac20c07bb2 | 393 | //////////////////////////////////////////////////////////////////////////////// |
POTLESS_2 | 19:31ac20c07bb2 | 394 | /// procédure principale /// |
POTLESS_2 | 19:31ac20c07bb2 | 395 | //////////////////////////////////////////////////////////////////////////////// |
POTLESS_2 | 19:31ac20c07bb2 | 396 | |
POTLESS_2 | 19:31ac20c07bb2 | 397 | int main() |
POTLESS_2 | 19:31ac20c07bb2 | 398 | { |
POTLESS_2 | 19:31ac20c07bb2 | 399 | setup(); |
POTLESS_2 | 14:e6686a44db84 | 400 | |
POTLESS_2 | 20:bb8d2cea2076 | 401 | //Initialisation BLE / ne marche pas si mise dans une fonction appelée ici ou dans le setup... |
POTLESS_2 | 20:bb8d2cea2076 | 402 | ble.init(); |
POTLESS_2 | 20:bb8d2cea2076 | 403 | ble.onDisconnection(disconnectionCallback); |
POTLESS_2 | 20:bb8d2cea2076 | 404 | ble.onDataWritten(onDataWritten); |
POTLESS_2 | 20:bb8d2cea2076 | 405 | |
POTLESS_2 | 20:bb8d2cea2076 | 406 | //setup advertising |
POTLESS_2 | 20:bb8d2cea2076 | 407 | ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED); |
POTLESS_2 | 20:bb8d2cea2076 | 408 | ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); |
POTLESS_2 | 20:bb8d2cea2076 | 409 | ble.accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME, |
POTLESS_2 | 20:bb8d2cea2076 | 410 | (const uint8_t *)"ARNSRS", sizeof("ARNSRS") - 1); |
POTLESS_2 | 20:bb8d2cea2076 | 411 | ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS, |
POTLESS_2 | 20:bb8d2cea2076 | 412 | (const uint8_t *)UARTServiceUUID_reversed, sizeof(UARTServiceUUID_reversed)); |
POTLESS_2 | 20:bb8d2cea2076 | 413 | |
POTLESS_2 | 20:bb8d2cea2076 | 414 | ble.setAdvertisingInterval(1000); /* 1000ms; in multiples of 0.625ms. */ |
POTLESS_2 | 20:bb8d2cea2076 | 415 | ble.startAdvertising(); |
POTLESS_2 | 20:bb8d2cea2076 | 416 | |
POTLESS_2 | 20:bb8d2cea2076 | 417 | UARTService uartService(ble); |
POTLESS_2 | 20:bb8d2cea2076 | 418 | uartServicePtr = &uartService; |
POTLESS_2 | 20:bb8d2cea2076 | 419 | |
POTLESS_2 | 4:d84250f67dec | 420 | while (1) { |
POTLESS_2 | 5:e1d0dc7940a6 | 421 | |
POTLESS_2 | 14:e6686a44db84 | 422 | ble.waitForEvent(); |
POTLESS_2 | 14:e6686a44db84 | 423 | |
POTLESS_2 | 4:d84250f67dec | 424 | //CO2 / H / T sur Cozir |
POTLESS_2 | 6:1c2212891714 | 425 | co2 = arnsrs.requestCO2(); |
POTLESS_2 | 6:1c2212891714 | 426 | Humi = arnsrs.requestHUMI(); |
POTLESS_2 | 14:e6686a44db84 | 427 | Temp1 = arnsrs.requestTEMP(); |
POTLESS_2 | 14:e6686a44db84 | 428 | |
POTLESS_2 | 6:1c2212891714 | 429 | //P / T sur MS5803_14BA |
POTLESS_2 | 5:e1d0dc7940a6 | 430 | pression = arnsrs.requestPress(); |
POTLESS_2 | 5:e1d0dc7940a6 | 431 | Temp2 = arnsrs.requestTemp(); |
POTLESS_2 | 5:e1d0dc7940a6 | 432 | |
POTLESS_2 | 5:e1d0dc7940a6 | 433 | //PPO2 sur ADS1015 |
POTLESS_2 | 8:e864edfe656e | 434 | ppO2 = arnsrs.requestPpO2(false); |
POTLESS_2 | 5:e1d0dc7940a6 | 435 | |
POTLESS_2 | 19:31ac20c07bb2 | 436 | //Retour position des servos |
POTLESS_2 | 19:31ac20c07bb2 | 437 | Servo1_POS = remap(FeedBack1, Limit_max_S1, Limit_min_S1, 0, 100); |
POTLESS_2 | 19:31ac20c07bb2 | 438 | Servo2_POS = remap(FeedBack2, Limit_max_S2, Limit_min_S2, 0, 100); |
POTLESS_2 | 5:e1d0dc7940a6 | 439 | |
POTLESS_2 | 19:31ac20c07bb2 | 440 | //Debug |
POTLESS_2 | 19:31ac20c07bb2 | 441 | Debug_Complet(); |
POTLESS_2 | 19:31ac20c07bb2 | 442 | |
POTLESS_2 | 7:c5a5d8f678ff | 443 | //Data LOG |
POTLESS_2 | 15:c9205e490740 | 444 | if (NEED_SD_DATA_LOG == 1) DATA_LOG(); |
POTLESS_2 | 19:31ac20c07bb2 | 445 | |
POTLESS_2 | 17:6e0c4c0e0fe2 | 446 | //En accord avec app Android |
POTLESS_2 | 19:31ac20c07bb2 | 447 | build_send_Message_int("t", co2, ppO2); |
POTLESS_2 | 19:31ac20c07bb2 | 448 | build_send_Message_float("u", Temp1, Temp2); |
POTLESS_2 | 19:31ac20c07bb2 | 449 | build_send_Message_float("v", Humi, pression); |
POTLESS_2 | 19:31ac20c07bb2 | 450 | //build_send_Message_float("f", Servo1_POS, Servo2_POS); |
POTLESS_2 | 13:aa620707126d | 451 | } |
POTLESS_2 | 4:d84250f67dec | 452 | } |
POTLESS_2 | 19:31ac20c07bb2 | 453 | |
POTLESS_2 | 19:31ac20c07bb2 | 454 | //////////////////////////////////////////////////////////////////////////////// |
POTLESS_2 | 19:31ac20c07bb2 | 455 | //////////////////////////////////////////////////////////////////////////////// |