Arduino I2C OLED Display Usage

Did you enjoy using the standard LCD module? Once you meet the I2C OLED module, we are sure that you will give up the LCD module! We have used a single color LCD module in a few of our articles before, we even created a menu with LCD screen, you can access it from here. Now we are going to an advanced level as technology and we use OLED display! In addition, the most important factor that distinguishes OLED and LCD screens from each other is the backlight, that is, the backlight. Lcd screens require backlighting, while OLED displays don't need this backlight.

What is OLED Technology?

OLED displays are semi-solid conductors, just like LED screens.OLED screens are made of organic materials that absorb light when electrically applied.OLEds can have 2 or 3 main organic layers, and when the third layer is found, it mediates the transport of electrons from the cathode to the light-emitting layer, that is, an anod layer.In addition, nanotechnology has a large role to play in the development of this technology.

What is I2C?

2C protocol is a very useful method in cases where the number of pins is low, 2C protocol is the most eye-catching topic of "Serial Communication Protocols", one of our previous articles. It only needs two pines to communicate, but the ability to connect multiple I2C modules to each other in parallel is preferred by many as the first option. For more information, please visit here.

Choosing the Appropriate OLED Module

You must decide entirely according to your wishes. In general, the biggest reason for the difference in fiyar between modules is the color factor, the price in size varies in very small amounts. In this article we will use a monochrome 0.96" OLED screen. Depending on the dimensions of the module we are using, you have to make changes to the code of the project, besides, you do not need to do anything external, the I2C protocol is already ready to do anything for you!

128x64 1.3" I2C
128×64 1.3" I2C
128x32 1" I2C OLED
128×32 1" I2C OLED

In addition to having a monochrome screen or a multicolored screen, some OLED models also come across dual-color models, in which a portion of the upper part of the screen is a different color compared to the lower part. The 1.3" screen at the top is the screen model we use in this project, but our screen is "monochrome", i.e. monochrome.

Deciding on the Library

It is worth choosing a library based on the programming memory of the microprocessor or Arduino you are using. In addition, some OLED modules do not work with every library, our module worked smoothly with the two libraries that we will show here. Although the code we made with the Adafruit library was 19kb, the code we prepared in the u8glib library was only 7kb.

Adafruit Library

According to the U8glib library, it has highly advanced and user-friendly content. Unlike at the time of installation, you can also add moving patterns, images, gifs, and design wonders to your project by setting up an Adafruit OLED GFX library. With easy bitmap edits, you can add symbols that don't exist, UTF codes with ease. The downside is that it takes up quite a lot of space, so if you're using the 8 or 16 series of ATmega/ATtiny microprocessors, you're going to have a little trouble because even the simplest "Hello World" project takes up almost 15kB of space. Even if you play from library and font files, there's no efficient space gain.

An image placed with bitmap mediation
An image placed through a bitmap mediation.

U8glib Library

According to the Adafruit library, it has a very complex and slightly more logical working principle. Graphics and artistic with this library! the contents are a bit difficult to produce, but plus a library that has a rich font family, as well as a library of our choice with low footprint. The place covered for a simple "Hello World" work is almost 5kB ! But this data depends on the font you choose, so when choosing a font from the font family, you need to consider the size and the place covered. In a project that has the same functions and the same functions, there is a difference of 6kB between the two libraries. Besides, changing the data on the screen is not as easy as Adafruit, since it works according to the page method. You can think of it this way:

  • Adafruit is a one-page notebook, and every transaction deletes and rewrites the notebook.
  • U8glib is a notebook of many pages and every transaction switches between pages.

Identifying I2C Address

To use the I2C communication channel, we absolutely need to know the address of the device. Fortunately, this address is quite easy to detect, and if you make the connections correctly, you can make software detection in about 10 seconds.

Software Detection

There are codes on the Internet that allow you to find the I2C address of your module using "Serial Monitor", perhaps hundreds of I2C-Scanners. We will share with you the code of our choice in all projects where we use I2C, if your connections are correct but no address can be identified or the screen remains blank, you may need to use a different I2C Scanner, but most likely; either your module is corrupted or your I2C connections are incorrect. Some MCU's lack pull-up resistance on I2C ports, so if you face such a problem, a 4.7k Ohm pull-up resistance will do the trick. We also need the Adafruit I2C Library for this scan. You can install it directly via Arduino IDE or download it here via github link.

