BLE and ESP NOW
Posted: Tue Jan 29, 2019 12:11 am
Hi Everybody,
I am working in a project using BLE and ESP now.
But the sketch is big and overflow the memory.
El Sketch usa 1422010 bytes (108%) del espacio de almacenamiento de programa. El máximo es 1310720 bytes.
Las variables Globales usan 79268 bytes (24%) de la memoria dinámica, dejando 248412 bytes para las variables locales. El máximo es 327680 bytes.
I like to know if there is a way to optimize the sketch.
I hope you can help me. Thanks.
Here is the sketch:
I am working in a project using BLE and ESP now.
But the sketch is big and overflow the memory.
El Sketch usa 1422010 bytes (108%) del espacio de almacenamiento de programa. El máximo es 1310720 bytes.
Las variables Globales usan 79268 bytes (24%) de la memoria dinámica, dejando 248412 bytes para las variables locales. El máximo es 327680 bytes.
I like to know if there is a way to optimize the sketch.
I hope you can help me. Thanks.
Here is the sketch:
- #include <BLEDevice.h>
- #include <BLEUtils.h>
- #include <BLEServer.h>
- #include <esp_now.h>
- #include <WiFi.h>
- // Global copy of slave
- #define NUMSLAVES 20
- esp_now_peer_info_t slaves[NUMSLAVES] = {};
- int SlaveCnt = 0;
- #define CHANNEL 3
- #define PRINTSCANRESULTS 0
- // See the following for generating UUIDs:
- // https://www.uuidgenerator.net/
- #define SERVICE_UUID "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
- #define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"
- //GPIO
- const int ADCPin = 36;
- //Variables
- int valor;
- int val_pwm;
- char contador = 0;
- // Init ESP Now with fallback
- void InitESPNow() {
- WiFi.disconnect();
- if (esp_now_init() == ESP_OK) {
- Serial.println("ESPNow Init Success");
- }
- else {
- Serial.println("ESPNow Init Failed");
- // Retry InitESPNow, add a counte and then restart?
- // InitESPNow();
- // or Simply Restart
- ESP.restart();
- }
- }
- // Scan for slaves in AP mode
- void ScanForSlave() {
- int8_t scanResults = WiFi.scanNetworks();
- //reset slaves
- memset(slaves, 0, sizeof(slaves));
- SlaveCnt = 0;
- Serial.println("");
- if (scanResults == 0) {
- Serial.println("No WiFi devices in AP Mode found");
- } else {
- Serial.print("Found "); Serial.print(scanResults); Serial.println(" devices ");
- for (int i = 0; i < scanResults; ++i) {
- // Print SSID and RSSI for each device found
- String SSID = WiFi.SSID(i);
- int32_t RSSI = WiFi.RSSI(i);
- String BSSIDstr = WiFi.BSSIDstr(i);
- if (PRINTSCANRESULTS) {
- Serial.print(i + 1); Serial.print(": "); Serial.print(SSID); Serial.print(" ["); Serial.print(BSSIDstr); Serial.print("]"); Serial.print(" ("); Serial.print(RSSI); Serial.print(")"); Serial.println("");
- }
- delay(10);
- // Check if the current device starts with `Slave`
- if (SSID.indexOf("Slave") == 0) {
- // SSID of interest
- Serial.print(i + 1); Serial.print(": "); Serial.print(SSID); Serial.print(" ["); Serial.print(BSSIDstr); Serial.print("]"); Serial.print(" ("); Serial.print(RSSI); Serial.print(")"); Serial.println("");
- // Get BSSID => Mac Address of the Slave
- int mac[6];
- if ( 6 == sscanf(BSSIDstr.c_str(), "%x:%x:%x:%x:%x:%x%c", &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5] ) ) {
- for (int ii = 0; ii < 6; ++ii ) {
- slaves[SlaveCnt].peer_addr[ii] = (uint8_t) mac[ii];
- }
- }
- slaves[SlaveCnt].channel = CHANNEL; // pick a channel
- slaves[SlaveCnt].encrypt = 0; // no encryption
- SlaveCnt++;
- }
- }
- }
- if (SlaveCnt > 0) {
- Serial.print(SlaveCnt); Serial.println(" Slave(s) found, processing..");
- } else {
- Serial.println("No Slave Found, trying again.");
- }
- // clean up ram
- WiFi.scanDelete();
- }
- // Check if the slave is already paired with the master.
- // If not, pair the slave with master
- void manageSlave() {
- if (SlaveCnt > 0) {
- for (int i = 0; i < SlaveCnt; i++) {
- const esp_now_peer_info_t *peer = &slaves[i];
- const uint8_t *peer_addr = slaves[i].peer_addr;
- Serial.print("Processing: ");
- for (int ii = 0; ii < 6; ++ii ) {
- Serial.print((uint8_t) slaves[i].peer_addr[ii], HEX);
- if (ii != 5) Serial.print(":");
- }
- Serial.print(" Status: ");
- // check if the peer exists
- bool exists = esp_now_is_peer_exist(peer_addr);
- if (exists) {
- // Slave already paired.
- Serial.println("Already Paired");
- } else {
- // Slave not paired, attempt pair
- esp_err_t addStatus = esp_now_add_peer(peer);
- if (addStatus == ESP_OK) {
- // Pair success
- Serial.println("Pair success");
- } else if (addStatus == ESP_ERR_ESPNOW_NOT_INIT) {
- // How did we get so far!!
- Serial.println("ESPNOW Not Init");
- } else if (addStatus == ESP_ERR_ESPNOW_ARG) {
- Serial.println("Add Peer - Invalid Argument");
- } else if (addStatus == ESP_ERR_ESPNOW_FULL) {
- Serial.println("Peer list full");
- } else if (addStatus == ESP_ERR_ESPNOW_NO_MEM) {
- Serial.println("Out of memory");
- } else if (addStatus == ESP_ERR_ESPNOW_EXIST) {
- Serial.println("Peer Exists");
- } else {
- Serial.println("Not sure what happened");
- }
- delay(100);
- }
- }
- } else {
- // No slave found to process
- Serial.println("No Slave found to process");
- }
- }
- uint8_t data = 0;
- // send data
- void sendData() {
- for (int i = 0; i < SlaveCnt; i++) {
- const uint8_t *peer_addr = slaves[i].peer_addr;
- if (i == 0) { // print only for first slave
- Serial.print("Sending: ");
- Serial.println(data);
- }
- esp_err_t result = esp_now_send(peer_addr, &data, sizeof(data));
- Serial.print("Send Status: ");
- if (result == ESP_OK) {
- Serial.println("Success");
- } else if (result == ESP_ERR_ESPNOW_NOT_INIT) {
- // How did we get so far!!
- Serial.println("ESPNOW not Init.");
- } else if (result == ESP_ERR_ESPNOW_ARG) {
- Serial.println("Invalid Argument");
- } else if (result == ESP_ERR_ESPNOW_INTERNAL) {
- Serial.println("Internal Error");
- } else if (result == ESP_ERR_ESPNOW_NO_MEM) {
- Serial.println("ESP_ERR_ESPNOW_NO_MEM");
- } else if (result == ESP_ERR_ESPNOW_NOT_FOUND) {
- Serial.println("Peer not found.");
- } else {
- Serial.println("Not sure what happened");
- }
- delay(100);
- }
- }
- // callback when data is sent from Master to Slave
- void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) {
- char macStr[18];
- snprintf(macStr, sizeof(macStr), "%02x:%02x:%02x:%02x:%02x:%02x",
- mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]);
- Serial.print("Last Packet Sent to: "); Serial.println(macStr);
- Serial.print("Last Packet Send Status: "); Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Delivery Success" : "Delivery Fail");
- }
- void setup() {
- Serial.begin(115200);
- //Set device in STA mode to begin with
- WiFi.mode(WIFI_STA);
- Serial.println("ESPNow/Multi-Slave/Master Example");
- // This is the mac address of the Master in Station Mode
- Serial.print("STA MAC: "); Serial.println(WiFi.macAddress());
- // Init ESPNow with a fallback logic
- InitESPNow();
- // Once ESPNow is successfully Init, we will register for Send CB to
- // get the status of Trasnmitted packet
- esp_now_register_send_cb(OnDataSent);
- //BLE
- BLEDevice::init("MyESP32");
- BLEServer *pServer = BLEDevice::createServer();
- BLEService *pService = pServer->createService(SERVICE_UUID);
- BLECharacteristic *pCharacteristic = pService->createCharacteristic(
- CHARACTERISTIC_UUID,
- BLECharacteristic::PROPERTY_READ |
- BLECharacteristic::PROPERTY_WRITE
- );
- pCharacteristic->setValue("Hello World says Neil");
- pService->start();
- BLEAdvertising *pAdvertising = pServer->getAdvertising();
- pAdvertising->start();
- Serial.println("Characteristic defined! Now you can read it in your phone!");
- }
- void loop() {
- if (contador < 5){
- // In the loop we scan for slave
- ScanForSlave();
- contador++;
- // If Slave is found, it would be populate in `slave` variable
- // We will check if `slave` is defined and then we proceed further
- if (SlaveCnt > 0) { // check if slave channel is defined
- // `slave` is defined
- // Add slave as peer if it has not been added already
- manageSlave();
- // pair success or already paired
- // Send data to device
- valor = analogRead(ADCPin);
- data = map(valor, 0, 4095, 0, 255);
- sendData();
- } else {
- // No slave found to process
- }
- }
- else {
- valor = analogRead(ADCPin);
- data = map(valor, 0, 4095, 0, 255);
- sendData();
- }
- // wait for 3seconds to run the logic again
- //delay(300);
- }