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