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? - จะได้เรียนรู้อะไร
Slider Widget: สร้าง slider พร้อม range, value, และ event callback
Bar Widget: สร้าง progress bar แบบ read-only สำหรับแสดงสถานะ
ADC Mapping: สูตรการแปลง ADC raw value เป็น percentage และ voltage
Timer Update Pattern: ใช้
lv_timer_create()อัพเดท UI แบบ periodicEvent Callback: จัดการ
LV_EVENT_VALUE_CHANGEDเพื่อตอบสนองต่อการเปลี่ยนแปลงค่า
How? - จะทำอย่างไร
สร้าง Slider แสดง ADC raw value (0-4095)
สร้าง Bar แสดง percentage (0-100%)
เพิ่ม Label แสดง Voltage คำนวณจาก ADC
ใช้ Timer จำลองค่า ADC ที่เปลี่ยนแปลงตามเวลา
เชื่อมต่อ 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
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
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
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 - เมื่อไหร่ใช้อะไร
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