Power Down Round Display within an app?

Written a small weather app using the Seeed Round Display, but want to run it on batteries ideally. Unfortunately even if I put the ESP32C3 into deep sleep mode, the display stays on, sucking lots of power.

Even 3 x 3.7v 1200MhA batteries cannot keep this thing running for 24 hours. Now looking at the diagram for the ESP32C3 it says it is supplying power 5V and 3V down the pink pins here?

Can I shutdown the power that I assume is the means that the Seeed Round Display is using to run? or is there something else here telling me how I can do it?

Sorry if this an obvious question to those in the know? I am new this tech?

Mark

does not the display driver library… U8G2 have a command to power down the display?

The device runs of 3v3… the pink color is not the same as power color… the pink color is Analog pins… pins able to communicate in analog… as opposed to digital… all the pins communicate at 3v3 the 5V power is supplied by the USB cable when it is plugged in…

This is the driver code?

/* display and touch driver for XIAO round screen */

#include <Arduino.h>
#include <lvgl.h>
#include <SPI.h>
#include <Wire.h>

#define SCREEN_WIDTH 240
#define SCREEN_HEIGHT 240
#define LVGL_BUFF_SIZE 10 // Number of rows

#define CHSC6X_I2C_ID 0x2e
#define CHSC6X_MAX_POINTS_NUM 1
#define CHSC6X_READ_POINT_LEN 5
#define TOUCH_INT D7

#ifndef XIAO_BL
#define XIAO_BL D6
#endif
#define XIAO_DC D3
#define XIAO_CS D1

uint8_t screen_rotation;

/* display driver : use TFT_eSPI or Arduino_GFX */
#if defined(USE_TFT_ESPI_LIBRARY) && defined(USE_ARDUINO_GFX_LIBRARY)
#error "More than one graphics library is defined."
#elif defined(USE_TFT_ESPI_LIBRARY)
#include <TFT_eSPI.h>
TFT_eSPI tft = TFT_eSPI(SCREEN_WIDTH, SCREEN_HEIGHT);
#elif defined(USE_ARDUINO_GFX_LIBRARY)
#include <Arduino_GFX_Library.h>
#define SPI_FREQ 20000000 // SPI bus frequency: 20Mhz
#if defined(CONFIG_IDF_TARGET_ESP32S3) || defined(CONFIG_IDF_TARGET_ESP32C3)
Arduino_DataBus *bus = new Arduino_ESP32SPI(XIAO_DC, XIAO_CS, SCK, MOSI, MISO, FSPI);
#elif defined(ARDUINO_Seeed_XIAO_nRF52840_Sense) || defined(ARDUINO_Seeed_XIAO_nRF52840)
Arduino_DataBus *bus = new Arduino_NRFXSPI(XIAO_DC, XIAO_CS, SCK, MOSI, MISO);
#elif defined(ARDUINO_SEEED_XIAO_NRF52840_SENSE) || defined(ARDUINO_SEEED_XIAO_NRF52840)
Arduino_DataBus *bus = new Arduino_mbedSPI(XIAO_DC, XIAO_CS);
#elif defined(ARDUINO_SEEED_XIAO_RP2040)
Arduino_DataBus *bus = new Arduino_RPiPicoSPI(XIAO_DC, XIAO_CS, SCK, MOSI, MISO, spi0);
#else
Arduino_DataBus *bus = new Arduino_HWSPI(XIAO_DC, XIAO_CS);
#endif
Arduino_GFX *gfx = new Arduino_GC9A01(bus, -1, screen_rotation, true);
#else
#error "Please define a graphics library for display."
#endif

#if LVGL_VERSION_MAJOR == 9
void xiao_disp_flush( lv_display_t *disp, const lv_area_t *area, uint8_t *px_map )
#elif LVGL_VERSION_MAJOR == 8
void xiao_disp_flush( lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p )
#else
#error "Not support LVGL version"
#endif
{
    uint32_t w = ( area->x2 - area->x1 + 1 );
    uint32_t h = ( area->y2 - area->y1 + 1 );

#if LVGL_VERSION_MAJOR == 9
    uint16_t *px_buf = ( uint16_t * )px_map;
#elif LVGL_VERSION_MAJOR == 8
    uint16_t *px_buf = ( uint16_t * )&color_p->full;
#endif

#if defined(USE_TFT_ESPI_LIBRARY)
    tft.startWrite();
    tft.setAddrWindow( area->x1, area->y1, w, h );
    tft.pushColors( px_buf, w * h, true );
    tft.endWrite();
#elif defined(USE_ARDUINO_GFX_LIBRARY)
    gfx->draw16bitRGBBitmap(area->x1, area->y1, px_buf, w, h);
#endif

#if LVGL_VERSION_MAJOR == 9
    lv_display_flush_ready(disp);
#elif LVGL_VERSION_MAJOR == 8
    lv_disp_flush_ready(disp);
#endif
}

