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.