Transparent Graphical OLED Breakout Hookup Guide

Pages
Contributors: Liquid Soulder, Ell C
Favorited Favorite 4

Introduction

The future is here! You asked and we delivered - our Qwiic Transparent Graphical OLED Breakout allows you to display custom images on a transparent screen using either I2C or SPI connections.

With Qwiic connectors it's quick (ha ha) and easy to get started with your own images. However, we still have broken out 0.1"-spaced pins in case you prefer to use a breadboard. Brilliantly lit in the dark and still visible by daylight, this OLED sports a display area of 128x64 pixels, 128x56 of which are completely transparent. Control of the OLED is based on our new HyperDisplay library.

SparkFun Transparent Graphical OLED Breakout (Qwiic)

LCD-15173
5 Retired

The Arduino sketch required to drive this display requires quite a bit of dynamic memory, meaning that it is not going to fit on a smaller controller like an ATmega328. Any controller with larger RAM should have no problem. In this tutorial, we're using the ESP32 Thing Plus.

Required Materials

To follow along with this tutorial, you will need the following materials. You may not need everything, depending on what you have. Add it to your cart, read through the guide, and adjust the cart as necessary.

Tools

If you want to use the broken out GPIO pins along the bottom of the board, you'll need to solder some headers to them so you'll need a soldering iron, solder, and general soldering accessories.

Solder Lead Free - 100-gram Spool

Solder Lead Free - 100-gram Spool

TOL-09325
$9.95
8

Weller WLC100 Soldering Station

TOL-14228
2 Retired

Suggested Reading

If you aren't familiar with the Qwiic system, we recommend reading here for an overview.

Qwiic Connect System
Qwiic Connect System

We would also recommend taking a look at the following tutorials if you aren't familiar with them.

Serial Communication

Asynchronous serial communication concepts: packets, signal levels, baud rates, UARTs and more!

I2C

An introduction to I2C, one of the main embedded communications protocols in use today.

Serial Terminal Basics

This tutorial will show you how to communicate with your serial devices using a variety of terminal emulator applications.

ESP32 Thing Plus Hookup Guide

Hookup guide for the ESP32 Thing Plus (Micro-B) using the ESP32 WROOM's WiFi/Bluetooth system-on-chip in Arduino.

Everything You Should Know About HyperDisplay

This is a tutorial to go in-depth about the SparkFun HyperDisplay Arduino Library.

Hardware Overview

Let's check out some of the characteristics of the Qwiic we're dealing with, so we know what to expect out of the board.

CharacteristicRange
Operating Voltage1.65V-3.3V
Supply Current400 mA
I2C Addresses0x3C (Default), 0x3D

Graphical Display

The graphical display is where all the fun stuff happens. The glass itself measures 42mm x 27.16mm, with a pixel display that is 35.5 x 18mm. It houses 128x64 pixels, 128x56 of which are transparent.

Display Screen

Graphical Display

Qwiic Connectors

There are two Qwiic connectors on the board such that you can daisy-chain the boards should you choose to do so. If you're unfamiliar with our Qwiic system, head on over to our Qwiic page to see the advantages!

Qwiic Connectors

Qwiic Connectors

GPIO Pins

When you look at the GPIO pins, you'll notice that the labels are different from one side to the other. One side is labeled for I2C, the other side is labeled for SPI.


I2C Labels SPI Labels

Power LED

This bad boy will light up when the board is powered up correctly.

Power LED

Power LED

You can disable the power LED by cutting the LED jumpers on the back of the board.

Power LED Jumpers

Power LED Jumpers

JPX Jumpers

The JPX jumpers are used to either change the I2C address or configure the board to use SPI communications. The other two jumpers allow you to disconnect the power LED and to disconnect the I2C pull-up resistors when chaining several Qwiic devices.

JumperFunction
JP1Holds the Chip Select line low when closed. Close for I2C, open for SPI
JP2Selects the address in I2C mode. Closed for 0x30 by default and open for 0x31. Open for SPI mode to release the D/C pin
JP3Used to select I2C or SPI mode. Close for I2C, open for SPI
JP4This jumper should be closed for I2C and open for SPI. This connection allows SDA to be bi-directional

JP1-JP4

JPX Jumpers

I2C Pull-Up Jumper

I2C devices contain open drains so we include resistors on our boards to allow these devices to pull pins high. This becomes a problem if you have a large number of I2C devices chained together. If you plan to daisy chain more than a few Qwiic boards together, you'll need to cut this I2C pull-up jumper.

I2C Pullup jumper

I2C PU Jumpers

Hardware Hookup

Now that you know what's available on your breakout board we can check out the options for connecting it to the brains of your project. There are two options to use - either I2C or SPI - and they each have their own advantages and drawbacks. Read on to choose the best option for your setup.

I2C (Qwiic)

The easiest way to start using the Transparent Graphical OLED is to use a Qwiic Cable along with a Qwiic compatible microcontroller (such as the ESP32 Thing Plus). You can also use the Qwiic Breadboard Cable to attach any I2C capable microcontroller, or take the scenic route and solder in all the I2C wires to the plated-through connections on the board.

Qwiic Connector I2C Pinout

So why use I2C? It's easy to connect with the Qwiic system, and you can put up to two of the Transparent Graphical Breakouts on the same bus without using any more microcontroller pins. That simplicity comes at a cost to performance though. The maximum clock speed of the I2C bus is 400 kHz, and there is additional overhead in data transmission to indicate which bytes are data and which are commands. This means that the I2C connection is best for showing static images.

Breakout PinMicrocontroller Pin Requirements
GNDGround pin. Connect these so the two devices agree on voltages
3V33.3V supply pin, capable of up to 400 mA output
SDASDA - the bi-directional data line of your chosen I2C port
SCLSCL - the clock line of your chosen I2C port
SA0Optional : change the I2C address of the breakout. Make sure to cut JP2
RSTOptional : reset the breakout to a known state by pulsing this low

SPI

SPI solves the I2C speed problems. With SPI there is a control signal that indicates data or command and the maximum clock speed is 10 MHz -- giving SPI 50x more speed! However, it doesn't have the same conveniences of the polarized Qwiic connector and low pin usage. You'll need to solder to the pins.

SPI Pinout

You can use SPI to connect as many breakouts as you want. For N displays you will need to use at least N + 3 data pins. That's because the MOSI, SCLK, and D/C pins can be shared between displays but each breakout needs its own dedicated Chip Select (CS) pin.

Breakout PinMicrocontroller Pin Requirements
CSA GPIO pin, set low when talking to the breakout
D/CA GPIO pin, indicates if bytes are data or commands
SCLKThe clock output of your chosen SPI port
MOSIThe data output of your chosen SPI port
3V33.3V supply pin, capable of up to 400 mA output
GNDGround pin. Connect these so the two devices agree on voltages

Software Setup and Programming

Note: This example assumes you are using the latest version of the Arduino IDE on your desktop. If this is your first time using Arduino, please review our tutorial on installing the Arduino IDE. If you have not previously installed an Arduino library, please check out our installation guide.

Drivers and Board Add-Ons

Depending on your development board, you may need to install drivers and a board add-on. For the scope of this tutorial, we will be using the ESP32 Thing Plus. If you have not already, make sure that you install the drivers and ESP32 Arduino core files as explained in our ESP32 Thing Plus Hookup Guide.

Installing ESP32 Board Add on Files
Software Setup for the ESP32

Arduino Libraries

The software for the Transparent Graphical OLED Breakout is built on the HyperDisplay libraries developed by SparkFun. If you are unfamiliar with how this abstracted library works, head over to our Everything You Should Know About HyperDisplay tutorial.

Everything You Should Know About HyperDisplay

February 20, 2019

This is a tutorial to go in-depth about the SparkFun HyperDisplay Arduino Library.

HyperDisplay is an abstracted library that requires multiple layers in order to function correctly. For the Transparent Graphical OLED to work, you'll need our base HyperDisplay Library, the HyperDisplay SSD1309 Arduino Library, and the somewhat painfully but informatively named HyperDisplay UG2856KLBAG01 Arduino Library. You can obtain these libraries through the Arduino Library Manager by searching for "HyperDisplay Library", "HyperDisplay SSD1309", "HyperDisplay Transparent Graphical OLED", respectively. You can download the required libraries from their individual GitHub pages or download the following *.zip file that contains all three libraries to manually install:

If you are manually downloading the libraries, unzip them and copy all three libraries to your Arduino > Libraries folder, wherever that may be located on your machine.

Copy the HyperDisplay libraries to your Arduino Libraries folder

Having a hard time seeing? Click the image for a closer look.

Examples

Included in the HyperDisplay_UG2856KLBAG01_ArduinoLibrary are three examples to help you get started using the Transparent Graphical OLED Breakout. If you haven't already downloaded the libraries from the afore-mentioned locations, click on the button below to download the library bundle. Unzip and copy it into your Arduino > Libraries folder.

If you are following along with this tutorial using an ESP32 Thing Plus board (as we are), make sure you set your board definition to Adafruit ESP32 Feather.

Choose The Adafruit Feather Board Definition

Example 1: DisplayTest

The purpose of this example is to act like the "Hello World" message for your display. Uploading this sketch will help confirm that you have followed the hardware hookup correctly. The sketch runs through a couple of different display test, beginning with a custom SparkFun logo display.

To show the logo, Owen whipped up a quick python script that looks at a jpg image and writes out, pixel by pixel, a function to make the display. We've included his script and our image here--have a look! With just a little modification it could be useful in your own application.

To get started, either select File > Examples > SparkFun HyperDisplay Transparent Graphical OLED Library > Example1_DisplayTest or copy and paste the code below into a new Arduino window.

language:c
/*
  Verify that your Qwiic Transparent Grahical OLED is connected correctly and working.

  By: Owen Lyke
  SparkFun Electronics
  Date: February 26, 2019
  License: MIT. See license file for more information but you can
  basically do whatever you want with this code.
  Feel like supporting open source hardware?
  Buy a board from SparkFun! https://www.sparkfun.com/products/15173



  The graphics library is like a 3-layer cake. Here they are from top-down
  https://github.com/sparkfun/SparkFun_HyperDisplay
  https://github.com/sparkfun/HyperDisplay_SSD1309_ArduinoLibrary
  https://github.com/sparkfun/HyperDisplay_UG2856KLBAG01_ArduinoLibrary

  Hardware Compatibility
    - The IO pins on this board are designed for use with 3.3V so if you are using a 5V microcontroller
      please use a level shifter. Note: Qwiic connectors on SparkFun dev boards are already at 3.3V
    - This display relies on a copy of graphics data in your microcontroller, a total of 1024 bytes. 
      That is half the RAM available on an Uno so it is easy to run into sinister low-memory related
      bugs. We reccomend using a micro with more memory like a SAMD21, Esp32, Teensy, etc.

  Hardware Connections:
  Option 1 (I2C):
    Connect using a Qwiic jumper if you have a Qwiic compatible board and you plan to use I2C

  Option 2 (SPI):
    Connect SCLK and MOSI to the SPI port of your choice (13 and 11 for SPI on Uno-like boards) 
    Also connect D/C and CS to two unused GPIO pins of your choice (and set the proper pin definitions below)
    Don't forget power - connect 3.3V and GND
*/

#include "HyperDisplay_UG2856KLBAG01.h"   // Your library can be installed here: http://librarymanager/All#SparkFun_Transparent_Graphical_OLED
                                          // The rest of the Layer Cake:         http://librarymanager/All#SparkFun_HyperDisplay_SSD1309
                                          //                                     http://librarymanager/All#SparkFun_HyperDisplay
//////////////////////////
//      User Setup      //
//////////////////////////
#define SERIAL_PORT Serial  
#define WIRE_PORT Wire      // Used if USE_SPI == 0
#define SPI_PORT SPI        // Used if USE_SPI == 1

#define RES_PIN 2           // Optional
#define CS_PIN 4            // Used only if USE_SPI == 1
#define DC_PIN 5            // Used only if USE_SPI == 1

#define USE_SPI 1           // Choose your interface. 0 = I2C, 1 = SPI

// END USER SETUP


// Object Declaration. A class exists for each interface option
#if USE_SPI
  UG2856KLBAG01_SPI myTOLED;  // Declare a SPI-based Transparent OLED object called myTOLED
#else
  UG2856KLBAG01_I2C myTOLED;  // Declare a I2C-based Transparent OLED object called myTOLED
#endif /* USE_SPI */


void setup() {
  Serial.begin(9600);

  Serial.println(F("Example1_DisplayTest: Transparent Graphical OLED"));

#if USE_SPI 
  SPI_PORT.begin();
  myTOLED.begin(CS_PIN, DC_PIN, SPI_PORT);                  // Begin for SPI requires that you provide the CS and DC pin numbers
#else
  WIRE_PORT.begin();
  myTOLED.begin(WIRE_PORT, false, SSD1309_ARD_UNUSED_PIN);  // Begin for I2C has default values for every argument
  Wire.setClock(400000);
#endif /* USSE_SPI */

// Don't show the logo on boards with small memory
#if !defined(__AVR_ATmega328P__) && !defined(__AVR_ATmega168__)
  showLogo( );      // The showLogo function is a hacky way to get a large bitmap into program space without using <avr/pgspace.h>
#endif
}

void loop() {

  lineTest();
  delay(500);

  rectTest();
  delay(500);

  circleTest();
  delay(500);
}

void lineTest( void )
{
  myTOLED.clearDisplay();

  for(hd_hw_extent_t indi = 0; indi < myTOLED.xExt; indi+=5)
  {
    myTOLED.lineSet(0,0,indi,myTOLED.yExt-1,1);
    delay(10);
  }

  for(hd_hw_extent_t indi = 0; indi < myTOLED.yExt; indi+=5)
  {
    myTOLED.lineSet(0,myTOLED.yExt-1,myTOLED.xExt-1,myTOLED.yExt-indi-1,1);
    delay(10);
  }

  for(hd_hw_extent_t indi = 0; indi < myTOLED.xExt; indi+=5)
  {
    myTOLED.lineSet(myTOLED.xExt-1,myTOLED.yExt-1,myTOLED.xExt-indi-1,0,1);
    delay(10);
  }

  for(hd_hw_extent_t indi = 0; indi < myTOLED.yExt; indi+=5)
  {
    myTOLED.lineSet(myTOLED.xExt-1,0,0,indi,1);
  }
}

