Skip to content

Commit cfc6338

Browse files
committed
Restructure low power to more time period oriented design
1 parent 4fa99de commit cfc6338

File tree

3 files changed

+191
-285
lines changed

3 files changed

+191
-285
lines changed

src/examples/low_power/low_power.ino

Lines changed: 36 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -39,14 +39,42 @@ void setup() {
3939
// pressing the button
4040
pinConfigure(SW0, PIN_DIR_INPUT | PIN_INT_FALL);
4141

42-
// Configure the power save configuration, start the LTE modem and wait
43-
// until we are connected to the operator
42+
// Now we configure the power save configuration. Note that this has to be
43+
// done before calling Lte.begin().
4444
//
45-
// Here we say that we want to sleep for 30 seconds * 2 = 60 seconds each
46-
// time we invoke sleep
47-
LowPower.begin(SleepMultiplier::THIRTY_SECONDS, 2, SleepMode::REGULAR);
45+
// This mode for LowPower is somewhat more complex than a plain power down,
46+
// which cuts the power to the LTE modem and puts the AVR CPU in sleep for
47+
// as long as we want.
48+
//
49+
// Let's break this mode down:
50+
//
51+
// 1. We first configure the LTE modem with this power save configuration.
52+
// That tells the LTE modem that it will be active for some time period
53+
// sending data and syncing up with the operator, then it can go to sleep
54+
// for the remaining time of this time period. That means that the LTE modem
55+
// will not be sleeping for the whole time period, but most of it. This
56+
// repeats as long as we want.
57+
//
58+
// Here we say that we want to have a power save period of 30 seconds * 2 =
59+
// 60 seconds.
60+
//
61+
// 2. This happens periodically as long as we tell it that it's okay for it
62+
// to go into power save, which we do with LowPower.powerSave(). Note that
63+
// the LTE modem is the one responsible for knowing where we are in this
64+
// time period, thus, if we call LowPower.powerSave() in the middle of the
65+
// time period, it will only sleep for half the time before being woken up
66+
// again. This is totally fine, and can for example happen if we do some
67+
// operations on the CPU which takes a lot of time.
68+
//
69+
// In powerSave(), after the LTE modem is sleeping, we also put the
70+
// CPU to sleep. When the time period is over, the CPU is woken at the same
71+
// time as the LTE modem is woken up.
72+
LowPower.configurePeriodicPowerSave(
73+
PowerSaveModePeriodMultiplier::THIRTY_SECONDS, 2);
74+
4875
Lte.begin();
4976
Log.infof("Connecting to operator");
77+
5078
while (!Lte.isConnected()) {
5179
Log.raw(".");
5280
delay(1000);
@@ -60,28 +88,10 @@ void loop() {
6088
Log.raw("\r\n");
6189
Log.info("Going to sleep...");
6290
delay(100);
63-
WakeUpReason wakeup_reason = LowPower.sleep();
64-
65-
switch (wakeup_reason) {
66-
case WakeUpReason::OK:
67-
Log.info("Finished sleep");
68-
break;
69-
case WakeUpReason::EXTERNAL_INTERRUPT:
70-
Log.info("Got woken up by external interrupt");
71-
break;
72-
case WakeUpReason::AWOKEN_BY_MODEM_PREMATURELY:
73-
Log.info("Got woken up by modem prematurely");
74-
break;
75-
case WakeUpReason::MODEM_TIMEOUT:
76-
Log.info("Took too long to put modem in sleep, no time left for "
77-
"sleeping. You might have to increase the sleep time.");
78-
break;
79-
case WakeUpReason::INVALID_SLEEP_TIME:
80-
Log.info("Got invalid sleep time from operator");
81-
break;
82-
}
91+
92+
LowPower.powerSave();
8393

8494
// Do work ...
8595
Log.info("Doing work...");
86-
delay(10000);
96+
delay(5000);
8797
}

0 commit comments

Comments
 (0)