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?