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

Popular posts from this blog

Drive 320x240 ILI9341 SPI TFT using ESP32-S3 (NodeMCU ESP-S3-12K-Kit) using TFT_eSPI library, in Arduino Framework.

480x320 TFT/ILI9488 SPI wih EP32C3 (arduino-esp32) using Arduino_GFX Library