Depart L476 Version 1 Communication UART par BLE avec App Inventor Communication HC05 avec F411
Dependencies: mbed X_NUCLEO_IDB0XA1 BLE_API
main.cpp@14:ac6cbe6ffaab, 2020-11-17 (annotated)
- 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?
User | Revision | Line number | New 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 |