Hello, I've got a T-Beam Supreme V3 and no matter which version of the iGate firmware I flash the display always looks like it's corrupted.
I tried mentioning this in another issue thread that specifically mentions the T-Beam Supreme but I finally realized with the v3.0 firmware that the iGate was actually functioning, I just couldn't use the display. If needed I can go back and verify the older versions, but my main problem is lack of useable display output. old comment
Here is a photo of the issue.
This same hardware has no issue running your APRS Tracker firmware. I previously had Meshtastic running just fine as well.
Edit: I'm in the US and purchased mine directly from Lilygo, which shipped from China.
Hello, I've got a T-Beam Supreme V3 and no matter which version of the iGate firmware I flash the display always looks like it's corrupted.
I tried mentioning this in another issue thread that specifically mentions the T-Beam Supreme but I finally realized with the v3.0 firmware that the iGate was actually functioning, I just couldn't use the display. If needed I can go back and verify the older versions, but my main problem is lack of useable display output. [old comment](https://github.com/richonguzman/LoRa_APRS_iGate/issues/204#issuecomment-2848413710)
Here is a photo of the issue. 
This same hardware has no issue running your APRS Tracker firmware. I previously had Meshtastic running just fine as well.
Edit: I'm in the US and purchased mine directly from Lilygo, which shipped from China.
<!-- github-sync-id:3266929505 -->
Wow - I've never seen that on my Supremes. I've suffered the "missing line" syndrome specifically on the paxcounter v1.6.1. When you had it configured with Meshtastic did the display work? Or, for that matter, did the display ever work %^)?
Hope you figure it out! Cheers and 73 - Jon N7UV
Wow - I've never seen that on my Supremes. I've suffered the "missing line" syndrome specifically on the paxcounter v1.6.1. When you had it configured with Meshtastic did the display work? Or, for that matter, did the display ever work %^)?
Hope you figure it out! Cheers and 73 - Jon N7UV
<!-- github-comment-id:3152614625 -->
When you had it configured with Meshtastic did the display work? Or, for that matter, did the display ever work %^)?
Hope you figure it out! Cheers and 73 - Jon N7UV
The display works fine with the tracker firmware
I haven't loaded Meshtastic since way back in October '24 but I don't remember any trouble with the display. It would have been obvious if it arrived with a dead display. I think the one I ordered for 433mhz shipped with SoftRF, that powered on and pinged my T-Echo that also shipped with SoftRF just fine.
Only thing, I got my Supremes before the iGate firmware was available. I guess I'll have to try it with the other Supreme I have for Meshtastic on 900mhz. Maybe there's a subtle hardware difference between what I got directly from LilyGo vs what I got from Rokland. I'll add a new reply if I notice anything.
> When you had it configured with Meshtastic did the display work? Or, for that matter, did the display ever work %^)?
>
> Hope you figure it out! Cheers and 73 - Jon N7UV
The display works fine with the [tracker firmware](https://github.com/richonguzman/LoRa_APRS_Tracker)
I haven't loaded Meshtastic since way back in October '24 but I don't remember any trouble with the display. It would have been obvious if it arrived with a dead display. I think the one I ordered for 433mhz shipped with SoftRF, that powered on and pinged my T-Echo that also shipped with SoftRF just fine.
Only thing, I got my Supremes before the iGate firmware was available. I guess I'll have to try it with the other Supreme I have for Meshtastic on 900mhz. Maybe there's a subtle hardware difference between what I got directly from LilyGo vs what I got from Rokland. I'll add a new reply if I notice anything.
<!-- github-comment-id:3152667623 -->
When you had it configured with Meshtastic did the display work? Or, for that matter, did the display ever work %^)?
Hope you figure it out! Cheers and 73 - Jon N7UV
The display works fine with the tracker firmware I haven't loaded Meshtastic since way back in October '24 but I don't remember any trouble with the display. It would have been obvious if it arrived with a dead display. I think the one I ordered for 433mhz shipped with SoftRF, that powered on and pinged my T-Echo that also shipped with SoftRF just fine.
Only thing, I got my Supremes before the iGate firmware was available. I guess I'll have to try it with the other Supreme I have for Meshtastic on 900mhz. Maybe there's a subtle hardware difference between what I got directly from LilyGo vs what I got from Rokland. I'll add a new reply if I notice anything.
please validate the screen on your T-beam Supreme is SH1106 and not SSD1306.
> > When you had it configured with Meshtastic did the display work? Or, for that matter, did the display ever work %^)?
> > Hope you figure it out! Cheers and 73 - Jon N7UV
>
> The display works fine with the [tracker firmware](https://github.com/richonguzman/LoRa_APRS_Tracker) I haven't loaded Meshtastic since way back in October '24 but I don't remember any trouble with the display. It would have been obvious if it arrived with a dead display. I think the one I ordered for 433mhz shipped with SoftRF, that powered on and pinged my T-Echo that also shipped with SoftRF just fine.
>
> Only thing, I got my Supremes before the iGate firmware was available. I guess I'll have to try it with the other Supreme I have for Meshtastic on 900mhz. Maybe there's a subtle hardware difference between what I got directly from LilyGo vs what I got from Rokland. I'll add a new reply if I notice anything.
please validate the screen on your T-beam Supreme is SH1106 and not SSD1306.
<!-- github-comment-id:3152722176 -->
please validate the screen on your T-beam Supreme is SH1106 and not SSD1306.
Ooof, I tried to dismantle it as far as I felt comfortable but I think the numbers I saw were for the ribbon cable or the glass assembly.
If it's printed on the back of the panel then I don't currently have the tools to properly dismount it from the acrylic frame.
I'm not familiar with getting a programming environment setup for these boards. Is there a way to check via console of some sort?
> please validate the screen on your T-beam Supreme is SH1106 and not SSD1306.
Ooof, I tried to dismantle it as far as I felt comfortable but I think the numbers I saw were for the ribbon cable or the glass assembly.
If it's printed on the back of the panel then I don't currently have the tools to properly dismount it from the acrylic frame.
I'm not familiar with getting a programming environment setup for these boards. Is there a way to check via console of some sort?
<!-- github-comment-id:3153056142 -->
maybe we just need to know if you ever changed it or not... it comes with SH1106 regularly from factory
I have not modified it other than giving it a proper antenna. It is as shipped directly from LilyGo's warehouse in China.
I looked up my order on the lilygo.cc website. purchased Oct 6 2024.
T-Beam Supreme SoftRF 433mhz UBLOX.
Maybe they had old inventory that did not include the SH1106 and I got unlucky??
> maybe we just need to know if you ever changed it or not... it comes with SH1106 regularly from factory
I have not modified it other than giving it a proper antenna. It is as shipped directly from LilyGo's warehouse in China.
I looked up my order on the lilygo.cc website. purchased Oct 6 2024.
T-Beam Supreme SoftRF 433mhz UBLOX.
Maybe they had old inventory that did not include the SH1106 and I got unlucky??
<!-- github-comment-id:3153368695 -->
we can test a variation of your board to test SSD1306:
are you ok uploading firmware from VSCODE + Platformio?
we can test a variation of your board to test SSD1306:
1) are you ok uploading firmware from VSCODE + Platformio?
<!-- github-comment-id:3155022119 -->
we can test a variation of your board to test SSD1306:
are you ok uploading firmware from VSCODE + Platformio?
I'm willing to try but I would need a tutorial to get that going.
Edit: I'm going to follow one of the tutorials on LiLygo's github. Let me know what commands or code changes I'd need to make.
> we can test a variation of your board to test SSD1306:
>
> 1. are you ok uploading firmware from VSCODE + Platformio?
I'm willing to try but I would need a tutorial to get that going.
Edit: I'm going to follow one of the tutorials on LiLygo's github. Let me know what commands or code changes I'd need to make.
<!-- github-comment-id:3160880381 -->
Just to add I'm also running into the same corrupt display issue with the T-Beam Supreme V3.
The display works fine with the tracker firmware & Meshtastic.
Just to add I'm also running into the same corrupt display issue with the T-Beam Supreme V3.
The display works fine with the tracker firmware & Meshtastic.
<!-- github-comment-id:3178483401 -->
anyone of @EI3HIB or @MastarPete can help me locally install from VSCODE a minor update i can guide you from here?
is removing a line that i suspect could fix it and with this i can fast update web flasher to have the right version for you both ?
anyone of @EI3HIB or @MastarPete can help me locally install from VSCODE a minor update i can guide you from here?
is removing a line that i suspect could fix it and with this i can fast update web flasher to have the right version for you both ?
<!-- github-comment-id:3180861336 -->
@richonguzman sorry for the delay in replying, I'd be happy to help - can you just advise me what I need to do? Do I need to install VSCODE?
@richonguzman sorry for the delay in replying, I'd be happy to help - can you just advise me what I need to do? Do I need to install VSCODE?
<!-- github-comment-id:3214184953 -->
> [@richonguzman](https://github.com/richonguzman) sorry for the delay in replying, I'd be happy to help - can you just advise me what I need to do? Do I need to install VSCODE?
yes, download VSCODE, download this repository, import it into vscode + platformio
the EDIT is just taking away 1 line... let me know when you are done with the installation and all
(this is a "bad" guide for installing the needed programs:
https://github.com/richonguzman/LoRa_APRS_Tracker/wiki/01.-Installation-Guide-%23-Guia-de-Instalacion )
<!-- github-comment-id:3214500547 -->
Thank You! OK downloaded and installed - just a stupid question: when selecting the board on the "Import Arduino Project" what one should I pick for the T-Beam Supreme V3?
Thank You! OK downloaded and installed - just a stupid question: when selecting the board on the "Import Arduino Project" what one should I pick for the T-Beam Supreme V3?
<img width="579" height="193" alt="Image" src="https://github.com/user-attachments/assets/466a408c-d9c6-409b-92b7-26b93efbd1bd" />
<!-- github-comment-id:3214659379 -->
use the first one of your picture... as later you have to change the environment anyway and it would work as expected (this is just a loading process)
if you like i can help you over Telegram (chat app) which would be faster at this point (look for my GitHub user )
use the first one of your picture... as later you have to change the environment anyway and it would work as expected (this is just a loading process)
if you like i can help you over Telegram (chat app) which would be faster at this point (look for my GitHub user )
<!-- github-comment-id:3214699200 -->
Ah, I don't have Telegram - have it loaded now and editing the igate_conf.json.
Let me know where that line is and I'll give it a try.
Thanks again for all of the help!
Ah, I don't have Telegram - have it loaded now and editing the igate_conf.json.
Let me know where that line is and I'll give it a try.
Thanks again for all of the help!
<!-- github-comment-id:3214769806 -->
delete this line: #define OLED_DISPLAY_HAS_RST_PIN
save the file and just upload the firmware again (no need to change filesystem)
LoRa_APRS_iGate/varians/ttgo_t_beam_s3_SUPREME_v3/board_pinout.h
line 45
delete this line: #define OLED_DISPLAY_HAS_RST_PIN
save the file and just upload the firmware again (no need to change filesystem)
<!-- github-comment-id:3214782636 -->
I have VSCode installed, I added PlatformIO and got the main source code from the v3.0 release imported.
I navigated to the s3 Supreme > Pinout.h and removed that line just fine.
I saved.
I clicked build.. it passed
I selected the ttgo_t_beam_s3_SUPREME_v3 as the environment from the bottom status bar.
I clicked upload and it seemed to have uploaded to the device. (Side note: I went directly from the tracker to the iGate firmware)
Maybe I'm missing something in the environment settings or upload process but the change doesn't seem to be working as the display is still "corrupted."
here's a screenshot after trying to upload
Hi, sorry I lost track of getting back to this.
I have VSCode installed, I added PlatformIO and got the main source code from the v3.0 release imported.
I navigated to the s3 Supreme > Pinout.h and removed that line just fine.
I saved.
I clicked build.. it passed
I selected the ttgo_t_beam_s3_SUPREME_v3 as the environment from the bottom status bar.
I clicked upload and it seemed to have uploaded to the device. (Side note: I went directly from the tracker to the iGate firmware)
Maybe I'm missing something in the environment settings or upload process but the change doesn't seem to be working as the display is still "corrupted."
here's a screenshot after trying to upload

<!-- github-comment-id:3216692484 -->
Just to confirm, I'm getting the same result as @MastarPete - screen is still corrupted.
And I also went directly from the tracker to the iGate firmware.
Just to confirm, I'm getting the same result as @MastarPete - screen is still corrupted.
And I also went directly from the tracker to the iGate firmware.
<!-- github-comment-id:3216723277 -->
i've compared it with the tracker "again" and it should run! i'm really confused about it... will keep on checking stuff
i've compared it with the tracker "again" and it should run! i'm really confused about it... will keep on checking stuff
<!-- github-comment-id:3216799163 -->
Thanks for trying! I am just comparing the code in display.cpp and I notice it seems different between the tracker and igate versions?
Is the display issue linked to the handling of ssd1306?
Tracker:
#else
#include <Adafruit_GFX.h>
#define ssd1306 //comment this line with "//" when using SH1106 screen instead of SSD1306
#if defined(TTGO_T_Beam_S3_SUPREME_V3)
#undef ssd1306
#endif
Thanks for trying! I am just comparing the code in display.cpp and I notice it seems different between the tracker and igate versions?
Is the display issue linked to the handling of ssd1306?
Tracker:
```
#else
#include <Adafruit_GFX.h>
#define ssd1306 //comment this line with "//" when using SH1106 screen instead of SSD1306
#if defined(TTGO_T_Beam_S3_SUPREME_V3)
#undef ssd1306
#endif
```
iGate code:
```
#if defined(TTGO_T_Beam_S3_SUPREME_V3)
#include <Adafruit_SH110X.h>
Adafruit_SH1106G display(128, 64, &Wire, OLED_RST);
#else
#include <Adafruit_SSD1306.h>
#ifdef HELTEC_WSL_V3_DISPLAY
Adafruit_SSD1306 display(128, 64, &Wire1, OLED_RST);
#else
Adafruit_SSD1306 display(128, 64, &Wire, OLED_RST);
#endif
#endif
```
<!-- github-comment-id:3216968799 -->
on the igate the single one board with SH1106 screen is the Supreme... this is why is forced to work with this library and not the way of the tracker, although they end up working the same and it is only a difference in how its called.
crazy thing would be to know LILYGO changed the screen recently
on the igate the single one board with SH1106 screen is the Supreme... this is why is forced to work with this library and not the way of the tracker, although they end up working the same and it is only a difference in how its called.
crazy thing would be to know LILYGO changed the screen recently
<!-- github-comment-id:3216996699 -->
OK - I have got the display working, I am not to thank for this though - I was playing around with AI to diagnose the issue:
"The final fix involved using the correct library for your specific board, and then correctly handling the different function names and constants between the Adafruit_SSD1306 and Adafruit_SH110X libraries. "
@MastarPete you might try and copy and paste and replace the existing display.cpp and see if this works for you too.
/* Copyright (C) 2025 Ricardo Guzman - CA2RXU
* * This file is part of LoRa APRS iGate.
* * LoRa APRS iGate is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* * LoRa APRS iGate is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* * You should have received a copy of the GNU General Public License
* along with LoRa APRS iGate. If not, see <https://www.gnu.org/licenses/>.
*/
#include <Wire.h>
#include "configuration.h"
#include "board_pinout.h"
#include "display.h"
#ifdef HAS_DISPLAY
#ifdef HAS_TFT
#include <TFT_eSPI.h>
TFT_eSPI tft = TFT_eSPI();
TFT_eSprite sprite = TFT_eSprite(&tft);
#ifdef HELTEC_WIRELESS_TRACKER
#define bigSizeFont 2
#define smallSizeFont 1
#define lineSpacing 10
#endif
#if defined(TTGO_T_DECK_GPS) || defined(TTGO_T_DECK_PLUS)
#define bigSizeFont 5
#define smallSizeFont 2
#define lineSpacing 25
#endif
uint16_t redColor = 0xc8a2;
#else
#ifdef HAS_EPAPER
#include <heltec-eink-modules.h>
#include "Fonts/FreeSansBold9pt7b.h"
EInkDisplay_WirelessPaperV1_1 display;
String lastEpaperText;
#else
#include <Adafruit_SH110X.h>
#if defined(TTGO_T_Beam_S3_SUPREME_V3)
Adafruit_SH1106G display(128, 64, &Wire, OLED_RST);
#else
Adafruit_SSD1306 display(128, 64, &Wire, OLED_RST);
#endif
#endif
#endif
#endif
extern Configuration Config;
bool displayFound = false;
void displaySetup() {
#ifdef HAS_DISPLAY
delay(500);
#ifdef HAS_TFT
tft.init();
tft.begin();
if (Config.display.turn180) {
tft.setRotation(3);
} else {
tft.setRotation(1);
}
pinMode(TFT_BL, OUTPUT);
digitalWrite(TFT_BL, HIGH);
tft.setTextFont(0);
tft.fillScreen(TFT_BLACK);
#if defined(TTGO_T_DECK_GPS) || defined(TTGO_T_DECK_PLUS)
sprite.createSprite(320,240);
#else
sprite.createSprite(160,80);
#endif
#else
#ifdef HAS_EPAPER
display.landscape();
display.printCenter("LoRa APRS iGate Initialising...");
display.update();
#else
#ifdef OLED_DISPLAY_HAS_RST_PIN
pinMode(OLED_RST, OUTPUT);
digitalWrite(OLED_RST, LOW);
delay(20);
digitalWrite(OLED_RST, HIGH);
#endif
#if defined(TTGO_T_Beam_S3_SUPREME_V3)
if (display.begin(0x3c)) {
displayFound = true;
if (Config.display.turn180) display.setRotation(2);
display.clearDisplay();
display.setTextColor(SH110X_WHITE);
display.setTextSize(1);
display.setCursor(0, 0);
display.setContrast(1);
display.display();
}
#else
if(display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
displayFound = true;
if (Config.display.turn180) display.setRotation(2);
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(1);
display.setCursor(0, 0);
display.ssd1306_command(SSD1306_SETCONTRAST);
display.ssd1306_command(1);
display.display();
}
#endif
#endif
#endif
delay(1000);
#endif
}
void displayToggle(bool toggle) {
#ifdef HAS_DISPLAY
if (toggle) {
#ifdef HAS_TFT
digitalWrite(TFT_BL, HIGH);
#else
#ifdef HAS_EPAPER
display.printCenter("EPAPER Display Disabled by toggle...");
display.update();
#else
if (displayFound) {
#if defined(TTGO_T_Beam_S3_SUPREME_V3)
display.oled_command(SH110X_DISPLAYON);
#else
display.ssd1306_command(SSD1306_DISPLAYON);
#endif
}
#endif
#endif
} else {
#ifdef HAS_TFT
digitalWrite(TFT_BL, LOW);
#else
#ifdef HAS_EPAPER
display.printCenter("Enabled EPAPER Display...");
display.update();
#else
if (displayFound) {
#if defined(TTGO_T_Beam_S3_SUPREME_V3)
display.oled_command(SH110X_DISPLAYOFF);
#else
display.ssd1306_command(SSD1306_DISPLAYOFF);
#endif
}
#endif
#endif
}
#endif
}
void displayShow(const String& header, const String& line1, const String& line2, const String& line3, int wait) {
#ifdef HAS_DISPLAY
const String* const lines[] = {&line1, &line2, &line3};
#ifdef HAS_TFT
sprite.fillSprite(TFT_BLACK);
#if defined(HELTEC_WIRELESS_TRACKER)
sprite.fillRect(0, 0, 160, 19, redColor);
#endif
#if defined(TTGO_T_DECK_GPS) || defined(TTGO_T_DECK_PLUS)
sprite.fillRect(0, 0, 320, 43, redColor);
#endif
sprite.setTextFont(0);
sprite.setTextSize(bigSizeFont);
sprite.setTextColor(TFT_WHITE, redColor);
sprite.drawString(header, 3, 3);
sprite.setTextSize(smallSizeFont);
sprite.setTextColor(TFT_WHITE, TFT_BLACK);
for (int i = 0; i < 3; i++) {
sprite.drawString(*lines[i], 3, (lineSpacing * (2 + i)) - 2);
}
sprite.pushSprite(0,0);
#else
#ifdef HAS_EPAPER
display.clearMemory();
display.setCursor(5,10);
display.setFont(&FreeSansBold9pt7b);
display.println(header);
display.setFont(NULL);
for (int i = 0; i < 3; i++) {
display.setCursor(0, 25 + (14 * i));
display.println(*lines[i]);
}
display.update();
#else
if (displayFound) {
display.clearDisplay();
display.setTextColor(SH110X_WHITE);
display.setTextSize(1);
display.setCursor(0, 0);
display.println(header);
for (int i = 0; i < 3; i++) {
display.setCursor(0, 8 + (8 * i));
display.println(*lines[i]);
}
display.display();
}
#endif
#endif
delay(wait);
#endif
}
void displayShow(const String& header, const String& line1, const String& line2, const String& line3, const String& line4, const String& line5, const String& line6, int wait) {
#ifdef HAS_DISPLAY
const String* const lines[] = {&line1, &line2, &line3, &line4, &line5, &line6};
#ifdef HAS_TFT
sprite.fillSprite(TFT_BLACK);
#if defined(HELTEC_WIRELESS_TRACKER)
sprite.fillRect(0, 0, 160, 19, redColor);
#endif
#if defined(TTGO_T_DECK_GPS) || defined(TTGO_T_DECK_PLUS)
sprite.fillRect(0, 0, 320, 43, redColor);
#endif
sprite.setTextFont(0);
sprite.setTextSize(bigSizeFont);
sprite.setTextColor(TFT_WHITE, redColor);
sprite.drawString(header, 3, 3);
sprite.setTextSize(smallSizeFont);
sprite.setTextColor(TFT_WHITE, TFT_BLACK);
for (int i = 0; i < 6; i++) {
sprite.drawString(*lines[i], 3, (lineSpacing * (2 + i)) - 2);
}
sprite.pushSprite(0,0);
#else
#ifdef HAS_EPAPER
lastEpaperText = header + line1 + line2 + line3 + line4 + line5 + line6;
display.clearMemory();
display.setCursor(5,10);
display.setFont(&FreeSansBold9pt7b);
display.println(header);
display.setFont(NULL);
for (int i = 0; i < 6; i++) {
display.setCursor(0, 25 + (14 * i));
display.println(*lines[i]);
}
display.update();
#else
if (displayFound) {
display.clearDisplay();
display.setTextColor(SH110X_WHITE);
display.setTextSize(2);
display.setCursor(0, 0);
display.println(header);
display.setTextSize(1);
for (int i = 0; i < 6; i++) {
display.setCursor(0, 16 + (8 * i));
display.println(*lines[i]);
}
display.display();
}
#endif
#endif
delay(wait);
#endif
}
OK - I have got the display working, I am not to thank for this though - I was playing around with AI to diagnose the issue:
"The final fix involved using the correct library for your specific board, and then correctly handling the different function names and constants between the Adafruit_SSD1306 and Adafruit_SH110X libraries. "
@MastarPete you might try and copy and paste and replace the existing display.cpp and see if this works for you too.
```
/* Copyright (C) 2025 Ricardo Guzman - CA2RXU
* * This file is part of LoRa APRS iGate.
* * LoRa APRS iGate is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* * LoRa APRS iGate is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* * You should have received a copy of the GNU General Public License
* along with LoRa APRS iGate. If not, see <https://www.gnu.org/licenses/>.
*/
#include <Wire.h>
#include "configuration.h"
#include "board_pinout.h"
#include "display.h"
#ifdef HAS_DISPLAY
#ifdef HAS_TFT
#include <TFT_eSPI.h>
TFT_eSPI tft = TFT_eSPI();
TFT_eSprite sprite = TFT_eSprite(&tft);
#ifdef HELTEC_WIRELESS_TRACKER
#define bigSizeFont 2
#define smallSizeFont 1
#define lineSpacing 10
#endif
#if defined(TTGO_T_DECK_GPS) || defined(TTGO_T_DECK_PLUS)
#define bigSizeFont 5
#define smallSizeFont 2
#define lineSpacing 25
#endif
uint16_t redColor = 0xc8a2;
#else
#ifdef HAS_EPAPER
#include <heltec-eink-modules.h>
#include "Fonts/FreeSansBold9pt7b.h"
EInkDisplay_WirelessPaperV1_1 display;
String lastEpaperText;
#else
#include <Adafruit_SH110X.h>
#if defined(TTGO_T_Beam_S3_SUPREME_V3)
Adafruit_SH1106G display(128, 64, &Wire, OLED_RST);
#else
Adafruit_SSD1306 display(128, 64, &Wire, OLED_RST);
#endif
#endif
#endif
#endif
extern Configuration Config;
bool displayFound = false;
void displaySetup() {
#ifdef HAS_DISPLAY
delay(500);
#ifdef HAS_TFT
tft.init();
tft.begin();
if (Config.display.turn180) {
tft.setRotation(3);
} else {
tft.setRotation(1);
}
pinMode(TFT_BL, OUTPUT);
digitalWrite(TFT_BL, HIGH);
tft.setTextFont(0);
tft.fillScreen(TFT_BLACK);
#if defined(TTGO_T_DECK_GPS) || defined(TTGO_T_DECK_PLUS)
sprite.createSprite(320,240);
#else
sprite.createSprite(160,80);
#endif
#else
#ifdef HAS_EPAPER
display.landscape();
display.printCenter("LoRa APRS iGate Initialising...");
display.update();
#else
#ifdef OLED_DISPLAY_HAS_RST_PIN
pinMode(OLED_RST, OUTPUT);
digitalWrite(OLED_RST, LOW);
delay(20);
digitalWrite(OLED_RST, HIGH);
#endif
#if defined(TTGO_T_Beam_S3_SUPREME_V3)
if (display.begin(0x3c)) {
displayFound = true;
if (Config.display.turn180) display.setRotation(2);
display.clearDisplay();
display.setTextColor(SH110X_WHITE);
display.setTextSize(1);
display.setCursor(0, 0);
display.setContrast(1);
display.display();
}
#else
if(display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
displayFound = true;
if (Config.display.turn180) display.setRotation(2);
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(1);
display.setCursor(0, 0);
display.ssd1306_command(SSD1306_SETCONTRAST);
display.ssd1306_command(1);
display.display();
}
#endif
#endif
#endif
delay(1000);
#endif
}
void displayToggle(bool toggle) {
#ifdef HAS_DISPLAY
if (toggle) {
#ifdef HAS_TFT
digitalWrite(TFT_BL, HIGH);
#else
#ifdef HAS_EPAPER
display.printCenter("EPAPER Display Disabled by toggle...");
display.update();
#else
if (displayFound) {
#if defined(TTGO_T_Beam_S3_SUPREME_V3)
display.oled_command(SH110X_DISPLAYON);
#else
display.ssd1306_command(SSD1306_DISPLAYON);
#endif
}
#endif
#endif
} else {
#ifdef HAS_TFT
digitalWrite(TFT_BL, LOW);
#else
#ifdef HAS_EPAPER
display.printCenter("Enabled EPAPER Display...");
display.update();
#else
if (displayFound) {
#if defined(TTGO_T_Beam_S3_SUPREME_V3)
display.oled_command(SH110X_DISPLAYOFF);
#else
display.ssd1306_command(SSD1306_DISPLAYOFF);
#endif
}
#endif
#endif
}
#endif
}
void displayShow(const String& header, const String& line1, const String& line2, const String& line3, int wait) {
#ifdef HAS_DISPLAY
const String* const lines[] = {&line1, &line2, &line3};
#ifdef HAS_TFT
sprite.fillSprite(TFT_BLACK);
#if defined(HELTEC_WIRELESS_TRACKER)
sprite.fillRect(0, 0, 160, 19, redColor);
#endif
#if defined(TTGO_T_DECK_GPS) || defined(TTGO_T_DECK_PLUS)
sprite.fillRect(0, 0, 320, 43, redColor);
#endif
sprite.setTextFont(0);
sprite.setTextSize(bigSizeFont);
sprite.setTextColor(TFT_WHITE, redColor);
sprite.drawString(header, 3, 3);
sprite.setTextSize(smallSizeFont);
sprite.setTextColor(TFT_WHITE, TFT_BLACK);
for (int i = 0; i < 3; i++) {
sprite.drawString(*lines[i], 3, (lineSpacing * (2 + i)) - 2);
}
sprite.pushSprite(0,0);
#else
#ifdef HAS_EPAPER
display.clearMemory();
display.setCursor(5,10);
display.setFont(&FreeSansBold9pt7b);
display.println(header);
display.setFont(NULL);
for (int i = 0; i < 3; i++) {
display.setCursor(0, 25 + (14 * i));
display.println(*lines[i]);
}
display.update();
#else
if (displayFound) {
display.clearDisplay();
display.setTextColor(SH110X_WHITE);
display.setTextSize(1);
display.setCursor(0, 0);
display.println(header);
for (int i = 0; i < 3; i++) {
display.setCursor(0, 8 + (8 * i));
display.println(*lines[i]);
}
display.display();
}
#endif
#endif
delay(wait);
#endif
}
void displayShow(const String& header, const String& line1, const String& line2, const String& line3, const String& line4, const String& line5, const String& line6, int wait) {
#ifdef HAS_DISPLAY
const String* const lines[] = {&line1, &line2, &line3, &line4, &line5, &line6};
#ifdef HAS_TFT
sprite.fillSprite(TFT_BLACK);
#if defined(HELTEC_WIRELESS_TRACKER)
sprite.fillRect(0, 0, 160, 19, redColor);
#endif
#if defined(TTGO_T_DECK_GPS) || defined(TTGO_T_DECK_PLUS)
sprite.fillRect(0, 0, 320, 43, redColor);
#endif
sprite.setTextFont(0);
sprite.setTextSize(bigSizeFont);
sprite.setTextColor(TFT_WHITE, redColor);
sprite.drawString(header, 3, 3);
sprite.setTextSize(smallSizeFont);
sprite.setTextColor(TFT_WHITE, TFT_BLACK);
for (int i = 0; i < 6; i++) {
sprite.drawString(*lines[i], 3, (lineSpacing * (2 + i)) - 2);
}
sprite.pushSprite(0,0);
#else
#ifdef HAS_EPAPER
lastEpaperText = header + line1 + line2 + line3 + line4 + line5 + line6;
display.clearMemory();
display.setCursor(5,10);
display.setFont(&FreeSansBold9pt7b);
display.println(header);
display.setFont(NULL);
for (int i = 0; i < 6; i++) {
display.setCursor(0, 25 + (14 * i));
display.println(*lines[i]);
}
display.update();
#else
if (displayFound) {
display.clearDisplay();
display.setTextColor(SH110X_WHITE);
display.setTextSize(2);
display.setCursor(0, 0);
display.println(header);
display.setTextSize(1);
for (int i = 0; i < 6; i++) {
display.setCursor(0, 16 + (8 * i));
display.println(*lines[i]);
}
display.display();
}
#endif
#endif
delay(wait);
#endif
}
```
<!-- github-comment-id:3217043781 -->
The primary change between the two versions of the code is the replacement of the Adafruit_SSD1306 library-specific functions and constants with their Adafruit_SH110X equivalents, all conditionally compiled to work for both display types.
displaySetup()
This function now includes a conditional check for TTGO_T_Beam_S3_SUPREME_V3 to use the correct functions and constants.
Before: The original code had a more complex conditional block for initializing the Adafruit_SSD1306 display.
After: The revised code simplifies this by using Adafruit_SH110X for the TTGO_T_Beam_S3_SUPREME_V3. The display.begin() call is changed from !display.begin(0x3c, false) to the more common if (display.begin(0x3c)). This ensures the display initializes correctly. The display.setTextColor() function is updated to use SH110X_WHITE instead of WHITE. The display.ssd1306_command(SSD1306_SETCONTRAST) and display.ssd1306_command(1) functions are replaced with a single display.setContrast(1).
displayToggle()
This function controls turning the display on and off.
Before: The original code used display.ssd1306_command(SSD1306_DISPLAYON) and SSD1306_DISPLAYOFF) for the SSD1306 display. For the TTGO_T_Beam_S3_SUPREME_V3 model, it had display.oled_command(SH110X_DISPLAYON) and SH110X_DISPLAYOFF.
After: The revised code now explicitly uses the correct commands for each board type. It correctly uses display.oled_command(SH110X_DISPLAYON) and display.oled_command(SH110X_DISPLAYOFF) for the TTGO_T_Beam_S3_SUPREME_V3 and keeps the old ssd1306_command for other boards. The redundant if (displayFound) check was also removed inside the TTGO_T_Beam_S3_SUPREME_V3 conditional block, as the logic flow already handles this.
displayShow()
Both displayShow() functions were modified to use SH110X_WHITE.
Before: The code used a conditional check to set the text color.
After: This check was simplified to display.setTextColor(SH110X_WHITE) for the TTGO_T_Beam_S3_SUPREME_V3 board and display.setTextColor(WHITE) for others.
The primary change between the two versions of the code is the **replacement of the `Adafruit_SSD1306` library-specific functions and constants with their `Adafruit_SH110X` equivalents**, all conditionally compiled to work for both display types.
***
### `displaySetup()`
This function now includes a conditional check for `TTGO_T_Beam_S3_SUPREME_V3` to use the correct functions and constants.
* **Before**: The original code had a more complex conditional block for initializing the `Adafruit_SSD1306` display.
* **After**: The revised code simplifies this by using `Adafruit_SH110X` for the `TTGO_T_Beam_S3_SUPREME_V3`. The `display.begin()` call is changed from `!display.begin(0x3c, false)` to the more common `if (display.begin(0x3c))`. This ensures the display initializes correctly. The `display.setTextColor()` function is updated to use **`SH110X_WHITE`** instead of `WHITE`. The `display.ssd1306_command(SSD1306_SETCONTRAST)` and `display.ssd1306_command(1)` functions are replaced with a single `display.setContrast(1)`.
***
### `displayToggle()`
This function controls turning the display on and off.
* **Before**: The original code used `display.ssd1306_command(SSD1306_DISPLAYON)` and `SSD1306_DISPLAYOFF)` for the SSD1306 display. For the `TTGO_T_Beam_S3_SUPREME_V3` model, it had `display.oled_command(SH110X_DISPLAYON)` and `SH110X_DISPLAYOFF`.
* **After**: The revised code now explicitly uses the correct commands for each board type. It correctly uses `display.oled_command(SH110X_DISPLAYON)` and `display.oled_command(SH110X_DISPLAYOFF)` for the `TTGO_T_Beam_S3_SUPREME_V3` and keeps the old `ssd1306_command` for other boards. The redundant `if (displayFound)` check was also removed inside the `TTGO_T_Beam_S3_SUPREME_V3` conditional block, as the logic flow already handles this.
***
### `displayShow()`
Both `displayShow()` functions were modified to use `SH110X_WHITE`.
* **Before**: The code used a conditional check to set the text color.
* **After**: This check was simplified to `display.setTextColor(SH110X_WHITE)` for the `TTGO_T_Beam_S3_SUPREME_V3` board and `display.setTextColor(WHITE)` for others.
<!-- github-comment-id:3217059313 -->
and please validate if you uploaded it with the
#define OLED_DISPLAY_HAS_RST_PIN
or not
can you test just this?
change line 104 to this:
if (!display.begin(0x3c)) {
instead of : if (!display.begin(0x3c, false)) {
and please validate if you uploaded it with the
#define OLED_DISPLAY_HAS_RST_PIN
or not
<!-- github-comment-id:3217062467 -->
Yes I deleted the "#define OLED_DISPLAY_HAS_RST_PIN" line when uploading.
Will try that other change soon - just have to step away for a bit.
Yes I deleted the "#define OLED_DISPLAY_HAS_RST_PIN" line when uploading.
Will try that other change soon - just have to step away for a bit.
<!-- github-comment-id:3217077996 -->
Yes I deleted the "#define OLED_DISPLAY_HAS_RST_PIN" line when uploading.
Will try that other change soon - just have to step away for a bit.
awesome
if the change for:
if (!display.begin(0x3c)) {
(without the false) is needed and also the deleting of the #define we have solve the issue for adding it to the full firmware
> Yes I deleted the "#define OLED_DISPLAY_HAS_RST_PIN" line when uploading.
>
> Will try that other change soon - just have to step away for a bit.
awesome
if the change for:
if (!display.begin(0x3c)) {
(without the false) is needed and also the deleting of the #define we have solve the issue for adding it to the full firmware
<!-- github-comment-id:3217082219 -->
(without the false) is needed and also the deleting of the #define we have solve the issue for adding it to the full firmware
@richonguzman I just tried your fix but it did not work. if (!display.begin(0x3c)) {
I nuked the contents of display.cpp and pasted @EI3HIB's code and that worked.
EDIT: The display works using EI3HIB's code but I don't think the rest of the code is working as it's not broadcasting the config AP
EDIT 2: I tried both suggestions twice, verified that the define ..RST_PIN line was deleted all four times. if (!display.begin(0x3c)) { unfortunately is not enough, the display is still corrupted.
> if the change for: if (!display.begin(0x3c)) {
>
> (without the false) is needed and also the deleting of the #define we have solve the issue for adding it to the full firmware
@richonguzman I just tried your fix but it did not work.
`if (!display.begin(0x3c)) {`
<img width="648" height="287" alt="Image" src="https://github.com/user-attachments/assets/1fe6f92c-7fe3-463f-8061-e16d5f663b54" />
I nuked the contents of display.cpp and pasted @EI3HIB's code and that worked.

EDIT: The display works using EI3HIB's code but I don't think the rest of the code is working as it's not broadcasting the config AP
EDIT 2: I tried both suggestions twice, verified that the define ..RST_PIN line was deleted all four times.
`if (!display.begin(0x3c)) {` unfortunately is not enough, the display is still corrupted.
<!-- github-comment-id:3217126497 -->
I made that change to line 104 and screen just went back to being corrupted.
Reverted to my code above and screen came back (and it seemed like my settings had been saved from the working code?)
One thing to add, I left tracker_conf.json default and configured my settings over wifi once the screen started working - wondering if you're not seeing the config AP because you edited the json?
I made that change to line 104 and screen just went back to being corrupted.
Reverted to my code above and screen came back (and it seemed like my settings had been saved from the working code?)
One thing to add, I left tracker_conf.json default and configured my settings over wifi once the screen started working - wondering if you're not seeing the config AP because you edited the json?
<img width="706" height="606" alt="Image" src="https://github.com/user-attachments/assets/6916519a-5a2f-4e3f-8bc4-269a32bab75c" />
<!-- github-comment-id:3217172826 -->
One thing to add, I left tracker_conf.json default and configured my settings over wifi once the screen started working - wondering if you're not seeing the config AP because you edited the json?
Nope. I didn't bother trying to edit the config.json because I was expecting to just use the config AP. Maybe I was a bit impatient and didn't give my system enough time to update the wifi list??
Otherwise I'm missing something about how VSCode works and it did actually remember the one time I attempted to edit it. Despite me closing the workspace and deleting all files from the expanded folder in my download directory, in-between flash attempts.
> One thing to add, I left tracker_conf.json default and configured my settings over wifi once the screen started working - wondering if you're not seeing the config AP because you edited the json?
Nope. I didn't bother trying to edit the config.json because I was expecting to just use the config AP. Maybe I was a bit impatient and didn't give my system enough time to update the wifi list??
Otherwise I'm missing something about how VSCode works and it did actually remember the one time I attempted to edit it. Despite me closing the workspace and deleting all files from the expanded folder in my download directory, in-between flash attempts.
<!-- github-comment-id:3217208552 -->
we need to find exactly what is needed for the board to work ok with the mods but also so that i can add this to the main firmware and not have a custom T-Beam Supreme firmware that breaks all the other boards from working.
@EI3HIB and @MastarPete
what are the mods needed for it to work?
if (!display.begin(0x3c)) + deleting #define OLED_DISPLAY_HAS_RST_PIN ???
or is there another thing ? (please don't tell me about pasting the working display.cpp as this will only work for T-Beam Supreme and no other board 😂😂😂😂
ok.
we need to find exactly what is needed for the board to work ok with the mods but also so that i can add this to the main firmware and not have a custom T-Beam Supreme firmware that breaks all the other boards from working.
@EI3HIB and @MastarPete
what are the mods needed for it to work?
if (!display.begin(0x3c)) + deleting #define OLED_DISPLAY_HAS_RST_PIN ???
or is there another thing ? (please don't tell me about pasting the working display.cpp as this will only work for T-Beam Supreme and no other board 😂😂😂😂
<!-- github-comment-id:3218051241 -->
Hi @EI3HIB and @MastarPete could you test and identify the single or the minimal mods needed for this to add to the "almost ready to share" new version for iGate?
Hi @EI3HIB and @MastarPete could you test and identify the single or the minimal mods needed for this to add to the "almost ready to share" new version for iGate?
<!-- github-comment-id:3229494177 -->
@richonguzman Sorry, as I said in my previous post, I still haven't had luck with your code suggestions. The display is corrupted and the wifi AP never shows up for me to even get it configured. I'm wondering if the ESP32 device environment isn't quite correct?? Or else the upload/flash somehow isn't clearing out old settings, causing a soft-lock.
I haven't coded enough to be able to contribute how to re-write whats there. I can somewhat follow along to make minor modifications to existing code but that's about it. To me, when I compared to the tracker display code, it looks like there's not enough code to define the screen for the iGate when running on a Supreme. If the code is pointing to another support library to define the display, then I've missed the pointer.
Side note. I was a little surprised that the iGate is using a different code structure in display.cpp and I can't help but wonder if that's contributing to something getting overlooked?? Then again, I am the noob here. ^_^
@richonguzman Sorry, as I said in my [previous post](https://github.com/richonguzman/LoRa_APRS_iGate/issues/307#issuecomment-3217126497), I still haven't had luck with your code suggestions. The display is corrupted and the wifi AP never shows up for me to even get it configured. I'm wondering if the ESP32 device environment isn't quite correct?? Or else the upload/flash somehow isn't clearing out old settings, causing a soft-lock.
I haven't coded enough to be able to contribute how to re-write whats there. I can somewhat follow along to make minor modifications to existing code but that's about it. To me, when I compared to the tracker display code, it looks like there's not enough code to define the screen for the iGate when running on a Supreme. If the code is pointing to another support library to define the display, then I've missed the pointer.
Side note. I was a little surprised that the iGate is using a different code structure in display.cpp and I can't help but wonder if that's contributing to something getting overlooked?? Then again, I am the noob here. ^_^
<!-- github-comment-id:3254810635 -->
Any fix for this issue looming? I'm gasping to set my node up as an igate using this firmware but I'm having to make do with Nakhonthai's version currently.
Any fix for this issue looming? I'm gasping to set my node up as an igate using this firmware but I'm having to make do with Nakhonthai's version currently.
<!-- github-comment-id:3433280652 -->
Any fix for this issue looming? I'm gasping to set my node up as an igate using this firmware but I'm having to make do with Nakhonthai's version currently.
sorry, but i didn't have any confirmation about the exact mods that worked for @EI3HIB
If he can confirms that is only needed the deleting of a line... i will add this ASAP
> Any fix for this issue looming? I'm gasping to set my node up as an igate using this firmware but I'm having to make do with Nakhonthai's version currently.
sorry, but i didn't have any confirmation about the exact mods that worked for @EI3HIB
If he can confirms that is only needed the deleting of a line... i will add this ASAP
<!-- github-comment-id:3442789997 -->
It would be nice to hear back from @EI3HIB because I still can't replicate their result. I tried again over the last hour using every combination of modifications suggested above.
Nuking display.cpp and pasting that entire code blob just gets me the boot logo and nothing else. The wifi AP never shows up when I use my tablet and a wifi scanning app.
EI3HIB mentioned pre-configuring everything but did not clarify where they made the modifications. That could be the magic needed but I agree that's not a proper fix if the intent of the project is to webflash and be done.
It would be nice to hear back from @EI3HIB because I still can't replicate their result. I tried again over the last hour using every combination of modifications suggested above.
Nuking display.cpp and pasting that entire code blob just gets me the boot logo and nothing else. The wifi AP never shows up when I use my tablet and a wifi scanning app.
EI3HIB mentioned pre-configuring everything but did not clarify where they made the modifications. That could be the magic needed but I agree that's not a proper fix if the intent of the project is to webflash and be done.
<!-- github-comment-id:3447856723 -->
Just wanted to jump in and say +1 having the issue as well. Everything else works, just the display seems to be initializing incorrectly somehow.
Commenting out the reset define didn't work, nor did removing the false flag from the initialization.
This isn't a show-stopper for my use case, but I'll keep poking at it to see if I can get it to work.
Just wanted to jump in and say +1 having the issue as well. Everything else works, just the display seems to be initializing incorrectly somehow.
Commenting out the reset define didn't work, nor did removing the false flag from the initialization.
This isn't a show-stopper for my use case, but I'll keep poking at it to see if I can get it to work.
<!-- github-comment-id:3453479463 -->
Add me to the list of hams having this problem! I've followed the steps in this issue and seem to be in the same spot as everyone else:
Deleting #define OLED_DISPLAY_HAS_RST_PIN: No change
Modifying if (!display.begin(0x3c)) {: No change
Replacing display.cpp with @EI3HIB version: Display works!
I'm not a coder but will poke around and see if I can find a diff to your display.cpp that resolves this. I am available to try any additional ideas on my device. My Telegram username is @brianlefevre.
Add me to the list of hams having this problem! I've followed the steps in this issue and seem to be in the same spot as everyone else:
- Deleting `#define OLED_DISPLAY_HAS_RST_PIN`: No change
- Modifying `if (!display.begin(0x3c)) {`: No change
- Replacing `display.cpp` with @EI3HIB version: Display works!
I'm not a coder but will poke around and see if I can find a diff to your display.cpp that resolves this. I am available to try any additional ideas on my device. My Telegram username is `@brianlefevre`.
<!-- github-comment-id:3499992633 -->
I think I got it, submitted pull request #360 with one character fix. (@richonguzman did request "minimal mods!")
I think I got it, submitted pull request #360 with one character fix. (@richonguzman did request "minimal mods!")
<!-- github-comment-id:3500272728 -->
Yeah I think that did it! I used 3.1.4, removed that pesky ! and flashed with VsCode. Display worked and was able to access the Wifi AP.
Now if only I hadn't misconfigured it and locked myself out. 🤣🤦
Yeah I think that did it! I used 3.1.4, removed that pesky ! and flashed with VsCode. Display worked and was able to access the Wifi AP.
Now if only I hadn't misconfigured it and locked myself out. 🤣🤦
<!-- github-comment-id:3505423449 -->
Screen fixed, now different issue. After configuration via AP the device reboots, connects to my network then displays NOCALL-10 and error message "APRS PASSCODE NOT VALID!!!"
Wi-Fi AP is broadcasting but unable to connect to it.
Screen fixed, now different issue. After configuration via AP the device reboots, connects to my network then displays NOCALL-10 and error message "APRS PASSCODE NOT VALID!!!"
Wi-Fi AP is broadcasting but unable to connect to it.
<!-- github-comment-id:3507890803 -->
Screen fixed, now different issue. After configuration via AP the device reboots, connects to my network then displays NOCALL-10 and error message "APRS PASSCODE NOT VALID!!!"
Wi-Fi AP is broadcasting but unable to connect to it.
save just the Callsign, lat+lng, Wifi credentials, aprs passcode and enable aprs-is connection en test again please
only letters and numbers as characters please
> Screen fixed, now different issue. After configuration via AP the device reboots, connects to my network then displays NOCALL-10 and error message "APRS PASSCODE NOT VALID!!!"
>
> Wi-Fi AP is broadcasting but unable to connect to it.
save just the Callsign, lat+lng, Wifi credentials, aprs passcode and enable aprs-is connection en test again please
only letters and numbers as characters please
<!-- github-comment-id:3508220283 -->
Screen fixed, now different issue. After configuration via AP the device reboots, connects to my network then displays NOCALL-10 and error message "APRS PASSCODE NOT VALID!!!"
Wi-Fi AP is broadcasting but unable to connect to it.
save just the Callsign, lat+lng, Wifi credentials, aprs passcode and enable aprs-is connection en test again please
only letters and numbers as characters please
All up and running, issues resolved. Happy days!
> > Screen fixed, now different issue. After configuration via AP the device reboots, connects to my network then displays NOCALL-10 and error message "APRS PASSCODE NOT VALID!!!"
> >
> > Wi-Fi AP is broadcasting but unable to connect to it.
>
> save just the Callsign, lat+lng, Wifi credentials, aprs passcode and enable aprs-is connection en test again please
>
> only letters and numbers as characters please
All up and running, issues resolved. Happy days!
<!-- github-comment-id:3508534557 -->
VSCode wasn't properly flushing out the old settings properly so I didn't get a good run-through of getting it configured.
Now that a proper firmware is on the web flasher I've got it up an running, the display issue looks to be resolved!
I skipped setting a fixed position, the GPS eventually got a fix and updated the iGate's location.
Might be useful to add a "get location" button for devices with a gps?
VSCode wasn't properly flushing out the old settings properly so I didn't get a good run-through of getting it configured.
Now that a proper firmware is on the web flasher I've got it up an running, the display issue looks to be resolved!
I skipped setting a fixed position, the GPS eventually got a fix and updated the iGate's location.
Might be useful to add a "get location" button for devices with a gps?
<!-- github-comment-id:3508761033 -->
VSCode wasn't properly flushing out the old settings properly so I didn't get a good run-through of getting it configured. Now that a proper firmware is on the web flasher I've got it up an running, the display issue looks to be resolved!
I skipped setting a fixed position, the GPS eventually got a fix and updated the iGate's location. Might be useful to add a "get location" button for devices with a gps?
if you enable to "SEND BEACON from GPS data" it will do it automatically
Glad it worked out!
> VSCode wasn't properly flushing out the old settings properly so I didn't get a good run-through of getting it configured. Now that a proper firmware is on the web flasher I've got it up an running, the display issue looks to be resolved!
>
> I skipped setting a fixed position, the GPS eventually got a fix and updated the iGate's location. Might be useful to add a "get location" button for devices with a gps?
if you enable to "SEND BEACON from GPS data" it will do it automatically
Glad it worked out!
<!-- github-comment-id:3508779350 -->
if you enable to "SEND BEACON from GPS data" it will do it automatically
Glad it worked out!
True, however even after it had a fix the Lat/long never populated on its own. It just stays 0/0 so there's no feedback to indicate that is how it works.
I just figured It would be nice to get a fix without beaconing.
> if you enable to "SEND BEACON from GPS data" it will do it automatically
>
> Glad it worked out!
True, however even after it had a fix the Lat/long never populated on its own. It just stays 0/0 so there's no feedback to indicate that is how it works.
I just figured It would be nice to get a fix without beaconing.
<!-- github-comment-id:3508822352 -->
if you enable to "SEND BEACON from GPS data" it will do it automatically
Glad it worked out!
True, however even after it had a fix the Lat/long never populated on its own. It just stays 0/0 so there's no feedback to indicate that is how it works. I just figured It would be nice to get a fix without beaconing.
there is no way to show on screen the values the gps has (for now)
> > if you enable to "SEND BEACON from GPS data" it will do it automatically
> > Glad it worked out!
>
> True, however even after it had a fix the Lat/long never populated on its own. It just stays 0/0 so there's no feedback to indicate that is how it works. I just figured It would be nice to get a fix without beaconing.
there is no way to show on screen the values the gps has (for now)
<!-- github-comment-id:3508824024 -->
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Hello, I've got a T-Beam Supreme V3 and no matter which version of the iGate firmware I flash the display always looks like it's corrupted.
I tried mentioning this in another issue thread that specifically mentions the T-Beam Supreme but I finally realized with the v3.0 firmware that the iGate was actually functioning, I just couldn't use the display. If needed I can go back and verify the older versions, but my main problem is lack of useable display output. old comment
Here is a photo of the issue.
This same hardware has no issue running your APRS Tracker firmware. I previously had Meshtastic running just fine as well.
Edit: I'm in the US and purchased mine directly from Lilygo, which shipped from China.
Hello! I do have the same issue with the screen showing up static artefacts
Wow - I've never seen that on my Supremes. I've suffered the "missing line" syndrome specifically on the paxcounter v1.6.1. When you had it configured with Meshtastic did the display work? Or, for that matter, did the display ever work %^)?
Hope you figure it out! Cheers and 73 - Jon N7UV
The display works fine with the tracker firmware
I haven't loaded Meshtastic since way back in October '24 but I don't remember any trouble with the display. It would have been obvious if it arrived with a dead display. I think the one I ordered for 433mhz shipped with SoftRF, that powered on and pinged my T-Echo that also shipped with SoftRF just fine.
Only thing, I got my Supremes before the iGate firmware was available. I guess I'll have to try it with the other Supreme I have for Meshtastic on 900mhz. Maybe there's a subtle hardware difference between what I got directly from LilyGo vs what I got from Rokland. I'll add a new reply if I notice anything.
please validate the screen on your T-beam Supreme is SH1106 and not SSD1306.
Ooof, I tried to dismantle it as far as I felt comfortable but I think the numbers I saw were for the ribbon cable or the glass assembly.
If it's printed on the back of the panel then I don't currently have the tools to properly dismount it from the acrylic frame.
I'm not familiar with getting a programming environment setup for these boards. Is there a way to check via console of some sort?
maybe we just need to know if you ever changed it or not... it comes with SH1106 regularly from factory
I have not modified it other than giving it a proper antenna. It is as shipped directly from LilyGo's warehouse in China.
I looked up my order on the lilygo.cc website. purchased Oct 6 2024.
T-Beam Supreme SoftRF 433mhz UBLOX.
Maybe they had old inventory that did not include the SH1106 and I got unlucky??
we can test a variation of your board to test SSD1306:
I'm willing to try but I would need a tutorial to get that going.
Edit: I'm going to follow one of the tutorials on LiLygo's github. Let me know what commands or code changes I'd need to make.
Just to add I'm also running into the same corrupt display issue with the T-Beam Supreme V3.
The display works fine with the tracker firmware & Meshtastic.
anyone of @EI3HIB or @MastarPete can help me locally install from VSCODE a minor update i can guide you from here?
is removing a line that i suspect could fix it and with this i can fast update web flasher to have the right version for you both ?
@richonguzman sorry for the delay in replying, I'd be happy to help - can you just advise me what I need to do? Do I need to install VSCODE?
yes, download VSCODE, download this repository, import it into vscode + platformio
the EDIT is just taking away 1 line... let me know when you are done with the installation and all
(this is a "bad" guide for installing the needed programs:
https://github.com/richonguzman/LoRa_APRS_Tracker/wiki/01.-Installation-Guide-%23-Guia-de-Instalacion )
Thank You! OK downloaded and installed - just a stupid question: when selecting the board on the "Import Arduino Project" what one should I pick for the T-Beam Supreme V3?
use the first one of your picture... as later you have to change the environment anyway and it would work as expected (this is just a loading process)
if you like i can help you over Telegram (chat app) which would be faster at this point (look for my GitHub user )
Ah, I don't have Telegram - have it loaded now and editing the igate_conf.json.
Let me know where that line is and I'll give it a try.
Thanks again for all of the help!
LoRa_APRS_iGate/varians/ttgo_t_beam_s3_SUPREME_v3/board_pinout.h
line 45
delete this line: #define OLED_DISPLAY_HAS_RST_PIN
save the file and just upload the firmware again (no need to change filesystem)
Hi, sorry I lost track of getting back to this.
I have VSCode installed, I added PlatformIO and got the main source code from the v3.0 release imported.
I navigated to the s3 Supreme > Pinout.h and removed that line just fine.
I saved.
I clicked build.. it passed
I selected the ttgo_t_beam_s3_SUPREME_v3 as the environment from the bottom status bar.
I clicked upload and it seemed to have uploaded to the device. (Side note: I went directly from the tracker to the iGate firmware)
Maybe I'm missing something in the environment settings or upload process but the change doesn't seem to be working as the display is still "corrupted."
here's a screenshot after trying to upload

Just to confirm, I'm getting the same result as @MastarPete - screen is still corrupted.
And I also went directly from the tracker to the iGate firmware.
i've compared it with the tracker "again" and it should run! i'm really confused about it... will keep on checking stuff
Thanks for trying! I am just comparing the code in display.cpp and I notice it seems different between the tracker and igate versions?
Is the display issue linked to the handling of ssd1306?
Tracker:
iGate code:
on the igate the single one board with SH1106 screen is the Supreme... this is why is forced to work with this library and not the way of the tracker, although they end up working the same and it is only a difference in how its called.
crazy thing would be to know LILYGO changed the screen recently
OK - I have got the display working, I am not to thank for this though - I was playing around with AI to diagnose the issue:
"The final fix involved using the correct library for your specific board, and then correctly handling the different function names and constants between the Adafruit_SSD1306 and Adafruit_SH110X libraries. "
@MastarPete you might try and copy and paste and replace the existing display.cpp and see if this works for you too.
@EI3HIB what were the changes?
The primary change between the two versions of the code is the replacement of the
Adafruit_SSD1306library-specific functions and constants with theirAdafruit_SH110Xequivalents, all conditionally compiled to work for both display types.displaySetup()This function now includes a conditional check for
TTGO_T_Beam_S3_SUPREME_V3to use the correct functions and constants.Adafruit_SSD1306display.Adafruit_SH110Xfor theTTGO_T_Beam_S3_SUPREME_V3. Thedisplay.begin()call is changed from!display.begin(0x3c, false)to the more commonif (display.begin(0x3c)). This ensures the display initializes correctly. Thedisplay.setTextColor()function is updated to useSH110X_WHITEinstead ofWHITE. Thedisplay.ssd1306_command(SSD1306_SETCONTRAST)anddisplay.ssd1306_command(1)functions are replaced with a singledisplay.setContrast(1).displayToggle()This function controls turning the display on and off.
display.ssd1306_command(SSD1306_DISPLAYON)andSSD1306_DISPLAYOFF)for the SSD1306 display. For theTTGO_T_Beam_S3_SUPREME_V3model, it haddisplay.oled_command(SH110X_DISPLAYON)andSH110X_DISPLAYOFF.display.oled_command(SH110X_DISPLAYON)anddisplay.oled_command(SH110X_DISPLAYOFF)for theTTGO_T_Beam_S3_SUPREME_V3and keeps the oldssd1306_commandfor other boards. The redundantif (displayFound)check was also removed inside theTTGO_T_Beam_S3_SUPREME_V3conditional block, as the logic flow already handles this.displayShow()Both
displayShow()functions were modified to useSH110X_WHITE.display.setTextColor(SH110X_WHITE)for theTTGO_T_Beam_S3_SUPREME_V3board anddisplay.setTextColor(WHITE)for others.can you test just this?
change line 104 to this:
if (!display.begin(0x3c)) {
instead of : if (!display.begin(0x3c, false)) {
and please validate if you uploaded it with the
#define OLED_DISPLAY_HAS_RST_PIN
or not
Yes I deleted the "#define OLED_DISPLAY_HAS_RST_PIN" line when uploading.
Will try that other change soon - just have to step away for a bit.
awesome
if the change for:
if (!display.begin(0x3c)) {
(without the false) is needed and also the deleting of the #define we have solve the issue for adding it to the full firmware
@richonguzman I just tried your fix but it did not work.
if (!display.begin(0x3c)) {I nuked the contents of display.cpp and pasted @EI3HIB's code and that worked.
EDIT: The display works using EI3HIB's code but I don't think the rest of the code is working as it's not broadcasting the config AP
EDIT 2: I tried both suggestions twice, verified that the define ..RST_PIN line was deleted all four times.
if (!display.begin(0x3c)) {unfortunately is not enough, the display is still corrupted.I made that change to line 104 and screen just went back to being corrupted.
Reverted to my code above and screen came back (and it seemed like my settings had been saved from the working code?)
One thing to add, I left tracker_conf.json default and configured my settings over wifi once the screen started working - wondering if you're not seeing the config AP because you edited the json?
Nope. I didn't bother trying to edit the config.json because I was expecting to just use the config AP. Maybe I was a bit impatient and didn't give my system enough time to update the wifi list??
Otherwise I'm missing something about how VSCode works and it did actually remember the one time I attempted to edit it. Despite me closing the workspace and deleting all files from the expanded folder in my download directory, in-between flash attempts.
ok.
we need to find exactly what is needed for the board to work ok with the mods but also so that i can add this to the main firmware and not have a custom T-Beam Supreme firmware that breaks all the other boards from working.
@EI3HIB and @MastarPete
what are the mods needed for it to work?
if (!display.begin(0x3c)) + deleting #define OLED_DISPLAY_HAS_RST_PIN ???
or is there another thing ? (please don't tell me about pasting the working display.cpp as this will only work for T-Beam Supreme and no other board 😂😂😂😂
Hi @EI3HIB and @MastarPete could you test and identify the single or the minimal mods needed for this to add to the "almost ready to share" new version for iGate?
@richonguzman Sorry, as I said in my previous post, I still haven't had luck with your code suggestions. The display is corrupted and the wifi AP never shows up for me to even get it configured. I'm wondering if the ESP32 device environment isn't quite correct?? Or else the upload/flash somehow isn't clearing out old settings, causing a soft-lock.
I haven't coded enough to be able to contribute how to re-write whats there. I can somewhat follow along to make minor modifications to existing code but that's about it. To me, when I compared to the tracker display code, it looks like there's not enough code to define the screen for the iGate when running on a Supreme. If the code is pointing to another support library to define the display, then I've missed the pointer.
Side note. I was a little surprised that the iGate is using a different code structure in display.cpp and I can't help but wonder if that's contributing to something getting overlooked?? Then again, I am the noob here. ^_^
Any fix for this issue looming? I'm gasping to set my node up as an igate using this firmware but I'm having to make do with Nakhonthai's version currently.
sorry, but i didn't have any confirmation about the exact mods that worked for @EI3HIB
If he can confirms that is only needed the deleting of a line... i will add this ASAP
It would be nice to hear back from @EI3HIB because I still can't replicate their result. I tried again over the last hour using every combination of modifications suggested above.
Nuking display.cpp and pasting that entire code blob just gets me the boot logo and nothing else. The wifi AP never shows up when I use my tablet and a wifi scanning app.
EI3HIB mentioned pre-configuring everything but did not clarify where they made the modifications. That could be the magic needed but I agree that's not a proper fix if the intent of the project is to webflash and be done.
Just wanted to jump in and say +1 having the issue as well. Everything else works, just the display seems to be initializing incorrectly somehow.
Commenting out the reset define didn't work, nor did removing the false flag from the initialization.
This isn't a show-stopper for my use case, but I'll keep poking at it to see if I can get it to work.
Add me to the list of hams having this problem! I've followed the steps in this issue and seem to be in the same spot as everyone else:
#define OLED_DISPLAY_HAS_RST_PIN: No changeif (!display.begin(0x3c)) {: No changedisplay.cppwith @EI3HIB version: Display works!I'm not a coder but will poke around and see if I can find a diff to your display.cpp that resolves this. I am available to try any additional ideas on my device. My Telegram username is
@brianlefevre.I think I got it, submitted pull request #360 with one character fix. (@richonguzman did request "minimal mods!")
Yeah I think that did it! I used 3.1.4, removed that pesky ! and flashed with VsCode. Display worked and was able to access the Wifi AP.
Now if only I hadn't misconfigured it and locked myself out. 🤣🤦
@MastarPete , @cwb , @openincident , @MeshMouse , @Rentiu30 , @arizonajon1
time to test V.3.1.4.1 with the fix
@richonguzman Works for me!
Screen fixed, now different issue. After configuration via AP the device reboots, connects to my network then displays NOCALL-10 and error message "APRS PASSCODE NOT VALID!!!"
Wi-Fi AP is broadcasting but unable to connect to it.
save just the Callsign, lat+lng, Wifi credentials, aprs passcode and enable aprs-is connection en test again please
only letters and numbers as characters please
All up and running, issues resolved. Happy days!
VSCode wasn't properly flushing out the old settings properly so I didn't get a good run-through of getting it configured.
Now that a proper firmware is on the web flasher I've got it up an running, the display issue looks to be resolved!
I skipped setting a fixed position, the GPS eventually got a fix and updated the iGate's location.
Might be useful to add a "get location" button for devices with a gps?
if you enable to "SEND BEACON from GPS data" it will do it automatically
Glad it worked out!
True, however even after it had a fix the Lat/long never populated on its own. It just stays 0/0 so there's no feedback to indicate that is how it works.
I just figured It would be nice to get a fix without beaconing.
there is no way to show on screen the values the gps has (for now)