Depart L476 Version 1 Communication UART par BLE avec App Inventor Communication HC05 avec F411

Dependencies:   mbed X_NUCLEO_IDB0XA1 BLE_API

Committer:
jimbaud
Date:
Mon Nov 09 18:12:58 2020 +0000
Revision:
13:38d6b18040c7
Child:
14:ac6cbe6ffaab
BLE UART adapted for ObCP ENSMM user board

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jimbaud 13:38d6b18040c7 1 #include "mbed.h"
jimbaud 13:38d6b18040c7 2 #include "ble/BLE.h"
jimbaud 13:38d6b18040c7 3 #include "ble/services/UARTService.h"
jimbaud 13:38d6b18040c7 4 #include "Serial.h"
jimbaud 13:38d6b18040c7 5 #include "LIS3DH.h"
jimbaud 13:38d6b18040c7 6 #include "stdlib.h"
jimbaud 13:38d6b18040c7 7
jimbaud 13:38d6b18040c7 8 #define UART_BUFFER (UARTService::BLE_UART_SERVICE_MAX_DATA_LEN)
jimbaud 13:38d6b18040c7 9
jimbaud 13:38d6b18040c7 10
jimbaud 13:38d6b18040c7 11 const static char DEVICE_NAME[] = "ObCP";
jimbaud 13:38d6b18040c7 12 UARTService *uartServicePtr;
jimbaud 13:38d6b18040c7 13
jimbaud 13:38d6b18040c7 14 //PWM output
jimbaud 13:38d6b18040c7 15 PwmOut PWMoutput(PB_1); //Main PWM output
jimbaud 13:38d6b18040c7 16 PwmOut Green(PC_8); //PWM Red LED
jimbaud 13:38d6b18040c7 17 PwmOut Red(PC_6); //PWM Green LED
jimbaud 13:38d6b18040c7 18 PwmOut Blue(PC_9); //PWM Blue LED
jimbaud 13:38d6b18040c7 19
jimbaud 13:38d6b18040c7 20 //Accelerometer
jimbaud 13:38d6b18040c7 21
jimbaud 13:38d6b18040c7 22 #define MOSI PC_12
jimbaud 13:38d6b18040c7 23 #define MISO PC_11
jimbaud 13:38d6b18040c7 24 #define CS PC_5
jimbaud 13:38d6b18040c7 25 #define SCLK PC_10
jimbaud 13:38d6b18040c7 26
jimbaud 13:38d6b18040c7 27 // Def Peripheriques
jimbaud 13:38d6b18040c7 28 DigitalIn myButton(PC_13); // USER BUTTON
jimbaud 13:38d6b18040c7 29 //Init accelerometer
jimbaud 13:38d6b18040c7 30 LIS3DH acc(MOSI, MISO, SCLK, CS, LIS3DH_DR_NR_LP_50HZ, LIS3DH_FS_2G);
jimbaud 13:38d6b18040c7 31
jimbaud 13:38d6b18040c7 32 Ticker Acceleration;
jimbaud 13:38d6b18040c7 33
jimbaud 13:38d6b18040c7 34 // Tableau et index de communication avec UART
jimbaud 13:38d6b18040c7 35 static char uartBuff[UART_BUFFER];
jimbaud 13:38d6b18040c7 36 // Variables contenant accelerations
jimbaud 13:38d6b18040c7 37 double accX, accY, accZ;
jimbaud 13:38d6b18040c7 38 // Routine de traitement des erreurs
jimbaud 13:38d6b18040c7 39 void onBleError(ble_error_t error);
jimbaud 13:38d6b18040c7 40
jimbaud 13:38d6b18040c7 41 /****************************************************/
jimbaud 13:38d6b18040c7 42 /* Ticker actif lorsque la connexion BLE est présente */
jimbaud 13:38d6b18040c7 43 /****************************************************/
jimbaud 13:38d6b18040c7 44 void ConnectedBLE(void)
jimbaud 13:38d6b18040c7 45 {
jimbaud 13:38d6b18040c7 46 // Signal de vie: allumer et éteindre la LED
jimbaud 13:38d6b18040c7 47 Green.period(1.0f); // période = 1 seconde
jimbaud 13:38d6b18040c7 48 Green.write(0.01f); // élaire 1% de la période
jimbaud 13:38d6b18040c7 49 }
jimbaud 13:38d6b18040c7 50
jimbaud 13:38d6b18040c7 51 void AccMeasurement(void)
jimbaud 13:38d6b18040c7 52 {
jimbaud 13:38d6b18040c7 53 char outstrX[5];
jimbaud 13:38d6b18040c7 54 char outstrY[5];
jimbaud 13:38d6b18040c7 55 char outstrZ[5];
jimbaud 13:38d6b18040c7 56
jimbaud 13:38d6b18040c7 57 // Mesure des accélérations sur les 3 axes
jimbaud 13:38d6b18040c7 58 accX = float(short((acc.read_reg(LIS3DH_OUT_X_H) << 8) | acc.read_reg(LIS3DH_OUT_X_L))) * 0.001F / 15;
jimbaud 13:38d6b18040c7 59 accY = float(short((acc.read_reg(LIS3DH_OUT_Y_H) << 8) | acc.read_reg(LIS3DH_OUT_Y_L))) * 0.001F / 15;
jimbaud 13:38d6b18040c7 60 accZ = float(short((acc.read_reg(LIS3DH_OUT_Z_H) << 8) | acc.read_reg(LIS3DH_OUT_Z_L))) * 0.001F / 15;
jimbaud 13:38d6b18040c7 61
jimbaud 13:38d6b18040c7 62 //Transformation des valeurs numeriques en chaine de caracteres
jimbaud 13:38d6b18040c7 63 sprintf(outstrX,"%5.2f",accX);
jimbaud 13:38d6b18040c7 64 sprintf(outstrY,"%5.2f",accY);
jimbaud 13:38d6b18040c7 65 sprintf(outstrZ,"%5.2f",accZ);
jimbaud 13:38d6b18040c7 66 //Integre les trois chaines de caractere contenant les accelerations dans la chaine uartBuff
jimbaud 13:38d6b18040c7 67 sprintf(uartBuff, "X%s Y%s Z%s", outstrX, outstrY, outstrZ) ;
jimbaud 13:38d6b18040c7 68 //Envoie la chaine uartBuff sur le sevice TX UART BLE
jimbaud 13:38d6b18040c7 69 uartServicePtr->write(uartBuff, UARTService::BLE_UART_SERVICE_MAX_DATA_LEN);
jimbaud 13:38d6b18040c7 70 // Réinitialiser la chaîne uartBuff en entrant 0 dans les premiers caractères UART_BUFFER
jimbaud 13:38d6b18040c7 71 memset(uartBuff, 0, UART_BUFFER);
jimbaud 13:38d6b18040c7 72
jimbaud 13:38d6b18040c7 73 }
jimbaud 13:38d6b18040c7 74
jimbaud 13:38d6b18040c7 75 /*************************/
jimbaud 13:38d6b18040c7 76 /* Connexion BLE réussie */
jimbaud 13:38d6b18040c7 77 /*************************/
jimbaud 13:38d6b18040c7 78 void BleConnectionCallback(const Gap::ConnectionCallbackParams_t *params)
jimbaud 13:38d6b18040c7 79 {
jimbaud 13:38d6b18040c7 80 // Signal de connexion BLE: allume / éteint la LED avec une période de 1 seconde
jimbaud 13:38d6b18040c7 81 ConnectedBLE();
jimbaud 13:38d6b18040c7 82 Acceleration.attach(AccMeasurement, 1);
jimbaud 13:38d6b18040c7 83 }
jimbaud 13:38d6b18040c7 84
jimbaud 13:38d6b18040c7 85 /*****************************/
jimbaud 13:38d6b18040c7 86 /* Déconnexion du client BLE */
jimbaud 13:38d6b18040c7 87 /*****************************/
jimbaud 13:38d6b18040c7 88 void BleDisconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
jimbaud 13:38d6b18040c7 89 {
jimbaud 13:38d6b18040c7 90 (void)params;
jimbaud 13:38d6b18040c7 91 // Redémarrer la publicité
jimbaud 13:38d6b18040c7 92 Acceleration.detach();
jimbaud 13:38d6b18040c7 93 BLE::Instance().gap().startAdvertising();
jimbaud 13:38d6b18040c7 94
jimbaud 13:38d6b18040c7 95 PWMoutput.write(0.0f);
jimbaud 13:38d6b18040c7 96 Green.write(0.0f);
jimbaud 13:38d6b18040c7 97 Red.write(0.0f);
jimbaud 13:38d6b18040c7 98 Blue.write(0.0f);
jimbaud 13:38d6b18040c7 99 }
jimbaud 13:38d6b18040c7 100
jimbaud 13:38d6b18040c7 101 /***************************/
jimbaud 13:38d6b18040c7 102 /* Rx de BLE et Rx vers USB*/
jimbaud 13:38d6b18040c7 103 /***************************/
jimbaud 13:38d6b18040c7 104 void BleOnDataWrittenCallback(const GattWriteCallbackParams *params)
jimbaud 13:38d6b18040c7 105 {
jimbaud 13:38d6b18040c7 106 char reception[UART_BUFFER];
jimbaud 13:38d6b18040c7 107 char commande[2];
jimbaud 13:38d6b18040c7 108 float valeur;
jimbaud 13:38d6b18040c7 109
jimbaud 13:38d6b18040c7 110 // Reçoit une chaîne de BLE
jimbaud 13:38d6b18040c7 111 if (params->handle == uartServicePtr->getTXCharacteristicHandle()) {
jimbaud 13:38d6b18040c7 112 // Copie de la chaine reçue dans reception
jimbaud 13:38d6b18040c7 113 sprintf(reception,"%s", params->data);
jimbaud 13:38d6b18040c7 114 // Copie dans la chaine commande des deux premier caracteres de la chaine reception
jimbaud 13:38d6b18040c7 115 sprintf(commande,"%c%c", reception[0], reception[1]);
jimbaud 13:38d6b18040c7 116 // Transformation des 3 caracteres suivants en valeur numerique
jimbaud 13:38d6b18040c7 117 valeur = ((reception[2] - '0')* 100 + (reception[3] - '0')* 10 +(reception[4] - '0')) ;
jimbaud 13:38d6b18040c7 118 valeur = valeur/255;
jimbaud 13:38d6b18040c7 119
jimbaud 13:38d6b18040c7 120 if( strcmp(commande, "LR")==0) {
jimbaud 13:38d6b18040c7 121 Red.period(0.01f);
jimbaud 13:38d6b18040c7 122 Red.write(valeur);
jimbaud 13:38d6b18040c7 123 }
jimbaud 13:38d6b18040c7 124 if( strcmp(commande, "LV")==0) {
jimbaud 13:38d6b18040c7 125 Green.period(0.01f);
jimbaud 13:38d6b18040c7 126 Green.write(valeur);
jimbaud 13:38d6b18040c7 127 }
jimbaud 13:38d6b18040c7 128 if( strcmp(commande, "LB")==0) {
jimbaud 13:38d6b18040c7 129 Blue.period(0.01f);
jimbaud 13:38d6b18040c7 130 Blue.write(valeur);
jimbaud 13:38d6b18040c7 131 }
jimbaud 13:38d6b18040c7 132 if( strcmp(commande, "PW")==0) {
jimbaud 13:38d6b18040c7 133 PWMoutput.period(0.001f);
jimbaud 13:38d6b18040c7 134 PWMoutput.write(valeur);
jimbaud 13:38d6b18040c7 135 }
jimbaud 13:38d6b18040c7 136
jimbaud 13:38d6b18040c7 137 }
jimbaud 13:38d6b18040c7 138 }
jimbaud 13:38d6b18040c7 139
jimbaud 13:38d6b18040c7 140 /***************************/
jimbaud 13:38d6b18040c7 141 /* Erreur sur le canal BLE */
jimbaud 13:38d6b18040c7 142 /***************************/
jimbaud 13:38d6b18040c7 143
jimbaud 13:38d6b18040c7 144 void onBleError(ble_error_t error)
jimbaud 13:38d6b18040c7 145 {
jimbaud 13:38d6b18040c7 146 Red.period(0.8f); // période = 0.8 seconde
jimbaud 13:38d6b18040c7 147 Red.write(0.10f); // élaire 10% de la période
jimbaud 13:38d6b18040c7 148 /* Entrer le traitement des erreurs */
jimbaud 13:38d6b18040c7 149 }
jimbaud 13:38d6b18040c7 150
jimbaud 13:38d6b18040c7 151 /**************************************/
jimbaud 13:38d6b18040c7 152 /* Initialisation du service BLE UART */
jimbaud 13:38d6b18040c7 153 /**************************************/
jimbaud 13:38d6b18040c7 154
jimbaud 13:38d6b18040c7 155 void bleInitComplete(BLE::InitializationCompleteCallbackContext *params)
jimbaud 13:38d6b18040c7 156 {
jimbaud 13:38d6b18040c7 157 BLE& ble = params->ble;
jimbaud 13:38d6b18040c7 158 ble_error_t error = params->error;
jimbaud 13:38d6b18040c7 159
jimbaud 13:38d6b18040c7 160 if (error != BLE_ERROR_NONE) {
jimbaud 13:38d6b18040c7 161
jimbaud 13:38d6b18040c7 162 /* En cas d'erreur, transmettez le traitement d'erreur à onBleInitError*/
jimbaud 13:38d6b18040c7 163 onBleError(error);
jimbaud 13:38d6b18040c7 164 return;
jimbaud 13:38d6b18040c7 165 }
jimbaud 13:38d6b18040c7 166
jimbaud 13:38d6b18040c7 167 /* Assurez-vous qu'il s'agit de l'instance par défaut de BLE */
jimbaud 13:38d6b18040c7 168 if(ble.getInstanceID() != BLE::DEFAULT_INSTANCE) {
jimbaud 13:38d6b18040c7 169 return;
jimbaud 13:38d6b18040c7 170 }
jimbaud 13:38d6b18040c7 171
jimbaud 13:38d6b18040c7 172 ble.gap().onConnection(BleConnectionCallback);
jimbaud 13:38d6b18040c7 173 ble.gap().onDisconnection(BleDisconnectionCallback);
jimbaud 13:38d6b18040c7 174 ble.gattServer().onDataWritten(BleOnDataWrittenCallback);
jimbaud 13:38d6b18040c7 175
jimbaud 13:38d6b18040c7 176 /* Configuration du service primaire. */
jimbaud 13:38d6b18040c7 177 UARTService uartService(ble);
jimbaud 13:38d6b18040c7 178 uartServicePtr = &uartService;
jimbaud 13:38d6b18040c7 179
jimbaud 13:38d6b18040c7 180 /* Configurer la publicité */
jimbaud 13:38d6b18040c7 181 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
jimbaud 13:38d6b18040c7 182 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)UARTServiceUUID_reversed, sizeof(UARTServiceUUID_reversed));
jimbaud 13:38d6b18040c7 183 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME));
jimbaud 13:38d6b18040c7 184 ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
jimbaud 13:38d6b18040c7 185 ble.gap().setAdvertisingInterval(500); /* 500ms. */
jimbaud 13:38d6b18040c7 186 ble.gap().startAdvertising();
jimbaud 13:38d6b18040c7 187
jimbaud 13:38d6b18040c7 188 // Attend les événements sur BLE
jimbaud 13:38d6b18040c7 189 while (true) {
jimbaud 13:38d6b18040c7 190 ble.waitForEvent();
jimbaud 13:38d6b18040c7 191 }
jimbaud 13:38d6b18040c7 192 }
jimbaud 13:38d6b18040c7 193
jimbaud 13:38d6b18040c7 194 /********/
jimbaud 13:38d6b18040c7 195 /* MAIN */
jimbaud 13:38d6b18040c7 196 /********/
jimbaud 13:38d6b18040c7 197 int main(void)
jimbaud 13:38d6b18040c7 198 {
jimbaud 13:38d6b18040c7 199 //Définit le fonctionnement du bouton sur "PullDown": Open = '0'. L’autre mode de fonctionnement est PullUp
jimbaud 13:38d6b18040c7 200 myButton.mode(PullDown);
jimbaud 13:38d6b18040c7 201
jimbaud 13:38d6b18040c7 202 // Initialiser LED
jimbaud 13:38d6b18040c7 203 Green.write(0.0f);
jimbaud 13:38d6b18040c7 204 Red.write(0.0f);
jimbaud 13:38d6b18040c7 205 Blue.write(0.0f);
jimbaud 13:38d6b18040c7 206
jimbaud 13:38d6b18040c7 207 /****** START Initialiser BLE **********/
jimbaud 13:38d6b18040c7 208 BLE &ble = BLE::Instance();
jimbaud 13:38d6b18040c7 209 ble.init(bleInitComplete);
jimbaud 13:38d6b18040c7 210 /******* FIN initialise BLE ***********/
jimbaud 13:38d6b18040c7 211
jimbaud 13:38d6b18040c7 212 }
jimbaud 13:38d6b18040c7 213