LED

Lab 3: LED Widget Control

1. โครงสร้างภาพรวมของ Lab

Why? - ทำไมต้องเรียนรู้เรื่องนี้

LED Widget เป็นเครื่องมือสำคัญสำหรับแสดงสถานะ:

  • Visual Feedback: แสดงสถานะ ON/OFF อย่างชัดเจน

  • Status Indicator: ใช้แสดงสถานะ GPIO, Connection, Error

  • Brightness Control: สามารถควบคุมความสว่างได้ (0-255)

  • Multiple Colors: รองรับสีต่างๆ ตาม Palette

What? - จะได้เรียนรู้อะไร

  1. LED Widget: สร้างและควบคุม LED ด้วย LVGL

  2. ON/OFF Control: ใช้ lv_led_on() และ lv_led_off()

  3. Brightness: ปรับความสว่างด้วย lv_led_set_brightness()

  4. Slider Widget: ควบคุมค่าต่อเนื่องด้วย Slider

  5. Multiple Callbacks: ผูกหลาย callback กับหลาย widget

ฟังก์ชัน
หน้าที่

lv_led_create()

สร้าง Virtual LED widget

lv_led_on() / lv_led_off()

เปิด/ปิด LED

lv_led_set_brightness()

ปรับความสว่าง (0-255)

lv_led_set_color()

เปลี่ยนสี LED

lv_slider_create()

สร้าง Slider widget

lv_slider_set_range()

กำหนดค่า min-max

lv_slider_get_value()

อ่านค่าปัจจุบัน

LV_EVENT_VALUE_CHANGED

Event เมื่อค่า Slider เปลี่ยน

How? - ทำอย่างไร

  • สร้าง Virtual LED ที่ควบคุมได้ด้วยปุ่ม ON/OFF และ Slider ปรับความสว่าง


2. หลักการทำงานและ Flowchart

2.1 LED Widget Architecture

2.2 Slider Widget Architecture

2.3 Program Flowchart


3. ฟังก์ชันสำคัญ (API Reference)

3.1 LED Widget Functions

ฟังก์ชัน
พารามิเตอร์
คำอธิบาย

lv_led_create(parent)

parent object

สร้าง LED widget

lv_led_on(led)

led object

เปิด LED (brightness = 255)

lv_led_off(led)

led object

ปิด LED (brightness = 0)

lv_led_toggle(led)

led object

สลับ ON/OFF

lv_led_set_brightness(led, bright)

led, 0-255

กำหนดความสว่าง

lv_led_get_brightness(led)

led object

อ่านค่าความสว่าง

lv_led_set_color(led, color)

led, lv_color_t

เปลี่ยนสี LED

3.2 Slider Widget Functions

ฟังก์ชัน
พารามิเตอร์
คำอธิบาย

lv_slider_create(parent)

parent object

สร้าง Slider widget

lv_slider_set_range(slider, min, max)

slider, min, max

กำหนดช่วงค่า

lv_slider_set_value(slider, value, anim)

slider, value, LV_ANIM_ON/OFF

กำหนดค่าปัจจุบัน

lv_slider_get_value(slider)

slider object

อ่านค่าปัจจุบัน

lv_obj_set_width(slider, w)

slider, width_px

กำหนดความกว้าง

3.3 Style Functions ที่เกี่ยวข้อง

ฟังก์ชัน
คำอธิบาย

lv_obj_set_size(led, w, h)

กำหนดขนาด LED (ปกติสี่เหลี่ยมจัตุรัส เช่น 80x80)

lv_obj_set_style_bg_color(btn, color, 0)

เปลี่ยนสีปุ่ม ON/OFF

lv_obj_set_style_pad_hor(btn, px, 0)

padding ซ้าย-ขวาของปุ่ม

lv_obj_set_style_pad_ver(btn, px, 0)

padding บน-ล่างของปุ่ม

3.4 Slider Parts (สำหรับ Style ขั้นสูง)

Part
คำอธิบาย

LV_PART_MAIN

พื้นหลัง track ของ Slider

LV_PART_INDICATOR

ส่วนที่เติมสี (จาก min ถึง current value)

LV_PART_KNOB

ปุ่มกลมที่ผู้ใช้ลาก


4. โค้ดตัวอย่าง (Code Examples)

4.1 โค้ดอ้างอิง: part1_ex3_led_control()

จากไฟล์ part1_examples.c:

วิเคราะห์โครงสร้าง:

องค์ประกอบ
ตำแหน่ง
หน้าที่

Title

TOP_MID, y=20

ชื่อ Example

LED (80x80)

