Arduino UNO Q - SSD1309 OLED Display
This tutorial shows you how to use a 2.42-inch SSD1309 OLED 128x64 display with Arduino UNO Q — from basic text and graphics all the way to remote control via Telegram.
- How to connect an SSD1309 OLED 128x64 to Arduino UNO Q
- How to display text and numbers using the DIYables_OLED_SSD1309 library
- How to draw shapes (lines, rectangles, circles, triangles) on the OLED
- How to use hardware scrolling in multiple directions
- How to display bitmap images on the OLED
- How to control brightness and contrast
- How to use custom external fonts
- How to control the OLED remotely from Telegram via Bridge programming

Hardware Preparation
Or you can buy the following kits:
| 1 | × | DIYables Sensor Kit (18 sensors/displays) |
Additionally, some of these links are for products from our own brand, DIYables .
Overview of the SSD1309 2.42-Inch OLED Display
The SSD1309 is a 128×64 OLED driver IC commonly found on 2.42-inch (sometimes labeled 2.4-inch) I2C OLED modules. It is register-compatible with the SSD1306, but uses an external VCC rail (handled transparently by the breakout board's onboard boost converter). Key characteristics:
- Resolution: 128 × 64 pixels
- Interface: I2C (only 4 wires needed)
- Display color: White, blue, or yellow depending on the OLED material — not software-controllable
- Viewing angle: Wide, self-emitting pixels — deep blacks, no backlight needed
- Library: Uses DIYables_OLED_SSD1309 (extends Adafruit GFX)
SSD1309 OLED Pinout
- GND — connect to GND
- VCC — connect to 5V
- SCL — I2C clock signal
- SDA — I2C data signal

※ NOTE THAT:
Pin order may differ between manufacturers. Always use the labels printed on the OLED module.
Wiring Diagram

This image is created using Fritzing. Click to enlarge image
| OLED Pin | Arduino UNO Q Pin |
|---|---|
| GND | GND |
| VCC | 5V |
| SCL | SCL |
| SDA | SDA |
How To Program the SSD1309 OLED
- Include the libraries:
- Create the display object:
- Initialize in setup():
- Display text:
※ NOTE THAT:
Always call display.display() after drawing commands to push the buffer to the physical screen.
Arduino UNO Q Code — Hello World on SSD1309 OLED
The Arduino UNO Q has two processors: the STM32 MCU (handles real-time hardware control) and the Qualcomm MPU (runs Debian Linux). In this section, only the STM32 MCU is programmed — the Linux side stays idle. A later section will show how both processors work together.
The sketch below displays text in two different sizes on the OLED.
Detailed Instructions
- First time with Arduino UNO Q? Follow the Getting Started with Arduino UNO Q tutorial to get your development environment ready before proceeding.
- Wire the OLED: Connect GND→GND, VCC→5V, SCL→SCL, SDA→SDA.
- Connect: Plug the Arduino UNO Q into your computer with a USB-C cable.
- Open Arduino App Lab: Launch Arduino App Lab and wait until it detects your Arduino UNO Q.
- Create a new App: Click the Create New App button.

- Give the App a name, for example: DIYables_SSD1309
- Click Create to confirm.
- You will see a set of folders and files generated inside your new App.

- Find the sketch/sketch.ino file — this is where you will paste the MCU sketch.
- Install the library: Click the Add sketch library button (the open book icon with a + sign) in the left sidebar.

- Search for DIYables_OLED_SSD1309 created by DIYables and click the Install button.
- Upload: Click the Run button in Arduino App Lab to compile and upload to the STM32.

Look at the OLED — it shows "Hello, World!", "DIYables", and "SSD1309 OLED 128x64"!
Arduino UNO Q Code — Display Text on SSD1309 OLED
This example demonstrates different text sizes and how to display integers, floats, and hexadecimal numbers on the OLED.
Detailed Instructions
- Copy the code above and paste it into sketch/sketch.ino.
- Click the Run button in Arduino App Lab.

The OLED cycles through text size demos, then shows an integer, a float, and a hex number.
Useful Display Functions Reference
Quick reference for commonly-used SSD1309 OLED functions:
- display.clearDisplay() — erase the frame buffer (all pixels off)
- display.display() — push the buffer to the screen — required after every drawing call
- display.drawPixel(x, y, color) — set or clear a single pixel
- display.setTextSize(n) — scale the font by factor *n* (1 = 6×8 px, 2 = 12×16 px, …)
- display.setCursor(x, y) — move the text cursor to pixel coordinates *(x, y)*
- display.setTextColor(SSD1309_PIXEL_ON) — text foreground only (transparent background)
- display.setTextColor(SSD1309_PIXEL_OFF, SSD1309_PIXEL_ON) — text with explicit background
- display.println("message") — print a string and advance to the next line
- display.println(number) — print an integer in decimal
- display.println(number, HEX) — print an integer in hexadecimal
- display.startscrollright(start, stop) — hardware-scroll right between pages
- display.startscrollleft(start, stop) — hardware-scroll left
- display.startscrolldiagright(start, stop) — diagonal scroll right
- display.startscrolldiagleft(start, stop) — diagonal scroll left
- display.stopscroll() — stop any active hardware scroll
- display.setContrast(value) — adjust brightness (0–255)
- display.dim(true/false) — quick dim toggle
- display.invertDisplay(true/false) — hardware-level color inversion
Arduino UNO Q Code — Draw Shapes on SSD1309 OLED
The DIYables_OLED_SSD1309 library inherits from Adafruit_GFX, giving you pixels, lines, rectangles, filled rectangles, circles, filled circles, triangles, filled triangles, and rounded rectangles. The sketch below cycles through all of them.
Detailed Instructions
- Copy the code above and paste it into sketch/sketch.ino.
- Click the Run button in Arduino App Lab.

Watch the OLED cycle through every shape — pixels, lines, rectangles, circles, rounded rectangles, and triangles!
Arduino UNO Q Code — Hardware Scrolling on SSD1309 OLED
The SSD1309 has a built-in hardware scrolling engine that moves content without any CPU work. The library provides four scroll directions: right, left, diagonal-right, and diagonal-left.
※ NOTE THAT:
Always call display.display() to transfer your content to the OLED before starting a scroll. Call stopscroll() before drawing new content.
Detailed Instructions
- Copy the code above and paste it into sketch/sketch.ino.
- Click the Run button in Arduino App Lab.

The OLED scrolls "DIYables" right, left, diagonal-right, and diagonal-left, repeating forever.
Arduino UNO Q Code — Display Bitmap Image on SSD1309 OLED
To display a bitmap on the SSD1309 OLED, you must first convert your image into a C byte array. Use the free Image to Bitmap Converter tool:
- Upload your image file (PNG, JPG, BMP, etc.).
- Set the canvas size to 128×64 (or smaller).
- Select Arduino code as the output format.
- Copy the generated array into your sketch.

The sketch below shows a 16×16 heart icon then switches to the full 128×64 DIYables logo — both stored as byte arrays in the code:
Detailed Instructions
- Copy the code above and paste it into sketch/sketch.ino.
- Click the Run button in Arduino App Lab.

The OLED shows the heart icon for 3 seconds, then switches to the DIYables logo.
※ NOTE THAT:
Bitmap dimensions must not exceed the screen resolution (128×64).
Arduino UNO Q Code — Contrast and Dim on SSD1309 OLED
The SSD1309 supports 256 contrast levels (0–255). Use setContrast() for fine control and dim() for a quick brightness toggle.
Detailed Instructions
- Copy the code above and paste it into sketch/sketch.ino.
- Click the Run button in Arduino App Lab.

Watch the OLED brightness ramp up then down, followed by a dim-on/dim-off cycle.
Arduino UNO Q Code — Custom External Fonts on SSD1309 OLED
The Adafruit GFX library includes many FreeFont typefaces (Serif, Sans, Mono — in multiple sizes). Use them by including the font header and calling setFont().
※ NOTE THAT:
When an external font is active, the cursor Y coordinate refers to the text baseline, not the top-left corner. This differs from the built-in 5×7 font.
Detailed Instructions
- Copy the code above and paste it into sketch/sketch.ino.
- Click the Run button in Arduino App Lab.

The OLED cycles through the built-in font, FreeSerif 9pt, FreeSansBold 12pt, and FreeMono 9pt.
Linux + MCU Bridge Programming
The Arduino UNO Q has two processors that work together: the MPU (Qualcomm, runs Debian Linux) and the MCU (STM32, runs Zephyr OS with your Arduino sketch). They communicate using RPC via the Arduino_RouterBridge library — never via raw serial ports.
- The SSD1309 OLED is connected to the MCU (STM32) — via I2C (SCL/SDA). Only the MCU can directly drive it.
- The MPU cannot control the OLED directly — it calls Bridge.call("display_text", "text") which updates the display and prints the result to Monitor.
- The MPU has Wi-Fi — because the MPU runs full Debian Linux with Wi-Fi, it can receive Telegram commands and display any message on the OLED remotely.
- Communication: Bridge.call() on the Linux side invokes Bridge.provide_safe() functions on the MCU side (since OLED writes are hardware API calls).
- ⚠️ Reserved: /dev/ttyHS1 (Linux) and Serial1 (MCU) are used by the Arduino Router — never open them directly.
MCU sketch — SSD1309 OLED with Bridge and Monitor output:
Python script (Arduino App Lab) — display text on SSD1309 OLED from Linux:
Detailed Instructions
- Create a new App: Open Arduino App Lab, click Create New App, name it DIYables_SSD1309_Bridge, and click Create.
- Paste the MCU sketch: Copy the Bridge MCU code above and paste it into sketch/sketch.ino.
- Paste the Python script: Copy the Python code above and paste it into the Python file in the App.
- Install the library: Click the Add sketch library button (the open book icon with a + sign) in the left sidebar.

- Search for DIYables_OLED_SSD1309 created by DIYables and click the Install button.
- Search for Arduino_RouterBridge created by Arduino and click the Install button.
- Run the App: Click the Run button — the Python side cycles through messages on the OLED.
App Lab Console Output
Telegram Integration
Display any text on your SSD1309 OLED from anywhere via Telegram.
If you do not have a Telegram bot yet, see How to Create a Telegram Bot to get your bot token before continuing.
MCU sketch: Keep the same MCU sketch from the previous Bridge section — no changes needed. Make sure it is already uploaded and running on the STM32 before proceeding.
Python script (Arduino App Lab) — Telegram bot for SSD1309 OLED:
- Note: Replace YOUR_BOT_TOKEN with the token from @BotFather on Telegram.
- Send /display Hello — appears on the OLED.
- Send /clear — clears the OLED.
- Send /status — bot replies with the current text.
App Lab Console Output
ArduinoBot
OpenClaw Integration
OpenClaw integration for Arduino UNO Q SSD1309 OLED is coming soon.
- Coming Soon: OpenClaw support for SSD1309 OLED on Arduino UNO Q will be covered in a future update.
Application/Project Ideas
- Large-text alert display: Use text size 3 or 4 to show a single critical value (temperature, voltage) across the entire 2.42-inch screen
- Remote info board: Push messages to the OLED from a Telegram group to display team announcements
- Data logger status: Show the last record timestamp and row count on the OLED when the MPU writes to a CSV file
- Wi-Fi signal meter: Display MPU Wi-Fi SSID and RSSI strength on the large 2.42-inch screen
- Custom icon rendering: Use drawBitmap() to display logos or warning icons stored as byte arrays in the MCU sketch
Challenge Yourself
- Easy: Modify the sketch to use setTextSize(2) for the first line and setTextSize(1) for subsequent lines to create a title/body layout
- Medium: Add a /contrast <0-255> Telegram command that calls display.ssd1309_command(SSD1309_SETCONTRAST) followed by the value to adjust screen brightness
- Advanced: Display a real-time bar chart on the OLED using fillRect() that updates from sensor data sent from the MPU via Bridge