void rectTest( void )
{
  myTOLED.clearDisplay();

  for(uint8_t indi = 0; indi < myTOLED.yExt/2; indi+=1)
  {
    myTOLED.rectangleSet(myTOLED.xExt/2-1-indi, myTOLED.yExt/2-1-indi, myTOLED.xExt/2+1+indi, myTOLED.yExt/2+1+indi, false);
    delay(50);
  }

  for(uint8_t indi = 0; indi < myTOLED.yExt/2; indi+=1)
  {
    myTOLED.rectangleClear(myTOLED.xExt/2-1-indi, myTOLED.yExt/2-1-indi, myTOLED.xExt/2+1+indi, myTOLED.yExt/2+1+indi, false);
    delay(50);
  }

  for(uint8_t indi = 0; indi < myTOLED.yExt/2; indi+=1)
  {
    myTOLED.rectangleSet(myTOLED.xExt/2-1-indi, myTOLED.yExt/2-1-indi, myTOLED.xExt/2+1+indi, myTOLED.yExt/2+1+indi, false);
    delay(50);
  }
}

void circleTest( void )
{
  myTOLED.clearDisplay();

  for(uint8_t indi = 0; indi < (myTOLED.xExt/2 - 1); indi++)
  {
    myTOLED.circleSet((myTOLED.xExt/2 - 1),(myTOLED.yExt/2 - 1), indi, false);
    delay(10);
  }
  myTOLED.circleSet((myTOLED.xExt/2 - 1),(myTOLED.yExt/2 - 1), myTOLED.xExt/2, true);
}

