I have a problem with a 1.3" SH1106 I2C OLED connected to a “Lolin32 Lite V1.0 with ESP32 Rev1” board, using U8G2 library:
When I upload the sketch to the board, everything works as expected, i.e. the display shows the counter and the LED is blinking.
But when I unplug and replug USB, the display looks scrumbled, sometimes, the LED even doesn’t blink.
Same occurs when I connect the LOLIN just to a USB power supply, without any USB communication.
No other device is connected to I2C.
No difference whether I use “Full Buffer” or “Page Buffer”.
Before U8G2, I tried the Adafruit_SH1106 library with the same result.
The same sketch on the “ESP32 Dev Kit C” has no problems.
Also, I can use a 0.9" SSD1306 OLED on both boards without problems.
What do I miss?
Do I need any additional setting for the Lolin32 Lite?
boards:
“AZDelivery LOLIN32 Lite Board V1.0 mit ESP-32 Rev1”
“AZDelivery ESP32 NodeMCU Module WLAN WiFi Dev Kit C Development Board mit CP2102”
display:
“1,3” OLED I2C 128 x 64"
Good display after upload:
Bad display after reconnect:
platform.io-ini:
[env:lolin32_lite]
board = lolin32_lite
platform = espressif32
framework = arduino
monitor_speed = 115200
build_flags = -DCORE_DEBUG_LEVEL=5
lib_deps =
adafruit/Adafruit GFX Library@^1.12.0
olikraus/U8g2@^2.36.5
sketch:
#include <Arduino.h>
#include <common.h>
#define ESP32_LOLIN
//#define DISPLAY_SH1106
//#define TEST_I2C
#define TEST_U8G2
#define U8G2_FULL
//#define U8G2_PAGE
#ifdef TEST_I2C
#include <Wire.h>
#endif
#ifdef TEST_U8G2
#include <Wire.h>
#include <U8g2lib.h>
#endif
#ifdef DISPLAY_SSD1306
#endif
#ifdef ESP32_LOLIN
// Lolin32 Lite
#define PIN_SDA (0)
#define PIN_SCL (4)
#define OUT_LED (25)
#else
// ESP32
#define PIN_SDA (21)
#define PIN_SCL (22)
#define OUT_LED (12)
#endif
// SH1106 Display -----------------------------------------------
#ifdef DISPLAY_SH1106
#include "main_display.h"
#endif
#ifdef TEST_U8G2
// SSD1306
// U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
// SH1106
#ifdef U8G2_FULL
U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
#endif
#ifdef U8G2_PAGE
U8G2_SH1106_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
#endif
#endif
// Main ---------------------------------------------------------
#ifdef TEST_U8G2
void setup_u8g2() {
Wire.begin(PIN_SDA, PIN_SCL);
detect_i2c();
u8g2.begin();
}
#endif
void setup() {
Serial.begin(115200);
while (!Serial)
{
; // wait for serial port to connect. Needed for native USB
}
Serial.println(F(""));
Serial.println(F("-----------------------"));
Serial.println(F("------ ESP32 Test -----"));
Serial.println(F("-----------------------"));
Serial.println(S("Build Date: ") + __DATE__);
Serial.println(S("Build Time: ") + __TIME__);
Serial.println(F("-----------------------"));
Serial.println(F(""));
pinMode(OUT_LED, OUTPUT);
#ifdef TEST_I2C
Wire.begin(PIN_SDA, PIN_SCL);
detect_i2c();
#endif
#ifdef DISPLAY_SH1106
setup_sh1106();
#endif
#ifdef TEST_U8G2
setup_u8g2();
#endif
}
#ifdef TEST_U8G2
void loop_u8g2_full(int value) {
static char outText[20] = {0};
u8g2.clearBuffer(); // clear the internal memory
u8g2.setFont(u8g2_font_ncenB08_tr); // choose a suitable font
u8g2.drawStr(0,10,"Full Buffer"); // write something to the internal memory
snprintf(outText, sizeof(outText), "count %d", value);
u8g2.drawStr(0,30, outText);
u8g2.sendBuffer(); // transfer internal memory to the display
}
void loop_u8g2_page(int value) {
static char outText[20] = {0};
u8g2.firstPage();
do {
u8g2.setFont(u8g2_font_ncenB10_tr);
u8g2.drawStr(0,20,"Page Buffer");
snprintf(outText, sizeof(outText), "count %d", value);
u8g2.drawStr(0,40, outText);
} while ( u8g2.nextPage() );
}
#endif
void loop() {
static unsigned long timestamp = 0;
static bool state = 0;
static int count = 0;
if ((millis() - timestamp) > 1000)
{
count++;
Serial.println(count);
digitalWrite(OUT_LED, state);
state = 1 - state;
timestamp = millis();
#ifdef TEST_U8G2
#ifdef U8G2_FULL
loop_u8g2_full(count);
#endif
#ifdef U8G2_PAGE
loop_u8g2_page(count);
#endif
#endif
#ifdef DISPLAY_SH1106
loop_1106();
#endif
}
}