Currently, this blog post summarizes my first impressions and steps with this module. I will update this post with more code and examples later.

Table of Contents

The Hardware

You can get the module via

It contains the following components:

  • ESP8266 (Datasheet)
  • SH1106 1.3” OLED Display (D1/5=SDA D2/4=SCL)
  • 4MB Flash Winbond W25Q32JVSSIQ (Datasheet) (Although it says “A TTGO wifi board with 2MB flash based on ESP-8266EX.” on the product page, it came with this chip, so make sure to check on yours and set the right settings when flashing.)
  • SIL2104 USB-to-UART bridge (Datasheet)
  • IP5306 Power Regulator/Charger (Datasheet, Chinese), this page has more info:, set to 500mA charge current.

Click on the images below for high reslution:

The front.
The back.
The front, comparison with a 0.96" OLED module.
The back, comparison with a 0.96" OLED module.
On first boot, it starts the ESP8266 Deauther
If you peel off the OLED; you can see the pin out on the top silk screen.

The Softare


Look at the image below to see which settings I used to successfully flash the example:

Make sure to check the Flash Size is correct. Check which flash chip came on your board, search for the number + datasheet, and check the values.

Provided Example

On the shopping page there is a link pointing to .

I opened the code with the Arduino IDE. My first compile attempt ended in

/Users/paul/Code/Arduino/sketches/ttgo_weather_station/ttgo_weather_station.ino:29:64: fatal error: SH1106Wire.h: No such file or directory
 #include "SH1106Wire.h" // alias for `#include "SSD1306Wire.h"`
compilation terminated.
exit status 1
Error compiling for board Generic ESP8266 Module.

I was missing a library. To install it go to the Menu Sketch > Include Library > Manage Libraries and search for ESP8266 and ESP32 Oled Driver for SSD1306 display, and install the library (v4.0).

Click on build again to check if it compiles.

Now it complains about

invalid conversion from 'const char*' to 'const uint8_t* {aka const unsigned char*}' [-fpermissive]

Open the file images.h and change the line 3:

const char WiFi_Logo_bits[] PROGMEM = {


const uint8_t WiFi_Logo_bits[] PROGMEM = {

Then, it compiled.


Using u8g2

When using the u8g2 library you will need to use the following constructor:

U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/U8X8_PIN_NONE);

and initialize the I2C ports differently:

Wire.begin(5, 4);

A minimal working example would be:

#include <Arduino.h>
#include <U8g2lib.h>
#include <Wire.h>

U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

void setup(void) {
  // change hardware I2C pins to (5,4) (D1,D2)
  // init display

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.sendBuffer();          // transfer internal memory to the display

I uploaded example code to which demonstrates this module using the u8g2 library (

See below for the result:

Using the Buttons

#include <Arduino.h>
#include <U8g2lib.h>
#include <Wire.h>

#define BTN_LEFT 12
#define BTN_MID 14
#define BTN_RIGHT 13

U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

void setupButtons() {

void setup(void) {
  Wire.begin(5, 4); // (CLK,SDA)

void loop(void) {
  u8g2.drawStr(0, 25, digitalRead(BTN_LEFT) ? "BTN_LEFT: UP" : "BTN_LEFT: DOWN");
  u8g2.drawStr(0, 35, digitalRead(BTN_MID) ? "BTN_MID: UP" : "BTN_MID: DOWN");
  u8g2.drawStr(0, 45, digitalRead(BTN_RIGHT) ? "BTN_RIGHT: UP" : "BTN_RIGHT: DOWN");