#if !defined(__AVR_ATmega328P__) && !defined(__AVR_ATmega168__)
void showLogo( void ){
  myTOLED.setContrastControl(0);

  myTOLED.pixelSet(84, 3); myTOLED.pixelSet(85, 3); myTOLED.pixelSet(86, 3); myTOLED.pixelSet(87, 3); myTOLED.pixelSet(88, 3); 
  myTOLED.pixelSet(83, 4); myTOLED.pixelSet(84, 4); myTOLED.pixelSet(85, 4); myTOLED.pixelSet(86, 4); myTOLED.pixelSet(87, 4); 
  myTOLED.pixelSet(82, 5); myTOLED.pixelSet(83, 5); myTOLED.pixelSet(84, 5); myTOLED.pixelSet(85, 5); myTOLED.pixelSet(86, 5); 
  myTOLED.pixelSet(82, 6); myTOLED.pixelSet(83, 6); myTOLED.pixelSet(84, 6); myTOLED.pixelSet(85, 6); myTOLED.pixelSet(86, 6); 
  myTOLED.pixelSet(82, 7); myTOLED.pixelSet(83, 7); myTOLED.pixelSet(84, 7); myTOLED.pixelSet(85, 7); myTOLED.pixelSet(86, 7); 
  myTOLED.pixelSet(82, 8); myTOLED.pixelSet(83, 8); myTOLED.pixelSet(84, 8); myTOLED.pixelSet(85, 8); myTOLED.pixelSet(86, 8); myTOLED.pixelSet(87, 8); myTOLED.pixelSet(92, 8); 
  myTOLED.pixelSet(83, 9); myTOLED.pixelSet(84, 9); myTOLED.pixelSet(85, 9); myTOLED.pixelSet(86, 9); myTOLED.pixelSet(87, 9); myTOLED.pixelSet(88, 9); myTOLED.pixelSet(89, 9); myTOLED.pixelSet(91, 9); myTOLED.pixelSet(92, 9); myTOLED.pixelSet(93, 9); 
  myTOLED.pixelSet(84, 10); myTOLED.pixelSet(85, 10); myTOLED.pixelSet(86, 10); myTOLED.pixelSet(87, 10); myTOLED.pixelSet(88, 10); myTOLED.pixelSet(89, 10); myTOLED.pixelSet(90, 10); myTOLED.pixelSet(91, 10); myTOLED.pixelSet(92, 10); myTOLED.pixelSet(93, 10); 
  myTOLED.pixelSet(85, 11); myTOLED.pixelSet(86, 11); myTOLED.pixelSet(87, 11); myTOLED.pixelSet(88, 11); myTOLED.pixelSet(89, 11); myTOLED.pixelSet(90, 11); myTOLED.pixelSet(91, 11); myTOLED.pixelSet(92, 11); myTOLED.pixelSet(93, 11); 
  myTOLED.pixelSet(78, 12); myTOLED.pixelSet(79, 12); myTOLED.pixelSet(85, 12); myTOLED.pixelSet(86, 12); myTOLED.pixelSet(87, 12); myTOLED.pixelSet(88, 12); myTOLED.pixelSet(89, 12); myTOLED.pixelSet(90, 12); myTOLED.pixelSet(91, 12); myTOLED.pixelSet(92, 12); myTOLED.pixelSet(93, 12); myTOLED.pixelSet(94, 12); 
  myTOLED.pixelSet(77, 13); myTOLED.pixelSet(78, 13); myTOLED.pixelSet(79, 13); myTOLED.pixelSet(85, 13); myTOLED.pixelSet(86, 13); myTOLED.pixelSet(87, 13); myTOLED.pixelSet(88, 13); myTOLED.pixelSet(89, 13); myTOLED.pixelSet(90, 13); myTOLED.pixelSet(91, 13); myTOLED.pixelSet(92, 13); myTOLED.pixelSet(93, 13); myTOLED.pixelSet(94, 13); 
  myTOLED.pixelSet(77, 14); myTOLED.pixelSet(78, 14); myTOLED.pixelSet(79, 14); myTOLED.pixelSet(85, 14); myTOLED.pixelSet(86, 14); myTOLED.pixelSet(87, 14); myTOLED.pixelSet(88, 14); myTOLED.pixelSet(89, 14); myTOLED.pixelSet(90, 14); myTOLED.pixelSet(91, 14); myTOLED.pixelSet(92, 14); myTOLED.pixelSet(93, 14); myTOLED.pixelSet(94, 14); 
  myTOLED.pixelSet(76, 15); myTOLED.pixelSet(77, 15); myTOLED.pixelSet(78, 15); myTOLED.pixelSet(79, 15); myTOLED.pixelSet(80, 15); myTOLED.pixelSet(84, 15); myTOLED.pixelSet(85, 15); myTOLED.pixelSet(86, 15); myTOLED.pixelSet(87, 15); myTOLED.pixelSet(88, 15); myTOLED.pixelSet(89, 15); myTOLED.pixelSet(90, 15); myTOLED.pixelSet(91, 15); myTOLED.pixelSet(92, 15); myTOLED.pixelSet(93, 15); myTOLED.pixelSet(94, 15); 
  myTOLED.pixelSet(76, 16); myTOLED.pixelSet(77, 16); myTOLED.pixelSet(78, 16); myTOLED.pixelSet(79, 16); myTOLED.pixelSet(80, 16); myTOLED.pixelSet(81, 16); myTOLED.pixelSet(82, 16); myTOLED.pixelSet(83, 16); myTOLED.pixelSet(84, 16); myTOLED.pixelSet(85, 16); myTOLED.pixelSet(86, 16); myTOLED.pixelSet(87, 16); myTOLED.pixelSet(88, 16); myTOLED.pixelSet(89, 16); myTOLED.pixelSet(90, 16); myTOLED.pixelSet(91, 16); myTOLED.pixelSet(92, 16); myTOLED.pixelSet(93, 16); myTOLED.pixelSet(94, 16); 
  myTOLED.pixelSet(76, 17); myTOLED.pixelSet(77, 17); myTOLED.pixelSet(78, 17); myTOLED.pixelSet(79, 17); myTOLED.pixelSet(80, 17); myTOLED.pixelSet(81, 17); myTOLED.pixelSet(82, 17); myTOLED.pixelSet(83, 17); myTOLED.pixelSet(84, 17); myTOLED.pixelSet(85, 17); myTOLED.pixelSet(86, 17); myTOLED.pixelSet(87, 17); myTOLED.pixelSet(88, 17); myTOLED.pixelSet(89, 17); myTOLED.pixelSet(90, 17); myTOLED.pixelSet(91, 17); myTOLED.pixelSet(92, 17); myTOLED.pixelSet(93, 17); 
  myTOLED.pixelSet(76, 18); myTOLED.pixelSet(77, 18); myTOLED.pixelSet(78, 18); myTOLED.pixelSet(79, 18); myTOLED.pixelSet(80, 18); myTOLED.pixelSet(81, 18); myTOLED.pixelSet(82, 18); myTOLED.pixelSet(83, 18); myTOLED.pixelSet(84, 18); myTOLED.pixelSet(85, 18); myTOLED.pixelSet(86, 18); myTOLED.pixelSet(87, 18); myTOLED.pixelSet(88, 18); myTOLED.pixelSet(89, 18); myTOLED.pixelSet(90, 18); myTOLED.pixelSet(91, 18); myTOLED.pixelSet(92, 18); myTOLED.pixelSet(93, 18); 
  myTOLED.pixelSet(76, 19); myTOLED.pixelSet(77, 19); myTOLED.pixelSet(78, 19); myTOLED.pixelSet(79, 19); myTOLED.pixelSet(80, 19); myTOLED.pixelSet(81, 19); myTOLED.pixelSet(82, 19); myTOLED.pixelSet(83, 19); myTOLED.pixelSet(84, 19); myTOLED.pixelSet(85, 19); myTOLED.pixelSet(86, 19); myTOLED.pixelSet(87, 19); myTOLED.pixelSet(88, 19); myTOLED.pixelSet(89, 19); myTOLED.pixelSet(90, 19); myTOLED.pixelSet(91, 19); myTOLED.pixelSet(92, 19); 
  myTOLED.pixelSet(76, 20); myTOLED.pixelSet(77, 20); myTOLED.pixelSet(78, 20); myTOLED.pixelSet(79, 20); myTOLED.pixelSet(80, 20); myTOLED.pixelSet(81, 20); myTOLED.pixelSet(82, 20); myTOLED.pixelSet(83, 20); myTOLED.pixelSet(84, 20); myTOLED.pixelSet(85, 20); myTOLED.pixelSet(86, 20); myTOLED.pixelSet(87, 20); myTOLED.pixelSet(88, 20); myTOLED.pixelSet(89, 20); myTOLED.pixelSet(90, 20); myTOLED.pixelSet(91, 20); myTOLED.pixelSet(92, 20); 
  myTOLED.pixelSet(76, 21); myTOLED.pixelSet(77, 21); myTOLED.pixelSet(78, 21); myTOLED.pixelSet(79, 21); myTOLED.pixelSet(80, 21); myTOLED.pixelSet(81, 21); myTOLED.pixelSet(82, 21); myTOLED.pixelSet(83, 21); myTOLED.pixelSet(84, 21); myTOLED.pixelSet(85, 21); myTOLED.pixelSet(86, 21); myTOLED.pixelSet(87, 21); myTOLED.pixelSet(88, 21); myTOLED.pixelSet(89, 21); myTOLED.pixelSet(90, 21); myTOLED.pixelSet(91, 21); 
  myTOLED.pixelSet(76, 22); myTOLED.pixelSet(77, 22); myTOLED.pixelSet(78, 22); myTOLED.pixelSet(79, 22); myTOLED.pixelSet(80, 22); myTOLED.pixelSet(81, 22); myTOLED.pixelSet(82, 22); myTOLED.pixelSet(83, 22); myTOLED.pixelSet(84, 22); myTOLED.pixelSet(85, 22); myTOLED.pixelSet(86, 22); myTOLED.pixelSet(87, 22); myTOLED.pixelSet(88, 22); myTOLED.pixelSet(89, 22); 
  myTOLED.pixelSet(76, 23); myTOLED.pixelSet(77, 23); myTOLED.pixelSet(78, 23); myTOLED.pixelSet(79, 23); myTOLED.pixelSet(80, 23); myTOLED.pixelSet(81, 23); myTOLED.pixelSet(82, 23); myTOLED.pixelSet(83, 23); myTOLED.pixelSet(84, 23); myTOLED.pixelSet(85, 23); myTOLED.pixelSet(86, 23); myTOLED.pixelSet(87, 23); 
  myTOLED.pixelSet(76, 24); myTOLED.pixelSet(77, 24); myTOLED.pixelSet(78, 24); myTOLED.pixelSet(79, 24); myTOLED.pixelSet(80, 24); myTOLED.pixelSet(81, 24); 
  myTOLED.pixelSet(76, 25); myTOLED.pixelSet(77, 25); myTOLED.pixelSet(78, 25); myTOLED.pixelSet(79, 25); myTOLED.pixelSet(80, 25); 
  myTOLED.pixelSet(76, 26); myTOLED.pixelSet(77, 26); myTOLED.pixelSet(78, 26); myTOLED.pixelSet(79, 26); 
  myTOLED.pixelSet(76, 27); myTOLED.pixelSet(77, 27); myTOLED.pixelSet(78, 27); 
  myTOLED.pixelSet(76, 28); myTOLED.pixelSet(77, 28); 
  myTOLED.pixelSet(76, 29); myTOLED.pixelSet(88, 29); myTOLED.pixelSet(89, 29); myTOLED.pixelSet(90, 29); myTOLED.pixelSet(91, 29); myTOLED.pixelSet(92, 29); 
  myTOLED.pixelSet(69, 30); myTOLED.pixelSet(70, 30); myTOLED.pixelSet(76, 30); myTOLED.pixelSet(87, 30); myTOLED.pixelSet(88, 30); myTOLED.pixelSet(89, 30); myTOLED.pixelSet(90, 30); myTOLED.pixelSet(91, 30); myTOLED.pixelSet(92, 30); 
  myTOLED.pixelSet(67, 31); myTOLED.pixelSet(68, 31); myTOLED.pixelSet(69, 31); myTOLED.pixelSet(70, 31); myTOLED.pixelSet(86, 31); myTOLED.pixelSet(87, 31); myTOLED.pixelSet(88, 31); myTOLED.pixelSet(89, 31); myTOLED.pixelSet(90, 31); myTOLED.pixelSet(91, 31); myTOLED.pixelSet(92, 31); 
  myTOLED.pixelSet(67, 32); myTOLED.pixelSet(68, 32); myTOLED.pixelSet(69, 32); myTOLED.pixelSet(70, 32); myTOLED.pixelSet(86, 32); myTOLED.pixelSet(87, 32); myTOLED.pixelSet(88, 32); myTOLED.pixelSet(89, 32); 
  myTOLED.pixelSet(67, 33); myTOLED.pixelSet(68, 33); myTOLED.pixelSet(69, 33); myTOLED.pixelSet(70, 33); myTOLED.pixelSet(86, 33); myTOLED.pixelSet(87, 33); myTOLED.pixelSet(88, 33); 
  myTOLED.pixelSet(67, 34); myTOLED.pixelSet(68, 34); myTOLED.pixelSet(69, 34); myTOLED.pixelSet(70, 34); myTOLED.pixelSet(86, 34); myTOLED.pixelSet(87, 34); myTOLED.pixelSet(88, 34); 
  myTOLED.pixelSet(6, 35); myTOLED.pixelSet(7, 35); myTOLED.pixelSet(8, 35); myTOLED.pixelSet(9, 35); myTOLED.pixelSet(10, 35); myTOLED.pixelSet(11, 35); myTOLED.pixelSet(12, 35); myTOLED.pixelSet(13, 35); myTOLED.pixelSet(22, 35); myTOLED.pixelSet(26, 35); myTOLED.pixelSet(27, 35); myTOLED.pixelSet(28, 35); myTOLED.pixelSet(29, 35); myTOLED.pixelSet(30, 35); myTOLED.pixelSet(31, 35); myTOLED.pixelSet(41, 35); myTOLED.pixelSet(42, 35); myTOLED.pixelSet(43, 35); myTOLED.pixelSet(44, 35); myTOLED.pixelSet(45, 35); myTOLED.pixelSet(46, 35); myTOLED.pixelSet(47, 35); myTOLED.pixelSet(48, 35); myTOLED.pixelSet(61, 35); myTOLED.pixelSet(62, 35); myTOLED.pixelSet(63, 35); myTOLED.pixelSet(64, 35); myTOLED.pixelSet(67, 35); myTOLED.pixelSet(68, 35); myTOLED.pixelSet(69, 35); myTOLED.pixelSet(70, 35); myTOLED.pixelSet(77, 35); myTOLED.pixelSet(78, 35); myTOLED.pixelSet(79, 35); myTOLED.pixelSet(80, 35); myTOLED.pixelSet(84, 35); myTOLED.pixelSet(85, 35); myTOLED.pixelSet(86, 35); myTOLED.pixelSet(87, 35); myTOLED.pixelSet(88, 35); myTOLED.pixelSet(89, 35); myTOLED.pixelSet(90, 35); myTOLED.pixelSet(91, 35); myTOLED.pixelSet(92, 35); myTOLED.pixelSet(94, 35); myTOLED.pixelSet(95, 35); myTOLED.pixelSet(96, 35); myTOLED.pixelSet(97, 35); myTOLED.pixelSet(105, 35); myTOLED.pixelSet(106, 35); myTOLED.pixelSet(107, 35); myTOLED.pixelSet(108, 35); myTOLED.pixelSet(112, 35); myTOLED.pixelSet(113, 35); myTOLED.pixelSet(114, 35); myTOLED.pixelSet(118, 35); myTOLED.pixelSet(119, 35); myTOLED.pixelSet(120, 35); myTOLED.pixelSet(121, 35); myTOLED.pixelSet(122, 35); myTOLED.pixelSet(123, 35); 
  myTOLED.pixelSet(5, 36); myTOLED.pixelSet(6, 36); myTOLED.pixelSet(7, 36); myTOLED.pixelSet(8, 36); myTOLED.pixelSet(9, 36); myTOLED.pixelSet(10, 36); myTOLED.pixelSet(11, 36); myTOLED.pixelSet(12, 36); myTOLED.pixelSet(13, 36); myTOLED.pixelSet(14, 36); myTOLED.pixelSet(20, 36); myTOLED.pixelSet(21, 36); myTOLED.pixelSet(22, 36); myTOLED.pixelSet(24, 36); myTOLED.pixelSet(25, 36); myTOLED.pixelSet(26, 36); myTOLED.pixelSet(27, 36); myTOLED.pixelSet(28, 36); myTOLED.pixelSet(29, 36); myTOLED.pixelSet(30, 36); myTOLED.pixelSet(31, 36); myTOLED.pixelSet(32, 36); myTOLED.pixelSet(39, 36); myTOLED.pixelSet(40, 36); myTOLED.pixelSet(41, 36); myTOLED.pixelSet(42, 36); myTOLED.pixelSet(43, 36); myTOLED.pixelSet(44, 36); myTOLED.pixelSet(45, 36); myTOLED.pixelSet(46, 36); myTOLED.pixelSet(47, 36); myTOLED.pixelSet(48, 36); myTOLED.pixelSet(49, 36); myTOLED.pixelSet(50, 36); myTOLED.pixelSet(55, 36); myTOLED.pixelSet(56, 36); myTOLED.pixelSet(57, 36); myTOLED.pixelSet(58, 36); myTOLED.pixelSet(60, 36); myTOLED.pixelSet(61, 36); myTOLED.pixelSet(62, 36); myTOLED.pixelSet(63, 36); myTOLED.pixelSet(64, 36); myTOLED.pixelSet(67, 36); myTOLED.pixelSet(68, 36); myTOLED.pixelSet(69, 36); myTOLED.pixelSet(70, 36); myTOLED.pixelSet(76, 36); myTOLED.pixelSet(77, 36); myTOLED.pixelSet(78, 36); myTOLED.pixelSet(79, 36); myTOLED.pixelSet(83, 36); myTOLED.pixelSet(84, 36); myTOLED.pixelSet(85, 36); myTOLED.pixelSet(86, 36); myTOLED.pixelSet(87, 36); myTOLED.pixelSet(88, 36); myTOLED.pixelSet(89, 36); myTOLED.pixelSet(90, 36); myTOLED.pixelSet(91, 36); myTOLED.pixelSet(92, 36); myTOLED.pixelSet(94, 36); myTOLED.pixelSet(95, 36); myTOLED.pixelSet(96, 36); myTOLED.pixelSet(97, 36); myTOLED.pixelSet(105, 36); myTOLED.pixelSet(106, 36); myTOLED.pixelSet(107, 36); myTOLED.pixelSet(108, 36); myTOLED.pixelSet(112, 36); myTOLED.pixelSet(113, 36); myTOLED.pixelSet(114, 36); myTOLED.pixelSet(117, 36); myTOLED.pixelSet(118, 36); myTOLED.pixelSet(119, 36); myTOLED.pixelSet(120, 36); myTOLED.pixelSet(121, 36); myTOLED.pixelSet(122, 36); myTOLED.pixelSet(123, 36); myTOLED.pixelSet(124, 36); 
  myTOLED.pixelSet(4, 37); myTOLED.pixelSet(5, 37); myTOLED.pixelSet(6, 37); myTOLED.pixelSet(7, 37); myTOLED.pixelSet(12, 37); myTOLED.pixelSet(13, 37); myTOLED.pixelSet(14, 37); myTOLED.pixelSet(15, 37); myTOLED.pixelSet(20, 37); myTOLED.pixelSet(21, 37); myTOLED.pixelSet(22, 37); myTOLED.pixelSet(23, 37); myTOLED.pixelSet(24, 37); myTOLED.pixelSet(25, 37); myTOLED.pixelSet(26, 37); myTOLED.pixelSet(27, 37); myTOLED.pixelSet(28, 37); myTOLED.pixelSet(29, 37); myTOLED.pixelSet(30, 37); myTOLED.pixelSet(31, 37); myTOLED.pixelSet(32, 37); myTOLED.pixelSet(33, 37); myTOLED.pixelSet(38, 37); myTOLED.pixelSet(39, 37); myTOLED.pixelSet(40, 37); myTOLED.pixelSet(41, 37); myTOLED.pixelSet(42, 37); myTOLED.pixelSet(47, 37); myTOLED.pixelSet(48, 37); myTOLED.pixelSet(49, 37); myTOLED.pixelSet(50, 37); myTOLED.pixelSet(51, 37); myTOLED.pixelSet(55, 37); myTOLED.pixelSet(56, 37); myTOLED.pixelSet(57, 37); myTOLED.pixelSet(58, 37); myTOLED.pixelSet(59, 37); myTOLED.pixelSet(60, 37); myTOLED.pixelSet(61, 37); myTOLED.pixelSet(62, 37); myTOLED.pixelSet(63, 37); myTOLED.pixelSet(64, 37); myTOLED.pixelSet(67, 37); myTOLED.pixelSet(68, 37); myTOLED.pixelSet(69, 37); myTOLED.pixelSet(70, 37); myTOLED.pixelSet(75, 37); myTOLED.pixelSet(76, 37); myTOLED.pixelSet(77, 37); myTOLED.pixelSet(78, 37); myTOLED.pixelSet(82, 37); myTOLED.pixelSet(83, 37); myTOLED.pixelSet(84, 37); myTOLED.pixelSet(85, 37); myTOLED.pixelSet(86, 37); myTOLED.pixelSet(87, 37); myTOLED.pixelSet(88, 37); myTOLED.pixelSet(89, 37); myTOLED.pixelSet(90, 37); myTOLED.pixelSet(91, 37); myTOLED.pixelSet(92, 37); myTOLED.pixelSet(94, 37); myTOLED.pixelSet(95, 37); myTOLED.pixelSet(96, 37); myTOLED.pixelSet(97, 37); myTOLED.pixelSet(105, 37); myTOLED.pixelSet(106, 37); myTOLED.pixelSet(107, 37); myTOLED.pixelSet(108, 37); myTOLED.pixelSet(112, 37); myTOLED.pixelSet(113, 37); myTOLED.pixelSet(114, 37); myTOLED.pixelSet(115, 37); myTOLED.pixelSet(116, 37); myTOLED.pixelSet(117, 37); myTOLED.pixelSet(118, 37); myTOLED.pixelSet(119, 37); myTOLED.pixelSet(120, 37); myTOLED.pixelSet(121, 37); myTOLED.pixelSet(122, 37); myTOLED.pixelSet(123, 37); myTOLED.pixelSet(124, 37); myTOLED.pixelSet(125, 37); 
  myTOLED.pixelSet(3, 38); myTOLED.pixelSet(4, 38); myTOLED.pixelSet(5, 38); myTOLED.pixelSet(6, 38); myTOLED.pixelSet(13, 38); myTOLED.pixelSet(14, 38); myTOLED.pixelSet(15, 38); myTOLED.pixelSet(16, 38); myTOLED.pixelSet(20, 38); myTOLED.pixelSet(21, 38); myTOLED.pixelSet(22, 38); myTOLED.pixelSet(23, 38); myTOLED.pixelSet(24, 38); myTOLED.pixelSet(30, 38); myTOLED.pixelSet(31, 38); myTOLED.pixelSet(32, 38); myTOLED.pixelSet(33, 38); myTOLED.pixelSet(38, 38); myTOLED.pixelSet(39, 38); myTOLED.pixelSet(40, 38); myTOLED.pixelSet(41, 38); myTOLED.pixelSet(48, 38); myTOLED.pixelSet(49, 38); myTOLED.pixelSet(50, 38); myTOLED.pixelSet(51, 38); myTOLED.pixelSet(55, 38); myTOLED.pixelSet(56, 38); myTOLED.pixelSet(57, 38); myTOLED.pixelSet(58, 38); myTOLED.pixelSet(59, 38); myTOLED.pixelSet(60, 38); myTOLED.pixelSet(61, 38); myTOLED.pixelSet(64, 38); myTOLED.pixelSet(67, 38); myTOLED.pixelSet(68, 38); myTOLED.pixelSet(69, 38); myTOLED.pixelSet(70, 38); myTOLED.pixelSet(74, 38); myTOLED.pixelSet(75, 38); myTOLED.pixelSet(76, 38); myTOLED.pixelSet(77, 38); myTOLED.pixelSet(86, 38); myTOLED.pixelSet(87, 38); myTOLED.pixelSet(88, 38); myTOLED.pixelSet(94, 38); myTOLED.pixelSet(95, 38); myTOLED.pixelSet(96, 38); myTOLED.pixelSet(97, 38); myTOLED.pixelSet(105, 38); myTOLED.pixelSet(106, 38); myTOLED.pixelSet(107, 38); myTOLED.pixelSet(108, 38); myTOLED.pixelSet(112, 38); myTOLED.pixelSet(113, 38); myTOLED.pixelSet(114, 38); myTOLED.pixelSet(115, 38); myTOLED.pixelSet(116, 38); myTOLED.pixelSet(121, 38); myTOLED.pixelSet(122, 38); myTOLED.pixelSet(123, 38); myTOLED.pixelSet(124, 38); myTOLED.pixelSet(125, 38); 
  myTOLED.pixelSet(3, 39); myTOLED.pixelSet(4, 39); myTOLED.pixelSet(5, 39); myTOLED.pixelSet(6, 39); myTOLED.pixelSet(20, 39); myTOLED.pixelSet(21, 39); myTOLED.pixelSet(22, 39); myTOLED.pixelSet(23, 39); myTOLED.pixelSet(31, 39); myTOLED.pixelSet(32, 39); myTOLED.pixelSet(33, 39); myTOLED.pixelSet(34, 39); myTOLED.pixelSet(38, 39); myTOLED.pixelSet(39, 39); myTOLED.pixelSet(40, 39); myTOLED.pixelSet(41, 39); myTOLED.pixelSet(48, 39); myTOLED.pixelSet(49, 39); myTOLED.pixelSet(50, 39); myTOLED.pixelSet(51, 39); myTOLED.pixelSet(55, 39); myTOLED.pixelSet(56, 39); myTOLED.pixelSet(57, 39); myTOLED.pixelSet(58, 39); myTOLED.pixelSet(59, 39); myTOLED.pixelSet(67, 39); myTOLED.pixelSet(68, 39); myTOLED.pixelSet(69, 39); myTOLED.pixelSet(70, 39); myTOLED.pixelSet(73, 39); myTOLED.pixelSet(74, 39); myTOLED.pixelSet(75, 39); myTOLED.pixelSet(76, 39); myTOLED.pixelSet(86, 39); myTOLED.pixelSet(87, 39); myTOLED.pixelSet(88, 39); myTOLED.pixelSet(94, 39); myTOLED.pixelSet(95, 39); myTOLED.pixelSet(96, 39); myTOLED.pixelSet(97, 39); myTOLED.pixelSet(105, 39); myTOLED.pixelSet(106, 39); myTOLED.pixelSet(107, 39); myTOLED.pixelSet(108, 39); myTOLED.pixelSet(112, 39); myTOLED.pixelSet(113, 39); myTOLED.pixelSet(114, 39); myTOLED.pixelSet(115, 39); myTOLED.pixelSet(122, 39); myTOLED.pixelSet(123, 39); myTOLED.pixelSet(124, 39); myTOLED.pixelSet(125, 39); 
  myTOLED.pixelSet(3, 40); myTOLED.pixelSet(4, 40); myTOLED.pixelSet(5, 40); myTOLED.pixelSet(6, 40); myTOLED.pixelSet(7, 40); myTOLED.pixelSet(20, 40); myTOLED.pixelSet(21, 40); myTOLED.pixelSet(22, 40); myTOLED.pixelSet(23, 40); myTOLED.pixelSet(31, 40); myTOLED.pixelSet(32, 40); myTOLED.pixelSet(33, 40); myTOLED.pixelSet(34, 40); myTOLED.pixelSet(48, 40); myTOLED.pixelSet(49, 40); myTOLED.pixelSet(50, 40); myTOLED.pixelSet(51, 40); myTOLED.pixelSet(55, 40); myTOLED.pixelSet(56, 40); myTOLED.pixelSet(57, 40); myTOLED.pixelSet(58, 40); myTOLED.pixelSet(59, 40); myTOLED.pixelSet(67, 40); myTOLED.pixelSet(68, 40); myTOLED.pixelSet(69, 40); myTOLED.pixelSet(70, 40); myTOLED.pixelSet(72, 40); myTOLED.pixelSet(73, 40); myTOLED.pixelSet(74, 40); myTOLED.pixelSet(75, 40); myTOLED.pixelSet(86, 40); myTOLED.pixelSet(87, 40); myTOLED.pixelSet(88, 40); myTOLED.pixelSet(94, 40); myTOLED.pixelSet(95, 40); myTOLED.pixelSet(96, 40); myTOLED.pixelSet(97, 40); myTOLED.pixelSet(105, 40); myTOLED.pixelSet(106, 40); myTOLED.pixelSet(107, 40); myTOLED.pixelSet(108, 40); myTOLED.pixelSet(112, 40); myTOLED.pixelSet(113, 40); myTOLED.pixelSet(114, 40); myTOLED.pixelSet(115, 40); myTOLED.pixelSet(122, 40); myTOLED.pixelSet(123, 40); myTOLED.pixelSet(124, 40); myTOLED.pixelSet(125, 40); 
  myTOLED.pixelSet(4, 41); myTOLED.pixelSet(5, 41); myTOLED.pixelSet(6, 41); myTOLED.pixelSet(7, 41); myTOLED.pixelSet(8, 41); myTOLED.pixelSet(9, 41); myTOLED.pixelSet(10, 41); myTOLED.pixelSet(11, 41); myTOLED.pixelSet(20, 41); myTOLED.pixelSet(21, 41); myTOLED.pixelSet(22, 41); myTOLED.pixelSet(31, 41); myTOLED.pixelSet(32, 41); myTOLED.pixelSet(33, 41); myTOLED.pixelSet(34, 41); myTOLED.pixelSet(46, 41); myTOLED.pixelSet(47, 41); myTOLED.pixelSet(48, 41); myTOLED.pixelSet(49, 41); myTOLED.pixelSet(50, 41); myTOLED.pixelSet(51, 41); myTOLED.pixelSet(55, 41); myTOLED.pixelSet(56, 41); myTOLED.pixelSet(57, 41); myTOLED.pixelSet(58, 41); myTOLED.pixelSet(67, 41); myTOLED.pixelSet(68, 41); myTOLED.pixelSet(69, 41); myTOLED.pixelSet(70, 41); myTOLED.pixelSet(71, 41); myTOLED.pixelSet(72, 41); myTOLED.pixelSet(73, 41); myTOLED.pixelSet(74, 41); myTOLED.pixelSet(75, 41); myTOLED.pixelSet(86, 41); myTOLED.pixelSet(87, 41); myTOLED.pixelSet(88, 41); myTOLED.pixelSet(94, 41); myTOLED.pixelSet(95, 41); myTOLED.pixelSet(96, 41); myTOLED.pixelSet(97, 41); myTOLED.pixelSet(105, 41); myTOLED.pixelSet(106, 41); myTOLED.pixelSet(107, 41); myTOLED.pixelSet(108, 41); myTOLED.pixelSet(112, 41); myTOLED.pixelSet(113, 41); myTOLED.pixelSet(114, 41); myTOLED.pixelSet(115, 41); myTOLED.pixelSet(122, 41); myTOLED.pixelSet(123, 41); myTOLED.pixelSet(124, 41); myTOLED.pixelSet(125, 41); 
  myTOLED.pixelSet(5, 42); myTOLED.pixelSet(6, 42); myTOLED.pixelSet(7, 42); myTOLED.pixelSet(8, 42); myTOLED.pixelSet(9, 42); myTOLED.pixelSet(10, 42); myTOLED.pixelSet(11, 42); myTOLED.pixelSet(12, 42); myTOLED.pixelSet(13, 42); myTOLED.pixelSet(14, 42); myTOLED.pixelSet(20, 42); myTOLED.pixelSet(21, 42); myTOLED.pixelSet(22, 42); myTOLED.pixelSet(32, 42); myTOLED.pixelSet(33, 42); myTOLED.pixelSet(34, 42); myTOLED.pixelSet(41, 42); myTOLED.pixelSet(42, 42); myTOLED.pixelSet(43, 42); myTOLED.pixelSet(44, 42); myTOLED.pixelSet(45, 42); myTOLED.pixelSet(46, 42); myTOLED.pixelSet(47, 42); myTOLED.pixelSet(48, 42); myTOLED.pixelSet(49, 42); myTOLED.pixelSet(50, 42); myTOLED.pixelSet(51, 42); myTOLED.pixelSet(55, 42); myTOLED.pixelSet(56, 42); myTOLED.pixelSet(57, 42); myTOLED.pixelSet(58, 42); myTOLED.pixelSet(67, 42); myTOLED.pixelSet(68, 42); myTOLED.pixelSet(69, 42); myTOLED.pixelSet(70, 42); myTOLED.pixelSet(71, 42); myTOLED.pixelSet(72, 42); myTOLED.pixelSet(73, 42); myTOLED.pixelSet(74, 42); myTOLED.pixelSet(75, 42); myTOLED.pixelSet(76, 42); myTOLED.pixelSet(86, 42); myTOLED.pixelSet(87, 42); myTOLED.pixelSet(88, 42); myTOLED.pixelSet(94, 42); myTOLED.pixelSet(95, 42); myTOLED.pixelSet(96, 42); myTOLED.pixelSet(97, 42); myTOLED.pixelSet(105, 42); myTOLED.pixelSet(106, 42); myTOLED.pixelSet(107, 42); myTOLED.pixelSet(108, 42); myTOLED.pixelSet(112, 42); myTOLED.pixelSet(113, 42); myTOLED.pixelSet(114, 42); myTOLED.pixelSet(115, 42); myTOLED.pixelSet(122, 42); myTOLED.pixelSet(123, 42); myTOLED.pixelSet(124, 42); myTOLED.pixelSet(125, 42); 
  myTOLED.pixelSet(7, 43); myTOLED.pixelSet(8, 43); myTOLED.pixelSet(9, 43); myTOLED.pixelSet(10, 43); myTOLED.pixelSet(11, 43); myTOLED.pixelSet(12, 43); myTOLED.pixelSet(13, 43); myTOLED.pixelSet(14, 43); myTOLED.pixelSet(15, 43); myTOLED.pixelSet(20, 43); myTOLED.pixelSet(21, 43); myTOLED.pixelSet(22, 43); myTOLED.pixelSet(32, 43); myTOLED.pixelSet(33, 43); myTOLED.pixelSet(34, 43); myTOLED.pixelSet(39, 43); myTOLED.pixelSet(40, 43); myTOLED.pixelSet(41, 43); myTOLED.pixelSet(42, 43); myTOLED.pixelSet(43, 43); myTOLED.pixelSet(44, 43); myTOLED.pixelSet(45, 43); myTOLED.pixelSet(48, 43); myTOLED.pixelSet(49, 43); myTOLED.pixelSet(50, 43); myTOLED.pixelSet(51, 43); myTOLED.pixelSet(55, 43); myTOLED.pixelSet(56, 43); myTOLED.pixelSet(57, 43); myTOLED.pixelSet(58, 43); myTOLED.pixelSet(67, 43); myTOLED.pixelSet(68, 43); myTOLED.pixelSet(69, 43); myTOLED.pixelSet(70, 43); myTOLED.pixelSet(71, 43); myTOLED.pixelSet(72, 43); myTOLED.pixelSet(73, 43); myTOLED.pixelSet(74, 43); myTOLED.pixelSet(75, 43); myTOLED.pixelSet(76, 43); myTOLED.pixelSet(86, 43); myTOLED.pixelSet(87, 43); myTOLED.pixelSet(88, 43); myTOLED.pixelSet(94, 43); myTOLED.pixelSet(95, 43); myTOLED.pixelSet(96, 43); myTOLED.pixelSet(97, 43); myTOLED.pixelSet(105, 43); myTOLED.pixelSet(106, 43); myTOLED.pixelSet(107, 43); myTOLED.pixelSet(108, 43); myTOLED.pixelSet(112, 43); myTOLED.pixelSet(113, 43); myTOLED.pixelSet(114, 43); myTOLED.pixelSet(115, 43); myTOLED.pixelSet(122, 43); myTOLED.pixelSet(123, 43); myTOLED.pixelSet(124, 43); myTOLED.pixelSet(125, 43); 
  myTOLED.pixelSet(11, 44); myTOLED.pixelSet(12, 44); myTOLED.pixelSet(13, 44); myTOLED.pixelSet(14, 44); myTOLED.pixelSet(15, 44); myTOLED.pixelSet(16, 44); myTOLED.pixelSet(20, 44); myTOLED.pixelSet(21, 44); myTOLED.pixelSet(22, 44); myTOLED.pixelSet(31, 44); myTOLED.pixelSet(32, 44); myTOLED.pixelSet(33, 44); myTOLED.pixelSet(34, 44); myTOLED.pixelSet(38, 44); myTOLED.pixelSet(39, 44); myTOLED.pixelSet(40, 44); myTOLED.pixelSet(41, 44); myTOLED.pixelSet(48, 44); myTOLED.pixelSet(49, 44); myTOLED.pixelSet(50, 44); myTOLED.pixelSet(51, 44); myTOLED.pixelSet(55, 44); myTOLED.pixelSet(56, 44); myTOLED.pixelSet(57, 44); myTOLED.pixelSet(58, 44); myTOLED.pixelSet(67, 44); myTOLED.pixelSet(68, 44); myTOLED.pixelSet(69, 44); myTOLED.pixelSet(70, 44); myTOLED.pixelSet(71, 44); myTOLED.pixelSet(73, 44); myTOLED.pixelSet(74, 44); myTOLED.pixelSet(75, 44); myTOLED.pixelSet(76, 44); myTOLED.pixelSet(77, 44); myTOLED.pixelSet(86, 44); myTOLED.pixelSet(87, 44); myTOLED.pixelSet(88, 44); myTOLED.pixelSet(94, 44); myTOLED.pixelSet(95, 44); myTOLED.pixelSet(96, 44); myTOLED.pixelSet(97, 44); myTOLED.pixelSet(105, 44); myTOLED.pixelSet(106, 44); myTOLED.pixelSet(107, 44); myTOLED.pixelSet(108, 44); myTOLED.pixelSet(112, 44); myTOLED.pixelSet(113, 44); myTOLED.pixelSet(114, 44); myTOLED.pixelSet(115, 44); myTOLED.pixelSet(122, 44); myTOLED.pixelSet(123, 44); myTOLED.pixelSet(124, 44); myTOLED.pixelSet(125, 44); 
  myTOLED.pixelSet(13, 45); myTOLED.pixelSet(14, 45); myTOLED.pixelSet(15, 45); myTOLED.pixelSet(16, 45); myTOLED.pixelSet(20, 45); myTOLED.pixelSet(21, 45); myTOLED.pixelSet(22, 45); myTOLED.pixelSet(23, 45); myTOLED.pixelSet(31, 45); myTOLED.pixelSet(32, 45); myTOLED.pixelSet(33, 45); myTOLED.pixelSet(34, 45); myTOLED.pixelSet(37, 45); myTOLED.pixelSet(38, 45); myTOLED.pixelSet(39, 45); myTOLED.pixelSet(40, 45); myTOLED.pixelSet(48, 45); myTOLED.pixelSet(49, 45); myTOLED.pixelSet(50, 45); myTOLED.pixelSet(51, 45); myTOLED.pixelSet(55, 45); myTOLED.pixelSet(56, 45); myTOLED.pixelSet(57, 45); myTOLED.pixelSet(58, 45); myTOLED.pixelSet(67, 45); myTOLED.pixelSet(68, 45); myTOLED.pixelSet(69, 45); myTOLED.pixelSet(70, 45); myTOLED.pixelSet(74, 45); myTOLED.pixelSet(75, 45); myTOLED.pixelSet(76, 45); myTOLED.pixelSet(77, 45); myTOLED.pixelSet(78, 45); myTOLED.pixelSet(86, 45); myTOLED.pixelSet(87, 45); myTOLED.pixelSet(88, 45); myTOLED.pixelSet(94, 45); myTOLED.pixelSet(95, 45); myTOLED.pixelSet(96, 45); myTOLED.pixelSet(97, 45); myTOLED.pixelSet(105, 45); myTOLED.pixelSet(106, 45); myTOLED.pixelSet(107, 45); myTOLED.pixelSet(108, 45); myTOLED.pixelSet(112, 45); myTOLED.pixelSet(113, 45); myTOLED.pixelSet(114, 45); myTOLED.pixelSet(115, 45); myTOLED.pixelSet(122, 45); myTOLED.pixelSet(123, 45); myTOLED.pixelSet(124, 45); myTOLED.pixelSet(125, 45); 
  myTOLED.pixelSet(3, 46); myTOLED.pixelSet(4, 46); myTOLED.pixelSet(5, 46); myTOLED.pixelSet(6, 46); myTOLED.pixelSet(13, 46); myTOLED.pixelSet(14, 46); myTOLED.pixelSet(15, 46); myTOLED.pixelSet(16, 46); myTOLED.pixelSet(20, 46); myTOLED.pixelSet(21, 46); myTOLED.pixelSet(22, 46); myTOLED.pixelSet(23, 46); myTOLED.pixelSet(31, 46); myTOLED.pixelSet(32, 46); myTOLED.pixelSet(33, 46); myTOLED.pixelSet(34, 46); myTOLED.pixelSet(37, 46); myTOLED.pixelSet(38, 46); myTOLED.pixelSet(39, 46); myTOLED.pixelSet(40, 46); myTOLED.pixelSet(48, 46); myTOLED.pixelSet(49, 46); myTOLED.pixelSet(50, 46); myTOLED.pixelSet(51, 46); myTOLED.pixelSet(55, 46); myTOLED.pixelSet(56, 46); myTOLED.pixelSet(57, 46); myTOLED.pixelSet(58, 46); myTOLED.pixelSet(67, 46); myTOLED.pixelSet(68, 46); myTOLED.pixelSet(69, 46); myTOLED.pixelSet(70, 46); myTOLED.pixelSet(75, 46); myTOLED.pixelSet(76, 46); myTOLED.pixelSet(77, 46); myTOLED.pixelSet(78, 46); myTOLED.pixelSet(86, 46); myTOLED.pixelSet(87, 46); myTOLED.pixelSet(88, 46); myTOLED.pixelSet(94, 46); myTOLED.pixelSet(95, 46); myTOLED.pixelSet(96, 46); myTOLED.pixelSet(97, 46); myTOLED.pixelSet(98, 46); myTOLED.pixelSet(104, 46); myTOLED.pixelSet(105, 46); myTOLED.pixelSet(106, 46); myTOLED.pixelSet(107, 46); myTOLED.pixelSet(108, 46); myTOLED.pixelSet(112, 46); myTOLED.pixelSet(113, 46); myTOLED.pixelSet(114, 46); myTOLED.pixelSet(115, 46); myTOLED.pixelSet(122, 46); myTOLED.pixelSet(123, 46); myTOLED.pixelSet(124, 46); myTOLED.pixelSet(125, 46); 
  myTOLED.pixelSet(3, 47); myTOLED.pixelSet(4, 47); myTOLED.pixelSet(5, 47); myTOLED.pixelSet(6, 47); myTOLED.pixelSet(13, 47); myTOLED.pixelSet(14, 47); myTOLED.pixelSet(15, 47); myTOLED.pixelSet(16, 47); myTOLED.pixelSet(20, 47); myTOLED.pixelSet(21, 47); myTOLED.pixelSet(22, 47); myTOLED.pixelSet(23, 47); myTOLED.pixelSet(24, 47); myTOLED.pixelSet(30, 47); myTOLED.pixelSet(31, 47); myTOLED.pixelSet(32, 47); myTOLED.pixelSet(33, 47); myTOLED.pixelSet(34, 47); myTOLED.pixelSet(37, 47); myTOLED.pixelSet(38, 47); myTOLED.pixelSet(39, 47); myTOLED.pixelSet(40, 47); myTOLED.pixelSet(47, 47); myTOLED.pixelSet(48, 47); myTOLED.pixelSet(49, 47); myTOLED.pixelSet(50, 47); myTOLED.pixelSet(51, 47); myTOLED.pixelSet(55, 47); myTOLED.pixelSet(56, 47); myTOLED.pixelSet(57, 47); myTOLED.pixelSet(58, 47); myTOLED.pixelSet(67, 47); myTOLED.pixelSet(68, 47); myTOLED.pixelSet(69, 47); myTOLED.pixelSet(70, 47); myTOLED.pixelSet(75, 47); myTOLED.pixelSet(76, 47); myTOLED.pixelSet(77, 47); myTOLED.pixelSet(78, 47); myTOLED.pixelSet(79, 47); myTOLED.pixelSet(86, 47); myTOLED.pixelSet(87, 47); myTOLED.pixelSet(88, 47); myTOLED.pixelSet(95, 47); myTOLED.pixelSet(96, 47); myTOLED.pixelSet(97, 47); myTOLED.pixelSet(98, 47); myTOLED.pixelSet(104, 47); myTOLED.pixelSet(105, 47); myTOLED.pixelSet(106, 47); myTOLED.pixelSet(107, 47); myTOLED.pixelSet(108, 47); myTOLED.pixelSet(112, 47); myTOLED.pixelSet(113, 47); myTOLED.pixelSet(114, 47); myTOLED.pixelSet(115, 47); myTOLED.pixelSet(122, 47); myTOLED.pixelSet(123, 47); myTOLED.pixelSet(124, 47); myTOLED.pixelSet(125, 47); 
  myTOLED.pixelSet(4, 48); myTOLED.pixelSet(5, 48); myTOLED.pixelSet(6, 48); myTOLED.pixelSet(7, 48); myTOLED.pixelSet(12, 48); myTOLED.pixelSet(13, 48); myTOLED.pixelSet(14, 48); myTOLED.pixelSet(15, 48); myTOLED.pixelSet(16, 48); myTOLED.pixelSet(20, 48); myTOLED.pixelSet(21, 48); myTOLED.pixelSet(22, 48); myTOLED.pixelSet(23, 48); myTOLED.pixelSet(24, 48); myTOLED.pixelSet(25, 48); myTOLED.pixelSet(26, 48); myTOLED.pixelSet(27, 48); myTOLED.pixelSet(28, 48); myTOLED.pixelSet(29, 48); myTOLED.pixelSet(30, 48); myTOLED.pixelSet(31, 48); myTOLED.pixelSet(32, 48); myTOLED.pixelSet(33, 48); myTOLED.pixelSet(38, 48); myTOLED.pixelSet(39, 48); myTOLED.pixelSet(40, 48); myTOLED.pixelSet(41, 48); myTOLED.pixelSet(46, 48); myTOLED.pixelSet(47, 48); myTOLED.pixelSet(48, 48); myTOLED.pixelSet(49, 48); myTOLED.pixelSet(50, 48); myTOLED.pixelSet(51, 48); myTOLED.pixelSet(55, 48); myTOLED.pixelSet(56, 48); myTOLED.pixelSet(57, 48); myTOLED.pixelSet(58, 48); myTOLED.pixelSet(67, 48); myTOLED.pixelSet(68, 48); myTOLED.pixelSet(69, 48); myTOLED.pixelSet(70, 48); myTOLED.pixelSet(76, 48); myTOLED.pixelSet(77, 48); myTOLED.pixelSet(78, 48); myTOLED.pixelSet(79, 48); myTOLED.pixelSet(80, 48); myTOLED.pixelSet(86, 48); myTOLED.pixelSet(87, 48); myTOLED.pixelSet(88, 48); myTOLED.pixelSet(95, 48); myTOLED.pixelSet(96, 48); myTOLED.pixelSet(97, 48); myTOLED.pixelSet(98, 48); myTOLED.pixelSet(99, 48); myTOLED.pixelSet(100, 48); myTOLED.pixelSet(101, 48); myTOLED.pixelSet(102, 48); myTOLED.pixelSet(103, 48); myTOLED.pixelSet(104, 48); myTOLED.pixelSet(105, 48); myTOLED.pixelSet(106, 48); myTOLED.pixelSet(107, 48); myTOLED.pixelSet(108, 48); myTOLED.pixelSet(112, 48); myTOLED.pixelSet(113, 48); myTOLED.pixelSet(114, 48); myTOLED.pixelSet(115, 48); myTOLED.pixelSet(122, 48); myTOLED.pixelSet(123, 48); myTOLED.pixelSet(124, 48); myTOLED.pixelSet(125, 48); 
  myTOLED.pixelSet(4, 49); myTOLED.pixelSet(5, 49); myTOLED.pixelSet(6, 49); myTOLED.pixelSet(7, 49); myTOLED.pixelSet(8, 49); myTOLED.pixelSet(9, 49); myTOLED.pixelSet(10, 49); myTOLED.pixelSet(11, 49); myTOLED.pixelSet(12, 49); myTOLED.pixelSet(13, 49); myTOLED.pixelSet(14, 49); myTOLED.pixelSet(15, 49); myTOLED.pixelSet(20, 49); myTOLED.pixelSet(21, 49); myTOLED.pixelSet(22, 49); myTOLED.pixelSet(23, 49); myTOLED.pixelSet(24, 49); myTOLED.pixelSet(25, 49); myTOLED.pixelSet(26, 49); myTOLED.pixelSet(27, 49); myTOLED.pixelSet(28, 49); myTOLED.pixelSet(29, 49); myTOLED.pixelSet(30, 49); myTOLED.pixelSet(31, 49); myTOLED.pixelSet(32, 49); myTOLED.pixelSet(38, 49); myTOLED.pixelSet(39, 49); myTOLED.pixelSet(40, 49); myTOLED.pixelSet(41, 49); myTOLED.pixelSet(42, 49); myTOLED.pixelSet(43, 49); myTOLED.pixelSet(44, 49); myTOLED.pixelSet(45, 49); myTOLED.pixelSet(46, 49); myTOLED.pixelSet(47, 49); myTOLED.pixelSet(48, 49); myTOLED.pixelSet(49, 49); myTOLED.pixelSet(50, 49); myTOLED.pixelSet(51, 49); myTOLED.pixelSet(55, 49); myTOLED.pixelSet(56, 49); myTOLED.pixelSet(57, 49); myTOLED.pixelSet(58, 49); myTOLED.pixelSet(67, 49); myTOLED.pixelSet(68, 49); myTOLED.pixelSet(69, 49); myTOLED.pixelSet(70, 49); myTOLED.pixelSet(77, 49); myTOLED.pixelSet(78, 49); myTOLED.pixelSet(79, 49); myTOLED.pixelSet(80, 49); myTOLED.pixelSet(86, 49); myTOLED.pixelSet(87, 49); myTOLED.pixelSet(88, 49); myTOLED.pixelSet(95, 49); myTOLED.pixelSet(96, 49); myTOLED.pixelSet(97, 49); myTOLED.pixelSet(98, 49); myTOLED.pixelSet(99, 49); myTOLED.pixelSet(100, 49); myTOLED.pixelSet(101, 49); myTOLED.pixelSet(102, 49); myTOLED.pixelSet(103, 49); myTOLED.pixelSet(105, 49); myTOLED.pixelSet(106, 49); myTOLED.pixelSet(107, 49); myTOLED.pixelSet(108, 49); myTOLED.pixelSet(112, 49); myTOLED.pixelSet(113, 49); myTOLED.pixelSet(114, 49); myTOLED.pixelSet(115, 49); myTOLED.pixelSet(122, 49); myTOLED.pixelSet(123, 49); myTOLED.pixelSet(124, 49); myTOLED.pixelSet(125, 49); 
  myTOLED.pixelSet(6, 50); myTOLED.pixelSet(7, 50); myTOLED.pixelSet(8, 50); myTOLED.pixelSet(9, 50); myTOLED.pixelSet(10, 50); myTOLED.pixelSet(11, 50); myTOLED.pixelSet(12, 50); myTOLED.pixelSet(13, 50); myTOLED.pixelSet(20, 50); myTOLED.pixelSet(21, 50); myTOLED.pixelSet(22, 50); myTOLED.pixelSet(23, 50); myTOLED.pixelSet(26, 50); myTOLED.pixelSet(27, 50); myTOLED.pixelSet(28, 50); myTOLED.pixelSet(29, 50); myTOLED.pixelSet(30, 50); myTOLED.pixelSet(31, 50); myTOLED.pixelSet(39, 50); myTOLED.pixelSet(40, 50); myTOLED.pixelSet(41, 50); myTOLED.pixelSet(42, 50); myTOLED.pixelSet(43, 50); myTOLED.pixelSet(44, 50); myTOLED.pixelSet(45, 50); myTOLED.pixelSet(48, 50); myTOLED.pixelSet(49, 50); myTOLED.pixelSet(50, 50); myTOLED.pixelSet(51, 50); myTOLED.pixelSet(55, 50); myTOLED.pixelSet(56, 50); myTOLED.pixelSet(57, 50); myTOLED.pixelSet(58, 50); myTOLED.pixelSet(67, 50); myTOLED.pixelSet(68, 50); myTOLED.pixelSet(69, 50); myTOLED.pixelSet(70, 50); myTOLED.pixelSet(77, 50); myTOLED.pixelSet(78, 50); myTOLED.pixelSet(79, 50); myTOLED.pixelSet(80, 50); myTOLED.pixelSet(81, 50); myTOLED.pixelSet(86, 50); myTOLED.pixelSet(87, 50); myTOLED.pixelSet(88, 50); myTOLED.pixelSet(96, 50); myTOLED.pixelSet(97, 50); myTOLED.pixelSet(98, 50); myTOLED.pixelSet(99, 50); myTOLED.pixelSet(100, 50); myTOLED.pixelSet(101, 50); myTOLED.pixelSet(102, 50); myTOLED.pixelSet(105, 50); myTOLED.pixelSet(106, 50); myTOLED.pixelSet(107, 50); myTOLED.pixelSet(108, 50); myTOLED.pixelSet(112, 50); myTOLED.pixelSet(113, 50); myTOLED.pixelSet(114, 50); myTOLED.pixelSet(115, 50); myTOLED.pixelSet(122, 50); myTOLED.pixelSet(123, 50); myTOLED.pixelSet(124, 50); myTOLED.pixelSet(125, 50); 
  myTOLED.pixelSet(20, 51); myTOLED.pixelSet(21, 51); myTOLED.pixelSet(22, 51); myTOLED.pixelSet(23, 51); 
  myTOLED.pixelSet(20, 52); myTOLED.pixelSet(21, 52); myTOLED.pixelSet(22, 52); myTOLED.pixelSet(23, 52); 
  myTOLED.pixelSet(20, 53); myTOLED.pixelSet(21, 53); myTOLED.pixelSet(22, 53); myTOLED.pixelSet(23, 53); 
  myTOLED.pixelSet(20, 54); myTOLED.pixelSet(21, 54); myTOLED.pixelSet(22, 54); myTOLED.pixelSet(23, 54); 
  myTOLED.pixelSet(20, 55); myTOLED.pixelSet(21, 55); myTOLED.pixelSet(22, 55); myTOLED.pixelSet(23, 55); 
  myTOLED.pixelSet(20, 56); myTOLED.pixelSet(21, 56); myTOLED.pixelSet(22, 56); myTOLED.pixelSet(23, 56); 
  myTOLED.pixelSet(21, 57); myTOLED.pixelSet(22, 57); myTOLED.pixelSet(23, 57); 
  myTOLED.pixelSet(22, 58); myTOLED.pixelSet(23, 58); 
  myTOLED.pixelSet(23, 59); 


  for(uint8_t indi = 0; indi < 254; indi++)
  {
    myTOLED.setContrastControl(indi);
    delay(5);
  }
  delay(5000);
  for(uint8_t indi = 255; indi > 1; indi--)
  {
    myTOLED.setContrastControl(indi);
    delay(5);
  }
  myTOLED.setContrastControl(0);
  myTOLED.clearDisplay();
  myTOLED.setContrastControl(128);
}
#endif

