Nano 33 BLE idle power

Hi,

I want to make a datalogger (for bucket rain gauge or temperature recording...) in a remote place. I will store data in the internal flash. I want to use BT to set logger parameters (like current date/time, frequency recording for temperature) and to extract data. One can imagine that BT is usually not powered and, after pushing a button, it is switch one to connect with smartphone. Once idle, it is switched back to power off.

So, in order to adjust battery size, how low can the Nano 33 BLE go with current consumption when in idle and without BT?

Hi MarsaMatruh,

There are not so good news at moment. The status at moment is, that the mbed os has some issues and the power consumption is too high.

Normal I would expect something with from 2-100µA (Depends on the intervals) but something keeps the controller awake and so we are without BLE functionality at 930µA and with BLE at about 1.5mA at an interval of 1sec(status: 9.12.).

This works much better and the developers are looking for a solution and I hope that they have found one, because we are currently far away from Bluetooth LOW ENERGY.

In Github is under the master some change for low power, but this is not conformt and under test.
I don’t know how to get it work. I downloaded the changes and tried by copy paste the new version, but there were some error in compilation in the board version. If you would like to update the ArduinoBLE version with the update, there is no conflict.

Maybe someone can say, how to update the board data without the board manager.
I know that you can install it by select the zip file, but this created some new error of too many sources of one library.

I hope this information helped.

Best regards
Knowless

Thanks for your answer.

Yes, this is quite high but if there is some work on minimizing it, there is still hope. As my project is not urgent, I will wait a couple of months and see if there is some evolution.

Hi,

I am also trying to reduce the power consumption. I am posting my solutions here as this may someone.

555µA by disabling USB CDC feature:
Warning: This interferes with upload of the next sketch to the board. I have to press reset twice in about 1s when the IDE is uploading to make it work.

// override the default main function to remove USB CDC feature
int main(void)
{
  init();
  initVariant();

//remove USB CDC feature
//#if defined(SERIAL_CDC)
//  PluggableUSBD().begin();
//  SerialUSB.begin(115200);
//#endif

  setup();

  for (;;) {
    loop();
    if (arduino::serialEventRun) arduino::serialEventRun();
  }

  return 0;
}

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_PWR, LOW); // turn off power LED
  digitalWrite(PIN_ENABLE_SENSORS_3V3, LOW); // turn off sensors
}


void loop() {
  digitalWrite(LED_BUILTIN, HIGH);
  delay(5000); // 5s for easier current measurment
  digitalWrite(LED_BUILTIN, LOW);
  delay(5000);
}

21µA by turning off the CPU:
Once turned off the CPU must be wake-up externaly with the reset button for example.

void setup() {
  delay(5000);
  digitalWrite(LED_PWR, LOW); // turn off power LED
  digitalWrite(PIN_ENABLE_SENSORS_3V3, LOW); // turn off sensors

  pinMode(PIN_A6, OUTPUT);
  digitalWrite(PIN_A6, LOW);

  NRF_POWER->SYSTEMOFF=1;
}

void loop() {

}

Wake up the arduino a few seconds later with external components
Using a simple RC circuit and the low power comparator it is powible to reset the arduino with a delay.

// --- Circuit for delayed wake-up ---
// A1 ──R1──┬────┐
//          │    │
//          R2   C1
//          │    │
// GND ─────┴────┘
//
// Wake-up delay is 2.77*R2*C1
//
// Exemple for 127s delay:
//  R1=1.2kOhm
//  R2=1MOhm
//  C1=47µF

void setup() {
  digitalWrite(PIN_ENABLE_SENSORS_3V3, LOW); // turn off sensors

  // Charging the capacitor
  pinMode(PIN_A1, OUTPUT);
  digitalWrite(PIN_A1, HIGH);
  delay(100);
  pinMode(PIN_A1, INPUT);
  
  // low power comparator setup to wake-up when the capacitor is discharged to 1/16 of VIN
  NRF_LPCOMP->PSEL=3; //select AIN3 = PIN_A1 = P0.05
  NRF_LPCOMP->REFSEL=8; // VDD * 1/16 selected as reference
  NRF_LPCOMP->ENABLE=1;
  NRF_LPCOMP->TASKS_START=1;
  while(!NRF_LPCOMP->EVENTS_READY){}

  digitalWrite(LED_PWR, LOW); // turn off power LED
  
  NRF_POWER->SYSTEMOFF=1;
}

void loop() {

}

Conditions:
Arduino nano 33 BLE with 3V3 trace cut and supplied with 3V (2xAA battery) through VIN pin.
Arduino nRF528x lib v1.1.3
Arduino IDE 1.8.10 on Linux

So, if I understand right, 21 µA is the current you obtain at "rest" with booth your software and hardware optimizations?

One may wake-up the CPU with a dry contact like the one generated by the rain-gauge bucket flip?

With CPU off, is RTC still available? For instance to wake-up the CPU at regular intervals.

Anyhow, this is very interesting news. :slight_smile:

Dry contact should work but you may have to change the configuration depending if it is a normally open or close contact.

The RTC is not running when the CPU is OFF.

Also the average current consumption is increased because of the long wake-up duration: 0.6s including 0.5s for the bootloader. In average it's closer to 40µA for my example.

Thanks farom, you did indeed help someone. I am also powering a 33 BLE from a battery (using a 4000mAh Lipo though), and have been struggling to get the power consumption down.

I am using the BLE as a peripheral, with a BME280 temp/press/humidity sensor. It samples once every hour or so, waits for a central to connect & get the reading, then sleeps until the next sample - I couldn't get it under 5 or 6 mA when it was sleeping.

I used the LPCOMP as you suggested and RC circuit with a 4.7MOhm R2 and 220 uF C1, I now get sleep mode current of 0.18mA. This should extend the battery life to more than a year!

Thanks for your contribution