
Interface 0.96″ OLED Display with Raspberry Pi Pico
Table of Contents
Introduction
In this tutorial we will learn how to Interface 0.96″ OLED Display with Raspberry Pi Pico Board, The OLED display is the one of the most popular and Attractive Display available for a microcontrollers.
The organic light-emitting diode (OLED) display that we’ll use in this tutorial is the SSD1306 model Display With Raspberry Pi Pico 0.96-inch display with 128×64 pixels.
Required Components
- Raspberry Pi PIco —>https://amzn.to/3LCIoWq
- OLED Display —>https://amzn.to/3LN8ohS
- Jumper wire —>https://amzn.to/3LN8ohS
SSD1306 Module
Basically the SSD1306 does communicate with the microcontroller to get the data and send it to the OLED screen to draw that data, Communication between the SSD1306 and the microcontroller, be it an Raspberry Pi Pico or an Arduino, is done via SPI or I2C .
- Generally, SPI communication is faster than I2C communication .
- In contrast, SPI communication requires more pins than I2C communication .
OLED screens have the advantage of having a very low consumption , around 20mA, since only the necessary pixel is lit and they do not require a backlight. This is especially interesting in battery-powered applications.
SSD1306 Pinout
- GND : ground pin.
- VCC : is the power pin. The screen can be powered between 1.8V and 6V.
- SCL : is the clock signal pin of the I2C interface.
- SDA : It is the data signal pin of the I2C interface.
OLED Display with Raspberry Pi Pico Schematics
wiring is very simple. You just need to connect to the Raspberry Pi pico I2C pins as shown in the Below
OLED Pin | Wiring to Raspberry Pi pico |
Vin | 3.3V |
GND | GND |
SCL | GP9 |
SDA | GP8 |
Source Code and Libraries
To control the OLED display with Micropython code you need the OLED libraries. Follow the next instructions to install those libraries.
The programming here is divided into two main parts:
1. SSD1306.py // this is SSD1306 Driver Code
2. Main.py // this is main code
SSD1306.py
Firstly you need to create a new file in Thonny IDE. Copy the following code & save the file by the name ssd1306.py in Raspberry Pi Pico Board.
from micropython import const import framebuf # register definitions SET_CONTRAST = const(0x81) SET_ENTIRE_ON = const(0xA4) SET_NORM_INV = const(0xA6) SET_DISP = const(0xAE) SET_MEM_ADDR = const(0x20) SET_COL_ADDR = const(0x21) SET_PAGE_ADDR = const(0x22) SET_DISP_START_LINE = const(0x40) SET_SEG_REMAP = const(0xA0) SET_MUX_RATIO = const(0xA8) SET_COM_OUT_DIR = const(0xC0) SET_DISP_OFFSET = const(0xD3) SET_COM_PIN_CFG = const(0xDA) SET_DISP_CLK_DIV = const(0xD5) SET_PRECHARGE = const(0xD9) SET_VCOM_DESEL = const(0xDB) SET_CHARGE_PUMP = const(0x8D) # Subclassing FrameBuffer provides support for graphics primitives # http://docs.micropython.org/en/latest/pyboard/library/framebuf.html class SSD1306(framebuf.FrameBuffer): def __init__(self, width, height, external_vcc): self.width = width self.height = height self.external_vcc = external_vcc self.pages = self.height // 8 self.buffer = bytearray(self.pages * self.width) super().__init__(self.buffer, self.width, self.height, framebuf.MONO_VLSB) self.init_display() def init_display(self): for cmd in ( SET_DISP | 0x00, # off # address setting SET_MEM_ADDR, 0x00, # horizontal # resolution and layout SET_DISP_START_LINE | 0x00, SET_SEG_REMAP | 0x01, # column addr 127 mapped to SEG0 SET_MUX_RATIO, self.height - 1, SET_COM_OUT_DIR | 0x08, # scan from COM[N] to COM0 SET_DISP_OFFSET, 0x00, SET_COM_PIN_CFG, 0x02 if self.width > 2 * self.height else 0x12, # timing and driving scheme SET_DISP_CLK_DIV, 0x80, SET_PRECHARGE, 0x22 if self.external_vcc else 0xF1, SET_VCOM_DESEL, 0x30, # 0.83*Vcc # display SET_CONTRAST, 0xFF, # maximum SET_ENTIRE_ON, # output follows RAM contents SET_NORM_INV, # not inverted # charge pump SET_CHARGE_PUMP, 0x10 if self.external_vcc else 0x14, SET_DISP | 0x01, ): # on self.write_cmd(cmd) self.fill(0) self.show() def poweroff(self): self.write_cmd(SET_DISP | 0x00) def poweron(self): self.write_cmd(SET_DISP | 0x01) def contrast(self, contrast): self.write_cmd(SET_CONTRAST) self.write_cmd(contrast) def invert(self, invert): self.write_cmd(SET_NORM_INV | (invert & 1)) def show(self): x0 = 0 x1 = self.width - 1 if self.width == 64: # displays with width of 64 pixels are shifted by 32 x0 += 32 x1 += 32 self.write_cmd(SET_COL_ADDR) self.write_cmd(x0) self.write_cmd(x1) self.write_cmd(SET_PAGE_ADDR) self.write_cmd(0) self.write_cmd(self.pages - 1) self.write_data(self.buffer) class SSD1306_I2C(SSD1306): def __init__(self, width, height, i2c, addr=0x3C, external_vcc=False): self.i2c = i2c self.addr = addr self.temp = bytearray(2) self.write_list = [b"\x40", None] # Co=0, D/C#=1 super().__init__(width, height, external_vcc) def write_cmd(self, cmd): self.temp[0] = 0x80 # Co=1, D/C#=0 self.temp[1] = cmd self.i2c.writeto(self.addr, self.temp) def write_data(self, buf): self.write_list[1] = buf self.i2c.writevto(self.addr, self.write_list) class SSD1306_SPI(SSD1306): def __init__(self, width, height, spi, dc, res, cs, external_vcc=False): self.rate = 10 * 1024 * 1024 dc.init(dc.OUT, value=0) res.init(res.OUT, value=0) cs.init(cs.OUT, value=1) self.spi = spi self.dc = dc self.res = res self.cs = cs import time self.res(1) time.sleep_ms(1) self.res(0) time.sleep_ms(10) self.res(1) super().__init__(width, height, external_vcc) def write_cmd(self, cmd): self.spi.init(baudrate=self.rate, polarity=0, phase=0) self.cs(1) self.dc(0) self.cs(0) self.spi.write(bytearray([cmd])) self.cs(1) def write_data(self, buf): self.spi.init(baudrate=self.rate, polarity=0, phase=0) self.cs(1) self.dc(1) self.cs(0) self.spi.write(buf) self.cs(1)
main.py
Open a new tab again in the Thonny IDE. Copy the following below code and paste it on the Thonny IDE new tab. Save the file by the name main.py in Raspberry Pi Pico.
import machine import ssd1306 import time oled = ssd1306.SSD1306_I2C(128, 64, machine.I2C(0)) oled.text("Hello everyone", 0, 0) oled.show() time.sleep(2) oled.text("Welcome to my", 0, 10) oled.text("channel", 0, 20) oled.show() time.sleep(2) oled.text("Thank You", 0, 30) oled.show()
Conclusion
After Upload code You will see that the OLED Start Texting on Display.
You may also like to read: