/** * A BLE client example that is rich in capabilities. * There is a lot new capabilities implemented. * author unknown * updated by chegewara and MoThunderz */ #include "BLEDevice.h" //#include "BLEScan.h" //motor 1 #define motorDB 2 #define motorDB2 3 //motor 2 #define motorDA 5 #define motorDA2 4 //mototr 3 #define motorIA 19 #define motorIA2 17 //motor 4 #define motorIB 18 #define motorIB2 20 #define LED1 6 #define LED2 7 // Define UUIDs: static BLEUUID serviceUUID("4fafc201-1fb5-459e-8fcc-c5c9c331914b"); static BLEUUID charUUID_1("beb5483e-36e1-4688-b7f5-ea07361b26a8"); static BLEUUID charUUID_2("1c95d5e3-d8f7-413a-bf3d-7a2e5d7be87e"); // Some variables to keep track on device connected static boolean doConnect = false; static boolean connected = false; static boolean doScan = false; // Define pointer for the BLE connection static BLEAdvertisedDevice* myDevice; BLERemoteCharacteristic* pRemoteChar_1; BLERemoteCharacteristic* pRemoteChar_2; // Callback function for Notify function static void notifyCallback(BLERemoteCharacteristic* pBLERemoteCharacteristic, uint8_t* pData, size_t length, bool isNotify) { if(pBLERemoteCharacteristic->getUUID().toString() == charUUID_1.toString()) { // convert received bytes to integer uint32_t counter = pData[0]; for(int i = 1; igetAddress().toString().c_str()); BLEClient* pClient = BLEDevice::createClient(); Serial.println(" - Created client"); pClient->setClientCallbacks(new MyClientCallback()); // Connect to the remove BLE Server. pClient->connect(myDevice); // if you pass BLEAdvertisedDevice instead of address, it will be recognized type of peer device address (public or private) Serial.println(" - Connected to server"); // Obtain a reference to the service we are after in the remote BLE server. BLERemoteService* pRemoteService = pClient->getService(serviceUUID); if (pRemoteService == nullptr) { Serial.print("Failed to find our service UUID: "); Serial.println(serviceUUID.toString().c_str()); pClient->disconnect(); return false; } Serial.println(" - Found our service"); connected = true; pRemoteChar_1 = pRemoteService->getCharacteristic(charUUID_1); pRemoteChar_2 = pRemoteService->getCharacteristic(charUUID_2); if(connectCharacteristic(pRemoteService, pRemoteChar_1) == false) connected = false; else if(connectCharacteristic(pRemoteService, pRemoteChar_2) == false) connected = false; if(connected == false) { pClient-> disconnect(); Serial.println("At least one characteristic UUID not found"); return false; } return true; } // Function to chech Characteristic bool connectCharacteristic(BLERemoteService* pRemoteService, BLERemoteCharacteristic* l_BLERemoteChar) { // Obtain a reference to the characteristic in the service of the remote BLE server. if (l_BLERemoteChar == nullptr) { Serial.print("Failed to find one of the characteristics"); Serial.print(l_BLERemoteChar->getUUID().toString().c_str()); return false; } Serial.println(" - Found characteristic: " + String(l_BLERemoteChar->getUUID().toString().c_str())); if(l_BLERemoteChar->canNotify()) l_BLERemoteChar->registerForNotify(notifyCallback); return true; } // Scan for BLE servers and find the first one that advertises the service we are looking for. class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks { //Called for each advertising BLE server. void onResult(BLEAdvertisedDevice advertisedDevice) { Serial.print("BLE Advertised Device found: "); Serial.println(advertisedDevice.toString().c_str()); // We have found a device, let us now see if it contains the service we are looking for. if (advertisedDevice.haveServiceUUID() && advertisedDevice.isAdvertisingService(serviceUUID)) { BLEDevice::getScan()->stop(); myDevice = new BLEAdvertisedDevice(advertisedDevice); doConnect = true; doScan = true; } // Found our server } // onResult }; // MyAdvertisedDeviceCallbacks void setup() { Serial.begin(115200); Serial.println("Starting Arduino BLE Client application..."); BLEDevice::init(""); pinMode(motorIA, OUTPUT); pinMode(motorIA2, OUTPUT); pinMode(motorIB, OUTPUT); pinMode(motorIB2, OUTPUT); pinMode(motorDA, OUTPUT); pinMode(motorDA2, OUTPUT); pinMode(motorDB, OUTPUT); pinMode(motorDB2, OUTPUT); pinMode(LED1, OUTPUT); pinMode(LED2, OUTPUT); digitalWrite(LED1, HIGH); digitalWrite(LED2, HIGH); // Retrieve a Scanner and set the callback we want to use to be informed when we // have detected a new device. Specify that we want active scanning and start the // scan to run for 5 seconds. BLEScan* pBLEScan = BLEDevice::getScan(); pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks()); pBLEScan->setInterval(1349); pBLEScan->setWindow(449); pBLEScan->setActiveScan(true); pBLEScan->start(5, false); } // End of setup. void loop() { // If the flag "doConnect" is true then we have scanned for and found the desired // BLE Server with which we wish to connect. Now we connect to it. Once we are // connected we set the connected flag to be true. if (doConnect == true) { if (connectToServer()) { Serial.println("We are now connected to the BLE Server."); } else { Serial.println("We have failed to connect to the server; there is nothin more we will do."); } doConnect = false; } // If we are connected to a peer BLE Server, update the characteristic each time we are reached // with the current time since boot. if (connected) { String rxValue = pRemoteChar_2->readValue(); if (rxValue == "S"){ Serial.println("Estatico"); analogWrite(motorDB, 0); analogWrite(motorDA, 0); analogWrite(motorIB, 0); analogWrite(motorIA, 0); analogWrite(motorDB2, 0); analogWrite(motorDA2, 0); analogWrite(motorIB2, 0); analogWrite(motorIA2, 0); } if (rxValue == "F"){ Serial.println("Frente"); analogWrite(motorDB2, 100); analogWrite(motorDA2, 100); analogWrite(motorIB2, 100); analogWrite(motorIA2, 100); } if (rxValue == "B"){ Serial.println("Atras"); analogWrite(motorDB, 100); analogWrite(motorDA, 100); analogWrite(motorIB, 100); analogWrite(motorIA, 100); } if (rxValue == "D"){ Serial.println("Derecha"); analogWrite(motorDB, 100); analogWrite(motorDA2, 100); analogWrite(motorIB2, 100); analogWrite(motorIA, 100); } if (rxValue == "I"){ Serial.println("Izquierda"); analogWrite(motorDB2, 100); analogWrite(motorDA, 100); analogWrite(motorIB, 100); analogWrite(motorIA2, 100); } if (rxValue == "RD"){ Serial.println("Rotar derecha"); analogWrite(motorDB, 100); analogWrite(motorDA, 100); analogWrite(motorIB2, 100); analogWrite(motorIA2, 100); } if (rxValue == "RI"){ Serial.println("Rotar izquierda"); analogWrite(motorDB2, 100); analogWrite(motorDA2, 100); analogWrite(motorIB, 100); analogWrite(motorIA, 100); } }else if(doScan){ BLEDevice::getScan()->start(0); // this is just example to start scan after disconnect, most likely there is better way to do it in arduino } // In this example "delay" is used to delay with one second. This is of course a very basic // implementation to keep things simple. I recommend to use millis() for any production code delay(50); }