Button

Lab 2: Button with Click Counter

1. ΰΉ‚ΰΈ„ΰΈ£ΰΈ‡ΰΈͺΰΈ£ΰΉ‰ΰΈ²ΰΈ‡ΰΈ ΰΈ²ΰΈžΰΈ£ΰΈ§ΰΈ‘ΰΈ‚ΰΈ­ΰΈ‡ Lab

Why?: ΰΈ§ΰΈ±ΰΈ•ΰΈ–ΰΈΈΰΈ›ΰΈ£ΰΈ°ΰΈͺΰΈ‡ΰΈ„ΰΉŒΰΈΰΈ²ΰΈ£ΰΉ€ΰΈ£ΰΈ΅ΰΈ’ΰΈ™ΰΈ£ΰΈΉΰΉ‰

Button ΰΉ€ΰΈ›ΰΉ‡ΰΈ™ Widget ΰΈžΰΈ·ΰΉ‰ΰΈ™ΰΈΰΈ²ΰΈ™ΰΈ—ΰΈ΅ΰΉˆΰΈͺΰΈ³ΰΈ„ΰΈ±ΰΈΰΈ—ΰΈ΅ΰΉˆΰΈͺΰΈΈΰΈ”ΰΈͺำหรับการรับ Input ΰΈˆΰΈ²ΰΈΰΈœΰΈΉΰΉ‰ΰΉƒΰΈŠΰΉ‰:

  • User Interaction: Button ΰΉ€ΰΈ›ΰΉ‡ΰΈ™ΰΈ§ΰΈ΄ΰΈ˜ΰΈ΅ΰΈ«ΰΈ₯ΰΈ±ΰΈΰΈ—ΰΈ΅ΰΉˆΰΈœΰΈΉΰΉ‰ΰΉƒΰΈŠΰΉ‰ΰΉ‚ΰΈ•ΰΉ‰ΰΈ•ΰΈ­ΰΈšΰΈΰΈ±ΰΈš GUI

  • GPIO Control: ΰΉƒΰΈŠΰΉ‰ΰΈ„ΰΈ§ΰΈšΰΈ„ΰΈΈΰΈ‘ GPIO ΰΉ€ΰΈŠΰΉˆΰΈ™ ΰΉ€ΰΈ›ΰΈ΄ΰΈ”/ΰΈ›ΰΈ΄ΰΈ” LED, Motor

  • Action Trigger: ΰΉƒΰΈŠΰΉ‰ΰΈͺΰΈ±ΰΉˆΰΈ‡ΰΉ€ΰΈ£ΰΈ΄ΰΉˆΰΈ‘/ΰΈ«ΰΈ’ΰΈΈΰΈ”ΰΈΰΈ²ΰΈ£ΰΈ—ΰΈ³ΰΈ‡ΰΈ²ΰΈ™ΰΈ•ΰΉˆΰΈ²ΰΈ‡ΰΉ†

  • Event-Driven: เรมฒนรู้แนวคิด Event-driven Programming

What?: ΰΈˆΰΈ°ΰΉ„ΰΈ”ΰΉ‰ΰΉ€ΰΈ£ΰΈ΅ΰΈ’ΰΈ™ΰΈ£ΰΈΉΰΉ‰ΰΈ­ΰΈ°ΰΉ„ΰΈ£

  1. Button Widget: ΰΈͺΰΈ£ΰΉ‰ΰΈ²ΰΈ‡ΰΈ›ΰΈΈΰΉˆΰΈ‘ΰΈΰΈ”ΰΈ”ΰΉ‰ΰΈ§ΰΈ’ lv_button_create()

  2. Event Callback: ผูก callback function กับ event

  3. Event Filtering: กรอง event ΰΈ—ΰΈ΅ΰΉˆΰΈ•ΰΉ‰ΰΈ­ΰΈ‡ΰΈΰΈ²ΰΈ£ΰΈ”ΰΉ‰ΰΈ§ΰΈ’ LV_EVENT_CLICKED

  4. Static Variable: ΰΉ€ΰΈΰΉ‡ΰΈšΰΈ„ΰΉˆΰΈ² counter ΰΈ‚ΰΉ‰ΰΈ²ΰΈ‘ function calls

  5. Child Widget: ΰΉ€ΰΈžΰΈ΄ΰΉˆΰΈ‘ Label ΰΈ₯ΰΈ‡ΰΉƒΰΈ™ Button

