CircuitPython key detection
Base on the previous exercise of "ESP32-H2-DevKitM-1-N4/CircuitPython display on 1.9" IPS LCD Module, 170x320
ST7789 SPI", implement key detection using digitalio + debounce
and keypad.
cpyH2_ST7789_BUTTON.py, key detection using digitalio + debounce.
"""
ESP32-H2-DevKitM-1-N4/CircuitPython
display on 1.9" IPS LCD Module, 170x320 ST7789 SPI.
~ BUTTON detection: digitalio + debounce.
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
import terminalio
import digitalio
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 BUTTON ===
print("board.BUTTON:", board.BUTTON)
button = digitalio.DigitalInOut(board.BUTTON)
button.direction = digitalio.Direction.INPUT
button.pull = digitalio.Pull.UP
DEBOUNCE_TIME = 0.05 # 50ms
button_last_state = button.value
button_last_time = time.monotonic()
button_count = 0
# === init LCD ===
# Release any resources currently in use for the displays
displayio.release_displays()
spi = busio.SPI(clock=spi_sclk, MOSI=spi_mosi)
# Change spi speed
spi.try_lock()
baud_before = spi.frequency
print("spi.frequency (before configure):", baud_before)
spi.configure(baudrate=20000000)
baud_after = spi.frequency
print("spi.frequency (after configure): ", baud_after)
spi.unlock()
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" +\
"ST7789 SPI IPS LCD\n" +\
"- BUTTON detection -\n" +\
"digitalio + debounce"
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(3)
msg_area.text = ""
btn_msg = str(button_count)
btn_msg_group = displayio.Group(scale=8, x=10, y=100)
btn_msg_area = label.Label(terminalio.FONT, text=btn_msg, color=0x0000FF)
btn_msg_group.append(btn_msg_area)
bgGroup.append(btn_msg_group)
while True:
# BUTTON handle
current_state = button.value
now = time.monotonic()
if current_state != button_last_state:
if (now - button_last_time) > DEBOUNCE_TIME:
button_last_state = current_state
if not current_state:
print("Button pressed")
msg_area.text = "Button pressed"
button_count = button_count+1
btn_msg_area.text = str(button_count)
else:
print("Button released")
msg_area.text = "Button released"
button_last_time = now
time.sleep(0.01)
cpyH2_ST7789_keypad.py, key detection using keypad.
"""
ESP32-H2-DevKitM-1-N4/CircuitPython
display on 1.9" IPS LCD Module, 170x320 ST7789 SPI.
~ BUTTON detection: keypad.
CircuitPython keypad doc:
https://docs.circuitpython.org/en/latest/shared-bindings/keypad/
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
import keypad
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 keypad ===
print("board.BUTTON:", board.BUTTON)
keys = keypad.Keys((board.BUTTON,), value_when_pressed=False, pull=True)
button_count = 0
# === init LCD ===
# Release any resources currently in use for the displays
displayio.release_displays()
spi = busio.SPI(clock=spi_sclk, MOSI=spi_mosi)
# Change spi speed
spi.try_lock()
baud_before = spi.frequency
print("spi.frequency (before configure):", baud_before)
spi.configure(baudrate=20000000)
baud_after = spi.frequency
print("spi.frequency (after configure): ", baud_after)
spi.unlock()
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" +\
"ST7789 SPI IPS LCD\n" +\
"- BUTTON detection -\n" +\
"keypad"
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(3)
msg_area.text = ""
btn_msg = str(button_count)
btn_msg_group = displayio.Group(scale=8, x=10, y=100)
btn_msg_area = label.Label(terminalio.FONT, text=btn_msg, color=0xFF0000)
btn_msg_group.append(btn_msg_area)
bgGroup.append(btn_msg_group)
while True:
# keypad handle
key_event = keys.events.get()
if key_event:
if key_event.pressed:
print("Button pressed")
msg_area.text = "Button pressed"
button_count = button_count+1
btn_msg_area.text = str(button_count)
elif key_event.released:
print("Button released")
msg_area.text = "Button released"
Comments
Post a Comment