Once you've uploaded the code to your board successfully, you should see something like the GIF below:

Example 1 GIF

If you have a look at the showLogo function, you'll see that the SparkFun logo is calculated and drawn out pixel by pixel. This was calculated using the image_to_pixel python script above. The image is drawn this way due to memory limitations in some Arduino boards. Perhaps not the most efficient way to do this, but it does the trick.

You'll also notice that the comments in this example are sparse - this example is intended to get you up and running and show you that the OLED works. The next example is where we will more thoroughly demonstrate how to make your own application with the drawing functions.

Example 2: DrawingBasics

This example shows some of the basic functions for drawing shapes, including line, rectangle, circle, and polygon. Once uploaded, you should notice different shapes showing up on your transparent OLED. Either select File > Examples > SparkFun HyperDisplay Transparent Graphical OLED Library > Example2_DrawingBasics or copy and paste the code below into a new Arduino window.

language:c
/*
  Take a guided tour of the basic capabilities of the Transparent Graphical OLED

  By: Owen Lyke
  SparkFun Electronics
  Date: February 27, 2019
  License: MIT. See license file for more information but you can
  basically do whatever you want with this code.
  Feel like supporting open source hardware?
  Buy a board from SparkFun! https://www.sparkfun.com/products/15173



  The graphics library is like a 3-layer cake. Here they are from top-down
  https://github.com/sparkfun/SparkFun_HyperDisplay
  https://github.com/sparkfun/HyperDisplay_SSD1309_ArduinoLibrary
  https://github.com/sparkfun/HyperDisplay_UG2856KLBAG01_ArduinoLibrary

  Hardware Compatibility
    - The IO pins on this board are designed for use with 3.3V so if you are using a 5V microcontroller
      please use a level shifter. Note: Qwiic connectors on SparkFun dev boards are already at 3.3V
    - This display relies on a copy of graphics data in your microcontroller, a total of 1024 bytes. 
      That is half the RAM available on an Uno so it is easy to run into sinister low-memory related
      bugs. We reccomend using a micro with more memory like a SAMD21, Esp32, Teensy, etc.

  Hardware Connections:
  Option 1 (I2C):
    Connect using a Qwiic jumper if you have a Qwiic compatible board and you plan to use I2C

  Option 2 (SPI):
    Connect SCLK and MOSI to the SPI port of your choice (13 and 11 for SPI on Uno-like boards) 
    Also connect D/C and CS to two unused GPIO pins of your choice (and set the proper pin definitions below)
    Don't forget power - connect 3.3V and GND
*/

