12-03-2021, 12:22
Witam,
Za pomocą poniższego kodu łączę się z licznikami energii w zależności od podanego adresu MAC.
Łączę się bez problemu po zmianie
Nie wiem jak połączyć się z dwoma licznikami i otrzymać z nich dane.
Z góry dziękuję za podpowiedź.
Za pomocą poniższego kodu łączę się z licznikami energii w zależności od podanego adresu MAC.
Kod:
#include "BLEDevice.h"
static BLEUUID srvUUID("0000ffe0-0000-1000-8000-00805f9b34fb");
static BLEUUID chrUUID("0000FFE1-0000-1000-8000-00805F9B34FB");
String BLE_Address1 = "47:71:f7:a7:25:93"; // adresy MAC
String BLE_Address2 = "47:71:f7:a7:14:f2";
static BLEAddress *Server_BLE_Address;
static BLEAdvertisedDevice* scale;
static BLERemoteCharacteristic* remoteChr;
static boolean doConnect = false;
static boolean connected = false;
static int year = 0;
static void chrCB(BLERemoteCharacteristic* remoteChr, uint8_t* pData, size_t length, bool isNotify) {
double spr = 0;
spr = (pData[0]);
if (spr == 255) {
Serial.print("Data bytes: ");
for(int i =0; i< length; i++){
Serial.print(pData[i]);
Serial.print(" ");
}
Serial.println(" ");
double dana1 = 0;
dana1 = (((pData[5]*256) + pData[6]+ pData[7]) ) ;
dana1 = dana1/10;
double dana2 = 0;
dana2 = (((pData[8]*256) + pData[9]+ pData[10]) ) ;
dana2 = dana2/1000;
double dana3 = 0;
dana3 = (((pData[11]*256) + pData[12]+ pData[13]) ) ;
dana3 = dana3/10;
Serial.println("Wartości pobrane: ");
Serial.print(" - ");
Serial.print("Napięcie : ");
Serial.println(dana1,1);
Serial.print(" - ");
Serial.print("Natężenie : ");
//Serial.print("dana2: ");
Serial.println(dana2,3);
Serial.print(" - ");
Serial.print("Moc : ");
//Serial.print("dana3: ");
Serial.println(dana3,1);
Serial.println(" ... ");
}
}
class deviceCB: public BLEAdvertisedDeviceCallbacks {
void onResult(BLEAdvertisedDevice advertisedDevice) {
if (advertisedDevice.haveServiceUUID() && advertisedDevice.isAdvertisingService(srvUUID)) {
String adres = (advertisedDevice.getAddress().toString().c_str());
if((advertisedDevice.getName() == "AT24CB-BLE") && (adres == BLE_Address1)){
Serial.println(" Wykryto");
BLEDevice::getScan()->stop();
Serial.print("Zatrzymano skanowanie i podłączono do AT24CB-BLE: ");
Serial.println(adres);
scale = new BLEAdvertisedDevice(advertisedDevice);
doConnect = true;
} else {
Serial.print(".");
}
} else {
Serial.print(".");
}
}
};
class ClientCB : public BLEClientCallbacks {
void onConnect(BLEClient* pclient) {
}
void onDisconnect(BLEClient* pclient) {
Serial.println("Disconnected. Reconnecting...");
connected = false;
}
};
bool connectToScale() {
Serial.println("Stablishing communications with scale:");
BLEClient* pClient = BLEDevice::createClient();
Serial.println(" BLE client created");
pClient->setClientCallbacks(new ClientCB());
pClient->connect(scale);
Serial.println(" Connected to scale");
BLERemoteService* pRemoteService = pClient->getService(srvUUID);
if (pRemoteService == nullptr) {
Serial.println(" Error: Failed to find service");
pClient->disconnect();
return false;
}
Serial.println(" Service found");
remoteChr = pRemoteService->getCharacteristic(chrUUID);
if (remoteChr == nullptr) {
Serial.print(" Failed to find characteristic");
pClient->disconnect();
return false;
}
Serial.println(" Characteristic found");
Serial.println(" Setting callback for notify / indicate");
remoteChr->registerForNotify(chrCB);
return true;
}
void setup() {
Serial.begin(115200);
Serial.println("Searching for AT24CB-BLE device");
delay(1000);
BLEDevice::init("");
BLEScan* pBLEScan = BLEDevice::getScan();
pBLEScan->setAdvertisedDeviceCallbacks(new deviceCB());
pBLEScan->setInterval(1349);
pBLEScan->setWindow(449);
pBLEScan->setActiveScan(true);
pBLEScan->start(5, false);
}
void loop() {
if(doConnect && !connected){
connected = connectToScale();
}
delay(1000);
}
Cytat:BLE_Address1 na BLE_Address2w tym miejscu
Kod:
if((advertisedDevice.getName() == "AT24CB-BLE") && (adres == BLE_Address1)){
Z góry dziękuję za podpowiedź.