<Adafruit_I2CDevice.h>#include
Adafruit_I2CDevice i2c_dev = Adafruit_I2CDevice(0x10);
void setup() {
  while (! Serial) { delay(10); }
  Serial.begin(115200);
  Serial.println("I2C address scan > devreyakan.com");
  if (!i2c_dev.begin()) {
    Serial.print("No connection exists at Point 0x");
    Serial.println(i2c_dev.address(), HEX);
    while (1);
  }
  Serial.print("Device found...</Adafruit_I2CDevice.h> ");
  Serial.println(i2c_dev.address(), HEX);
}
void loop() {
}

Hardware Detection

There are probably two resistors in the back of your module that allow you to select an I2C address, which means the address that is currently selected. If you solder both parts at the same time, your module will not work, and if you leave both parts empty, your module will not work as it did just now. As you can see above, you have a choice, 0x78 and 0x7A. Although the resistance here in our module depends on 0x78, the address 0x3C appeared in the search software, so we used the 0x3C address and achieved successful results.

Circuit Diagram

These links apply to Arduino Uno/ATmega328-P. Although many ATmel cards are connected the same, be sure to check your card's pin outputs before providing connections.

PinArduino Uno
Vin5V
GndGnd
SCLA5
SdaA4

In other Arduino models;

  • Nano: SDA (A4); SCL (A5);
  • MEGA: SDA (20); SCL (21);
  • Leonardo: SDA (20); SCL (21);

Project ID

We also share codes for two different libraries, plus the address for U8glib automatically comes 0x3C, we didn't need to change this value as many OLED screens have this address, but you can easily change it if you want. Also, there are a few values that you must change when using the Adafruit library, the OLED screen will not work unless you change these values.

With Adafruit Library

First of all, we set up these libraries by writing SSD1306 and GFX to the Arduino IDE; You can take the first test by selecting the sample that suits your card from the Examples tab.

Hello World App with Adafruit

<Wire.h>#include
#include <Adafruit_GFX.h>// for graphics-based projects
#include <Adafruit_SSD1306.h>// for text-based projects
#define SCREEN_WIDTH 128 // width
#define SCREEN_HEIGHT 64 // height
sda-scl pins
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
void setup() {
  Serial.begin(115200);
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // i2c
    Serial.println(F("SSD1306 connection probe");;
    for(;;);
  }
  delay(2000);
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0, 10);
  display.println("hello world!");</Adafruit_SSD1306.h> </Adafruit_GFX.h> </Wire.h>
  display.display(); 
}
void loop() {
}

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

The section that says -1 is the reset pin of the OLED screen, if you do not have a reset pin on your screen, this value should definitely be -1. If you have a reset pin, you need to connect your identification output here on the card.

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64

The height and width must be written absolutely correctly or there will be ruptures in the image.

Adafruit Customizations

Clear the Screen

display.clearDisplay();

Text Point Adjustment

display.setTextSize(1);             

Starting Place of The First Character

display.setCursor(0.10);             

Sending Data to the Screen

display.display();

If you do not use the display code after any changes, the screen will not refresh.

Changing Fonts

display.setFont();
Font List

FreeMono12pt7b.h FreeSansBoldOblique12pt7b.h
FreeMono18pt7b.h FreeSansBoldOblique18pt7b.h
FreeMono24pt7b.h FreeSansBoldOblique24pt7b.h
FreeMono9pt7b.h FreeSansBoldOblique9pt7b.h
FreeMonoBold12pt7b.h FreeSansOblique12pt7b.h
FreeMonoBold18pt7b.h FreeSansOblique18pt7b.h
FreeMonoBold24pt7b.h FreeSansOblique24pt7b.h
FreeMonoBold9pt7b.h FreeSansOblique9pt7b.h
FreeMonoBoldOblique12pt7b.h FreeSerif12pt7b.h
FreeMonoBoldOblique18pt7b.h FreeSerif18pt7b.h
FreeMonoBoldOblique24pt7b.h FreeSerif24pt7b.h
FreeMonoBoldOblique9pt7b.h FreeSerif9pt7b.h
FreeMonoOblique12pt7b.h FreeSerifBold12pt7b.h
FreeMonoOblique18pt7b.h FreeSerifBold18pt7b.h
FreeMonoOblique24pt7b.h FreeSerifBold24pt7b.h
FreeMonoOblique9pt7b.h FreeSerifBold9pt7b.h
FreeSans12pt7b.h FreeSerifBoldItalic12pt7b.h
FreeSans18pt7b.h FreeSerifBoldItalic18pt7b.h
FreeSans24pt7b.h FreeSerifBoldItalic24pt7b.h
FreeSans9pt7b.h FreeSerifBoldItalic9pt7b.h
FreeSansBold12pt7b.h FreeSerifItalic12pt7b.h
FreeSansBold18pt7b.h FreeSerifItalic18pt7b.h
FreeSansBold24pt7b.h FreeSerifItalic24pt7b.h
FreeSansBold9pt7b.h FreeSerifItalic9pt7b.h

