Sleep / low power on Paper V1.1 without clearing the display on Wake?
-
Sorry if this is the wrong category, please feel free to move. I have the M5 Paper V1.1 and would like to use it as a graphical clock. The battery doesn't need to last months between charges but the longer the better. I need RTC and not much else. I'm looking for a way to put the device into the lowest possible power mode and update the display once per minute, or so.
I tried code kindly provided by @felmue in a thread about sleeping (and thoroughly confused myself that
shutdown()
behaviour appears to be very different when USB power is connected). However, thatshutdown()
function appears to place the processor into a reset state when it returns/wakes, which in turn clears the display duringsetup()
.Are there any different ways of managing sleep/low power modes that will retain RAM and resume running in
loop()
where it left off? If not, are there any tips about how to structuresetup()
so as to provide the visually smoothest display update regime, while still benefitting from low powershutdown()
? -
Hello @simonm
if you want a sleep mode which resumes in
loop()
you'll need to look into ESP32 light sleep mode. Please note: this only puts ESP32 into light sleep mode; everything else is still powered which means the battery doesn't last very long. You can find some measurements here.ESP32 deep sleep mode and shutdown mode both restart the ESP32 after sleeping. ESP32 deep sleep mode is not much better than ESP32 light sleep in regard of saving battery power.
The lowest mode is shutdown mode which turns off everything except the RTC chip. You can find a counter example here. It includes restoring the display and smooth updates of the counter.
Thanks
Felix -
In order to keep the data on screen after sleep or shutdown, you first have to put the screen into HV mode and then write to the screen. if you don't trigger the HV mode before writing, the display doesn't retain the data you wish to keep displayed.
-
@felmue thanks great explanation and example. In your example, is there any issue restructuring it:
void setup() { ... // First draw old count myCount = readEEPROM(EEPROM_ADDR, 0); snprintf(myBuf, 10, "%04d ", myCount); CountPageSprite.drawString(myBuf, 20, 20); CountPageSprite.pushCanvas(0, 0, UPDATE_MODE_DU4); } void loop() { // Then draw new count myCount++; writeEEPROM(EEPROM_ADDR, 0, myCount); snprintf(myBuf, 10, "%04d ", myCount); CountPageSprite.drawString(myBuf, 20, 20); CountPageSprite.pushCanvas(0, 0, UPDATE_MODE_DU4); delay(250); // required, else no update Serial.printf("Shutdown...\n"); Serial.flush(); M5.shutdown(10); // This part is only executed if running from USB power delay(1000); // Undo what shutdown did M5.RTC.clearIRQ(); M5.enableMainPower(); // Kill some time Serial.println("Should not be reached when battery powered 1"); delay(10000); Serial.println("Should not be reached when battery powered 2"); }
to avoid needing to use the
GOTO
? I realise it will work perfectly well as-is. I think I would like to try and use the shutdown mode, as I can be asleep for most of the time, with updates once per minute at most.I find it very unusual that the API docs don't seem to mention that USB power vs battery power makes a difference to whether
shutdown()
will result in any change to the power state.@ajb2k3 thanks for your reply. Please could you elaborate on what HV mode is? I had a look at the Paper API for canvas and power/system but couldn't see anything relating to 'HV'. Do any of the existing API functions already take care of this?
-
Hello @simonm
thank you for pointing that out. I think I was adapting my code from some other example at the time and I took over the
GOTO
without questioning it.As for the documentation about shutdown and USB power. There is one note about that here. In section Description in the blue marked box.
When using USB power supply, it cannot be shut down.
Thanks
Felix -
@felmue thanks for pointing out where that note lives! I'm still getting used to M5 stuff.
-
HV mode stands for High Voltage Write Mode. it is the mode that has to be set on E-Ink displays that need to retain data on power off.
I don't know what the arduino version is but I know the command must be used before the writing of data. -