Go Down

Topic: Nano 33 BLE idle power (Read 698 times) previous topic - next topic

MarsaMatruh

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?

Knowless

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

MarsaMatruh

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.

farom

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.

Code: [Select]
// 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.

Code: [Select]
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.

Code: [Select]
// --- 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

MarsaMatruh

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.  :)

farom

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.


Go Up