ESP32-H2-DevKitM-1-N4/CircuitPython display on 1.9" IPS LCD Module, 170x320 ST7789 SPI.
ESP32-H2-DevKitM-1-N4/CircuitPython display on 1.9" IPS LCD Module, 170x320 ST7789 SPI.
Exercise Code:
cpyH2_ST7789.py, color test.
"""
ESP32-H2-DevKitM-1-N4/CircuitPython
display on 1.9" IPS LCD Module, 170x320 ST7789 SPI.
~ Color test.
https://coxxect.blogspot.com/2025/11/esp32-h2-devkitm-1-n4circuitpython_21.html
Connection:
LCD ESP32-H2-DevKitM-1-N4
-----------------------------
GND G
VCC 3V3
SCL GPIO5
SDA GPIO4
RES GPIO3
DC GPIO2
CS GPIO1
BLK GPIO0
Libraries need:
adafruit_st7789.mpy
adafruit_display_text folder
"""
import os, sys
import time
import board
import displayio
import busio
import fourwire
import adafruit_st7789
from adafruit_display_text import label
import terminalio
spi_sclk = board.IO5
spi_mosi = board.IO4
lcd_rst = board.IO3
lcd_dc = board.IO2
lcd_cs = board.IO1
lcd_bl = board.IO0
# 1.9" IPS LCD Module, 170x320 ST7789 SPI.
DISPLAY_width = 320
DISPLAY_height = 170
DISPLAY_ROT = 90
DISPLAY_COLSTART =35
DISPLAY_ROWSTART=0
sys_info_text = sys.implementation[0] + " " + os.uname()[3] +\
"\nrun on " + os.uname()[4]
print("=========================================")
print(sys_info_text)
print("=========================================")
# === init LCD ===
# Release any resources currently in use for the displays
displayio.release_displays()
spi = busio.SPI(clock=spi_sclk, MOSI=spi_mosi)
display_bus = fourwire.FourWire(spi_bus=spi,
command=lcd_dc,
chip_select=lcd_cs,
reset=lcd_rst)
display = adafruit_st7789.ST7789(display_bus,
width=DISPLAY_width,
height=DISPLAY_height,
backlight_pin=lcd_bl,
rotation=DISPLAY_ROT,
colstart=DISPLAY_COLSTART, rowstart=DISPLAY_ROWSTART)
# Make the display context
bgGroup = displayio.Group()
display.root_group = bgGroup
bg_bitmap = displayio.Bitmap(display.width, display.height, 1) # with one color
bg_palette = displayio.Palette(1)
bg_palette[0] = 0xA0A0A0 # light-gray
bg_sprite = displayio.TileGrid(bg_bitmap, pixel_shader=bg_palette, x=0, y=0)
bgGroup.append(bg_sprite)
color_bitmap = displayio.Bitmap(display.width-2, display.height-2, 1) # with one color
color_palette = displayio.Palette(1)
color_palette[0] = 0x000000 # BLACK
color_sprite = displayio.TileGrid(color_bitmap, pixel_shader=color_palette, x=1, y=1)
bgGroup.append(color_sprite)
color_text_group = displayio.Group(scale=3, x=20, y=120)
color_text_area = label.Label(terminalio.FONT, text="", color=0xFFFFFF)
color_text_group.append(color_text_area)
bgGroup.append(color_text_group)
colorSet = ((0xFF0000, "RED"),
(0x00FF00, "GREEN"),
(0x0000FF, "BLUE"),
(0xFFFFFF, "WHITE"),
(0x000000, "BLACK"))
# Color Test
time.sleep(0.5)
for i in colorSet:
time.sleep(2)
color_palette[0] = i[0]
color_text_area.text = i[1]
color_text_area.color = i[0] ^ 0xFFFFFF
time.sleep(2)
bgGroup.remove(color_text_group)
# scrolling text
# ref:
# https://learn.adafruit.com/rgb-led-matrices-matrix-panels-with-circuitpython/example-simple-two-line-text-scroller
def scroll(line):
line.x = line.x - 1
line_width = line.bounding_box[2]
if line.x < -line_width:
line.x = display.width
def reverse_scroll(line):
line.x = line.x + 1
line_width = line.bounding_box[2]
if line.x >= display.width:
line.x = -line_width
# Scrolling text
sys_info_group = displayio.Group(scale=2, x=0, y=20)
sys_info_area = label.Label(terminalio.FONT, text=sys_info_text, color=0xFFFFFF)
sys_info_group.append(sys_info_area)
bgGroup.append(sys_info_group)
info1_text = "coXXect.blogspot.com"
info1_scale = 3
info1_area = label.Label(terminalio.FONT, text=info1_text, color=0xFFFF00)
# Measure text width
text_width = info1_area.bounding_box[2] # bounding_box = (x, y, width, height)
# Assume display is your display object
center_x = (display.width - text_width * info1_scale) // 2 # scale factor = 3
# Create group with centered x
info1_group = displayio.Group(scale=info1_scale, x=center_x, y=220)
info1_group.append(info1_area)
bgGroup.append(info1_group)
while True:
scroll(sys_info_area)
display.refresh(minimum_frames_per_second=0)
cpyH2_ST7789_gray.py, Visual Illusion.
"""
ESP32-H2-DevKitM-1-N4/CircuitPython
display on 1.9" IPS LCD Module, 170x320 ST7789 SPI.
~ Visual Illusion: All circle in the same gray-level.
https://coxxect.blogspot.com/2025/11/esp32-h2-devkitm-1-n4circuitpython_21.html
Connection:
LCD ESP32-H2-DevKitM-1-N4
-----------------------------
GND G
VCC 3V3
SCL GPIO5
SDA GPIO4
RES GPIO3
DC GPIO2
CS GPIO1
BLK GPIO0
Libraries need:
adafruit_st7789.mpy
adafruit_display_text folder
adafruit_display_shapes folder
"""
import os, sys
import time
import board
import displayio
import busio
import fourwire
import adafruit_st7789
from adafruit_display_text import label
from adafruit_display_shapes.circle import Circle
import terminalio
spi_sclk = board.IO5
spi_mosi = board.IO4
lcd_rst = board.IO3
lcd_dc = board.IO2
lcd_cs = board.IO1
lcd_bl = board.IO0
# 1.9" IPS LCD Module, 170x320 ST7789 SPI.
DISPLAY_width = 320
DISPLAY_height = 170
DISPLAY_ROT = 90
DISPLAY_COLSTART =35
DISPLAY_ROWSTART=0
sys_info_text = sys.implementation[0] + " " + os.uname()[3] +\
"\nrun on " + os.uname()[4]
print("=========================================")
print(sys_info_text)
print("=========================================")
def map_value(a, in_min, in_max, out_min, out_max):
return (a - in_min) * (out_max - out_min) // (in_max - in_min) + out_min
# === init LCD ===
# Release any resources currently in use for the displays
displayio.release_displays()
spi = busio.SPI(clock=spi_sclk, MOSI=spi_mosi)
display_bus = fourwire.FourWire(spi_bus=spi,
command=lcd_dc,
chip_select=lcd_cs,
reset=lcd_rst)
display = adafruit_st7789.ST7789(display_bus,
width=DISPLAY_width,
height=DISPLAY_height,
backlight_pin=lcd_bl,
rotation=DISPLAY_ROT,
colstart=DISPLAY_COLSTART, rowstart=DISPLAY_ROWSTART)
# Make the display context
bgGroup = displayio.Group()
display.root_group = bgGroup
bg_bitmap = displayio.Bitmap(display.width, display.height, 1) # with one color
bg_palette = displayio.Palette(1)
bg_palette[0] = 0xA0A0A0 # light-gray
bg_sprite = displayio.TileGrid(bg_bitmap, pixel_shader=bg_palette, x=0, y=0)
bgGroup.append(bg_sprite)
black_bitmap = displayio.Bitmap(display.width-2, display.height-2, 1) # with one color
black_palette = displayio.Palette(1)
black_palette[0] = 0x000000 # BLACK
black_sprite = displayio.TileGrid(black_bitmap, pixel_shader=black_palette, x=1, y=1)
bgGroup.append(black_sprite)
msg = "ESP32-H2-DevKitM-1-N4\n" +\
"CircuitPython 10.0.3\n" +\
"1.9\" IPS LCD Module\n" +\
"170x320 ST7789 SPI"
msg_group = displayio.Group(scale=2, x=10, y=20)
msg_area = label.Label(terminalio.FONT, text=msg, color=0xFFFFFF)
msg_group.append(msg_area)
bgGroup.append(msg_group)
time.sleep(5)
# Remove all child TileGrid from bgGroup
while len(bgGroup) > 0:
print(len(bgGroup), ":", bgGroup.pop())
# ========================================
# Display Gray screen
bg_bitmap = displayio.Bitmap(display.width, display.height, 256) # with 256 color
bg_palette = displayio.Palette(256)
for i in range(256):
bg_palette[i] = i + i*0x100 + i* 0x10000
bg_sprite = displayio.TileGrid(bg_bitmap, pixel_shader=bg_palette, x=0, y=0)
bgGroup.append(bg_sprite)
all_circle_the_same_gray = 0x808080
num_of_circle = 5
circle_r = 10
x_space = display.width//num_of_circle
y_space = display.height//num_of_circle
for cx in range(num_of_circle):
for cy in range(num_of_circle):
bgGroup.append(Circle(cx*x_space + x_space//2,
cy*y_space + y_space//2,
circle_r,
fill=all_circle_the_same_gray))
msg = "All circle in \nsame gray level"
msg_group = displayio.Group(scale=2, x=0, y=10)
msg_area = label.Label(terminalio.FONT, text=msg, color=0xFFFFFF)
msg_group.append(msg_area)
bgGroup.append(msg_group)
for x in range(display.width):
for y in range(display.height):
bg_bitmap[x,y] = map_value(y, 0, display.height-1, 0, 255)
while True:
time.sleep(1)
for x in range(display.width):
x_gray = map_value(x, 0, display.width-1, 0, 255)
for y in range(display.height):
bg_bitmap[x,y] = x_gray
time.sleep(1)
for x in range(display.width):
x_gray = map_value(x, 0, display.width-1, 255, 0)
for y in range(display.height):
bg_bitmap[x,y] = x_gray
Comments
Post a Comment