u8g2 DeepSleep. Незаметное обновление дисплея после глубокого сна.

p-a-h-a
Offline
Зарегистрирован: 17.01.2019

На рунете решения не нашел.

Железо и условия: ESP32 периодически спит по таймеру мертвым сном. При этом на графическом дисплее LCD12864 ST7920 128X64 выведена инфа при последней активности ESP.

Необходимо чтоб дисплей повторно не инициализировался при просыпании и не моргал очищая данные.

Вот собственно пример решения:

#define time_deepsleep 5e6// время сна 5 секунд
RTC_DATA_ATTR boolean first_boot = true;// переменная хранится в памяти RTC и сохраняется после глубокого сна
RTC_DATA_ATTR int number_boot = 0; //Счетчик количества просыпаний

//#include <Arduino.h>
#include <U8g2lib.h>

#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif
U8G2_ST7920_128X64_F_HW_SPI u8g2(U8G2_R2, /* CS=*/ 5, /* reset=*/ 22); //подключение дисплея
void setup(void) {
if (first_boot) { // First init of the displays
     u8g2.begin();
  } else {
    // Init displays after wake up
    // https://github.com/olikraus/u8g2/blob/master/sys/sdl/clock/guifn.c#L379
    u8x8_gpio_Init(u8g2.getU8x8());
    u8x8_cad_Init(u8g2.getU8x8());
    u8x8_gpio_SetReset(u8g2.getU8x8(), 1);
  }
    number_boot++;
  first_boot=false;
  esp_sleep_enable_timer_wakeup(time_deepsleep);  

  //u8g2.setDisplayRotation (180);
  if(first_boot) u8g2.clearBuffer();  
}

void loop(void) {
  //u8g2.clearBuffer();					// clear the internal memory
  u8g2.setFont(u8g2_font_ncenB08_tr);	// choose a suitable font
  u8g2.drawStr(0,10,"Hello World!");	// write something to the internal memory
  u8g2.setCursor(0, 30); u8g2.print(number_boot);
  u8g2.sendBuffer();					// transfer internal memory to the display
  delay(1000);  
  esp_deep_sleep_start();
}

 

p-a-h-a
Offline
Зарегистрирован: 17.01.2019

Источник https://github.com/olikraus/u8g2/issues/758

Парень подключал сразу два дисплея по i2c. Я подключил дисплей по SPI.