CENTER, y=-70

แสดงสถานะ Virtual LED

Brightness Label

CENTER, y=0

แสดงค่า Brightness 0-255

ON/OFF Buttons

CENTER, y=50, x=-60/+60

เปิด/ปิด LED

Slider (w=200)

CENTER, y=110

ปรับ brightness ต่อเนื่อง

Slider Label

ด้านล่าง Slider

แสดง % (0-100%)

4.2 LED สีต่างๆ

4.3 Slider กับ Custom Range

4.4 Slider Style Customization


5. องค์ความรู้และเทคนิค (Patterns & Tips)

5.1 Multiple Callbacks ควบคุม Widget เดียวกัน

5.2 ข้อผิดพลาดที่พบบ่อย

ข้อผิดพลาด
สาเหตุ
วิธีแก้

LED ไม่เปลี่ยนสี

ตั้งสีหลัง lv_led_on()

ตั้งสีก่อน set_brightness

Slider ไม่ตอบสนอง

ลืม add_event_cb

ตรวจสอบ LV_EVENT_VALUE_CHANGED

Label ไม่อัปเดต

ใช้ local variable แทน static/global

ใช้ static lv_obj_t *

Virtual LED สับสนกับ Hardware LED

ไม่ได้อธิบายในโค้ด

comment ชัดเจนว่าเป็น virtual

Slider range ไม่ตรง

ลืม lv_slider_set_range()

default คือ 0-100, LED ต้อง 0-255

Percentage คำนวณผิด

ใช้ integer division

(value * 100) / 255 ไม่ใช่ value / 255 * 100

5.3 Virtual LED vs. Hardware LED

5.4 Brightness to Percentage Conversion

5.5 Timer Pattern (สำหรับ animation)


6. แบบฝึกหัด (Exercises)

Exercise 1: RGB LED Mixer - 15-20 นาที

โจทย์: สร้าง RGB Color Mixer ที่มี Slider 3 ตัว (R, G, B) ควบคุมสีของ LED Widget 1 ตัว

ข้อกำหนด:

  1. Background สี 0x0f0f23

  2. Title "RGB LED Mixer" (font_24, สีขาว, TOP_MID)

  3. LED Widget ขนาด 100x100 ตรงกลางด้านบน (CENTER, y=-60)

  4. สร้าง Slider 3 ตัว:

    • Red Slider: range 0-255, ค่าเริ่มต้น 255

    • Green Slider: range 0-255, ค่าเริ่มต้น 0

    • Blue Slider: range 0-255, ค่าเริ่มต้น 0

  5. แต่ละ Slider มี Label ชื่อสี (R/G/B) ทางซ้าย และ Label ค่า (0-255) ทางขวา

  6. เมื่อ Slider เปลี่ยน ให้อัปเดตสี LED ด้วย lv_led_set_color(led, lv_color_make(r, g, b))

  7. ความกว้าง Slider = 200px

ผลลัพธ์ที่คาดหวัง:


Exercise 2: LED Traffic Light Simulation - 20-25 นาที

โจทย์: สร้างไฟจราจรจำลอง (Traffic Light) ที่มี LED 3 สี (แดง, เหลือง, เขียว) เปลี่ยนสลับอัตโนมัติด้วย Timer พร้อมปุ่ม Start/Stop

ข้อกำหนด:

  1. Background สี 0x1a1a2e

  2. Title "Traffic Light Simulator" (font_20, สีขาว)

  3. LED Widget 3 ตัว จัดเรียงแนวตั้ง (ขนาด 60x60 แต่ละตัว):

    • แดง (ด้านบน)

    • เหลือง (กลาง)

    • เขียว (ด้านล่าง)

  4. ใช้ Container สีเทาเข้ม (0x2a2a2a) ขนาด 100x220 เป็นกรอบไฟจราจร

  5. ปุ่ม "Start" (สีเขียว) เริ่มจับเวลา / "Stop" (สีแดง) หยุดจับเวลา

  6. ใช้ lv_timer_create() สำหรับเปลี่ยนสถานะ:

    • แดง: 3000ms (3 วินาที)

    • เหลือง: 1000ms (1 วินาที)

    • เขียว: 3000ms (3 วินาที)

  7. เมื่อไฟเปลี่ยน: LED ที่ active = brightness 255, LED อื่น = brightness 0

  8. Label แสดงสถานะ "State: RED (3s)" ด้านล่าง

ผลลัพธ์ที่คาดหวัง:


7. References


Previous Lab: Lab 2: Button with Counter Next Lab: Lab 4: Switch Toggle

Last updated

Was this helpful?