ESP32 bluetooth - dane z licznika energii

Masz problem z Arduino? Tutaj możesz szukać pomocy.
ODPOWIEDZ
Awatar użytkownika
globalinfo
Majsterkowicz
Posty: 78
Rejestracja: 30 sie 2014, 19:25

ESP32 bluetooth - dane z licznika energii

Post autor: globalinfo » 26 lut 2021, 10:25

Witam,
Kupiłem licznik energii który posiada bluetooth.
Chciałbym pobrać z niego dane co 1 minutę (napięcie, prad, moc).
Za pomocą przykładu z tej strony https://circuitdigest.com/microcontroll ... gger-light udał mi się preparing z licznikiem (zdjęcie z aktywnym połączeniem bluetootch).
ESP32 BLE Server program
Scan Result: Name: AT24CB-BLE, Address: 47:71:f7:a7:14:f2, manufacturer data: e23788a04771f7a614f2, serviceUUID: 0000ffe0-0000-1000-8000-00805f9b34fb
Scan Result: Name: AT24CB-BLE, Address: 47:71:f7:a7:25:93, manufacturer data: 850488a04771f7a62593, serviceUUID: 0000ffe0-0000-1000-8000-00805f9b34fb
Scan Result: Name: Mi Smart Band 4, Address: f7:51:6c:f6:b9:ae, manufacturer data: 570102ffffffffffffffffffffffffffffffff03f7516cf6b9ae, serviceUUID: 0000fee0-0000-1000-8000-00805f9b34fb
Scan Result: Name: S20, Address: dc:16:70:12:c1:99, manufacturer data: f0ffdc167012c199, serviceUUID: 0000fee7-0000-1000-8000-00805f9b34fb
We have some other BLe device in range
Scan Result: Name: , Address: 47:71:f7:a7:14:f2, manufacturer data: e23788a04771f7a614f2, serviceUUID: 0000ffe0-0000-1000-8000-00805f9b34fb
Scan Result: Name: , Address: 47:71:f7:a7:25:93, manufacturer data: 850488a04771f7a62593, serviceUUID: 0000ffe0-0000-1000-8000-00805f9b34fb
Scan Result: Name: , Address: f7:51:6c:f6:b9:ae, manufacturer data: 570102ffffffffffffffffffffffffffffffff03f7516cf6b9ae
Scan Result: Name: S20, Address: dc:16:70:12:c1:99, manufacturer data: f0ffdc167012c199
Found Device :-)... connecting to Server as client
- Created client
- Connected to AT24CB-BLE
- Found our service
Preparing udany
Scan Result: Name: , Address: 47:71:f7:a7:25:93, manufacturer data: 850488a04771f7a62593, serviceUUID: 0000ffe0-0000-1000-8000-00805f9b34fb
Scan Result: Name: S20, Address: dc:16:70:12:c1:99, manufacturer data: f0ffdc167012c199
We have some other BLe device in range
Zalazłem stronę gdzie jest udostępniony protokół komunikacji - https://github.com/NiceLabs/atorch-cons ... -design.md i nie bardzo wiem co dodać do programu aby licznik wysyłał dane które potrzebuję.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

Co miesiąc do wygrania nagrody o wartości ponad 1600 zł!


uzi18
Majsterkowicz
Posty: 152
Rejestracja: 10 maja 2018, 05:06

Re: ESP32 bluetooth - dane z licznika energii

Post autor: uzi18 » 27 lut 2021, 00:01

Na samym dole masz przyklad komendy i wyliczania sumy kontrolnej

Wysłane z mojego Mi Note 10 przy użyciu Tapatalka

Awatar użytkownika
globalinfo
Majsterkowicz
Posty: 78
Rejestracja: 30 sie 2014, 19:25

Re: ESP32 bluetooth - dane z licznika energii

Post autor: globalinfo » 27 lut 2021, 13:07

W którym miejscu to wstawić do programu, dopiero zaczynam z ESP32.
uzi18
Majsterkowicz
Posty: 152
Rejestracja: 10 maja 2018, 05:06

