From ff7240220b90d0ccbf33d0f4fa8f95a3448c742d Mon Sep 17 00:00:00 2001
From: Federico Terraneo <fede.tft@miosix.org>
Date: Sun, 6 Feb 2022 17:11:34 +0100
Subject: [PATCH] Improved display_er_oledm024 power consumption

---
 .../display_er_oledm024.cpp                   | 31 +++++++++++++++++--
 1 file changed, 29 insertions(+), 2 deletions(-)

diff --git a/_examples/display_er_oledm024/display_er_oledm024.cpp b/_examples/display_er_oledm024/display_er_oledm024.cpp
index f9b2238..66041e7 100644
--- a/_examples/display_er_oledm024/display_er_oledm024.cpp
+++ b/_examples/display_er_oledm024/display_er_oledm024.cpp
@@ -130,9 +130,36 @@ DisplayErOledm024::DisplayErOledm024() : DisplayGeneric1BPP(128,64)
     delayUs(100);
 
     //VCC=13.4V VCOMH=10.4V IREF~11uA SPI_fmax=10MHz
+    /*
+     * Power save mode reduces frame rate and precharge time to reduce current
+     * consumption from the VCC side. Power consumption from the VDD side is
+     * < 100uA and thus negligible.
+     * Measured current [mA] as a function of #pixel active
+     * pixel_on   default_current  power_save_current
+     *        0       0.70           0.49 (off current)
+     *      128       1.23           0.85
+     *      ...
+     *   15*128       6.88           4.98
+     * 
+     * Further tried to reduce scanlines to 16 with
+     * cmd(0xd5); cmd(0x03);     // Oscillator 0x0, /4 (75Hz)
+     * cmd(0xa8); cmd(15);       // Number of rows 16
+     * and got off current down to 0.15mA but per pixel current significantly
+     * increased and bug in cmd(0x81) set brightness did not allow to correct
+     */
+    #define POWER_SAVE //Active by default
+
+    #ifndef POWER_SAVE
+    const unsigned char oscCfg=0xa0; // 120Hz refresh rate
+    const unsigned char prcgCfg=0x25;// Precharge phase2=2 phase1=5
+    #else //POWER_SAVE
+    const unsigned char oscCfg=0x00; // 78Hz -30% off current 0.7 -> 0.48mA
+    const unsigned char prcgCfg=0x13;// 1,3  -22% on  current 3.1 -> 2.4uA/pix
+    #endif //POWER_SAVE
+    
     cmd(0xfd); cmd(0x12);     // Disable command lock
     cmd(0xae);                // Display OFF
-    cmd(0xd5); cmd(0xa0);     // Oscillator 0xa no divider
+    cmd(0xd5); cmd(oscCfg);   // Oscillator
     cmd(0xa8); cmd(height-1); // Number of rows 64
     cmd(0xd3); cmd(0x00);     // Display offset 0
     cmd(0x40);                // Display start line 0
@@ -141,7 +168,7 @@ DisplayErOledm024::DisplayErOledm024() : DisplayGeneric1BPP(128,64)
     cmd(0xc8);                // Scan direction 64 to 1
     cmd(0xda); cmd(0x12);     // Alternate COM, no COM left/right
     cmd(0x81); cmd(0x32);     // Brightness 1.1uA/pixel
-    cmd(0xd9); cmd(0x25);     // Precharge phase2=2 phase1=5
+    cmd(0xd9); cmd(prcgCfg);  // Precharge phase2=2 phase1=5
     cmd(0xdb); cmd(0x34);     // VCOMH=.78*VCC 
     cmd(0xa6);                // Normal display mode
     cmd(0xa4);                // Disable test mode
-- 
GitLab