#include "HyperDisplay_UG2856KLBAG01.h"   // Your library can be installed here: http://librarymanager/All#SparkFun_Transparent_Graphical_OLED
                                          // The rest of the Layer Cake:         http://librarymanager/All#SparkFun_HyperDisplay_SSD1309
                                          //                                     http://librarymanager/All#SparkFun_HyperDisplay
//////////////////////////
//      User Setup      //
//////////////////////////
#define SERIAL_PORT Serial  
#define WIRE_PORT Wire      // Used if USE_SPI == 0
#define SPI_PORT SPI        // Used if USE_SPI == 1

#define RES_PIN 2           // Optional
#define CS_PIN 4            // Used only if USE_SPI == 1
#define DC_PIN 5            // Used only if USE_SPI == 1

#define USE_SPI 0           // Choose your interface. 0 = I2C, 1 = SPI

// END USER SETUP


// Object Declaration. A class exists for each interface option
#if USE_SPI
  UG2856KLBAG01_SPI myTOLED;  // Declare a SPI-based Transparent OLED object called myTOLED
#else
  UG2856KLBAG01_I2C myTOLED;  // Declare a I2C-based Transparent OLED object called myTOLED
#endif /* USE_SPI */

void setup() {
  Serial.begin(9600);

  Serial.println("Example2_DrawingBasics: Transparent Graphical OLED");

#if USE_SPI 
  SPI_PORT.begin();
  myTOLED.begin(CS_PIN, DC_PIN, SPI_PORT);                  // Begin for SPI requires that you provide the CS and DC pin numbers
#else
  WIRE_PORT.begin();
  myTOLED.begin(WIRE_PORT, false, SSD1309_ARD_UNUSED_PIN);  // Begin for I2C has default values for every argument
  Wire.setClock(400000);
#endif /* USSE_SPI */

  /* 
   *  Drawing with the Transparent Graphical OLED
   *  
   *  The TOLED display is a 1-bit per pixel display, meaning that each pixel can either be on or off. It is also possible to
   *  raise/lower the contrast of the entire display, but not any pixel individually.
   *  
   *  This simplicity allows the TOLED HyperDisplay driver not to worry about color, instead each HyperDisplay function is 
   *  given two variants - one to 'Set' the pixels and one to 'Clear' the pixels. In th following code block we will try 
   *  out a few of those functions. Note, all the 'Set' functions have a 'Clear' counterpart that turns off pixels, but we
   *  will only show those in comments to avoid redundancy
   */

  uint8_t x0      = 0;
  uint8_t y0      = 0;
  uint8_t x1      = 0;
  uint8_t y1      = 0;
  uint8_t r       = 0;

  x0 = 5;
  y0 = 5;
  myTOLED.pixelSet(x0, y0);             // Provide the X and Y locations of the single pixel to set or clear
  // myTOLED.pixelClear(x0, y0);        // 

  x0 = 10;
  y0 = 10;
  x1 = 65;
  y1 = 35;
  myTOLED.rectangleSet(x0, y0, x1, y1);               // Draw a rectangle outline from (x0, y0) to (x1, y1)
  myTOLED.rectangleSet(x0+2, y0+2, x1-2, y1-2, true); // Supply the 'filled' parameter as true to fill in the rectangle
  //  myTOLED.rectangleClear(x0, y0, x1, y1);               
  //  myTOLED.rectangleClear(x0+2, y0+2, x1-2, y1-2, true); 

  x0 = 70;
  y0 = 5;
  x1 = 85;
  y1 = 50;
  myTOLED.lineSet(x0, y0, x1, y1);          // Draw a simple line from (x0, y0) to (x1, y1)  
  myTOLED.lineSet(x0+5, y0, x1+5, y1, 3);   // Draw a line with width 3 
  //  myTOLED.lineSet(x0, y0, x1, y1);        
  //  myTOLED.lineSet(x0+5, y0, x1+5, y1, 3); 

  x0 = 108;
  y1 = 24;
  r  = 14;
  myTOLED.circleSet(x0, y1, r);             // Outline circle centered at (x0, y0) with radius r
  myTOLED.circleSet(x0, y1, r-4, true);     // Filled in 
  //  myTOLED.circleSet(x0, y1, r);    
  //  myTOLED.circleSet(x0, y1, r-4, true);

  hd_extent_t x[] = {5, 42, 52};
  hd_extent_t y[] = {48, 40, 60};
  uint8_t numSides = sizeof(x)/sizeof(hd_extent_t);
  myTOLED.polygonSet(x, y, numSides);               // Make a polygon with numSides at the x, y coordinate pairs
  //  myTOLED.polygonClear(x, y, numSides);
}

