BLE test for specific board mheuve sensor ENSMM CROC
Dependencies: mbed Driver_BLE_Mheuve BLE_API
These two pictures show how to connect the Mheuve Sensor to the ST-Link debugger (don't forget to disable ST-link jumpers and JP5 on the board! ):
These two pictures show how to connect the Mheuve Sensor TX RX to the ST-Link debugger (don't forget to cross TX and RX, it means Mheuve sensor TX on ST-Link RX and ST-Link TX on Mheuve sensor RX ):
The Mheuve sensor board needs to be powered by an external battery.
The result appears on a BLE terminal smartphone application (like BLE terminal on Android) under BLE UART specification data, it prints periodically "coucou".
main.cpp@0:25d5fe1d290e, 2021-01-27 (annotated)
- Committer:
- jimbaud
- Date:
- Wed Jan 27 09:58:19 2021 +0000
- Revision:
- 0:25d5fe1d290e
BLE test for specific board mheuve sensor ENSMM CROC
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
jimbaud | 0:25d5fe1d290e | 1 | #include "mbed.h" |
jimbaud | 0:25d5fe1d290e | 2 | #include "ble/BLE.h" |
jimbaud | 0:25d5fe1d290e | 3 | #include "ble/services/UARTService.h" |
jimbaud | 0:25d5fe1d290e | 4 | #include "Serial.h" |
jimbaud | 0:25d5fe1d290e | 5 | #include "stdlib.h" |
jimbaud | 0:25d5fe1d290e | 6 | |
jimbaud | 0:25d5fe1d290e | 7 | #define UART_BUFFER (UARTService::BLE_UART_SERVICE_MAX_DATA_LEN) |
jimbaud | 0:25d5fe1d290e | 8 | |
jimbaud | 0:25d5fe1d290e | 9 | |
jimbaud | 0:25d5fe1d290e | 10 | const static char DEVICE_NAME[] = "Mheuve"; |
jimbaud | 0:25d5fe1d290e | 11 | UARTService *uartServicePtr; |
jimbaud | 0:25d5fe1d290e | 12 | |
jimbaud | 0:25d5fe1d290e | 13 | //PWM output |
jimbaud | 0:25d5fe1d290e | 14 | |
jimbaud | 0:25d5fe1d290e | 15 | DigitalOut Green(PC_4); //Red LED |
jimbaud | 0:25d5fe1d290e | 16 | DigitalOut Red(PC_5); //Green LED |
jimbaud | 0:25d5fe1d290e | 17 | |
jimbaud | 0:25d5fe1d290e | 18 | Ticker tempo; |
jimbaud | 0:25d5fe1d290e | 19 | |
jimbaud | 0:25d5fe1d290e | 20 | // Tableau et index de communication avec UART |
jimbaud | 0:25d5fe1d290e | 21 | static char uartBuff[UART_BUFFER]; |
jimbaud | 0:25d5fe1d290e | 22 | |
jimbaud | 0:25d5fe1d290e | 23 | // Routine de traitement des erreurs |
jimbaud | 0:25d5fe1d290e | 24 | void onBleError(ble_error_t error); |
jimbaud | 0:25d5fe1d290e | 25 | |
jimbaud | 0:25d5fe1d290e | 26 | /****************************************************/ |
jimbaud | 0:25d5fe1d290e | 27 | /* Ticker actif lorsque la connexion BLE est présente */ |
jimbaud | 0:25d5fe1d290e | 28 | /****************************************************/ |
jimbaud | 0:25d5fe1d290e | 29 | void ConnectedBLE(void) |
jimbaud | 0:25d5fe1d290e | 30 | { |
jimbaud | 0:25d5fe1d290e | 31 | // Signal de vie: allumer et éteindre la LED |
jimbaud | 0:25d5fe1d290e | 32 | Red = 0; |
jimbaud | 0:25d5fe1d290e | 33 | Green = 1 ; |
jimbaud | 0:25d5fe1d290e | 34 | |
jimbaud | 0:25d5fe1d290e | 35 | } |
jimbaud | 0:25d5fe1d290e | 36 | |
jimbaud | 0:25d5fe1d290e | 37 | void message(void) |
jimbaud | 0:25d5fe1d290e | 38 | { |
jimbaud | 0:25d5fe1d290e | 39 | //Integre les trois chaines de caractere contenant les accelerations dans la chaine uartBuff |
jimbaud | 0:25d5fe1d290e | 40 | sprintf(uartBuff, "coucou") ; |
jimbaud | 0:25d5fe1d290e | 41 | //Envoie la chaine uartBuff sur le sevice TX UART BLE |
jimbaud | 0:25d5fe1d290e | 42 | uartServicePtr->write(uartBuff, UARTService::BLE_UART_SERVICE_MAX_DATA_LEN); |
jimbaud | 0:25d5fe1d290e | 43 | // Réinitialiser la chaîne uartBuff en entrant 0 dans les premiers caractères UART_BUFFER |
jimbaud | 0:25d5fe1d290e | 44 | memset(uartBuff, 0, UART_BUFFER); |
jimbaud | 0:25d5fe1d290e | 45 | |
jimbaud | 0:25d5fe1d290e | 46 | } |
jimbaud | 0:25d5fe1d290e | 47 | |
jimbaud | 0:25d5fe1d290e | 48 | /*************************/ |
jimbaud | 0:25d5fe1d290e | 49 | /* Connexion BLE réussie */ |
jimbaud | 0:25d5fe1d290e | 50 | /*************************/ |
jimbaud | 0:25d5fe1d290e | 51 | void BleConnectionCallback(const Gap::ConnectionCallbackParams_t *params) |
jimbaud | 0:25d5fe1d290e | 52 | { |
jimbaud | 0:25d5fe1d290e | 53 | // Signal de connexion BLE: allume / éteint la LED avec une période de 1 seconde |
jimbaud | 0:25d5fe1d290e | 54 | ConnectedBLE(); |
jimbaud | 0:25d5fe1d290e | 55 | tempo.attach(message, 1); |
jimbaud | 0:25d5fe1d290e | 56 | } |
jimbaud | 0:25d5fe1d290e | 57 | |
jimbaud | 0:25d5fe1d290e | 58 | /*****************************/ |
jimbaud | 0:25d5fe1d290e | 59 | /* Déconnexion du client BLE */ |
jimbaud | 0:25d5fe1d290e | 60 | /*****************************/ |
jimbaud | 0:25d5fe1d290e | 61 | void BleDisconnectionCallback(const Gap::DisconnectionCallbackParams_t *params) |
jimbaud | 0:25d5fe1d290e | 62 | { |
jimbaud | 0:25d5fe1d290e | 63 | (void)params; |
jimbaud | 0:25d5fe1d290e | 64 | // Redémarrer la publicité |
jimbaud | 0:25d5fe1d290e | 65 | tempo.detach(); |
jimbaud | 0:25d5fe1d290e | 66 | BLE::Instance().gap().startAdvertising(); |
jimbaud | 0:25d5fe1d290e | 67 | |
jimbaud | 0:25d5fe1d290e | 68 | Green = 0; |
jimbaud | 0:25d5fe1d290e | 69 | Red = 1; |
jimbaud | 0:25d5fe1d290e | 70 | |
jimbaud | 0:25d5fe1d290e | 71 | } |
jimbaud | 0:25d5fe1d290e | 72 | |
jimbaud | 0:25d5fe1d290e | 73 | /***************************/ |
jimbaud | 0:25d5fe1d290e | 74 | /* Rx de BLE et Rx vers USB*/ |
jimbaud | 0:25d5fe1d290e | 75 | /***************************/ |
jimbaud | 0:25d5fe1d290e | 76 | void BleOnDataWrittenCallback(const GattWriteCallbackParams *params) |
jimbaud | 0:25d5fe1d290e | 77 | { |
jimbaud | 0:25d5fe1d290e | 78 | char reception[UART_BUFFER]; |
jimbaud | 0:25d5fe1d290e | 79 | char commande[2]; |
jimbaud | 0:25d5fe1d290e | 80 | float valeur; |
jimbaud | 0:25d5fe1d290e | 81 | |
jimbaud | 0:25d5fe1d290e | 82 | // Reçoit une chaîne de BLE |
jimbaud | 0:25d5fe1d290e | 83 | if (params->handle == uartServicePtr->getTXCharacteristicHandle()) { |
jimbaud | 0:25d5fe1d290e | 84 | // Copie de la chaine reçue dans reception |
jimbaud | 0:25d5fe1d290e | 85 | sprintf(reception,"%s", params->data); |
jimbaud | 0:25d5fe1d290e | 86 | // Copie dans la chaine commande des deux premier caracteres de la chaine reception |
jimbaud | 0:25d5fe1d290e | 87 | sprintf(commande,"%c%c", reception[0], reception[1]); |
jimbaud | 0:25d5fe1d290e | 88 | // Transformation des 3 caracteres suivants en valeur numerique |
jimbaud | 0:25d5fe1d290e | 89 | valeur = ((reception[2] - '0')* 100 + (reception[3] - '0')* 10 +(reception[4] - '0')) ; |
jimbaud | 0:25d5fe1d290e | 90 | valeur = valeur/255; |
jimbaud | 0:25d5fe1d290e | 91 | |
jimbaud | 0:25d5fe1d290e | 92 | if( strcmp(commande, "LR")==0) { |
jimbaud | 0:25d5fe1d290e | 93 | |
jimbaud | 0:25d5fe1d290e | 94 | } |
jimbaud | 0:25d5fe1d290e | 95 | if( strcmp(commande, "LV")==0) { |
jimbaud | 0:25d5fe1d290e | 96 | |
jimbaud | 0:25d5fe1d290e | 97 | } |
jimbaud | 0:25d5fe1d290e | 98 | |
jimbaud | 0:25d5fe1d290e | 99 | } |
jimbaud | 0:25d5fe1d290e | 100 | } |
jimbaud | 0:25d5fe1d290e | 101 | |
jimbaud | 0:25d5fe1d290e | 102 | /***************************/ |
jimbaud | 0:25d5fe1d290e | 103 | /* Erreur sur le canal BLE */ |
jimbaud | 0:25d5fe1d290e | 104 | /***************************/ |
jimbaud | 0:25d5fe1d290e | 105 | |
jimbaud | 0:25d5fe1d290e | 106 | void onBleError(ble_error_t error) |
jimbaud | 0:25d5fe1d290e | 107 | { |
jimbaud | 0:25d5fe1d290e | 108 | Red = 1; |
jimbaud | 0:25d5fe1d290e | 109 | |
jimbaud | 0:25d5fe1d290e | 110 | /* Entrer le traitement des erreurs */ |
jimbaud | 0:25d5fe1d290e | 111 | } |
jimbaud | 0:25d5fe1d290e | 112 | |
jimbaud | 0:25d5fe1d290e | 113 | /**************************************/ |
jimbaud | 0:25d5fe1d290e | 114 | /* Initialisation du service BLE UART */ |
jimbaud | 0:25d5fe1d290e | 115 | /**************************************/ |
jimbaud | 0:25d5fe1d290e | 116 | |
jimbaud | 0:25d5fe1d290e | 117 | void bleInitComplete(BLE::InitializationCompleteCallbackContext *params) |
jimbaud | 0:25d5fe1d290e | 118 | { |
jimbaud | 0:25d5fe1d290e | 119 | BLE& ble = params->ble; |
jimbaud | 0:25d5fe1d290e | 120 | ble_error_t error = params->error; |
jimbaud | 0:25d5fe1d290e | 121 | |
jimbaud | 0:25d5fe1d290e | 122 | if (error != BLE_ERROR_NONE) { |
jimbaud | 0:25d5fe1d290e | 123 | |
jimbaud | 0:25d5fe1d290e | 124 | /* En cas d'erreur, transmettez le traitement d'erreur à onBleInitError*/ |
jimbaud | 0:25d5fe1d290e | 125 | onBleError(error); |
jimbaud | 0:25d5fe1d290e | 126 | return; |
jimbaud | 0:25d5fe1d290e | 127 | } |
jimbaud | 0:25d5fe1d290e | 128 | |
jimbaud | 0:25d5fe1d290e | 129 | /* Assurez-vous qu'il s'agit de l'instance par défaut de BLE */ |
jimbaud | 0:25d5fe1d290e | 130 | if(ble.getInstanceID() != BLE::DEFAULT_INSTANCE) { |
jimbaud | 0:25d5fe1d290e | 131 | return; |
jimbaud | 0:25d5fe1d290e | 132 | } |
jimbaud | 0:25d5fe1d290e | 133 | |
jimbaud | 0:25d5fe1d290e | 134 | ble.gap().onConnection(BleConnectionCallback); |
jimbaud | 0:25d5fe1d290e | 135 | ble.gap().onDisconnection(BleDisconnectionCallback); |
jimbaud | 0:25d5fe1d290e | 136 | ble.gattServer().onDataWritten(BleOnDataWrittenCallback); |
jimbaud | 0:25d5fe1d290e | 137 | |
jimbaud | 0:25d5fe1d290e | 138 | /* Configuration du service primaire. */ |
jimbaud | 0:25d5fe1d290e | 139 | UARTService uartService(ble); |
jimbaud | 0:25d5fe1d290e | 140 | uartServicePtr = &uartService; |
jimbaud | 0:25d5fe1d290e | 141 | |
jimbaud | 0:25d5fe1d290e | 142 | /* Configurer la publicité */ |
jimbaud | 0:25d5fe1d290e | 143 | ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE); |
jimbaud | 0:25d5fe1d290e | 144 | ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)UARTServiceUUID_reversed, sizeof(UARTServiceUUID_reversed)); |
jimbaud | 0:25d5fe1d290e | 145 | ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME)); |
jimbaud | 0:25d5fe1d290e | 146 | ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); |
jimbaud | 0:25d5fe1d290e | 147 | ble.gap().setAdvertisingInterval(500); /* 500ms. */ |
jimbaud | 0:25d5fe1d290e | 148 | ble.gap().startAdvertising(); |
jimbaud | 0:25d5fe1d290e | 149 | |
jimbaud | 0:25d5fe1d290e | 150 | // Attend les événements sur BLE |
jimbaud | 0:25d5fe1d290e | 151 | while (true) { |
jimbaud | 0:25d5fe1d290e | 152 | ble.waitForEvent(); |
jimbaud | 0:25d5fe1d290e | 153 | } |
jimbaud | 0:25d5fe1d290e | 154 | } |
jimbaud | 0:25d5fe1d290e | 155 | |
jimbaud | 0:25d5fe1d290e | 156 | /********/ |
jimbaud | 0:25d5fe1d290e | 157 | /* MAIN */ |
jimbaud | 0:25d5fe1d290e | 158 | /********/ |
jimbaud | 0:25d5fe1d290e | 159 | int main(void) |
jimbaud | 0:25d5fe1d290e | 160 | { |
jimbaud | 0:25d5fe1d290e | 161 | |
jimbaud | 0:25d5fe1d290e | 162 | // Initialiser LED |
jimbaud | 0:25d5fe1d290e | 163 | Green = 0; |
jimbaud | 0:25d5fe1d290e | 164 | Red = 1; |
jimbaud | 0:25d5fe1d290e | 165 | |
jimbaud | 0:25d5fe1d290e | 166 | |
jimbaud | 0:25d5fe1d290e | 167 | |
jimbaud | 0:25d5fe1d290e | 168 | /****** START Initialiser BLE **********/ |
jimbaud | 0:25d5fe1d290e | 169 | BLE &ble = BLE::Instance(); |
jimbaud | 0:25d5fe1d290e | 170 | ble.init(bleInitComplete); |
jimbaud | 0:25d5fe1d290e | 171 | /******* FIN initialise BLE ***********/ |
jimbaud | 0:25d5fe1d290e | 172 | |
jimbaud | 0:25d5fe1d290e | 173 | } |
jimbaud | 0:25d5fe1d290e | 174 |