Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions src/helpers/esp32/TBeamBoard.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,16 @@ void TBeamBoard::begin() {

ESP32Board::begin();

#ifdef TBEAM_SUPREME_SX1262
// On the T-Beam S3 Supreme the PMU + RTC sit on Wire1 (GPIO 42/41, brought
// up by XPowersLib), while the SH1106 OLED and the BME280/QMC6310 sensors
// sit on the primary bus, Wire (GPIO PIN_BOARD_SDA/PIN_BOARD_SCL). Nothing
// else initialises Wire on this board, so the display driver would
// otherwise talk on the wrong (default) pins and display.begin() fails,
// leaving the screen blank. Bring the OLED bus up here.
Wire.begin(PIN_BOARD_SDA, PIN_BOARD_SCL);
#endif

power_init();

//Configure user button
Expand Down
12 changes: 11 additions & 1 deletion src/helpers/ui/SH1106Display.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,17 @@ bool SH1106Display::i2c_probe(TwoWire &wire, uint8_t addr)

bool SH1106Display::begin()
{
return display.begin(DISPLAY_ADDRESS, true) && i2c_probe(Wire, DISPLAY_ADDRESS);
// Address selection: on some board revisions (notably the LilyGo T-Beam
// Supreme V3) the OLED lives at 0x3D because 0x3C is occupied by a
// magnetometer (QMC6310N). 0x3D is only ever used by the OLED, so prefer it
// when present, otherwise fall back to the standard 0x3C (DISPLAY_ADDRESS).
uint8_t addr = 0;
if (i2c_probe(Wire, 0x3D)) {
addr = 0x3D;
} else if (i2c_probe(Wire, DISPLAY_ADDRESS)) {
addr = DISPLAY_ADDRESS;
}
return addr && display.begin(addr, true);
}

void SH1106Display::turnOn()
Expand Down