How? - ΰΈ—ΰΈ³ΰΈ­ΰΈ’ΰΉˆΰΈ²ΰΈ‡ΰΉ„ΰΈ£

  • ΰΈͺΰΈ£ΰΉ‰ΰΈ²ΰΈ‡ΰΈ›ΰΈΈΰΉˆΰΈ‘ΰΈ—ΰΈ΅ΰΉˆΰΈ™ΰΈ±ΰΈšΰΈˆΰΈ³ΰΈ™ΰΈ§ΰΈ™ΰΈ„ΰΈ£ΰΈ±ΰΉ‰ΰΈ‡ΰΈ—ΰΈ΅ΰΉˆΰΈΰΈ” แΰΈ₯ะแΰΈͺΰΈ”ΰΈ‡ΰΈœΰΈ₯ΰΈšΰΈ™ Label ΰΈ ΰΈ²ΰΈ’ΰΉƒΰΈ™ΰΈ›ΰΈΈΰΉˆΰΈ‘


2. ΰΈ«ΰΈ₯ักการทำงานแΰΈ₯ΰΈ° Flowchart

2.1 Event-Driven Model

2.2 Button Creation Pattern (LVGL Official)

2.3 Program Flowchart


3. ΰΈŸΰΈ±ΰΈ‡ΰΈΰΉŒΰΈŠΰΈ±ΰΈ™ΰΈͺำคัญ

3.1 Button Functions

Function
Description
Parameters

lv_button_create(parent)

ΰΈͺΰΈ£ΰΉ‰ΰΈ²ΰΈ‡ Button widget

parent: object ΰΈ«ΰΈ₯ัก

lv_obj_add_event_cb()

ΰΉ€ΰΈžΰΈ΄ΰΉˆΰΈ‘ event callback

obj, callback, event_type, user_data

lv_obj_set_style_pad_hor()

กำหนด padding แนวนอน

obj, value, selector

lv_obj_set_style_pad_ver()

กำหนด padding แนวตั้ง

obj, value, selector

3.2 Event Functions

Function
Description
Returns

lv_event_get_code(e)

ΰΈ”ΰΈΆΰΈ‡ΰΈ£ΰΈ«ΰΈ±ΰΈͺ event

lv_event_code_t

lv_event_get_target(e)

ΰΈ”ΰΈΆΰΈ‡ object ΰΈ—ΰΈ΅ΰΉˆΰΉ€ΰΈΰΈ΄ΰΈ” event

lv_obj_t *

lv_event_get_user_data(e)

ΰΈ”ΰΈΆΰΈ‡ user data ΰΈ—ΰΈ΅ΰΉˆΰΈͺΰΉˆΰΈ‡ΰΈ‘ΰΈ²

void *

3.3 Child Access Functions

Function
Description
Returns

lv_obj_get_child(obj, idx)

ΰΈ”ΰΈΆΰΈ‡ child ΰΈ•ΰΈ²ΰΈ‘ index

lv_obj_t *

lv_obj_center(obj)

ΰΈˆΰΈ±ΰΈ”ΰΉƒΰΈ«ΰΉ‰ΰΈ­ΰΈ’ΰΈΉΰΉˆΰΈΰΈΆΰΉˆΰΈ‡ΰΈΰΈ₯ΰΈ²ΰΈ‡ parent

-

3.4 Event Types ΰΈ—ΰΈ΅ΰΉˆΰΉƒΰΈŠΰΉ‰ΰΈšΰΉˆΰΈ­ΰΈ’


4. Code Example

4.1 Complete Code

4.2 Code Breakdown

Part 1: Event Callback

ΰΈ—ΰΈ³ΰΉ„ΰΈ‘ΰΈ•ΰΉ‰ΰΈ­ΰΈ‡ Filter Event?

  • Callback ΰΈ–ΰΈΉΰΈΰΉ€ΰΈ£ΰΈ΅ΰΈ’ΰΈΰΈΰΈ±ΰΈšΰΈ—ΰΈΈΰΈ event type

  • ΰΈ–ΰΉ‰ΰΈ²ΰΉ„ΰΈ‘ΰΉˆΰΈΰΈ£ΰΈ­ΰΈ‡ ΰΈ­ΰΈ²ΰΈˆΰΈ™ΰΈ±ΰΈšΰΈ‹ΰΉ‰ΰΈ³ (PRESSED, RELEASED, CLICKED)

Part 2: Static Variable

ΰΈ›ΰΈ£ΰΈ°ΰΉ€ΰΈ ΰΈ—
Lifetime
Visibility
ΰΈ„ΰΉˆΰΈ²ΰΉ€ΰΈ£ΰΈ΄ΰΉˆΰΈ‘ΰΈ•ΰΉ‰ΰΈ™

Regular local

Function call

Local