Drawing Pixel

display.drawPixel(64, 32, WHITE);

Creates a pixel, x=64 y=32.

Drawing a Straight Line

display.drawLine(0, 0, 127, 20, WHITE);

Creates a straight line, x1=0 x2=0 y1=127 y2=20.

Draw a Rectangle

display.drawRect(10, 10, 50, 30, WHITE);

Creates a rectangle, x=10 y=10 width=10 height=10.

Drawing a Circle

display.drawCircle(64, 32, 10, WHITE);

x=64 y=32 radius=10 to form a circle.

Reversing Colors

display.invertDisplay(true);

It is used to reverse the colors of the screen.

With U8glib Library

Unlike the Adafruit library, we chose this library because it is more modular and takes up less space. The connections are exactly the same, so we can go straight to the code part. Also, if this code does not work with the OLED module, if you are sure of the links, you can find the model number that works by trying the work in the sample files of the library one by one. For example, model settings that work on our card;

U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE| U8G_I2C_OPT_DEV_0);	I2C / TWI
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_DEV_0| U8G_I2C_OPT_NO_ACK| U8G_I2C_OPT_FAST);	Fast I2C / TWI
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NO_ACK);	Display which does not send AC

Hello World Code

#include "U8glib.h"
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE| U8G_I2C_OPT_DEV_0);	I2C / TWI 
void page Is Type() {
  u8g.setFont(u8g_font_unifont);
  u8g.drawStr( 0, 22, "devreyakan.com");
}
void setup(void) {
}
void loop(void) {
  picture loop
  u8g.firstPage();
  int i = 0;
  do {
    page Is The Year();
  } while( u8g.nextPage() );
  delay(1000);
}

Multiple Page Examples

#include "U8glib.h"
#include U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE| U8G_I2C_OPT_DEV_0); 
void page1();       
void page2();   
void page3();       
void page4();    
const int pageSay = 4;
int p;
void (*pages[pageSaly])() = { page1, pageS2, page3, page4 };
int sure [pageSayisi] = { 1000, 1000, 1000, 2000 };
void setup() {  
  u8g.setFont(u8g_font_unifont);
  u8g.setColorIndex(1);
  p = 0;
  Serial.begin(9600);
}
void loop() {  
  u8g.firstPage();
  do {  
    (*pages[p]) ();
  } while( u8g.nextPage() );
  delay(sure[p]);
  p = p+1;
  if (p == pageSaly)
    p=0;
}
void page1() {
  Serial.write("page1");
  Serial.println();
  u8g.drawStr( 0, 15, "page1");
  return 0; 
}
void pageS2(){
  Serial.write("page2");
  Serial.println();
  u8g.drawStr( 0, 15, "page2"); 
  return 0;
}
void page3() {
  Serial.write("page3");
  Serial.println();
  u8g.drawStr( 0, 15, "page3"); 
  return 0;
}
void page4(){
  Serial.write("page4");
  Serial.println();
  u8g.drawStr( 0, 15, "page4");  
  return 0;
}

When using this code you need to pay attention to the loop loop, arduino's own loop loop and the loop loop of the U8glib library are different from each other, so you need to use global actions in Arduino's loop loop, otherwise you will not get an efficient program.

Possible Problems

We explained here all the problems and solutions we encountered while exploring this module;

Not Being Able to Find the I2C Address

There is probably an error in your connections, although if there is no address, you should connect pull-up resistance to the i2c channel, for example 4.7k will do the trick. If you still haven't got results, carefully examine the address selection resistance and soldering of your OLED module, sometimes non-soldered paths can lead to this problem.

Fluctuation in Image

If such a problem exists even though the links and code are correct, your development card is most likely a clone card. These problems, usually caused by voltage and current, occur on clone cards, and a 100nF capacitor parallel to the GND and VCC connections of the OLED display is likely to solve this problem. Besides, your resolution settings may be incorrect, it's worth reviewing.

Black Screen Problem

It is one of the most common problems in general. The main reason is due to the wrong I2C address or connections. The connections are then checked and retried at the I2C address, respectively. We strongly recommend finding the I2C address by software means, since there was such a problem in the module that we used, a different I2C address was printed on the card.

Parasitization

The cause of this problem is generally the same as fluctuation, if links and code are correct, but something like this happens, change the library and try again, if the problem persists, your OLED module is damaged.

Extras

In addition to the subject, extra events and functions for the purpose of extra information to you;

Changing the I2C Address