Re: ESP32 bluetooth - dane z licznika energii

Post autor: uzi18 » 27 lut 2021, 19:14

Przyklad jest chyba dla jezyka python

Wysłane z mojego Mi Note 10 przy użyciu Tapatalka

Awatar użytkownika
globalinfo
Majsterkowicz
Posty: 78
Rejestracja: 30 sie 2014, 19:25

Re: ESP32 bluetooth - dane z licznika energii

Post autor: globalinfo » 28 lut 2021, 11:09

Jak to zaadoptować do Arduino IDE?
uzi18
Majsterkowicz
Posty: 152
Rejestracja: 10 maja 2018, 05:06

Re: ESP32 bluetooth - dane z licznika energii

Post autor: uzi18 » 28 lut 2021, 12:35

Trzeba poczytac czy api esp32 pozwala na takie rzeczy i napisać do tego odpowiedni program :)

Wysłane z mojego Mi Note 10 przy użyciu Tapatalka

Awatar użytkownika
globalinfo
Majsterkowicz
Posty: 78
Rejestracja: 30 sie 2014, 19:25

Re: ESP32 bluetooth - dane z licznika energii

Post autor: globalinfo » 2 mar 2021, 21:33

No to mi się udało
Searching for AT24CB-BLE device
. Found!
Stopping scan and connecting to AT24CB-BLE
Stablishing communications with scale:
BLE client created
Connected to scale
Service found
Characteristic found
Setting callback for notify / indicate
Data bytes: 255 85 1 1 0 9 68 0 0 144 0 0 137 0 0 0 18 0 5 20 253 63 0 0 0 0 0 0 0 0 158 138 17 128 144 3
Wartości pobrane:
- Napięcie : 237.2
- Natężenie : 0.144
- Moc : 13.7
...
Data bytes: 255 85 1 1 0 9 68 0 0 143 0 0 136 0 0 0 18 0 5 20 253 63 0 0 0 0 0 0 0 0 158 138 17 128 144 3
Wartości pobrane:
- Napięcie : 237.2
- Natężenie : 0.143
- Moc : 13.6
...
Data bytes: 255 85 1 1 0 9 68 0 0 143 0 0 136 0 0 0 18 0 5 20 253 63 0 0 0 0 0 0 0 0 158 138 17 128 144 3
Wartości pobrane:
- Napięcie : 237.2
- Natężenie : 0.143
- Moc : 13.6
...
Tyko mam pytanie jak mogę wybrać właściwy licznik - mam dwa
Advertised Device: Name: AT24CB-BLE, manufacturer data: e23788a04771f7a614f2, serviceUUID: 0000ffe0-0000-1000-8000-00805f9b34fb
Advertised Device: Name: AT24CB-BLE, manufacturer data: 850488a04771f7a62593, serviceUUID: 0000ffe0-0000-1000-8000-00805f9b34fb
i teraz łączy mi się z pierwszym szybszym a po wyłączeniu zasilania w pierwszym łączy się z drugim.
I mam pytanie czy mogę się połączyć z dwoma przez jedno esp32?
uzi18
Majsterkowicz
Posty: 152
Rejestracja: 10 maja 2018, 05:06

Re: ESP32 bluetooth - dane z licznika energii

Post autor: uzi18 » 3 mar 2021, 06:03

Mozesz je probowac rozpoznawac po manufacturer data

Komunikacja z jednym i drugim na raz nie powinna byc problemem

Wysłane z mojego Mi Note 10 przy użyciu Tapatalka


Awatar użytkownika
globalinfo
Majsterkowicz
Posty: 78
Rejestracja: 30 sie 2014, 19:25

Re: ESP32 bluetooth - dane z licznika energii

Post autor: globalinfo » 3 mar 2021, 10:10

Możesz podpowiedzieć jak to ująć w programie na Arduino IDE.
Awatar użytkownika
globalinfo
Majsterkowicz
Posty: 78
Rejestracja: 30 sie 2014, 19:25

Re: ESP32 bluetooth - dane z licznika energii