void loop() {

  myTOLED.pixelSet(126,2);
  delay(1000);

  myTOLED.pixelClear(126,2);
  delay(1000);

}

Example Two Display

Although Example2 is detailed in how to use the drawing functions, it falls short in explaining one thing; specifically the options you have when creating and beginning the myTOLED object. When creating the object you can choose either the _I2C or the _SPI suffix to the name of the class (UG2856KLBAG01). That of course changes the intended communication protocol.

If you're using Qwiic, choose I2C. The interface decision also impacts your use of the begin() function by changing which parameters are expected. For I2C, you can specify an Arduino 'Wire' object to use, which I2C address to use, and a pin to use to select the I2C address.

For I2C, all parameters have defaults so it works to just use myTOLED.begin(); For SPI, the first two arguments are required but the third (which allows you to choose which SPI port to use) can be left out (e.g. myTOLED.begin(CS_PIN, DC_PIN);).

Example 3: AdvancedFeatures

This example has some serious Mario goalz. When you upload this, you'll see Mario jumping up and down and eventually landing on a pipe. Either select File > Examples > SparkFun HyperDisplay Transparent Graphical OLED Library > Example3_AdvancedFeatures or copy and paste the code below into a new Arduino window.

language:c
/*
  Take a guided tour of the basic capabilities of the Transparent Graphical OLED

  By: Owen Lyke
  SparkFun Electronics
  Date: February 28, 2019
  License: MIT. See license file for more information but you can
  basically do whatever you want with this code.
  Feel like supporting open source hardware?
  Buy a board from SparkFun! https://www.sparkfun.com/products/15173



  The graphics library is like a 3-layer cake. Here they are from top-down
  https://github.com/sparkfun/SparkFun_HyperDisplay
  https://github.com/sparkfun/HyperDisplay_SSD1309_ArduinoLibrary
  https://github.com/sparkfun/HyperDisplay_UG2856KLBAG01_ArduinoLibrary

  Hardware Compatibility
    - The IO pins on this board are designed for use with 3.3V so if you are using a 5V microcontroller
      please use a level shifter. Note: Qwiic connectors on SparkFun dev boards are already at 3.3V
    - This display relies on a copy of graphics data in your microcontroller, a total of 1024 bytes. 
      That is half the RAM available on an Uno so it is easy to run into sinister low-memory related
      bugs. We reccomend using a micro with more memory like a SAMD21, Esp32, Teensy, etc.

  Hardware Connections:
  Option 1 (I2C):
    Connect using a Qwiic jumper if you have a Qwiic compatible board and you plan to use I2C

  Option 2 (SPI):
    Connect SCLK and MOSI to the SPI port of your choice (13 and 11 for SPI on Uno-like boards) 
    Also connect D/C and CS to two unused GPIO pins of your choice (and set the proper pin definitions below)
    Don't forget power - connect 3.3V and GND
*/

#include "HyperDisplay_UG2856KLBAG01.h"   // Your library can be installed here: http://librarymanager/All#SparkFun_Transparent_Graphical_OLED
                                          // The rest of the Layer Cake:         http://librarymanager/All#SparkFun_HyperDisplay_SSD1309
                                          //                                     http://librarymanager/All#SparkFun_HyperDisplay
//////////////////////////
//      User Setup      //
//////////////////////////
#define SERIAL_PORT Serial  
#define WIRE_PORT Wire      // Used if USE_SPI == 0
#define SPI_PORT SPI        // Used if USE_SPI == 1

#define RES_PIN 2           // Optional
#define CS_PIN 4            // Used only if USE_SPI == 1
#define DC_PIN 5            // Used only if USE_SPI == 1

#define USE_SPI 0           // Choose your interface. 0 = I2C, 1 = SPI

// END USER SETUP


// Object Declaration. A class exists for each interface option
#if USE_SPI
  UG2856KLBAG01_SPI myTOLED;  // Declare a SPI-based Transparent OLED object called myTOLED
#else
  UG2856KLBAG01_I2C myTOLED;  // Declare a I2C-based Transparent OLED object called myTOLED
#endif /* USE_SPI */

void setup() {
  Serial.begin(9600);

  Serial.println("Example3_AdvancedFeatures: Transparent Graphical OLED");

#if USE_SPI 
  SPI_PORT.begin();
  myTOLED.begin(CS_PIN, DC_PIN, SPI_PORT);                  // Begin for SPI requires that you provide the CS and DC pin numbers
#else
  WIRE_PORT.begin();
  myTOLED.begin(WIRE_PORT, false, SSD1309_ARD_UNUSED_PIN);  // Begin for I2C has default values for every argument
  Wire.setClock(400000);
#endif /* USSE_SPI */


  wind_info_t defaultWindow, myWindow;  // Create some window objects

  // Initialize the windows to defualt settings 
  // (this is a pretty important step unless you are extra
  // careful to manually initialize each and every paramter)
  myTOLED.setWindowDefaults(&defaultWindow);
  myTOLED.setWindowDefaults(&myWindow);

  // We can set the rectangular active area of the window
  myWindow.xMin = 25; 
  myWindow.yMin = 05;
  myWindow.xMax = 73;
  myWindow.yMax = 48;

  // All drawing functions use window-relative coordinates
  // This makes it easy to reposition whole compositions

  // First let's draw a line on the default window (which is equivalent to the whole screen)
  myTOLED.lineSet(0, 0, 15, 43);

  // Now let's change the active window and draw the same line
  delay(1000);
  myTOLED.pCurrentWindow = &myWindow;
  myTOLED.lineSet(0, 0, 15, 43);

  delay(2000);

  // To better illustrate where the window is let's fill it in..
  myTOLED.windowSet();  // Calling windowSet without arguments operates on the current window.
  //  myTOLED.windowClear();

  delay(2000);

  // Remember, drawing functions are relative to the current window,
  // so you don't have to do extra math!
  myTOLED.circleClear(25, 20, 10); // Add some pizzazz!

  delay(2000);

  // You can also pass a window to windowSet/Clear to fill it without changing the current window
  myTOLED.windowClear(&defaultWindow); // The default initialization will make this clear the whole screen

}

