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

Dependencies:   mbed X_NUCLEO_IDB0XA1 BLE_API

Committer:
dorianvoydie
Date:
Tue Nov 17 17:18:52 2020 +0000
Revision:
14:ac6cbe6ffaab
Parent:
13:38d6b18040c7
Version 1; Depart sur le L476; Communication UART par le BLE avec APP inventor

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 "stdlib.h"
jimbaud 13:38d6b18040c7 6
jimbaud 13:38d6b18040c7 7 #define UART_BUFFER (UARTService::BLE_UART_SERVICE_MAX_DATA_LEN)
jimbaud 13:38d6b18040c7 8
jimbaud 13:38d6b18040c7 9
dorianvoydie 14:ac6cbe6ffaab 10 const static char DEVICE_NAME[] = "OBCP";
jimbaud 13:38d6b18040c7 11 UARTService *uartServicePtr;
jimbaud 13:38d6b18040c7 12
jimbaud 13:38d6b18040c7 13 //PWM output
jimbaud 13:38d6b18040c7 14 PwmOut Green(PC_8); //PWM Red LED
dorianvoydie 14:ac6cbe6ffaab 15 PwmOut Red(PC_6); //PWM Red LED
dorianvoydie 14:ac6cbe6ffaab 16 PwmOut Blue(PC_9); //PWM Red LED
jimbaud 13:38d6b18040c7 17
jimbaud 13:38d6b18040c7 18 // Def Peripheriques
dorianvoydie 14:ac6cbe6ffaab 19 InterruptIn myButton(PC_13); // USER BUTTON
jimbaud 13:38d6b18040c7 20
dorianvoydie 14:ac6cbe6ffaab 21 ///////////Init HC05/////////////////
dorianvoydie 14:ac6cbe6ffaab 22 Serial HC05(D8, D2);
dorianvoydie 14:ac6cbe6ffaab 23 //Bluetooth
dorianvoydie 14:ac6cbe6ffaab 24 //Maitre (Arrivee) : ADDR = 98d3,b1,fd5c5d
dorianvoydie 14:ac6cbe6ffaab 25 //Esclave (Départ) : ADDR = 0019,10,08FCB5
dorianvoydie 14:ac6cbe6ffaab 26 /////////////////////////////////////
dorianvoydie 14:ac6cbe6ffaab 27 //Ticker t;
dorianvoydie 14:ac6cbe6ffaab 28 ////////////TIMER////////////////////
dorianvoydie 14:ac6cbe6ffaab 29 Timer timer;
dorianvoydie 14:ac6cbe6ffaab 30 int begin;
dorianvoydie 14:ac6cbe6ffaab 31 int end;
dorianvoydie 14:ac6cbe6ffaab 32 float chrono=0;
dorianvoydie 14:ac6cbe6ffaab 33 void Timer_triggered()
dorianvoydie 14:ac6cbe6ffaab 34 {
dorianvoydie 14:ac6cbe6ffaab 35 timer.start();
dorianvoydie 14:ac6cbe6ffaab 36 begin = timer.read_ms();
dorianvoydie 14:ac6cbe6ffaab 37 Blue=1;
dorianvoydie 14:ac6cbe6ffaab 38 wait(0.5);
dorianvoydie 14:ac6cbe6ffaab 39 Blue=0;
dorianvoydie 14:ac6cbe6ffaab 40 }
dorianvoydie 14:ac6cbe6ffaab 41 void Timer_Reset()
dorianvoydie 14:ac6cbe6ffaab 42 {
dorianvoydie 14:ac6cbe6ffaab 43 timer.stop();
dorianvoydie 14:ac6cbe6ffaab 44 begin=0;
dorianvoydie 14:ac6cbe6ffaab 45 end=0;
dorianvoydie 14:ac6cbe6ffaab 46 chrono=0;
dorianvoydie 14:ac6cbe6ffaab 47 }
dorianvoydie 14:ac6cbe6ffaab 48 /////////////////////////////////////
dorianvoydie 14:ac6cbe6ffaab 49
dorianvoydie 14:ac6cbe6ffaab 50
dorianvoydie 14:ac6cbe6ffaab 51 /////////COMMUNICATION///////////////
dorianvoydie 14:ac6cbe6ffaab 52 void HC05_receive()
dorianvoydie 14:ac6cbe6ffaab 53 {
dorianvoydie 14:ac6cbe6ffaab 54 char IncomingValue = HC05.getc();
dorianvoydie 14:ac6cbe6ffaab 55 if(IncomingValue == 'u') {
dorianvoydie 14:ac6cbe6ffaab 56 end = timer.read_ms();
dorianvoydie 14:ac6cbe6ffaab 57 timer.stop();
dorianvoydie 14:ac6cbe6ffaab 58 chrono = end-begin;
dorianvoydie 14:ac6cbe6ffaab 59
dorianvoydie 14:ac6cbe6ffaab 60 }
dorianvoydie 14:ac6cbe6ffaab 61 }
dorianvoydie 14:ac6cbe6ffaab 62 /////////////////////////////////////
dorianvoydie 14:ac6cbe6ffaab 63
dorianvoydie 14:ac6cbe6ffaab 64
dorianvoydie 14:ac6cbe6ffaab 65
dorianvoydie 14:ac6cbe6ffaab 66
dorianvoydie 14:ac6cbe6ffaab 67
dorianvoydie 14:ac6cbe6ffaab 68
jimbaud 13:38d6b18040c7 69
jimbaud 13:38d6b18040c7 70 // Tableau et index de communication avec UART
jimbaud 13:38d6b18040c7 71 static char uartBuff[UART_BUFFER];
jimbaud 13:38d6b18040c7 72 // Routine de traitement des erreurs
jimbaud 13:38d6b18040c7 73 void onBleError(ble_error_t error);
jimbaud 13:38d6b18040c7 74
jimbaud 13:38d6b18040c7 75 /****************************************************/
jimbaud 13:38d6b18040c7 76 /* Ticker actif lorsque la connexion BLE est présente */
jimbaud 13:38d6b18040c7 77 /****************************************************/
jimbaud 13:38d6b18040c7 78
dorianvoydie 14:ac6cbe6ffaab 79 void update(void)
jimbaud 13:38d6b18040c7 80 {
dorianvoydie 14:ac6cbe6ffaab 81 char train[5];
dorianvoydie 14:ac6cbe6ffaab 82 float chrono_value = float(chrono)* 0.001F;
jimbaud 13:38d6b18040c7 83
jimbaud 13:38d6b18040c7 84 //Transformation des valeurs numeriques en chaine de caracteres
dorianvoydie 14:ac6cbe6ffaab 85 sprintf(train,"%5.2f",chrono_value);
dorianvoydie 14:ac6cbe6ffaab 86 //Integre les trois chaines de caractere contenant les ts dans la chaine uartBuff
dorianvoydie 14:ac6cbe6ffaab 87 sprintf(uartBuff, "%s", train) ;
jimbaud 13:38d6b18040c7 88 //Envoie la chaine uartBuff sur le sevice TX UART BLE
jimbaud 13:38d6b18040c7 89 uartServicePtr->write(uartBuff, UARTService::BLE_UART_SERVICE_MAX_DATA_LEN);
jimbaud 13:38d6b18040c7 90 // Réinitialiser la chaîne uartBuff en entrant 0 dans les premiers caractères UART_BUFFER
jimbaud 13:38d6b18040c7 91 memset(uartBuff, 0, UART_BUFFER);
jimbaud 13:38d6b18040c7 92
jimbaud 13:38d6b18040c7 93 }
jimbaud 13:38d6b18040c7 94
jimbaud 13:38d6b18040c7 95 /*************************/
jimbaud 13:38d6b18040c7 96 /* Connexion BLE réussie */
jimbaud 13:38d6b18040c7 97 /*************************/
jimbaud 13:38d6b18040c7 98 void BleConnectionCallback(const Gap::ConnectionCallbackParams_t *params)
jimbaud 13:38d6b18040c7 99 {
dorianvoydie 14:ac6cbe6ffaab 100 Timer_Reset();
dorianvoydie 14:ac6cbe6ffaab 101 update();
jimbaud 13:38d6b18040c7 102 }
jimbaud 13:38d6b18040c7 103
jimbaud 13:38d6b18040c7 104 /*****************************/
jimbaud 13:38d6b18040c7 105 /* Déconnexion du client BLE */
jimbaud 13:38d6b18040c7 106 /*****************************/
jimbaud 13:38d6b18040c7 107 void BleDisconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
jimbaud 13:38d6b18040c7 108 {
jimbaud 13:38d6b18040c7 109 (void)params;
jimbaud 13:38d6b18040c7 110 // Redémarrer la publicité
dorianvoydie 14:ac6cbe6ffaab 111 Timer_Reset();
dorianvoydie 14:ac6cbe6ffaab 112 update();
dorianvoydie 14:ac6cbe6ffaab 113
jimbaud 13:38d6b18040c7 114 BLE::Instance().gap().startAdvertising();
jimbaud 13:38d6b18040c7 115
dorianvoydie 14:ac6cbe6ffaab 116 Blue.write(0.0f);
jimbaud 13:38d6b18040c7 117 Green.write(0.0f);
jimbaud 13:38d6b18040c7 118 Red.write(0.0f);
jimbaud 13:38d6b18040c7 119 }
jimbaud 13:38d6b18040c7 120
jimbaud 13:38d6b18040c7 121 /***************************/
jimbaud 13:38d6b18040c7 122 /* Rx de BLE et Rx vers USB*/
jimbaud 13:38d6b18040c7 123 /***************************/
dorianvoydie 14:ac6cbe6ffaab 124
jimbaud 13:38d6b18040c7 125 void BleOnDataWrittenCallback(const GattWriteCallbackParams *params)
jimbaud 13:38d6b18040c7 126 {
jimbaud 13:38d6b18040c7 127 char reception[UART_BUFFER];
dorianvoydie 14:ac6cbe6ffaab 128 char commande[3];
jimbaud 13:38d6b18040c7 129
jimbaud 13:38d6b18040c7 130 // Reçoit une chaîne de BLE
jimbaud 13:38d6b18040c7 131 if (params->handle == uartServicePtr->getTXCharacteristicHandle()) {
jimbaud 13:38d6b18040c7 132 // Copie de la chaine reçue dans reception
jimbaud 13:38d6b18040c7 133 sprintf(reception,"%s", params->data);
jimbaud 13:38d6b18040c7 134 // Copie dans la chaine commande des deux premier caracteres de la chaine reception
dorianvoydie 14:ac6cbe6ffaab 135 sprintf(commande,"%c%c%c", reception[0], reception[1], reception[2]);
dorianvoydie 14:ac6cbe6ffaab 136 if( strcmp(commande, "RST" )==0 or strcmp(commande, "rst" )==0 ) {
dorianvoydie 14:ac6cbe6ffaab 137 Timer_Reset();
dorianvoydie 14:ac6cbe6ffaab 138 update();
jimbaud 13:38d6b18040c7 139 }
jimbaud 13:38d6b18040c7 140 }
jimbaud 13:38d6b18040c7 141 }
jimbaud 13:38d6b18040c7 142
dorianvoydie 14:ac6cbe6ffaab 143
jimbaud 13:38d6b18040c7 144 /***************************/
jimbaud 13:38d6b18040c7 145 /* Erreur sur le canal BLE */
jimbaud 13:38d6b18040c7 146 /***************************/
jimbaud 13:38d6b18040c7 147
jimbaud 13:38d6b18040c7 148 void onBleError(ble_error_t error)
jimbaud 13:38d6b18040c7 149 {
jimbaud 13:38d6b18040c7 150 Red.period(0.8f); // période = 0.8 seconde
jimbaud 13:38d6b18040c7 151 Red.write(0.10f); // élaire 10% de la période
jimbaud 13:38d6b18040c7 152 /* Entrer le traitement des erreurs */
jimbaud 13:38d6b18040c7 153 }
jimbaud 13:38d6b18040c7 154
jimbaud 13:38d6b18040c7 155 /**************************************/
jimbaud 13:38d6b18040c7 156 /* Initialisation du service BLE UART */
jimbaud 13:38d6b18040c7 157 /**************************************/
jimbaud 13:38d6b18040c7 158
jimbaud 13:38d6b18040c7 159 void bleInitComplete(BLE::InitializationCompleteCallbackContext *params)
jimbaud 13:38d6b18040c7 160 {
jimbaud 13:38d6b18040c7 161 BLE& ble = params->ble;
jimbaud 13:38d6b18040c7 162 ble_error_t error = params->error;
jimbaud 13:38d6b18040c7 163
jimbaud 13:38d6b18040c7 164 if (error != BLE_ERROR_NONE) {
jimbaud 13:38d6b18040c7 165
jimbaud 13:38d6b18040c7 166 /* En cas d'erreur, transmettez le traitement d'erreur à onBleInitError*/
jimbaud 13:38d6b18040c7 167 onBleError(error);
jimbaud 13:38d6b18040c7 168 return;
jimbaud 13:38d6b18040c7 169 }
jimbaud 13:38d6b18040c7 170
jimbaud 13:38d6b18040c7 171 /* Assurez-vous qu'il s'agit de l'instance par défaut de BLE */
jimbaud 13:38d6b18040c7 172 if(ble.getInstanceID() != BLE::DEFAULT_INSTANCE) {
jimbaud 13:38d6b18040c7 173 return;
jimbaud 13:38d6b18040c7 174 }
jimbaud 13:38d6b18040c7 175
jimbaud 13:38d6b18040c7 176 ble.gap().onConnection(BleConnectionCallback);
jimbaud 13:38d6b18040c7 177 ble.gap().onDisconnection(BleDisconnectionCallback);
jimbaud 13:38d6b18040c7 178 ble.gattServer().onDataWritten(BleOnDataWrittenCallback);
jimbaud 13:38d6b18040c7 179
jimbaud 13:38d6b18040c7 180 /* Configuration du service primaire. */
jimbaud 13:38d6b18040c7 181 UARTService uartService(ble);
jimbaud 13:38d6b18040c7 182 uartServicePtr = &uartService;
jimbaud 13:38d6b18040c7 183
jimbaud 13:38d6b18040c7 184 /* Configurer la publicité */
jimbaud 13:38d6b18040c7 185 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
jimbaud 13:38d6b18040c7 186 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)UARTServiceUUID_reversed, sizeof(UARTServiceUUID_reversed));
jimbaud 13:38d6b18040c7 187 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME));
jimbaud 13:38d6b18040c7 188 ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
jimbaud 13:38d6b18040c7 189 ble.gap().setAdvertisingInterval(500); /* 500ms. */
jimbaud 13:38d6b18040c7 190 ble.gap().startAdvertising();
jimbaud 13:38d6b18040c7 191
jimbaud 13:38d6b18040c7 192 // Attend les événements sur BLE
jimbaud 13:38d6b18040c7 193 while (true) {
jimbaud 13:38d6b18040c7 194 ble.waitForEvent();
dorianvoydie 14:ac6cbe6ffaab 195 update();
dorianvoydie 14:ac6cbe6ffaab 196 while(HC05.readable()) {
dorianvoydie 14:ac6cbe6ffaab 197 HC05_receive();
dorianvoydie 14:ac6cbe6ffaab 198 }
dorianvoydie 14:ac6cbe6ffaab 199 wait(0.01);
jimbaud 13:38d6b18040c7 200 }
jimbaud 13:38d6b18040c7 201 }
jimbaud 13:38d6b18040c7 202
jimbaud 13:38d6b18040c7 203 /********/
jimbaud 13:38d6b18040c7 204 /* MAIN */
jimbaud 13:38d6b18040c7 205 /********/
jimbaud 13:38d6b18040c7 206 int main(void)
jimbaud 13:38d6b18040c7 207 {
dorianvoydie 14:ac6cbe6ffaab 208 HC05.baud(38400);
dorianvoydie 14:ac6cbe6ffaab 209 myButton.fall(&Timer_triggered);
jimbaud 13:38d6b18040c7 210
jimbaud 13:38d6b18040c7 211 // Initialiser LED
jimbaud 13:38d6b18040c7 212 Green.write(0.0f);
jimbaud 13:38d6b18040c7 213 Red.write(0.0f);
jimbaud 13:38d6b18040c7 214 Blue.write(0.0f);
jimbaud 13:38d6b18040c7 215
jimbaud 13:38d6b18040c7 216 /****** START Initialiser BLE **********/
jimbaud 13:38d6b18040c7 217 BLE &ble = BLE::Instance();
jimbaud 13:38d6b18040c7 218 ble.init(bleInitComplete);
jimbaud 13:38d6b18040c7 219 /******* FIN initialise BLE ***********/
jimbaud 13:38d6b18040c7 220 }
jimbaud 13:38d6b18040c7 221