void xiao_disp_init(void)
{
#if XIAO_BL > 0
    pinMode(XIAO_BL, OUTPUT); //Turn on screen backlight
    digitalWrite(XIAO_BL, HIGH);
#endif

#if defined(USE_TFT_ESPI_LIBRARY)
    tft.begin();
    tft.setRotation( screen_rotation );
    tft.fillScreen(TFT_BLACK);
#elif defined(USE_ARDUINO_GFX_LIBRARY)
    gfx->begin(SPI_FREQ);
    gfx->fillScreen(BLACK);
#endif
}

void lv_xiao_disp_init(void) 
{
    xiao_disp_init();

#if LVGL_VERSION_MAJOR == 9
    static uint8_t draw_buf[ SCREEN_WIDTH * LVGL_BUFF_SIZE * LV_COLOR_DEPTH / 8 ];
    lv_display_t * disp = lv_display_create(SCREEN_WIDTH, SCREEN_HEIGHT);
    lv_display_set_flush_cb(disp, xiao_disp_flush);
    lv_display_set_buffers(disp, (void*)draw_buf, NULL, sizeof(draw_buf), LV_DISPLAY_RENDER_MODE_PARTIAL);
#elif LVGL_VERSION_MAJOR == 8
    /*Initialize the display buffer*/
    static lv_disp_draw_buf_t draw_buf;
    static lv_color_t buf[ SCREEN_WIDTH * LVGL_BUFF_SIZE ];
    lv_disp_draw_buf_init( &draw_buf, buf, NULL, SCREEN_WIDTH * LVGL_BUFF_SIZE );
    /*Initialize the display driver for lvgl*/
    static lv_disp_drv_t disp_drv;
    lv_disp_drv_init( &disp_drv );
    disp_drv.hor_res = SCREEN_WIDTH;
    disp_drv.ver_res = SCREEN_HEIGHT;
    disp_drv.flush_cb = xiao_disp_flush;
    disp_drv.draw_buf = &draw_buf;
    lv_disp_drv_register( &disp_drv );
#endif
}



/* touch driver : chsc6x */

bool chsc6x_is_pressed(void)
{
    if(digitalRead(TOUCH_INT) != LOW) {
        delay(1);
        if(digitalRead(TOUCH_INT) != LOW)
        return false;
    }
    return true;
}

void chsc6x_convert_xy(uint8_t *x, uint8_t *y)
{
    uint8_t x_tmp = *x, y_tmp = *y, _end = 0;
    for(int i=1; i<=screen_rotation; i++){
        x_tmp = *x;
        y_tmp = *y;
        _end = (i % 2) ? SCREEN_WIDTH : SCREEN_HEIGHT;
        *x = y_tmp;
        *y = _end - x_tmp;
    }
}

void chsc6x_get_xy(lv_coord_t * x, lv_coord_t * y)
{
    uint8_t temp[CHSC6X_READ_POINT_LEN] = {0};
    uint8_t read_len = Wire.requestFrom(CHSC6X_I2C_ID, CHSC6X_READ_POINT_LEN);
    if(read_len == CHSC6X_READ_POINT_LEN){
        Wire.readBytes(temp, read_len);
        if (temp[0] == 0x01) {
        chsc6x_convert_xy(&temp[2], &temp[4]);
        *x = temp[2];
        *y = temp[4];
        }
    }
}

#if LVGL_VERSION_MAJOR == 9
void chsc6x_read( lv_indev_t * indev, lv_indev_data_t * data )
#elif LVGL_VERSION_MAJOR == 8
void chsc6x_read( lv_indev_drv_t * indev_driver, lv_indev_data_t * data )
#endif
{
    lv_coord_t touchX, touchY;
    if( !chsc6x_is_pressed() )
    {
        data->state = LV_INDEV_STATE_REL;
    } else {
        data->state = LV_INDEV_STATE_PR;
        chsc6x_get_xy(&touchX, &touchY);
        /*Set the coordinates*/
        data->point.x = touchX;
        data->point.y = touchY;
    }
}

void lv_xiao_touch_init(void)
{
    pinMode(TOUCH_INT, INPUT_PULLUP);
    Wire.begin(); // Turn on the IIC bus for touch driver
    /*Initialize the touch driver for lvgl*/
#if LVGL_VERSION_MAJOR == 9
    lv_indev_t * indev = lv_indev_create();
    lv_indev_set_type(indev, LV_INDEV_TYPE_POINTER);
    lv_indev_set_read_cb(indev, chsc6x_read);
#elif LVGL_VERSION_MAJOR == 8
    static lv_indev_drv_t indev_drv;
    lv_indev_drv_init(&indev_drv);
    indev_drv.type = LV_INDEV_TYPE_POINTER;
    indev_drv.read_cb = chsc6x_read;
    lv_indev_drv_register(&indev_drv);
#endif
}

Using digitalwrite to D6 doesn’t appear to do anything? I want to turn the backlight off for example?
Nor does changing the configuration from OUTPUT to input with a pinMode command?

Is there a clue here?

https://docs.lvgl.io/latest/en/html/intro/add-lvgl-to-your-project/threading.html

It talks about setting some sort of sleepmode if nobody touches the display…but I am unsure where to add this code?

To control the display backlight with D6 you have to toggle the micro-dip switch

1 Like

Just got around to testing, works well… at least looks like it turns the whole thing off

1 Like