void loop() {

#if !defined(__AVR_ATmega328P__) && !defined(__AVR_ATmega168__)
  // Now for an example of what you might do with a window...

  wind_info_t mariosWindow, pipeWindow;
  myTOLED.setWindowDefaults(&mariosWindow);
  myTOLED.setWindowDefaults(&pipeWindow);

  // Make the window just big enough for Mario
  mariosWindow.xMax = 21;
  mariosWindow.yMax = 28;

  pipeWindow.xMax = 24;
  pipeWindow.yMax = 24;

  // Move the windows into the starting position
  moveWindow(0, 34, &mariosWindow);
  moveWindow(103, 63-25, &pipeWindow);

  // Draw Pipe
  myTOLED.pCurrentWindow = &pipeWindow;
  showPipe();

  // Draw Mario at the starting position
  myTOLED.pCurrentWindow = &mariosWindow;
  showMario();


  // Move mario to his home
  myTOLED.windowClear();
  moveWindow(15, -15, &mariosWindow);
  showMario();

  myTOLED.windowClear();
  moveWindow(15, 15, &mariosWindow);
  showMario();

  myTOLED.windowClear();
  moveWindow(13, -15, &mariosWindow);
  showMario();

  myTOLED.windowClear();
  moveWindow(13, 15, &mariosWindow);
  showMario();

  myTOLED.windowClear();
  moveWindow(13, -15, &mariosWindow);
  showMario();

  myTOLED.windowClear();
  moveWindow(13, 15, &mariosWindow);
  showMario();

  myTOLED.windowClear();
  moveWindow(5, -23, &mariosWindow);
  showMario();

  myTOLED.windowClear();
  moveWindow(17, 0, &mariosWindow);
  showMario();

  delay(5000);

  myTOLED.windowClear();

#endif
}



void moveWindow( int8_t x, int8_t y, wind_info_t* pwind){
  pwind->xMin += x;
  pwind->yMin += y;
  pwind->xMax += x;
  pwind->yMax += y;
}


#if !defined(__AVR_ATmega328P__) && !defined(__AVR_ATmega168__)
void showMario( void ){
  myTOLED.pixelSet(6, 2); myTOLED.pixelSet(7, 2); myTOLED.pixelSet(8, 2); myTOLED.pixelSet(9, 2); myTOLED.pixelSet(10, 2); myTOLED.pixelSet(11, 2); myTOLED.pixelSet(12, 2); myTOLED.pixelSet(13, 2); 
  myTOLED.pixelSet(5, 3); myTOLED.pixelSet(6, 3); myTOLED.pixelSet(7, 3); myTOLED.pixelSet(8, 3); myTOLED.pixelSet(9, 3); myTOLED.pixelSet(10, 3); myTOLED.pixelSet(11, 3); myTOLED.pixelSet(12, 3); myTOLED.pixelSet(13, 3); myTOLED.pixelSet(14, 3); myTOLED.pixelSet(15, 3); myTOLED.pixelSet(16, 3); myTOLED.pixelSet(17, 3); myTOLED.pixelSet(18, 3); 
  myTOLED.pixelSet(4, 4); myTOLED.pixelSet(5, 4); myTOLED.pixelSet(6, 4); myTOLED.pixelSet(7, 4); myTOLED.pixelSet(8, 4); myTOLED.pixelSet(9, 4); myTOLED.pixelSet(10, 4); myTOLED.pixelSet(11, 4); myTOLED.pixelSet(12, 4); myTOLED.pixelSet(13, 4); myTOLED.pixelSet(14, 4); myTOLED.pixelSet(15, 4); myTOLED.pixelSet(16, 4); myTOLED.pixelSet(17, 4); myTOLED.pixelSet(18, 4); 
  myTOLED.pixelSet(4, 5); myTOLED.pixelSet(5, 5); myTOLED.pixelSet(6, 5); myTOLED.pixelSet(7, 5); myTOLED.pixelSet(8, 5); myTOLED.pixelSet(9, 5); myTOLED.pixelSet(10, 5); myTOLED.pixelSet(11, 5); myTOLED.pixelSet(12, 5); myTOLED.pixelSet(13, 5); myTOLED.pixelSet(14, 5); myTOLED.pixelSet(15, 5); 
  myTOLED.pixelSet(4, 6); myTOLED.pixelSet(5, 6); myTOLED.pixelSet(6, 6); myTOLED.pixelSet(7, 6); myTOLED.pixelSet(8, 6); myTOLED.pixelSet(9, 6); myTOLED.pixelSet(10, 6); myTOLED.pixelSet(11, 6); myTOLED.pixelSet(12, 6); myTOLED.pixelSet(13, 6); myTOLED.pixelSet(14, 6); myTOLED.pixelSet(15, 6); 
  myTOLED.pixelSet(3, 7); myTOLED.pixelSet(4, 7); myTOLED.pixelSet(5, 7); myTOLED.pixelSet(6, 7); myTOLED.pixelSet(7, 7); myTOLED.pixelSet(8, 7); myTOLED.pixelSet(9, 7); myTOLED.pixelSet(10, 7); myTOLED.pixelSet(11, 7); myTOLED.pixelSet(12, 7); myTOLED.pixelSet(13, 7); myTOLED.pixelSet(14, 7); myTOLED.pixelSet(15, 7); myTOLED.pixelSet(16, 7); myTOLED.pixelSet(17, 7); myTOLED.pixelSet(18, 7); 
  myTOLED.pixelSet(3, 8); myTOLED.pixelSet(4, 8); myTOLED.pixelSet(5, 8); myTOLED.pixelSet(6, 8); myTOLED.pixelSet(7, 8); myTOLED.pixelSet(8, 8); myTOLED.pixelSet(9, 8); myTOLED.pixelSet(10, 8); myTOLED.pixelSet(11, 8); myTOLED.pixelSet(12, 8); myTOLED.pixelSet(13, 8); myTOLED.pixelSet(14, 8); myTOLED.pixelSet(15, 8); myTOLED.pixelSet(16, 8); myTOLED.pixelSet(17, 8); myTOLED.pixelSet(18, 8); 
  myTOLED.pixelSet(3, 9); myTOLED.pixelSet(4, 9); myTOLED.pixelSet(5, 9); myTOLED.pixelSet(6, 9); myTOLED.pixelSet(7, 9); myTOLED.pixelSet(8, 9); myTOLED.pixelSet(9, 9); myTOLED.pixelSet(10, 9); myTOLED.pixelSet(11, 9); myTOLED.pixelSet(12, 9); myTOLED.pixelSet(13, 9); myTOLED.pixelSet(14, 9); myTOLED.pixelSet(15, 9); myTOLED.pixelSet(16, 9); myTOLED.pixelSet(17, 9); myTOLED.pixelSet(18, 9); myTOLED.pixelSet(19, 9); 
  myTOLED.pixelSet(3, 10); myTOLED.pixelSet(4, 10); myTOLED.pixelSet(5, 10); myTOLED.pixelSet(6, 10); myTOLED.pixelSet(7, 10); myTOLED.pixelSet(8, 10); myTOLED.pixelSet(9, 10); myTOLED.pixelSet(10, 10); myTOLED.pixelSet(11, 10); myTOLED.pixelSet(12, 10); myTOLED.pixelSet(13, 10); myTOLED.pixelSet(14, 10); myTOLED.pixelSet(15, 10); myTOLED.pixelSet(16, 10); myTOLED.pixelSet(17, 10); myTOLED.pixelSet(18, 10); 
  myTOLED.pixelSet(3, 11); myTOLED.pixelSet(4, 11); myTOLED.pixelSet(5, 11); myTOLED.pixelSet(6, 11); myTOLED.pixelSet(7, 11); myTOLED.pixelSet(8, 11); myTOLED.pixelSet(9, 11); myTOLED.pixelSet(10, 11); myTOLED.pixelSet(11, 11); myTOLED.pixelSet(12, 11); myTOLED.pixelSet(13, 11); myTOLED.pixelSet(14, 11); myTOLED.pixelSet(15, 11); myTOLED.pixelSet(16, 11); myTOLED.pixelSet(17, 11); myTOLED.pixelSet(18, 11); 
  myTOLED.pixelSet(6, 12); myTOLED.pixelSet(7, 12); myTOLED.pixelSet(8, 12); myTOLED.pixelSet(9, 12); myTOLED.pixelSet(10, 12); myTOLED.pixelSet(11, 12); myTOLED.pixelSet(12, 12); myTOLED.pixelSet(13, 12); myTOLED.pixelSet(14, 12); myTOLED.pixelSet(15, 12); myTOLED.pixelSet(16, 12); 
  myTOLED.pixelSet(5, 13); myTOLED.pixelSet(6, 13); myTOLED.pixelSet(7, 13); myTOLED.pixelSet(8, 13); myTOLED.pixelSet(9, 13); myTOLED.pixelSet(10, 13); myTOLED.pixelSet(11, 13); myTOLED.pixelSet(12, 13); myTOLED.pixelSet(13, 13); 
  myTOLED.pixelSet(4, 14); myTOLED.pixelSet(5, 14); myTOLED.pixelSet(6, 14); myTOLED.pixelSet(7, 14); myTOLED.pixelSet(8, 14); myTOLED.pixelSet(9, 14); myTOLED.pixelSet(10, 14); myTOLED.pixelSet(11, 14); myTOLED.pixelSet(12, 14); myTOLED.pixelSet(13, 14); 
  myTOLED.pixelSet(3, 15); myTOLED.pixelSet(4, 15); myTOLED.pixelSet(5, 15); myTOLED.pixelSet(6, 15); myTOLED.pixelSet(7, 15); myTOLED.pixelSet(8, 15); myTOLED.pixelSet(9, 15); myTOLED.pixelSet(10, 15); myTOLED.pixelSet(11, 15); myTOLED.pixelSet(12, 15); myTOLED.pixelSet(13, 15); myTOLED.pixelSet(14, 15); myTOLED.pixelSet(15, 15); myTOLED.pixelSet(16, 15); myTOLED.pixelSet(17, 15); myTOLED.pixelSet(18, 15); 
  myTOLED.pixelSet(2, 16); myTOLED.pixelSet(3, 16); myTOLED.pixelSet(4, 16); myTOLED.pixelSet(5, 16); myTOLED.pixelSet(6, 16); myTOLED.pixelSet(7, 16); myTOLED.pixelSet(8, 16); myTOLED.pixelSet(9, 16); myTOLED.pixelSet(10, 16); myTOLED.pixelSet(11, 16); myTOLED.pixelSet(12, 16); myTOLED.pixelSet(13, 16); myTOLED.pixelSet(14, 16); myTOLED.pixelSet(15, 16); myTOLED.pixelSet(16, 16); myTOLED.pixelSet(17, 16); myTOLED.pixelSet(18, 16); 
  myTOLED.pixelSet(1, 17); myTOLED.pixelSet(2, 17); myTOLED.pixelSet(3, 17); myTOLED.pixelSet(4, 17); myTOLED.pixelSet(5, 17); myTOLED.pixelSet(6, 17); myTOLED.pixelSet(7, 17); myTOLED.pixelSet(8, 17); myTOLED.pixelSet(9, 17); myTOLED.pixelSet(10, 17); myTOLED.pixelSet(11, 17); myTOLED.pixelSet(12, 17); myTOLED.pixelSet(13, 17); myTOLED.pixelSet(14, 17); myTOLED.pixelSet(15, 17); myTOLED.pixelSet(16, 17); myTOLED.pixelSet(17, 17); myTOLED.pixelSet(18, 17); myTOLED.pixelSet(19, 17); 
  myTOLED.pixelSet(1, 18); myTOLED.pixelSet(2, 18); myTOLED.pixelSet(3, 18); myTOLED.pixelSet(4, 18); myTOLED.pixelSet(5, 18); myTOLED.pixelSet(6, 18); myTOLED.pixelSet(7, 18); myTOLED.pixelSet(8, 18); myTOLED.pixelSet(9, 18); myTOLED.pixelSet(10, 18); myTOLED.pixelSet(11, 18); myTOLED.pixelSet(12, 18); myTOLED.pixelSet(13, 18); myTOLED.pixelSet(14, 18); myTOLED.pixelSet(15, 18); myTOLED.pixelSet(16, 18); myTOLED.pixelSet(17, 18); myTOLED.pixelSet(18, 18); myTOLED.pixelSet(19, 18); 
  myTOLED.pixelSet(1, 19); myTOLED.pixelSet(2, 19); myTOLED.pixelSet(3, 19); myTOLED.pixelSet(4, 19); myTOLED.pixelSet(5, 19); myTOLED.pixelSet(6, 19); myTOLED.pixelSet(7, 19); myTOLED.pixelSet(8, 19); myTOLED.pixelSet(9, 19); myTOLED.pixelSet(10, 19); myTOLED.pixelSet(11, 19); myTOLED.pixelSet(12, 19); myTOLED.pixelSet(13, 19); myTOLED.pixelSet(14, 19); myTOLED.pixelSet(15, 19); myTOLED.pixelSet(16, 19); myTOLED.pixelSet(17, 19); myTOLED.pixelSet(18, 19); myTOLED.pixelSet(19, 19); 
  myTOLED.pixelSet(1, 20); myTOLED.pixelSet(2, 20); myTOLED.pixelSet(3, 20); myTOLED.pixelSet(4, 20); myTOLED.pixelSet(5, 20); myTOLED.pixelSet(6, 20); myTOLED.pixelSet(7, 20); myTOLED.pixelSet(8, 20); myTOLED.pixelSet(9, 20); myTOLED.pixelSet(10, 20); myTOLED.pixelSet(11, 20); myTOLED.pixelSet(12, 20); myTOLED.pixelSet(13, 20); myTOLED.pixelSet(14, 20); myTOLED.pixelSet(15, 20); myTOLED.pixelSet(16, 20); myTOLED.pixelSet(17, 20); myTOLED.pixelSet(18, 20); myTOLED.pixelSet(19, 20); 
  myTOLED.pixelSet(1, 21); myTOLED.pixelSet(2, 21); myTOLED.pixelSet(3, 21); myTOLED.pixelSet(4, 21); myTOLED.pixelSet(5, 21); myTOLED.pixelSet(6, 21); myTOLED.pixelSet(7, 21); myTOLED.pixelSet(8, 21); myTOLED.pixelSet(9, 21); myTOLED.pixelSet(10, 21); myTOLED.pixelSet(11, 21); myTOLED.pixelSet(12, 21); myTOLED.pixelSet(13, 21); myTOLED.pixelSet(14, 21); myTOLED.pixelSet(15, 21); myTOLED.pixelSet(16, 21); myTOLED.pixelSet(17, 21); myTOLED.pixelSet(18, 21); myTOLED.pixelSet(19, 21); 
  myTOLED.pixelSet(1, 22); myTOLED.pixelSet(2, 22); myTOLED.pixelSet(3, 22); myTOLED.pixelSet(4, 22); myTOLED.pixelSet(5, 22); myTOLED.pixelSet(6, 22); myTOLED.pixelSet(7, 22); myTOLED.pixelSet(8, 22); myTOLED.pixelSet(9, 22); myTOLED.pixelSet(10, 22); myTOLED.pixelSet(11, 22); myTOLED.pixelSet(12, 22); myTOLED.pixelSet(13, 22); myTOLED.pixelSet(14, 22); myTOLED.pixelSet(15, 22); myTOLED.pixelSet(16, 22); myTOLED.pixelSet(17, 22); myTOLED.pixelSet(18, 22); myTOLED.pixelSet(19, 22); 
  myTOLED.pixelSet(4, 23); myTOLED.pixelSet(5, 23); myTOLED.pixelSet(6, 23); myTOLED.pixelSet(7, 23); myTOLED.pixelSet(8, 23); myTOLED.pixelSet(12, 23); myTOLED.pixelSet(13, 23); myTOLED.pixelSet(14, 23); myTOLED.pixelSet(15, 23); myTOLED.pixelSet(16, 23); 
  myTOLED.pixelSet(4, 24); myTOLED.pixelSet(5, 24); myTOLED.pixelSet(6, 24); myTOLED.pixelSet(7, 24); myTOLED.pixelSet(13, 24); myTOLED.pixelSet(14, 24); myTOLED.pixelSet(15, 24); myTOLED.pixelSet(16, 24); 
  myTOLED.pixelSet(3, 25); myTOLED.pixelSet(4, 25); myTOLED.pixelSet(5, 25); myTOLED.pixelSet(6, 25); myTOLED.pixelSet(14, 25); myTOLED.pixelSet(15, 25); myTOLED.pixelSet(16, 25); myTOLED.pixelSet(17, 25); myTOLED.pixelSet(18, 25); 
  myTOLED.pixelSet(2, 26); myTOLED.pixelSet(3, 26); myTOLED.pixelSet(4, 26); myTOLED.pixelSet(5, 26); myTOLED.pixelSet(6, 26); myTOLED.pixelSet(14, 26); myTOLED.pixelSet(15, 26); myTOLED.pixelSet(16, 26); myTOLED.pixelSet(17, 26); myTOLED.pixelSet(18, 26); myTOLED.pixelSet(19, 26); 
  myTOLED.pixelSet(1, 27); myTOLED.pixelSet(2, 27); myTOLED.pixelSet(3, 27); myTOLED.pixelSet(4, 27); myTOLED.pixelSet(5, 27); myTOLED.pixelSet(6, 27); myTOLED.pixelSet(14, 27); myTOLED.pixelSet(15, 27); myTOLED.pixelSet(16, 27); myTOLED.pixelSet(17, 27); myTOLED.pixelSet(18, 27); myTOLED.pixelSet(19, 27); myTOLED.pixelSet(20, 27);  
}


