Toggle Switch
Lab 4: Switch Toggle Control
Week 3 Part I - LVGL Basics
1. โครงสร้างภาพรวมของ Lab
Why? - ทำไมต้องเรียนรู้เรื่องนี้
Switch Widget เป็นตัวควบคุมสถานะ Binary (ON/OFF) ที่ใช้กันมากที่สุดในระบบ Embedded:
Industrial Control: ควบคุมเครื่องจักรในโรงงาน เปิด/ปิด Motor, Valve, Heater
Smart Home: สวิตช์ไฟ พัดลม เครื่องปรับอากาศผ่าน Touch Panel
IoT Gateway: เปิด/ปิด Module ต่าง ๆ เช่น WiFi, Bluetooth, Sensor
GPIO Mapping: Switch Widget บน UI สะท้องสถานะ GPIO pin จริง (HIGH/LOW)
ในงาน HMI (Human-Machine Interface) จริง ๆ switch เป็น widget ที่ operator ใช้บ่อยที่สุด เพราะมองเห็นสถานะชัดเจนทั้งจากรูปร่างและสี ไม่ต้องเดาว่าเปิดหรือปิดอยู่
What? - จะได้เรียนรู้อะไร
Switch Widget: สร้าง toggle switch ด้วย
lv_switch_create()State Management: ตรวจสอบ/เปลี่ยนสถานะด้วย
lv_obj_has_state(),lv_obj_add_state(),lv_obj_clear_state()LV_EVENT_VALUE_CHANGED: ตอบสนองเมื่อ switch ถูก toggle
LED Synchronization: ซิงค์สถานะ Switch กับ LED Widget
Switch Styling: กำหนดสี ON/OFF และรูปแบบ knob
Programmatic Control: ควบคุม switch จาก code (ไม่ใช่จาก touch)
How? - ทำอย่างไร
สร้าง Switch ที่ควบคุม Virtual LED พร้อมแสดงสถานะ GPIO (HIGH/LOW) จากนั้นฝึกสร้าง Device Power Panel สำหรับควบคุมอุปกรณ์หลายตัวพร้อมกัน

2. หลักการทำงานและ Flowchart
2.1 Switch Widget Architecture
2.2 State Checking Pattern
2.3 GPIO Simulation Concept
2.4 Program Flowchart
3. ฟังก์ชันสำคัญ (API Reference)
3.1 Switch Creation & Control
lv_switch_create(parent)
สร้าง Switch widget
lv_obj_t *
lv_obj_add_state(sw, LV_STATE_CHECKED)
ตั้งค่าสถานะ ON
void
lv_obj_clear_state(sw, LV_STATE_CHECKED)
ตั้งค่าสถานะ OFF
void
lv_obj_has_state(sw, LV_STATE_CHECKED)
ตรวจว่า ON หรือ OFF
bool
lv_obj_add_state(sw, LV_STATE_DISABLED)
Disable switch (กดไม่ได้)
void
3.2 LED Widget Functions
lv_led_create(parent)
สร้าง LED widget
parent object
lv_led_on(led)
เปิด LED (สว่างเต็ม)
led object
lv_led_off(led)
ปิด LED (หรี่สุด)
led object
lv_led_set_color(led, color)
ตั้งสี LED
led, lv_color_t
lv_led_set_brightness(led, bright)
ตั้งความสว่าง 0-255
led, uint8_t
3.3 Event Handling
lv_obj_add_event_cb(obj, cb, event, user_data)
ลงทะเบียน callback
void
lv_event_get_target(e)
ได้ object ที่ trigger event
lv_obj_t *
lv_event_get_user_data(e)
ได้ user_data ที่ส่งมา
void *
3.4 Switch vs Button Comparison
Action
Click (momentary)
Toggle (latching)
State
Pressed/Released
ON/OFF
Event
LV_EVENT_CLICKED
LV_EVENT_VALUE_CHANGED
Use Case
Action trigger
Setting toggle
Visual
Text label
Sliding knob
4. โค้ดตัวอย่าง (Code Examples)
4.1 Complete Code - part1_ex4_switch_toggle()
จากไฟล์ part1_examples.c:
4.2 Code Breakdown
Part A: Switch Event Callback
Part B: Switch Creation
5. องค์ความรู้และเทคนิค
5.1 Switch Styling - กำหนดสี ON/OFF
5.2 Programmatic State Control
5.3 Disable/Enable Switch
5.4 User Data Pattern (สำหรับหลาย Switch)
6. แบบฝึกหัด (Exercises)
Exercise 1: Device Power Panel (Intermediate)
สร้าง Smart Home Power Panel ที่มี 4 switches ควบคุมอุปกรณ์ พร้อม LED indicator แต่ละตัว
Requirements:
4 อุปกรณ์: Fan, Light, AC, Heater
แต่ละตัวมี Switch + LED + Label แสดงชื่อและสถานะ
LED เปลี่ยนสีตามอุปกรณ์ (Fan=Blue, Light=Yellow, AC=Cyan, Heater=Red)
แสดงจำนวนอุปกรณ์ที่เปิดอยู่ "Active: 2/4"
Expected Output:
Hints:
ใช้ struct array เก็บข้อมูลแต่ละอุปกรณ์
ส่ง pointer ไป callback ด้วย user_data
สร้าง function
update_active_count()แยก
Exercise 2: Master Switch with Child Switches (Advanced)
สร้าง Master Switch ที่ควบคุม switches ลูกทั้งหมด:
Master ON --> ลูกทุกตัว ON
Master OFF --> ลูกทุกตัว OFF
ลูกแต่ละตัวยังสามารถ toggle เองได้
แสดงสถานะ "All ON", "All OFF", หรือ "Partial (2/4)"
Expected Output:
Hints:
Master switch callback ใช้ loop set state ให้ switches ลูกทั้งหมด
เรียก
lv_obj_invalidate()หลังเปลี่ยน state จาก codeอัพเดท master label เมื่อ child switch เปลี่ยน
7. References
Previous Lab: Lab 3: LED Widget Control Next Lab: Lab 5: GPIO Dashboard
Last updated