ΰΉ„ΰΈ‘ΰΉˆΰΉΰΈ™ΰΉˆΰΈ™ΰΈ­ΰΈ™

Static local

Program lifetime

Local

0

Global

Program lifetime

Global

0


5. ΰΈ­ΰΈ‡ΰΈ„ΰΉŒΰΈ„ΰΈ§ΰΈ²ΰΈ‘ΰΈ£ΰΈΉΰΉ‰ΰΉΰΈ₯ΰΈ°ΰΉ€ΰΈ—ΰΈ„ΰΈ™ΰΈ΄ΰΈ„

5.1 Event Callback Pattern

5.2 Passing User Data

5.3 Multiple Events on Same Object

5.4 Button Styling


6. ΰΉΰΈšΰΈšΰΈΰΈΆΰΈΰΈ«ΰΈ±ΰΈ”

Exercise 1: Double Counter (Easy)

ΰΈͺΰΈ£ΰΉ‰ΰΈ²ΰΈ‡ 2 ΰΈ›ΰΈΈΰΉˆΰΈ‘: "Increment" แΰΈ₯ΰΈ° "Decrement" ΰΈ—ΰΈ΅ΰΉˆΰΉ€ΰΈžΰΈ΄ΰΉˆΰΈ‘/ΰΈ₯ΰΈ”ΰΈ„ΰΉˆΰΈ² counter

Expected Output:

Hints:

  • ΰΉƒΰΈŠΰΉ‰ static int ΰΈͺำหรับ counter

  • ΰΈͺΰΈ£ΰΉ‰ΰΈ²ΰΈ‡ global label pointer ΰΈͺำหรับแΰΈͺΰΈ”ΰΈ‡ΰΈ„ΰΉˆΰΈ²

  • ΰΉƒΰΈŠΰΉ‰ user_data ΰΈͺΰΉˆΰΈ‡ direction (+1 ΰΈ«ΰΈ£ΰΈ·ΰΈ­ -1)


Exercise 2: Toggle Button (Medium)

ΰΈͺΰΈ£ΰΉ‰ΰΈ²ΰΈ‡ΰΈ›ΰΈΈΰΉˆΰΈ‘ΰΈ—ΰΈ΅ΰΉˆΰΈͺΰΈ₯ΰΈ±ΰΈšΰΈ£ΰΈ°ΰΈ«ΰΈ§ΰΉˆΰΈ²ΰΈ‡ "ON" แΰΈ₯ΰΈ° "OFF" ΰΉ€ΰΈ‘ΰΈ·ΰΉˆΰΈ­ΰΈΰΈ” ΰΈžΰΈ£ΰΉ‰ΰΈ­ΰΈ‘ΰΉ€ΰΈ›ΰΈ₯ΰΈ΅ΰΉˆΰΈ’ΰΈ™ΰΈͺΰΈ΅ΰΈ›ΰΈΈΰΉˆΰΈ‘

Expected Output:

Hints:

  • ΰΉƒΰΈŠΰΉ‰ static bool state = false;

  • lv_obj_set_style_bg_color() ΰΉ€ΰΈ›ΰΈ₯ΰΈ΅ΰΉˆΰΈ’ΰΈ™ΰΈͺΰΈ΅ΰΈ›ΰΈΈΰΉˆΰΈ‘


Exercise 3: Long Press Detection (Advanced)

ΰΈͺΰΈ£ΰΉ‰ΰΈ²ΰΈ‡ΰΈ›ΰΈΈΰΉˆΰΈ‘ΰΈ—ΰΈ΅ΰΉˆΰΉΰΈ’ΰΈΰΈΰΈ²ΰΈ£ΰΈΰΈ”ΰΈͺั้นแΰΈ₯ะกดค้าง:

  • กดΰΈͺΰΈ±ΰΉ‰ΰΈ™: แΰΈͺΰΈ”ΰΈ‡ "Short Press"

  • กดค้าง 1 ΰΈ§ΰΈ΄ΰΈ™ΰΈ²ΰΈ—ΰΈ΅: แΰΈͺΰΈ”ΰΈ‡ "Long Press"

Hints:

  • ΰΉƒΰΈŠΰΉ‰ LV_EVENT_CLICKED แΰΈ₯ΰΈ° LV_EVENT_LONG_PRESSED

  • ΰΈͺΰΈ²ΰΈ‘ΰΈ²ΰΈ£ΰΈ– register ΰΈ«ΰΈ₯ΰΈ²ΰΈ’ callback ΰΉ„ΰΈ”ΰΉ‰


7. References


Next Lab: Lab 3: LED Widget Control

Last updated

Was this helpful?