You can change the address by relocating the resistance in the I2C addresses section on the back of the OLED Module. If you connect resistance to two parts, the module will not work, and if you leave both parts blank, the module will still not work.

Changing I2C Pins (Optional)

On the Arduino Uno model, the I2C pins sound hardware stable, in short, it is near impossible to replace the original I2C pins without an additional library. Imagine doing a project that uses all analog outputs in this proj, so it is impossible to use the I2C line. At this point, the "SoftwareWire" library will come to your aid.

Connecting Two Separate I2C Modules

If you master master-slave concepts, you can connect multiple I2C modules to your card in parallel.

Converting Regular Pictures to Bitmap

You can easily project your logo, picture to OLED screen by converting it to bitmap format; First, you need to save your picture as a monochrome bitmap, before that you need to crop and cut. Let's convert the cropped image to the C array with any Image to C converter program. If you are using the LCD Image Converter Program;

  • Type: Monochrome, Threshold Dither
  • Main Scan Direction: Top to Bottom
  • Line Scan Direction: Forward

settings. From the Image tab, you need to adjust these settings;

  • Split to rows
  • Block size: 8 bits
  • Byte order: Little-Endian

After we have all the settings done, we print out the export button in the form of a .c file. The output is as follows. When we use this output with any library, we will be greeted by a screen like the one at the bottom.

static const uint8_t image_data_Saraarray[1024] = {
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x14, 0x9e, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x36, 0x3f, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x6d, 0xff, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0xfb, 0xff, 0x80, 0x1f, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x03, 0xd7, 0xff, 0x80, 0x0f, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x07, 0xef, 0xff, 0x80, 0x07, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x0f, 0xdf, 0xff, 0x90, 0x07, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x0f, 0xbf, 0xff, 0xd0, 0x07, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x1d, 0x7f, 0xff, 0xd0, 0x07, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x01, 0x1b, 0xff, 0xff, 0xc0, 0x07, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x02, 0xa7, 0xff, 0xff, 0xc0, 0x07, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x03, 0xff, 0xc0, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0xff, 0x80, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x03, 0xff, 0xff, 0xff, 0xf0, 0x0f, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x07, 0xff, 0xff, 0xff, 0xf0, 0x0f, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x0f, 0x07, 0xff, 0xf8, 0xf8, 0x03, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x0e, 0x01, 0xff, 0xc0, 0x38, 0x07, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x1c, 0x46, 0xff, 0xb1, 0x18, 0x07, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x3f, 0x97, 0xff, 0xc0, 0x7a, 0x07, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xfe, 0x03, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xfe, 0x03, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xfe, 0x01, 0x3f, 0xff, 0xff, 0xff, 0xfe, 0x01, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xfe, 0x01, 0xbf, 0xff, 0xff, 0xff, 0xfe, 0x81, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0xbf, 0xff, 0xff, 0xff, 0xfc, 0x81, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0xff, 0xff, 0xfe, 0xff, 0xfd, 0x83, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0xbf, 0xff, 0xfe, 0xff, 0xfd, 0x01, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x01, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xfb, 0x03, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x3f, 0xff, 0xdc, 0xff, 0xfa, 0x03, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xd8, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xf8, 0x03, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xd0, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xf8, 0x01, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0x90, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xf8, 0x02, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xb0, 0x00, 0x0f, 0xf5, 0xff, 0xd7, 0xf8, 0x01, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xb0, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x5f, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xa0, 0x00, 0x0f, 0xfb, 0xff, 0xff, 0xf0, 0x00, 0x3f, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x0f, 0xfd, 0xff, 0xdf, 0xf0, 0x00, 0x3f, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x07, 0xff, 0xff, 0xbf, 0xf0, 0x00, 0x0f, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x07, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x87, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x03, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x43, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0x60, 0x00, 0x01, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x73, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xfe, 0xe0, 0x00, 0x00, 0xff, 0xff, 0xff, 0x80, 0x00, 0x7b, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xfd, 0xe0, 0x00, 0x00, 0x7f, 0xff, 0xfe, 0x00, 0x00, 0x33, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xfd, 0xe0, 0x00, 0x00, 0x3f, 0xff, 0xf8, 0x00, 0x00, 0x27, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x0f, 0xff, 0xf0, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0x60, 0x00, 0x00, 0x67, 0xff, 0xe0, 0x00, 0x00, 0x1b, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xfd, 0x40, 0x00, 0x00, 0xf3, 0xff, 0xc4, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xfe, 0x80, 0x00, 0x00, 0xfc, 0xff, 0x8c, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x7f, 0x3c, 0x3c, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x3f, 0xc0, 0x7c, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xfc, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff
};

As a result;