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

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