u8g2 DeepSleep. Незаметное обновление дисплея после глубокого сна.
- Войдите на сайт для отправки комментариев
Втр, 04/08/2020 - 01:38
На рунете решения не нашел.
Железо и условия: 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();
}
Источник https://github.com/olikraus/u8g2/issues/758
Парень подключал сразу два дисплея по i2c. Я подключил дисплей по SPI.