LED Control

Lab 6: Hardware LED Control

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

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

นี่คือ Lab แรกที่เชื่อมต่อ LVGL UI เข้ากับ Hardware จริง บนบอร์ด PSoC Edge E84:

  • UI-to-Hardware Bridge: ควบคุม LED จริงจากหน้าจอสัมผัส

  • GPIO Output: เข้าใจการส่งสัญญาณออกทาง Digital Pin

  • PWM Dimming: ควบคุมความสว่าง LED ด้วย Pulse Width Modulation

  • Industrial Application: พื้นฐานของ HMI (Human-Machine Interface) ในโรงงาน

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

  1. GPIO Initialization: เรียก aic_gpio_init() ก่อนใช้งาน GPIO

  2. LED On/Off Control: ใช้ aic_gpio_led_set() ควบคุม 3 สี (Red, Green, Blue)

  3. PWM Brightness: ใช้ aic_gpio_pwm_set_duty() ปรับความสว่าง Blue LED

  4. LVGL Event → Hardware Action: เมื่อ user กด Switch บนจอ → LED บนบอร์ดติด/ดับ

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

  1. Initialize GPIO subsystem ด้วย aic_gpio_init()

  2. สร้าง LVGL Switch widgets สำหรับ LED แต่ละสี

  3. สร้าง LVGL Slider สำหรับ PWM brightness

  4. ใน Event Callback ให้เรียก aic_gpio_led_set() ควบคุม LED จริง


ขั้นตอนการดาวโหลดจาก Github Repo และรันโปรแกรม Button Demo

หมายเหตุ: GitHub Repo --> https://github.com/Advance-Innovation-Centre-AIC/psoc-e84-e2-lvgl-aic-eecarrow-up-right


ดาวน์โหลด GitHub Repo

2. หลักการทำงาน (Technical Principles)

2.1 LED Hardware Configuration

2.2 GPIO API Flow

2.3 LVGL Event -> Hardware Action


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

3.1 Hardware GPIO API (aic-eec.h)

Function
Description
Parameters

aic_gpio_init()

Initialize GPIO subsystem

ไม่มี

aic_gpio_led_set(led, state)

ตั้งค่า LED ON/OFF

led: AIC_LED_RED/GREEN/BLUE, state: true/false

aic_gpio_pwm_init(led)

Initialize PWM สำหรับ LED

led: AIC_LED_BLUE เท่านั้น

aic_gpio_pwm_set_duty(led, duty)

ตั้งค่าความสว่าง

led: AIC_LED_BLUE, duty: 0-100

3.2 LED Type Constants

3.3 LVGL Functions ที่ใช้ในบทนี้

Function
Description

lv_switch_create(parent)

สร้าง Switch widget

lv_slider_create(parent)

สร้าง Slider widget

lv_slider_set_range(slider, min, max)

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

lv_slider_get_value(slider)

อ่านค่าปัจจุบันของ Slider

lv_led_create(parent)

สร้าง LED indicator widget

lv_led_on(led) / lv_led_off(led)

เปิด/ปิด LED indicator

lv_led_set_brightness(led, bright)

ตั้งความสว่าง LED indicator (0-255)

lv_led_set_color(led, color)

ตั้งสี LED indicator

lv_obj_has_state(obj, LV_STATE_CHECKED)

ตรวจสอบสถานะ Switch


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

4.1 Minimal Example: Single LED Toggle

4.2 Full Example: 3 LEDs + PWM Slider

4.3 อธิบายโค้ดทีละขั้นตอน

ขั้นตอน
โค้ด
คำอธิบาย

1

aic_gpio_init()

เริ่มต้น GPIO subsystem (ต้องเรียกก่อน)

2

aic_gpio_pwm_init(AIC_LED_BLUE)

เปิด PWM สำหรับ Blue LED

3

lv_switch_create()

สร้าง Switch widget สำหรับ Red/Green

4

lv_slider_create()

สร้าง Slider สำหรับ Blue PWM

5

lv_obj_add_event_cb(sw, cb, LV_EVENT_VALUE_CHANGED, ...)

ผูก callback

6

aic_gpio_led_set(AIC_LED_RED, on)

ใน callback: ควบคุม LED จริง

7

aic_gpio_pwm_set_duty(AIC_LED_BLUE, duty)

ใน callback: ควบคุม PWM


5. องค์ความรู้และเทคนิค

5.1 Pattern: Event Callback -> Hardware Action

ทุกครั้งที่ต้องการควบคุม Hardware จาก UI ให้ใช้ pattern นี้:

5.2 Pattern: PWM Duty Mapping

5.3 สิ่งที่ต้องระวัง

หัวข้อ
รายละเอียด

GPIO Init First

ต้องเรียก aic_gpio_init() ก่อนเสมอ ไม่งั้น LED ไม่ทำงาน

PWM Init

aic_gpio_pwm_init() รองรับ Blue LED เท่านั้น

Event Filter

ตรวจสอบ lv_event_get_code() ทุกครั้ง ป้องกัน callback ถูกเรียกซ้ำ

LVGL Thread Safety

เรียก LVGL functions ได้เฉพาะใน LVGL context (callback, timer)

PWM Duty Range

0 = ดับ, 100 = สว่างเต็ม, ค่านอกช่วงจะถูก clamp

5.4 Application ในอุตสาหกรรม

  • Factory HMI: ควบคุม Status Indicator LED จากหน้าจอสัมผัส

  • Building Automation: ควบคุมไฟ (ON/OFF + Dimming) ผ่าน Touch Panel

  • Medical Equipment: LED Alert system ที่ผู้ใช้ควบคุมได้


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

แบบฝึกหัดที่ 1: LED Pattern Sequence

โจทย์: สร้างปุ่ม "Start Pattern" ที่เมื่อกดแล้ว LED จะ toggle สลับกันเป็นลำดับ: Red -> Green -> Blue -> Red -> Green -> Blue (วนซ้ำ)

ข้อกำหนด:

  • ใช้ lv_timer_create() สร้าง timer ที่ทำงานทุก 500ms

  • แต่ละครั้ง timer callback ให้เปิด LED ตัวถัดไป และปิดตัวก่อนหน้า

  • มีปุ่ม "Stop" เพื่อหยุด pattern และปิด LED ทั้งหมด

  • แสดง Label บอกสถานะ: "Running: RED" / "Stopped"

Hints:

  • ใช้ตัวแปร static int current_led = 0; เก็บ index LED ปัจจุบัน

  • lv_timer_create(cb, 500, NULL) สร้าง timer

  • lv_timer_delete(timer) หยุด timer

แบบฝึกหัดที่ 2: RGB Brightness Control Panel

โจทย์: สร้างหน้า Control Panel ที่มี Slider 3 ตัว สำหรับ Red, Green, Blue

ข้อกำหนด:

  • Red Slider (0-1): 0 = OFF, 1 = ON (เพราะ Red ไม่มี PWM)

  • Green Slider (0-1): 0 = OFF, 1 = ON (เพราะ Green ไม่มี PWM)

  • Blue Slider (0-100): ควบคุม PWM duty cycle

  • แสดง Preview Box ที่เปลี่ยนสีตาม RGB combination

  • แสดงค่า R, G, B เป็นตัวเลข

Hints:

  • ใช้ lv_obj_set_style_bg_color() เปลี่ยนสี Preview Box

  • lv_color_make(r, g, b) สร้างสี โดย r, g, b เป็น 0-255


Last updated

Was this helpful?