Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ble taking too much power (IDFGH-769) #947

Open
joicetm opened this issue Aug 31, 2017 · 64 comments
Open

ble taking too much power (IDFGH-769) #947

joicetm opened this issue Aug 31, 2017 · 64 comments

Comments

@joicetm
Copy link

@joicetm joicetm commented Aug 31, 2017

Hi,
I wish to know when can i expect the low power modes in ble? would this feature be added in the next release v3.0?
currently i observe that with single core and 80 Mhz, the device consumes around 80-90 mA.[minimum i was able to achieve]
is it the best we can achieve ? or is there any way to improve the power consumption with current idf version?

@MS-elug
Copy link

@MS-elug MS-elug commented Aug 31, 2017

I have the same issue. Even running the demo heats the chips a lot.
Would be good to have a fix or a demo showing how to create a very low powered BT server.

@FayeY FayeY changed the title ble taking too much power [TW#15167] ble taking too much power Sep 5, 2017
@igrr
Copy link
Member

@igrr igrr commented Sep 7, 2017

@joicetm BLE power consumption improvements (i.e. modem sleep mode) are not planned for 3.0. 80-90mA is the best that can be achieved in the current version.

@MS-elug
Copy link

@MS-elug MS-elug commented Sep 8, 2017

Do you know what is the release target for the modem sleep mode ? Where can we find the project roadmap and estimate dates?

@mobilinkd
Copy link

@mobilinkd mobilinkd commented Oct 10, 2017

This is an important issue for me. I would be using the ESP32 in my project right now if I could run the ble_spp_server demo using less than 10mA.

@Yulong-espressif
Copy link
Contributor

@Yulong-espressif Yulong-espressif commented Oct 16, 2017

@MS-elug @mobilinkd The BLE modem sleep will be release at the next version(v3.1), thank you for your concern about ESP32.

@mobilinkd
Copy link

@mobilinkd mobilinkd commented Oct 17, 2017

That's great news, @Yulong-espressif ! Are you able to characterize the current consumption with this enhancement?

@PromTZ
Copy link

@PromTZ PromTZ commented Dec 7, 2017

Hi, I am using ESP-WROOM-32 with Arduino IDE. I want to know is there any way to reduce power consumption of BLE peripheral? I made a test on power consumption during BLE advertising which was consuming 112mA current when CPU set at 80Mhz. I want to reduce the current consumption to at least 1mA but BLE should keep on advertise. Please help me in this regards.

@devKlausS
Copy link

@devKlausS devKlausS commented Jan 12, 2018

@Yulong-espressif can you tell us a release date for BLE modem sleep (version 3.1)? Moreover I would be interested in the current consumption in BLE modem sleep mode. We are planning to develop a low power product, therefore the current consumption is the most critical part of the project.

@sargun
Copy link

@sargun sargun commented Jan 20, 2018

@Yulong-espressif Is BLE wakeup going to be in the next version?

@Yulong-espressif
Copy link
Contributor

@Yulong-espressif Yulong-espressif commented Jan 22, 2018

@sargun Yes, will be release in the version 3.1

@TianHao-Yoursmake
Copy link

@TianHao-Yoursmake TianHao-Yoursmake commented Apr 3, 2018

Actually, both BR/EDR and BLE power save will be released in release/v3.1.

@joicetm
Copy link
Author

@joicetm joicetm commented Apr 3, 2018

Thanks for the update, TianHao-Espressif .

@frax84
Copy link

@frax84 frax84 commented May 22, 2018

Features has been implemented few days ago. I tried it and it works. With the exactly same features (time interval=50ms, 15B per packet, notify enabled) power consumption passed from 102mA to 35-40mA. Data exchange is not fluid ad before, but don't know the cause.

@TianHao-Yoursmake
Copy link

@TianHao-Yoursmake TianHao-Yoursmake commented May 24, 2018

@frax84 , the BLE/BR/EDR sleep current and related performance is in test.
But, due to the Bluetooth RF is shared with WIFI, so the average current will not be very low as single BLE IC.

And what "not fluid" present. Could you provide your test case?

@frax84
Copy link

@frax84 frax84 commented May 24, 2018

@TianHao-Espressif Hi Tiao! Actually was not a complain but was just informing the others in this post. By the way, your explanation is very interesting. This is my use case:

  • GATT server (no security)
  • connection interval = 50ms (min 40 - max 60ms)
  • no latency
  • Payload = 15Bytes
  • Data are all notified
  • Antenna power set default
  • The consumption i wrote about is not only esp32. I'm using esp32thing from Sparkfun with no mod (i.e. leds still on the board)
  • in SDK i configured optimization for BLE (default was "balanced")

With the term "no fluid" i mean that while before (was using BLE with BTDM mode) data were coming evenly time-spaced ("1-2-3-4-5-6-7-8-9-10") now they tend to come less evenly spaced (i.e. "1-2---34--5-6-7--8---9-10"). I have not test data to show but what i'm saying is clearly visible with eye (while with previous settings it was ok)

I have two questions.

  1. Is it possibile to completely disable WiFi in SDKconfig.h?
  2. If yes, would this " disabling" would give any consumption improvements?

Thank you

EDIT: edited some typos and added more infos about my use case

@lucashutchinson
Copy link
Contributor

@lucashutchinson lucashutchinson commented Nov 6, 2018

Hi All,

I have been optimising our ESP32 application for low power at the moment.
I have eliminated a few power hogs in our code and incorrect configurations however i am running into a wall with bluetooth enabled.

The lowest consumption with BLE enabled (BT-classic disabled) is around 28-32mA when advertising with a 200ms interval
In the same application if BLE is not initialised, the power consumption drops to around 3.2mA.

Im just wondering if i am at the limit of what the ESP32 can currently do.
And if this is the case, is there any planned work to improve this during BLE-only modes?

I understand that as this chip supports BLE and WiFi the power consumption during transmit and Reception will be higher than a BLE only chip. However since BLE operates on the connection interval paradigm, if there is a 40ms connection interval or a 200ms advertising interval, surely the radio could be disabled between connection intervals saving power during these periods? This would likely result in a much lower average current.

Thanks in advance for your response.
@TianHao-Espressif @projectgus

@chegewara
Copy link
Contributor

@chegewara chegewara commented Nov 6, 2018

@lucashutchinson Did you try to change TX power? By default it is setup pretty high (+3dBm).

Remember that you can decrease TX power for advertising only if you want.

@Weijian-Espressif
Copy link
Collaborator

@Weijian-Espressif Weijian-Espressif commented Nov 7, 2018

hi all:
Please confirm if bluetooth mode sleep is enabled in menuconfig.
Location: Component config -> Bluetooth -> Bluetooth controller -> MODEM SLEEP Options

@lucashutchinson
Copy link
Contributor

@lucashutchinson lucashutchinson commented Nov 7, 2018

Hi @chegewara @Weijian-Espressif

Yes I have tried changing the TX power between N12 and P9, no real difference was noticed. however i am going to do a few more tests.

I have enable bluetooth modem sleep options, and have tried both ORIG and EVED modes.
I have also enabled power saving in Component config -> Power Management
and also enable tickless idle in Component config -> FreeRTOS -> Tickless Idle

I have also called the functions:
esp_pm_configure and esp_bt_sleep_enable.
I have also tried a few different configurations for the esp_pm_configure, i do see a difference when changing the max processor speed from 240mhz to 80mhz.
the current values i mentioned above were @ 80mhz. when running at 240mhz I see around 50mA of current draw.

Do you have any internal test results of low power bluetooth that can be shared?

Thanks for your responses!

@mywang-espressif
Copy link

@mywang-espressif mywang-espressif commented Nov 7, 2018

@lucashutchinson . 30mA is in accord with our internal test result for BLE advertising in current stage. In order to further optimize the bluetooth power consumption, we are trying to resolve the issue in the combination use of bluetooth modem sleep and Dynamic Frequency Scaling(DFS) as well as Automatic light sleep. which can hopefully be completed in a month.
The reason that you get a 3.2mA current compared to 30mA when BLE is inititalized is, currently bluetooth module will acquire a pm_lock during initialization and won't release it until deinit, and therefore the CPU frequency cannot be decreased to lower than 80MHz. After the we have resolve the issue for BT modem sleep with DFS and light sleep, you can expect an even lower power consumption.

@Alvin1Zhang
Copy link
Collaborator

@Alvin1Zhang Alvin1Zhang commented Nov 19, 2018

@lucashutchinson Could you help share if any updates for this issue? Thanks.

1 similar comment
@Alvin1Zhang
Copy link
Collaborator

@Alvin1Zhang Alvin1Zhang commented Mar 15, 2019

@lucashutchinson Could you help share if any updates for this issue? Thanks.

@github-actions github-actions bot changed the title [TW#15167] ble taking too much power [TW#15167] ble taking too much power (IDFGH-769) Mar 15, 2019
@lucazader
Copy link

@lucazader lucazader commented Mar 15, 2019

There are no updates that I have had from espressif.

@projectgus projectgus changed the title [TW#15167] ble taking too much power (IDFGH-769) ble taking too much power (IDFGH-769) Mar 18, 2019
@mywang-espressif
Copy link

@mywang-espressif mywang-espressif commented Jun 10, 2019

Hi, a commit on optimization of Bluetooth power consumption was merged into ESP-IDF recently. The merge commit is(git describe --tag): v4.0-dev-684-gb859584. An external 32.768kHz crystal is required to take advantage of this feature.

Here is the description for this commit and a brief manual.

Feature: Bluetooth modem sleep with external 32.768kHz xtal under light sleep

Overview

Bluetooth modem sleep could work under DFS but could not work under light sleep in previous implementation, which is largely due to the sleep clock source. Sleep clock must provide enough accuracy for BLE to maintain time during sleep.

Main crystal is supposed to be powered down during light sleep. It can support DFS but not light sleep for Bluetooth modem sleep.
External 32kHz crystal as RTC clock, has good accuracy and can support both DFS and light sleep for Bluetooth modem sleep. Currently there is another hardware issue of External 32kHz crystal but it is supposed to be resolved in later chip version.
Other RTC clock sources, such as internal 150kHz oscillator or internal 8.5MHz oscillator, divided by 256 (8MD256 for short), do not provide enough accuracy as required by Bluetooth specification(worst-case BLE SCA is +/-500ppm, worst-case accuracy for Classic Bluetooth Low Power Oscillator(LPO) is +/-250ppm).

This patch resolves the issue that Bluetooth modem sleep is not allowed to work with light sleep with external 32kHz crystal. In this case a menuconfig option is provided to set the BLE SCA used to estimate RX window widening during connection events.

User guide

To use bluetooth modem sleep with light sleep, please follow the below instructions.

ESP-IDF menuconfig options:

  1. Enable Power Management:
    menuconfig ---> Component config ---> Power management --->
    [*] Support for power management

  2. Enable Tickless Idle:
    menuconfig ---> Component config ---> FreeRTOS --->
    [*] Tickless idle support
    (3) Minimum number of ticks to enter sleep mode for (NEW)

Note: Tickless idle needs to be enabled to allow automatic light sleep. FreeRTOS will enter light sleep if no tasks need to run
for 3(by default) ticks, that is 30ms if tick rate is 100Hz. Configure the FreeRTOS tick rate to be higher if you want to allow
shorter duration light sleep, for example:
menuconfig ---> Component config ---> FreeRTOS ->
(1000) Tick rate (Hz)

  1. Configure external 32.768Hz crystal as RTC clock source:
    menuconfig ---> Component config ---> ESP32-specific --->
    RTC clock source (External 32kHz crystal)
    [*] Additional current for external 32kHz crystal

Note that the "additional current" option is a workaround for a hardware issue on ESP32 that the crystal can fail in oscillating.
Please enable this option when you use external 32kHz crystal. This hardware issue will be resolved in the next ECO chip.

  1. Enable Bluetooth modem sleep with external 32.768kHz crystal as low power clock:
    menuconfig ---> Component config ---> Bluetooth ---> Bluetooth controller ---> MODEM SLEEP Options --->
    [*] Bluetooth modem sleep
    Bluetooth Modem sleep mode (ORIG mode(sleep with low power clock))
    Bluetooth low power clock (External 32kHz crystal)

Enable light sleep by calling power management API in application:

  1. In your application source code, to enable automatic light sleep, use power management API esp_pm_configure like this:
#include "esp_err.h"
#include "esp_pm.h"

    esp_pm_config_esp32_t pm_config = {
        .max_freq_mhz = EXAMPLE_MAX_CPU_FREQ_MHZ, // e.g. 80, 160, 240
        .min_freq_mhz = EXAMPLE_MIN_CPU_FREQ_MHZ, // e.g. 40
        .light_sleep_enable = true, // enable light sleep
    };
    ESP_ERROR_CHECK( esp_pm_configure(&pm_config) );

Test result

Below are some power consumption statistics on typical BLE use scenario:

  • MAX cpu frequency = 240MHz
    ADV(adv_interval = 1000.0ms) average current 3.05mA, max 149.34mA, min 0.71mA
    SCAN(scan_wiONndow = 500.0ms, scan_interval = 1000.0ms) average current 59.57mA, max 170.26mA, min 0.93mA
    CONNECTION(connection_interval = 960.0ms, slave_latency = 0) average current 2.07mA, max 152.28mA, min 0.81mA

  • MAX cpu frequency = 160MHz
    ADV(adv_interval = 1000.0ms) average current 2.51mA, max 139.34mA, min 0.78mA
    SCAN(scan_window = 500.0ms, scan_interval = 1000.0ms) average current 50.37mA, max 134.85mA, min 1.08mA
    CONNECTION(connection_interval = 960.0ms, slave_latency = 0) average current 2.05mA, max 121.69mA, min 1.11mA

  • MAX cpu frequency = 80MHz
    ADV(adv_interval = 1000.0ms) average current 2.55mA, max 114.81mA, min 0.79mA
    SCAN(scan_window = 500.0ms, scan_interval = 1000.0ms) average current 49.05mA, max 123.80mA, min 0.85mA
    CONNECTION(connection_interval = 960.0ms, slave_latency = 0) average current 2.11mA, max 106.01mA, min 0.94mA

@chegewara
Copy link
Contributor

@chegewara chegewara commented Jun 10, 2019

Hi @mywang-espressif
thanks for sharing this test results, good to know ble can finally works with light sleep.

Could you confirm some values? From what i see in some cases with MAX cpu frequency = 80MHz there is higher current draw than with MAX cpu frequency = 160MHz.
Also strange to me is this:

CONNECTION(connection_interval = 960.0ms, slave_latency = 0) average current 2.05mA, max 121.69mA, min 1.11mA

VS

CONNECTION(connection_interval = 960.0ms, slave_latency = 0) average current 2.11mA, max 106.01mA, min 0.94mA

Min and max values are lower, but average current draw is higher with 80MHz.

Anyway thanks for new feature and comprehensive update about it.

PS only what is missing is comparison with current draw without light sleep enabled.

@fanoush
Copy link

@fanoush fanoush commented Jan 7, 2021

Hello the ESP32-C3 https://www.espressif.com/en/news/ESP32_C3 is described in datasheet as "Ultra-Low-Power SoC" can we expect significant improvements in BLE use case (like lasting weeks/months on battery instead of hours/days) or is it still on same level as ESP32?

@AshUK
Copy link
Contributor

@AshUK AshUK commented Feb 26, 2021

Has anyone done any testing on IDF version 4.3-beta now that 5.0 is supported ?

@chegewara
Copy link
Contributor

@chegewara chegewara commented Feb 26, 2021

Has anyone done any testing on IDF version 4.3-beta now that 5.0 is supported ?

But you understand ble 5 is only on C3 and S3 in future?

@AshUK
Copy link
Contributor

@AshUK AshUK commented Feb 26, 2021

Has anyone done any testing on IDF version 4.3-beta now that 5.0 is supported ?

But you understand ble 5 is only on C3 and S3 in future?

No I was not aware of this. ☹️

https://www.espressif.com/en/news/BLE_5.0_Certification

@seackone
Copy link

@seackone seackone commented Mar 22, 2021

I tested the setup which is considered by @mywang-espressif in #947 (comment) and I also added some GPIO outputs at btdm_sleep_enter_phase2_wrapper (low) and btdm_sleep_exit_phase3_wrapper (high). I was monitoring the output and can see a low time of roughly about 30ms and a high time of 6ms. It seems that the sleep mode work but my current consumption tells me something else.

Im using the same scenario as @Ben79543 in #947 (comment) PlatformIO with ESP-IDF and Arduino component. In my case, im using the esp_pm_configure as described above.

Im using the BLE server example. The first thing: I had to insert a delay to the loop function, otherwise the watchdog is always triggered by the loop function:

␛[0;31mE (11655) task_wdt:  - IDLE1 (CPU 1)␛[0m
␛[0;31mE (11655) task_wdt: Tasks currently running:␛[0m
␛[0;31mE (11655) task_wdt: CPU 0: IDLE0␛[0m
␛[0;31mE (11655) task_wdt: CPU 1: loopTask␛[0m 

without delay, my avg current consumption was about 64mA. If I was adding a short delay of 10ms, I did not received a trigger message anymore and the current consumption decreased to 46mA. If im increasing the delay in the loop function to, lets say 1 second, the current consumption decreases again (30mA). This was the best I could achieve. But how could I get the 3 mA? I would say that this got something to do with the Arduino core. I am doing something wrong (except of using Arduino ;) )?

@eccessivo75
Copy link

@eccessivo75 eccessivo75 commented May 28, 2021

Any one can share the code used by mywang-espressif during the test?

@LetsControltheController

Hi, a commit on optimization of Bluetooth power consumption was merged into ESP-IDF recently. The merge commit is(git describe --tag): v4.0-dev-684-gb859584. An external 32.768kHz crystal is required to take advantage of this feature.

Here is the description for this commit and a brief manual.

Feature: Bluetooth modem sleep with external 32.768kHz xtal under light sleep

Overview

Bluetooth modem sleep could work under DFS but could not work under light sleep in previous implementation, which is largely due to the sleep clock source. Sleep clock must provide enough accuracy for BLE to maintain time during sleep.

Main crystal is supposed to be powered down during light sleep. It can support DFS but not light sleep for Bluetooth modem sleep.
External 32kHz crystal as RTC clock, has good accuracy and can support both DFS and light sleep for Bluetooth modem sleep. Currently there is another hardware issue of External 32kHz crystal but it is supposed to be resolved in later chip version.
Other RTC clock sources, such as internal 150kHz oscillator or internal 8.5MHz oscillator, divided by 256 (8MD256 for short), do not provide enough accuracy as required by Bluetooth specification(worst-case BLE SCA is +/-500ppm, worst-case accuracy for Classic Bluetooth Low Power Oscillator(LPO) is +/-250ppm).

This patch resolves the issue that Bluetooth modem sleep is not allowed to work with light sleep with external 32kHz crystal. In this case a menuconfig option is provided to set the BLE SCA used to estimate RX window widening during connection events.

User guide

To use bluetooth modem sleep with light sleep, please follow the below instructions.

ESP-IDF menuconfig options:

  1. Enable Power Management:
    menuconfig ---> Component config ---> Power management --->
    [*] Support for power management
  2. Enable Tickless Idle:
    menuconfig ---> Component config ---> FreeRTOS --->
    [*] Tickless idle support
    (3) Minimum number of ticks to enter sleep mode for (NEW)

Note: Tickless idle needs to be enabled to allow automatic light sleep. FreeRTOS will enter light sleep if no tasks need to run
for 3(by default) ticks, that is 30ms if tick rate is 100Hz. Configure the FreeRTOS tick rate to be higher if you want to allow
shorter duration light sleep, for example:
menuconfig ---> Component config ---> FreeRTOS ->
(1000) Tick rate (Hz)

  1. Configure external 32.768Hz crystal as RTC clock source:
    menuconfig ---> Component config ---> ESP32-specific --->
    RTC clock source (External 32kHz crystal)
    [*] Additional current for external 32kHz crystal

Note that the "additional current" option is a workaround for a hardware issue on ESP32 that the crystal can fail in oscillating.
Please enable this option when you use external 32kHz crystal. This hardware issue will be resolved in the next ECO chip.

  1. Enable Bluetooth modem sleep with external 32.768kHz crystal as low power clock:
    menuconfig ---> Component config ---> Bluetooth ---> Bluetooth controller ---> MODEM SLEEP Options --->
    [*] Bluetooth modem sleep
    Bluetooth Modem sleep mode (ORIG mode(sleep with low power clock))
    Bluetooth low power clock (External 32kHz crystal)

Enable light sleep by calling power management API in application:

  1. In your application source code, to enable automatic light sleep, use power management API esp_pm_configure like this:
#include "esp_err.h"
#include "esp_pm.h"

    esp_pm_config_esp32_t pm_config = {
        .max_freq_mhz = EXAMPLE_MAX_CPU_FREQ_MHZ, // e.g. 80, 160, 240
        .min_freq_mhz = EXAMPLE_MIN_CPU_FREQ_MHZ, // e.g. 40
        .light_sleep_enable = true, // enable light sleep
    };
    ESP_ERROR_CHECK( esp_pm_configure(&pm_config) );

Test result

Below are some power consumption statistics on typical BLE use scenario:

  • MAX cpu frequency = 240MHz
    ADV(adv_interval = 1000.0ms) average current 3.05mA, max 149.34mA, min 0.71mA
    SCAN(scan_wiONndow = 500.0ms, scan_interval = 1000.0ms) average current 59.57mA, max 170.26mA, min 0.93mA
    CONNECTION(connection_interval = 960.0ms, slave_latency = 0) average current 2.07mA, max 152.28mA, min 0.81mA
  • MAX cpu frequency = 160MHz
    ADV(adv_interval = 1000.0ms) average current 2.51mA, max 139.34mA, min 0.78mA
    SCAN(scan_window = 500.0ms, scan_interval = 1000.0ms) average current 50.37mA, max 134.85mA, min 1.08mA
    CONNECTION(connection_interval = 960.0ms, slave_latency = 0) average current 2.05mA, max 121.69mA, min 1.11mA
  • MAX cpu frequency = 80MHz
    ADV(adv_interval = 1000.0ms) average current 2.55mA, max 114.81mA, min 0.79mA
    SCAN(scan_window = 500.0ms, scan_interval = 1000.0ms) average current 49.05mA, max 123.80mA, min 0.85mA
    CONNECTION(connection_interval = 960.0ms, slave_latency = 0) average current 2.11mA, max 106.01mA, min 0.94mA

Hi, can I get example usage for this?

esp_pm_config_esp32c3_t pm_config = {
.max_freq_mhz = 160, // e.g. 80, 160, 240
.min_freq_mhz = 160, // e.g. 40
.light_sleep_enable = true, // enable light sleep
};

esp_bluedroid_init();
esp_bluedroid_enable();
printf("- Bluedroid initialized and enabled\n");


// register GAP callback function
ESP_ERROR_CHECK(esp_ble_gap_register_callback(esp_gap_cb));
printf("- GAP callback registered\n\n");

// configure the adv data
ESP_ERROR_CHECK(esp_ble_gap_config_adv_data_raw(adv_raw_data, 8));
printf("- ADV data configured\n\n");

ESP_ERROR_CHECK( esp_pm_configure(&pm_config) );

I have used like this, but got stack size error.

@bilaljo
Copy link

@bilaljo bilaljo commented Jul 19, 2021

Hi,

Feature: Bluetooth modem sleep with external 32.768kHz xtal under light sleep

thanks for sharing this guide! I am working with an external 32.768kHz crystal and configured everything like mentioned above but while uisng BLE I've got the error message:

lld_pdu_get_tx_flush_nb HCI packet count mismatch (0, 1)
W (19397) BT_HCI: DiscCmpl evt: hdl=0, rsn=0x3

I am using sleep mode directly with calling esp_light_sleep_start(); and waiting for a wake up with timer (while (esp_sleep_get_wakeup_cause() != ESP_SLEEP_WAKEUP_TIMER)) which I have configured with esp_sleep_enable_timer_wakeup. Is there anything else to consider or is the guide above current?
The point Enable Tickless Idle seems to be not more available the latest version.

Edit: I am using the BLE library of arduino vergot to say.

@nzagorec
Copy link

@nzagorec nzagorec commented Jul 28, 2021

Hi,

I've configured everything as @mywang-espressif specified above and am indeed getting fairly low current consumptions. However, I have couple of questions:

  • I've configured advertisement period to ~1sec but I'm still not getting avg. consumption of ~2.5mA. Instead, I'm getting around 5.5mA. Not too bad either but I was wondering how did you go all the way down to 2.5mA?
  • I'm seeing peak currents of around 120mA which is still a lot of stress to the battery. I tried decreasing the TX power from +9dBm to -12dBm but that didn't seem to impact these peak currents a lot. Is there any way to lower the peak currents, at least to <100mA?
  • When using nRF Connect to connect to ESP32 using Android I have an option to change connection interval. If I choose "low power (100-125ms, 2, 20s)" I'm getting somewhat similar 5-6mA avg. consumption, even in connected state. When I install the same app on iOS there is no option to change connection interval. Does iOS allow the interval to be changed?

Here's a screenshot from my scope when ESP32 is in ADV with advertisement period set to ~1sec: https://i.imgur.com/kICSLIZ.jpg

PS.

I'm using Arduino with recompiled core. I've added a 13ms delay into the main loop to utilize light sleep as much as possible. If I go over 13ms BLE communication drops all the time and becomes unusable.

void loop() {
    if (deviceConnected) {
      //do something
    }

    // disconnecting
    if (!deviceConnected && oldDeviceConnected) {
        delay(500); // give the bluetooth stack the chance to get things ready
        pServer->startAdvertising(); // restart advertising
        Serial.println("start advertising");
        oldDeviceConnected = deviceConnected;
    }
    // connecting
    if (deviceConnected && !oldDeviceConnected) {
        // do stuff here on connecting
        oldDeviceConnected = deviceConnected;
    }

    // make the most of automatic light sleep
    delay(13);
}

To change advertisiment interval I used this:

pAdvertising->setMinInterval(0x640);
pAdvertising->setMaxInterval(0x640);

0x640 = 1600 => 1600 x 0.625 = 1000 ms

@Angtiepubu
Copy link

@Angtiepubu Angtiepubu commented Aug 10, 2021

@mywang-espressif Hi dear Karl I used the external xtal light sleep, it works well. But I read the bt.c code and found in"/Low Power Clock Selection/" there's a "BTDM_LPCLK_SEL_8M" option. so I wonder if it's doable to use the internal 8M as the LPCLK source. I tried to modify some of the codes but it didn't work. So, is the LPCLK only for the bt controller or it's also used to generate the RF carrier wave? if it's the first situation, why it needs so much accuracy??? Is there still some possibility to use internal 8M as the LPCLK source if some unsteady is acceptable?

@CarlosDerSeher
Copy link

@CarlosDerSeher CarlosDerSeher commented Sep 9, 2021

@mywang-espressif Using bluetooth classic with HFP profile, automatic light sleep seems to be impossible? Chip seems to never wake up and BT connection is dropped. Is this feature only applicable using BLE? If so, are there any plans to also implement it for BT classic? I really need to get sniff current consuption down to a minimum for connected HFP with no active call. At the moment I get around 23mA - 30mA sniff current

edit: I am using IDF v4.3
edit on 15.19.2021, 14:38: ok, seems like those node MCU dev boards are taking quite some power too. removing CP2102 and the voltage regulator on it and suppling 3.3V directly from my lab power supply results in an approx. 10mA decrease in current which is better, but still... How about light sleep using Bluetooth classic?

@xiongweichao
Copy link
Collaborator

@xiongweichao xiongweichao commented Sep 23, 2021

Hi @CarlosDerSeher ,

I tested using IDF V4.3, and the ESP32 can enter light sleep and wake up.
Are you using an external 32K crystal oscillator?

Thanks

@CarlosDerSeher
Copy link

@CarlosDerSeher CarlosDerSeher commented Sep 23, 2021

@xiongweichao using the HFP example with 32k crystal mounted to the right pins and setting everything as explained here #947 (comment) results in 10mA current consuption and a freezed esp32 after entering sniff mode. Which example did you use to verify esp32 can enter light sleep?

edit: tick rate in freeRTOS is set to 1000Hz

@xiongweichao
Copy link
Collaborator

@xiongweichao xiongweichao commented Sep 24, 2021

Hi @CarlosDerSeher ,

You can check if the esp_sleep_start() API is called. If this API is not called, light sleep is not entered.

Thanks

@CarlosDerSeher
Copy link

@CarlosDerSeher CarlosDerSeher commented Sep 28, 2021

@xiongweichao ok, seems there has to be some improvement. I checked out the version you linked from git and it seems like everything is working there. You stated to check if esp_sleep_start() is called, but this isn't available in v4.3. Correct me if I am wrong... Thank you though, will keep testing with https://github.com/espressif/esp-idf/tree/220590d599e134d7a5e7f1e683cc4550349ffbf8

edit: I meant I was using the release tagged with v4.3

@xiongweichao
Copy link
Collaborator

@xiongweichao xiongweichao commented Sep 30, 2021

Hi @CarlosDerSeher ,

Sorry, the architecture of v4.3 and master is a bit different. The esp_sleep_start() of v4.3 is here

static uint32_t IRAM_ATTR esp_sleep_start(uint32_t pd_flags)

Thanks

@boblane1
Copy link
Contributor

@boblane1 boblane1 commented Sep 30, 2021

It seems that the related API is esp_light_sleep_start.

@AxelLin
Copy link
Contributor

@AxelLin AxelLin commented Sep 30, 2021

Hi @CarlosDerSeher ,

Sorry, the architecture of v4.3 and master is a bit different. The esp_sleep_start() of v4.3 is here

static uint32_t IRAM_ATTR esp_sleep_start(uint32_t pd_flags)

It's static function, you cannot call that function out-side of sleep_modes.c.

@fito-jaeuklee
Copy link

@fito-jaeuklee fito-jaeuklee commented Oct 28, 2021

@mywang-espressif
Hello, i developed sport wearable device. Using WiFi & BLE. I also face on same situation that ble takes so many power.

So i consider about added 32.768KHz crystal in my PCB.

Before implementation, I have question about above solution.
is it possible coexistance WiFi & BLE (modem sleep)?

@xiongweichao
Copy link
Collaborator

@xiongweichao xiongweichao commented Nov 4, 2021

Hi @fito-jaeuklee

WiFi & BLE (modem sleep) can coexist, but only when both enter the modem sleep will the RF be turned off.

Thanks

@fito-jaeuklee
Copy link

@fito-jaeuklee fito-jaeuklee commented Nov 5, 2021

Hi @fito-jaeuklee

WiFi & BLE (modem sleep) can coexist, but only when both enter the modem sleep will the RF be turned off.

Thanks

Then wifi & ble coexist might be impossible....
This is because Wi-Fi should work even if Bluetooth go to modem sleep.

Thank you for answering :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests