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? - จะได้เรียนรู้อะไร

  1. Switch Widget: สร้าง toggle switch ด้วย lv_switch_create()

  2. State Management: ตรวจสอบ/เปลี่ยนสถานะด้วย lv_obj_has_state(), lv_obj_add_state(), lv_obj_clear_state()

  3. LV_EVENT_VALUE_CHANGED: ตอบสนองเมื่อ switch ถูก toggle

  4. LED Synchronization: ซิงค์สถานะ Switch กับ LED Widget

  5. Switch Styling: กำหนดสี ON/OFF และรูปแบบ knob

  6. 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

Function
Description
Return

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

Function
Description
Parameters

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

Function
Description
Return

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

Feature
Button
Switch

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

Was this helpful?