In this article we look at the Pico Display Pack which is an 18-bit capable 240×135 pixel IPS display. The pack also has four tactile buttons and an RGB LED that you can use as an indicator.
Features
1.14” 240×135 pixel IPS LCD screen
4 x tactile buttons
RGB LED
Pre-soldered female headers for attaching to Pico
Compatible with Raspberry Pi Pico.
Here is a pinout of display pack, you can see the pins that are used for the 4 buttons, the RGB LED is controlled by 3 pins and the LCD is an SPI type.
You can power this using USB or external power
Getting started
The labels on the underside of Pico Display will show you which way round to plug it into your Pico – just match up the USB port with the markings on the board.
The easiest way to get started is by downloading and copying the custom MicroPython uf2 to your Pico, it includes all the libraries you’ll need to use our add-ons.
https://github.com/pimoroni/pimoroni-pico/releases/latest/
To be able to copy this file on to your Pico, you’ll need to put it into bootloader mode. To do this, hold down the BOOTSEL button whilst plugging the USB cable into your computer – it should now show up as a drive called RPI-RP2. Here’s what it looks like in Windows:
Copy the downloaded .uf2 file across to this new drive. Your Pico will now reboot
Code examples
There are several good examples at https://github.com/pimoroni/pimoroni-pico/tree/main/micropython/examples/pico_display
Here is an example
# This example takes the temperature from the Pico's onboard temperature sensor, and displays it on Pico Display Pack, along with a little pixelly graph.
# It's based on the thermometer example in the "Getting Started with MicroPython on the Raspberry Pi Pico" book, which is a great read if you're a beginner!
import machine
import utime
import gc
# Pico Display boilerplate
import picodisplay as display
width = display.get_width()
height = display.get_height()
gc.collect()
display_buffer = bytearray(width * height * 2)
display.init(display_buffer)
# reads from Pico's temp sensor and converts it into a more manageable number
sensor_temp = machine.ADC(4)
conversion_factor = 3.3 / (65535)
temp_min = 10
temp_max = 30
bar_width = 5
# Set the display backlight to 50%
display.set_backlight(0.5)
temperatures = []
colors = [(0, 0, 255), (0, 255, 0), (255, 255, 0), (255, 0, 0)]
def temperature_to_color(temp):
temp = min(temp, temp_max)
temp = max(temp, temp_min)
f_index = float(temp - temp_min) / float(temp_max - temp_min)
f_index *= len(colors) - 1
index = int(f_index)
if index == len(colors) - 1:
return colors[index]
blend_b = f_index - index
blend_a = 1.0 - blend_b
a = colors[index]
b = colors[index + 1]
return [int((a[i] * blend_a) + (b[i] * blend_b)) for i in range(3)]
while True:
# fills the screen with black
display.set_pen(0, 0, 0)
display.clear()
# the following two lines do some maths to convert the number from the temp sensor into celsius
reading = sensor_temp.read_u16() * conversion_factor
temperature = 27 - (reading - 0.706) / 0.001721
temperatures.append(temperature)
# shifts the temperatures history to the left by one sample
if len(temperatures) > width // bar_width:
temperatures.pop(0)
i = 0
for t in temperatures:
# chooses a pen colour based on the temperature
display.set_pen(*temperature_to_color(t))
# draws the reading as a tall, thin rectangle
display.rectangle(i, height - (round(t) * 4), bar_width, height)
# the next tall thin rectangle needs to be drawn
# "bar_width" (default: 5) pixels to the right of the last one
i += bar_width
# heck lets also set the LED to match
display.set_led(*temperature_to_color(temperature))
# draws a white background for the text
display.set_pen(255, 255, 255)
display.rectangle(1, 1, 100, 25)
# writes the reading as text in the white rectangle
display.set_pen(0, 0, 0)
display.text("{:.2f}".format(temperature) + "c", 3, 3, 0, 3)
# time to update the display
display.update()
# waits for 5 seconds
utime.sleep(5)
and this example shows how to use the buttons
# This example shows you a simple, non-interrupt way of reading Pico Display's buttons with a loop that checks to see if buttons are pressed.
import picodisplay as display
import utime
# Initialise display with a bytearray display buffer
buf = bytearray(display.get_width() * display.get_height() * 2)
display.init(buf)
display.set_backlight(0.5)
# sets up a handy function we can call to clear the screen
def clear():
display.set_pen(0, 0, 0)
display.clear()
display.update()
while True:
if display.is_pressed(display.BUTTON_A): # if a button press is detected then...
clear() # clear to black
display.set_pen(255, 255, 255) # change the pen colour
display.text("Button A pressed", 10, 10, 240, 4) # display some text on the screen
display.update() # update the display
utime.sleep(1) # pause for a sec
clear() # clear to black again
elif display.is_pressed(display.BUTTON_B):
clear()
display.set_pen(0, 255, 255)
display.text("Button B pressed", 10, 10, 240, 4)
display.update()
utime.sleep(1)
clear()
elif display.is_pressed(display.BUTTON_X):
clear()
display.set_pen(255, 0, 255)
display.text("Button X pressed", 10, 10, 240, 4)
display.update()
utime.sleep(1)
clear()
elif display.is_pressed(display.BUTTON_Y):
clear()
display.set_pen(255, 255, 0)
display.text("Button Y pressed", 10, 10, 240, 4)
display.update()
utime.sleep(1)
clear()
else:
display.set_pen(255, 0, 0)
display.text("Press any button!", 10, 10, 240, 4)
display.update()
utime.sleep(0.1) # this number is how frequently the Pico checks for button presses
Products
Name | Link |
Pico | Raspberry Pi Pico Development Board A Low-Cost High-Performance Microcontroller Board RP2040 Cortex-M0+ Dual-Core ARM Processor |
Pico Display pack UK | Pico Display Pack |