void showPipe( void ){
  myTOLED.pixelSet(2, 2); myTOLED.pixelSet(3, 2); myTOLED.pixelSet(4, 2); myTOLED.pixelSet(5, 2); myTOLED.pixelSet(6, 2); myTOLED.pixelSet(7, 2); myTOLED.pixelSet(8, 2); myTOLED.pixelSet(9, 2); myTOLED.pixelSet(10, 2); myTOLED.pixelSet(11, 2); myTOLED.pixelSet(12, 2); myTOLED.pixelSet(13, 2); myTOLED.pixelSet(14, 2); myTOLED.pixelSet(15, 2); myTOLED.pixelSet(16, 2); myTOLED.pixelSet(17, 2); myTOLED.pixelSet(18, 2); myTOLED.pixelSet(19, 2); myTOLED.pixelSet(20, 2); myTOLED.pixelSet(21, 2); myTOLED.pixelSet(22, 2); 
  myTOLED.pixelSet(2, 3); myTOLED.pixelSet(22, 3); 
  myTOLED.pixelSet(2, 4); myTOLED.pixelSet(12, 4); myTOLED.pixelSet(13, 4); myTOLED.pixelSet(14, 4); myTOLED.pixelSet(15, 4); myTOLED.pixelSet(16, 4); myTOLED.pixelSet(22, 4); 
  myTOLED.pixelSet(2, 5); myTOLED.pixelSet(12, 5); myTOLED.pixelSet(13, 5); myTOLED.pixelSet(14, 5); myTOLED.pixelSet(15, 5); myTOLED.pixelSet(16, 5); myTOLED.pixelSet(17, 5); myTOLED.pixelSet(22, 5); 
  myTOLED.pixelSet(2, 6); myTOLED.pixelSet(4, 6); myTOLED.pixelSet(5, 6); myTOLED.pixelSet(9, 6); myTOLED.pixelSet(12, 6); myTOLED.pixelSet(13, 6); myTOLED.pixelSet(14, 6); myTOLED.pixelSet(15, 6); myTOLED.pixelSet(16, 6); myTOLED.pixelSet(22, 6); 
  myTOLED.pixelSet(2, 7); myTOLED.pixelSet(12, 7); myTOLED.pixelSet(13, 7); myTOLED.pixelSet(14, 7); myTOLED.pixelSet(15, 7); myTOLED.pixelSet(16, 7); myTOLED.pixelSet(17, 7); myTOLED.pixelSet(22, 7); 
  myTOLED.pixelSet(2, 8); myTOLED.pixelSet(12, 8); myTOLED.pixelSet(13, 8); myTOLED.pixelSet(14, 8); myTOLED.pixelSet(15, 8); myTOLED.pixelSet(16, 8); myTOLED.pixelSet(22, 8); 
  myTOLED.pixelSet(2, 9); myTOLED.pixelSet(12, 9); myTOLED.pixelSet(13, 9); myTOLED.pixelSet(14, 9); myTOLED.pixelSet(15, 9); myTOLED.pixelSet(16, 9); myTOLED.pixelSet(22, 9); 
  myTOLED.pixelSet(2, 10); myTOLED.pixelSet(12, 10); myTOLED.pixelSet(13, 10); myTOLED.pixelSet(14, 10); myTOLED.pixelSet(15, 10); myTOLED.pixelSet(16, 10); myTOLED.pixelSet(17, 10); myTOLED.pixelSet(22, 10); 
  myTOLED.pixelSet(2, 11); myTOLED.pixelSet(4, 11); myTOLED.pixelSet(5, 11); myTOLED.pixelSet(9, 11); myTOLED.pixelSet(12, 11); myTOLED.pixelSet(13, 11); myTOLED.pixelSet(14, 11); myTOLED.pixelSet(15, 11); myTOLED.pixelSet(16, 11); myTOLED.pixelSet(17, 11); myTOLED.pixelSet(18, 11); myTOLED.pixelSet(22, 11); 
  myTOLED.pixelSet(2, 12); myTOLED.pixelSet(3, 12); myTOLED.pixelSet(4, 12); myTOLED.pixelSet(5, 12); myTOLED.pixelSet(6, 12); myTOLED.pixelSet(7, 12); myTOLED.pixelSet(8, 12); myTOLED.pixelSet(9, 12); myTOLED.pixelSet(10, 12); myTOLED.pixelSet(11, 12); myTOLED.pixelSet(12, 12); myTOLED.pixelSet(13, 12); myTOLED.pixelSet(14, 12); myTOLED.pixelSet(15, 12); myTOLED.pixelSet(16, 12); myTOLED.pixelSet(17, 12); myTOLED.pixelSet(18, 12); myTOLED.pixelSet(19, 12); myTOLED.pixelSet(20, 12); myTOLED.pixelSet(21, 12); myTOLED.pixelSet(22, 12); 
  myTOLED.pixelSet(3, 13); myTOLED.pixelSet(6, 13); myTOLED.pixelSet(7, 13); myTOLED.pixelSet(11, 13); myTOLED.pixelSet(13, 13); myTOLED.pixelSet(14, 13); myTOLED.pixelSet(15, 13); myTOLED.pixelSet(16, 13); myTOLED.pixelSet(17, 13); myTOLED.pixelSet(20, 13); myTOLED.pixelSet(21, 13); 
  myTOLED.pixelSet(3, 14); myTOLED.pixelSet(6, 14); myTOLED.pixelSet(14, 14); myTOLED.pixelSet(20, 14); myTOLED.pixelSet(21, 14); 
  myTOLED.pixelSet(3, 15); myTOLED.pixelSet(6, 15); myTOLED.pixelSet(14, 15); myTOLED.pixelSet(15, 15); myTOLED.pixelSet(20, 15); myTOLED.pixelSet(21, 15); 
  myTOLED.pixelSet(3, 16); myTOLED.pixelSet(6, 16); myTOLED.pixelSet(14, 16); myTOLED.pixelSet(15, 16); myTOLED.pixelSet(20, 16); myTOLED.pixelSet(21, 16); 
  myTOLED.pixelSet(3, 17); myTOLED.pixelSet(6, 17); myTOLED.pixelSet(14, 17); myTOLED.pixelSet(15, 17); myTOLED.pixelSet(20, 17); myTOLED.pixelSet(21, 17); 
  myTOLED.pixelSet(3, 18); myTOLED.pixelSet(6, 18); myTOLED.pixelSet(14, 18); myTOLED.pixelSet(15, 18); myTOLED.pixelSet(20, 18); myTOLED.pixelSet(21, 18); 
  myTOLED.pixelSet(3, 19); myTOLED.pixelSet(6, 19); myTOLED.pixelSet(14, 19); myTOLED.pixelSet(20, 19); myTOLED.pixelSet(21, 19); 
  myTOLED.pixelSet(3, 20); myTOLED.pixelSet(6, 20); myTOLED.pixelSet(14, 20); myTOLED.pixelSet(15, 20); myTOLED.pixelSet(20, 20); myTOLED.pixelSet(21, 20); 
  myTOLED.pixelSet(3, 21); myTOLED.pixelSet(6, 21); myTOLED.pixelSet(14, 21); myTOLED.pixelSet(15, 21); myTOLED.pixelSet(20, 21); myTOLED.pixelSet(21, 21); 
  myTOLED.pixelSet(3, 22); myTOLED.pixelSet(6, 22); myTOLED.pixelSet(14, 22); myTOLED.pixelSet(15, 22); myTOLED.pixelSet(20, 22); myTOLED.pixelSet(21, 22); 
  myTOLED.pixelSet(3, 23); myTOLED.pixelSet(6, 23); myTOLED.pixelSet(14, 23); myTOLED.pixelSet(15, 23); myTOLED.pixelSet(20, 23); myTOLED.pixelSet(21, 23); 
  myTOLED.pixelSet(3, 24); myTOLED.pixelSet(6, 24); myTOLED.pixelSet(14, 24); myTOLED.pixelSet(20, 24); myTOLED.pixelSet(21, 24); 
}

#else
void showMario( void ){
  Serial.println(F("Sorry, Uno and other low-memory microcontrollers may not be able to run the Mario code due to program memory size constraints."))
}

void showPipe( void ){
  Serial.println(F("Sorry, Uno and other low-memory microcontrollers may not be able to run the Mario code due to program memory size constraints."))
}
#endif

Once you've uploaded the code, you should see a bouncing Mario heading towards the finish line.

Mario I2C display

The 'Advanced Feature' referenced in this example is the ability to draw in relation to pre-defined 'windows.' Windows allow you to easily constrain drawing to a particular area or to group related objects. To highlight this fact we made a Mario character with a bunch of hard-coded pixelSet(x,y) calls but were able to move him simply by moving the active window and re-drawing. In that case, all the individual pixels that make up Mario were the related objects that we wanted to move together.

One feature not shown in this example is the built-in HyperDisplay text printing. The reason for this is that on, ESP32 boards the <avr/pgmspace.h> header is not supported so we can't use the default font. However, the printing functions should work on micrcontrollers that both support <avr/pgmspace.h> and have enough RAM to be stable. Check out the HyperDisplay tutorial for more information on this.

Resources and Going Further

For more information on the Transparent Graphical OLED Breakout, check out some of the links here:

Need some inspiration for your next project? Check out some of these other display related tutorials!

Reaction Timer

Demonstrate mental chronometry with this simple reaction timer!

SparkFun Inventor's Kit for Photon Experiment Guide

Dive into the world of the Internet of Things with the SparkFun Inventor's Kit for Photon.

Everything You Should Know About HyperDisplay

This is a tutorial to go in-depth about the SparkFun HyperDisplay Arduino Library.

Qwiic GPS Clock

What time is it? Time for you to... Qwiic-ly build a GPS clock and output it to a display! This project provides you with the current date and time using GPS satellites. Read the date and time as a digital or analog clock. Or even configure the clock for military, your time zone, or automatically adjust the time for daylight savings time!

Or check out this blog post for ideas.