Post autor: globalinfo » 11 mar 2021, 19:58

Teraz pobieram dane łącząc się do licznika o określonym adresie MAC.

Kod: Zaznacz cały

if((advertisedDevice.getName() == "AT24CB-BLE") && (adres == BLE_Address1))
Po zmianie na

Kod: Zaznacz cały

 (adres == BLE_Address2)
łączę się z drugim licznikiem.
Teraz bym chciał pobierać dane z obydwóch liczników przez jedno ESP32.
Możecie podpowiedzieć.
Z góry dziękuję.

Kod: Zaznacz cały

#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);
}
Za pomocą poniższego programu udaje mi się połączyć z dwoma licznikami, ale nie wiem jak odczytać dane wysyłane przez liczniki.
Starting Arduino BLE Client application...
connect to 47:71:f7:a7:25:93
device: Name: AT24CB-BLE, Address: 47:71:f7:a7:25:93, manufacturer data: 850488a04771f7a62593, serviceUUID: 0000ffe0-0000-1000-8000-00805f9b34fb
forming a connection to device 47:71:f7:a7:25:93
ble created client
onConnect
device connected: 47:71:f7:a7:25:93
connected to ble server
connect to 47:71:f7:a7:14:f2
device: Name: AT24CB-BLE, Address: 47:71:f7:a7:14:f2, manufacturer data: e23788a04771f7a614f2, serviceUUID: 0000ffe0-0000-1000-8000-00805f9b34fb
forming a connection to device 47:71:f7:a7:14:f2
ble created client
onConnect
device connected: 47:71:f7:a7:14:f2
connected to ble server

Kod: Zaznacz cały

#include "BLEDevice.h"
static BLEAddress connAddr = BLEAddress("00:00:00:00:00:00");
static BLEScan* pBLEScan;

static unsigned long ms;
static unsigned long lastms = 0;
static unsigned long interval = 10000;
static boolean doConnect = false;

class MyClientCallback : public BLEClientCallbacks {
  void onConnect(BLEClient* pClient) {
    Serial.println("onConnect");
    Serial.printf("device connected: %s\n", pClient->getPeerAddress().toString().c_str());
  }
  void onDisconnect(BLEClient* pClient) {
    Serial.println("onDisconnect");
    Serial.printf("device disconnected: %s\n", pClient->getPeerAddress().toString().c_str());
  }
};

bool connectToServer() {
  Serial.printf("forming a connection to device %s\n", connAddr.toString().c_str());
  BLEClient* pClient = BLEDevice::createClient();
  Serial.println("ble created client");
  pClient->setClientCallbacks(new MyClientCallback());
  if (pClient->connect(connAddr)) {
    Serial.println("connected to ble server");
  }
  else {
    Serial.println("unable to connect to ble server");
  }
  doConnect = false;
}

class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks {
  void onResult(BLEAdvertisedDevice advertisedDevice) {
    if (advertisedDevice.getAddress().equals(deviceAddr1) || advertisedDevice.getAddress().equals(deviceAddr2)) { // advertisedDevice.haveServiceUUID() && advertisedDevice.isAdvertisingService(serviceUUID)) {
      Serial.printf("connect to %s \n", advertisedDevice.getAddress().toString().c_str());
      Serial.printf("device: %s\n", advertisedDevice.toString().c_str());
      pBLEScan->stop();
      connAddr = advertisedDevice.getAddress();
      doConnect = true;
    }
  }
};

void setup() {  
  Serial.begin(115200);
  Serial.println("Starting Arduino BLE Client application...");
  BLEDevice::init("");

  pBLEScan = BLEDevice::getScan();
  pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks());
  pBLEScan->setInterval(1349);
  pBLEScan->setWindow(449);
  pBLEScan->setActiveScan(true);
}

void loop() {
  if (doConnect) {
    connectToServer();

    
  }
  ms = millis();
  if (ms >= lastms + interval) {
    pBLEScan->start(5, false);
  }
  delay(1000);
}
ODPOWIEDZ

Strony partnerskie: