Slider Bar

Lab 1: Slider & Bar Widget (ADC Visualization)


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

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

  • ADC Visualization: ค่า ADC 0-4095 เป็นตัวเลขดิบที่อ่านยาก จำเป็นต้องแปลงเป็นภาพที่เข้าใจง่าย

  • Slider vs Bar: เรียนรู้ความแตกต่างระหว่าง widget ที่รับ input (Slider) กับ widget ที่แสดงผลอย่างเดียว (Bar)

  • Value Mapping: ฝึกการแปลงค่า raw ADC เป็น percentage และ voltage ซึ่งเป็นพื้นฐานของ Sensor Data Processing

  • Industrial Application: Bar chart และ slider เป็นส่วนสำคัญของ SCADA/HMI ในงานอุตสาหกรรม

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

  1. Slider Widget: สร้าง slider พร้อม range, value, และ event callback

  2. Bar Widget: สร้าง progress bar แบบ read-only สำหรับแสดงสถานะ

  3. ADC Mapping: สูตรการแปลง ADC raw value เป็น percentage และ voltage

  4. Timer Update Pattern: ใช้ lv_timer_create() อัพเดท UI แบบ periodic

  5. Event Callback: จัดการ LV_EVENT_VALUE_CHANGED เพื่อตอบสนองต่อการเปลี่ยนแปลงค่า

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

  1. สร้าง Slider แสดง ADC raw value (0-4095)

  2. สร้าง Bar แสดง percentage (0-100%)

  3. เพิ่ม Label แสดง Voltage คำนวณจาก ADC

  4. ใช้ Timer จำลองค่า ADC ที่เปลี่ยนแปลงตามเวลา

  5. เชื่อมต่อ Slider event กับ Bar update


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

2.1 Slider vs Bar Concept

2.2 ADC Value Mapping Pipeline

2.3 Timer Update Flow


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

3.1 Slider Functions

Function
Parameters
Description

lv_slider_create(parent)

parent: lv_obj_t*

สร้าง slider widget บน parent

lv_slider_set_range(obj, min, max)

min, max: int32_t

กำหนดช่วงค่า min-max

lv_slider_set_value(obj, val, anim)

val: int32_t, anim: lv_anim_enable_t

ตั้งค่า slider

lv_slider_get_value(obj)

-

อ่านค่าปัจจุบัน (return int32_t)

lv_slider_set_mode(obj, mode)

mode: lv_slider_mode_t

NORMAL / SYMMETRICAL / RANGE

3.2 Bar Functions

Function
Parameters
Description

lv_bar_create(parent)

parent: lv_obj_t*

สร้าง bar widget (read-only)

lv_bar_set_range(obj, min, max)

min, max: int32_t

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

lv_bar_set_value(obj, val, anim)

val: int32_t, anim: lv_anim_enable_t

ตั้งค่า bar

lv_bar_set_start_value(obj, val, anim)

val: int32_t

ตั้งค่าเริ่มต้น (สำหรับ range mode)

lv_bar_set_mode(obj, mode)

mode: lv_bar_mode_t

NORMAL / SYMMETRICAL / RANGE

3.3 Common Styling

Function
Description

lv_obj_set_size(obj, w, h)

กำหนดขนาด width x height

lv_obj_set_style_bg_color(obj, color, part)

เปลี่ยนสีพื้นหลัง

lv_obj_set_style_bg_color(obj, color, LV_PART_INDICATOR)

เปลี่ยนสี indicator (ส่วนที่เติม)

lv_obj_set_style_anim_duration(obj, ms, 0)

กำหนดเวลา animation

lv_obj_add_event_cb(obj, cb, LV_EVENT_VALUE_CHANGED, NULL)

เพิ่ม callback เมื่อค่าเปลี่ยน

3.4 ADC Calculation Formulas


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

4.1 Step 1: Global Variables และ Constants

4.2 Step 2: Simulated ADC Read

4.3 Step 3: Slider Event Callback

4.4 Step 4: Timer Callback สำหรับ Auto-Update

4.5 Step 5: Main Function - สร้าง UI ทั้งหมด

4.6 Data Flow Summary


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

5.1 Slider vs Bar - เมื่อไหร่ใช้อะไร

Feature
Slider
Bar

User Input

ใช่ (ลากได้)

ไม่ (read-only)

Knob

มี knob ลากได้

ไม่มี

Use Case

ปรับ setpoint, threshold

แสดง progress, level

Event

LV_EVENT_VALUE_CHANGED

ไม่มี (ตั้งค่าจากโค้ด)

CPU Usage

สูงกว่า (รับ touch)

ต่ำกว่า

ตัวอย่างใช้งาน

Volume control, Brightness

Battery, Loading, Fuel

5.2 Animation Options

Tip: ถ้า update rate สูง (< 50ms) ให้ใช้ LV_ANIM_OFF เพื่อลด CPU load

5.3 ทำ Slider เป็น Read-Only

5.4 เปลี่ยนสี Indicator ตามค่า

5.5 Integer Math vs Float

5.6 Memory Pattern: Static Variables


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

Exercise 1: Battery Level Indicator

สร้าง Battery Level Indicator ที่ประกอบด้วย:

Requirements:

  • Bar แสดงระดับแบตเตอรี่ (0-100%)

  • Label แสดง percentage ตัวเลข

  • เปลี่ยนสี ตามระดับ:

    • 0-20%: สีแดง (LV_PALETTE_RED) - ต่ำวิกฤต

    • 21-50%: สีส้ม (LV_PALETTE_ORANGE) - ต่ำ

    • 51-100%: สีเขียว (LV_PALETTE_GREEN) - ปกติ

  • Timer จำลองค่าแบตเตอรี่ลดลงทุก 500ms (ลดครั้งละ 1%)

  • เมื่อถึง 0% ให้รีเซ็ตเป็น 100% (จำลองการชาร์จ)

Hints:

  • ใช้ lv_bar_set_value() อัพเดทค่า

  • ใช้ lv_obj_set_style_bg_color() กับ LV_PART_INDICATOR เปลี่ยนสี

  • สร้าง status label ที่เปลี่ยนข้อความตาม level


Exercise 2: Audio Mixer - Volume Control with Slider & Bar

สร้าง Audio Mixer ที่มี Slider ควบคุม Volume เชื่อมกับ Bar แสดงระดับ:

Requirements:

  • Slider สำหรับปรับ Volume (0-100)

  • Bar แสดง Volume Level แบบ real-time

  • Label แสดงค่า Volume ปัจจุบัน

  • เพิ่ม Mute button: กดแล้ว volume เป็น 0, กดอีกทีกลับค่าเดิม

  • สี bar เปลี่ยนตาม volume:

    • 0: สีเทา (Muted)

    • 1-70: สีเขียว (Normal)

    • 71-90: สีเหลือง (Loud)

    • 91-100: สีแดง (Clipping!)

Hints:

  • ใช้ lv_slider_get_value() ใน event callback

  • สร้าง lv_button_create() สำหรับ Mute button

  • เก็บ last_volume ใน static variable สำหรับ mute/unmute


Exercise 3: Multi-Channel Energy Meter (ท้าทาย)

สร้าง Energy Meter แสดงกำลังไฟฟ้า 3 เฟส:

Requirements:

  • Bar 3 อัน สำหรับ Phase A, B, C (0-1000 Watt)

  • แต่ละ Phase มี label แสดง Watt

  • Bar ด้านล่างแสดง Total Power (ผลรวม 3 Phase)

  • Timer จำลองค่า power ที่เปลี่ยนแปลง

  • Color coding: < 300W Green, 300-700W Yellow, > 700W Red


7. References


Last updated

Was this helpful?