Sensor Dashboard
Lab 5: Sensor Dashboard (TabView)
1. โครงสร้างภาพรวมของ Lab
Why? - ทำไมต้องเรียนรู้เรื่องนี้
Multi-Page UI: ในระบบ IoT จริง เรามีข้อมูลจากหลาย Sensor ที่ต้องแสดงผลพร้อมกัน TabView ช่วยจัดกลุ่มข้อมูลอย่างเป็นระบบ
Organized Layout: Dashboard ที่ดีจัดกลุ่ม content ตามประเภท ไม่แสดงทุกอย่างบนหน้าเดียว
Real-World Pattern: รูปแบบ Tab-based Dashboard ใช้แพร่หลายในระบบ SCADA, HMI, และ IoT Monitoring
What? - จะได้เรียนรู้อะไร
TabView Widget: สร้าง multi-tab interface ด้วย
lv_tabview_create()Tab Content Management: แต่ละ tab มี widgets ของตัวเอง แยกจัดการอิสระ
Tab Bar Styling: ปรับแต่ง tab bar, ปุ่ม tab, สีพื้นหลัง
Tab Switching: ควบคุมการเปลี่ยน tab ทั้งด้วยการกด และ programmatic
Scroll Control: ปิด scrolling ที่ไม่ต้องการบน content area
How? - จะทำอย่างไร
สร้าง TabView กับ tab bar ด้านบน (80px)
เพิ่ม Tab 1: IMU data - แสดง accelerometer X/Y/Z ด้วย Line Chart
เพิ่ม Tab 2: ADC data - แสดงค่า ADC ด้วย Bar + Label แสดงแรงดัน
ใช้ timer callback อัพเดทข้อมูลทุก tab ทุก 100ms
ปรับแต่ง tab button styling ให้ดูเป็นมืออาชีพ

2. หลักการทำงาน
2.1 TabView Architecture
TabView เป็น widget ที่รวม Tab Bar (ปุ่มเลือก) กับ Content Area (พื้นที่แสดงผล) เข้าด้วยกัน เมื่อกดปุ่ม tab จะสลับแสดง content ของ tab นั้น
2.2 Screen Layout
2.3 Data Flow
2.4 Tab Bar Position Options
3. ฟังก์ชันสำคัญ
3.1 TabView Functions
lv_tabview_create(parent)
สร้าง TabView
lv_tabview_create(lv_screen_active())
lv_tabview_set_tab_bar_position(tv, dir)
ตำแหน่ง tab bar
...(tv, LV_DIR_TOP)
lv_tabview_set_tab_bar_size(tv, size)
ความสูง/กว้าง tab bar
...(tv, 80)
lv_tabview_add_tab(tv, "name")
เพิ่ม tab ใหม่ (return tab page)
lv_tabview_add_tab(tv, "IMU")
lv_tabview_get_tab_bar(tv)
รับ tab bar object สำหรับ styling
lv_tabview_get_tab_bar(tv)
lv_tabview_get_content(tv)
รับ content container
lv_tabview_get_content(tv)
lv_tabview_get_tab_active(tv)
ดูว่า tab ไหน active (0-based)
uint32_t idx = ...
lv_tabview_set_active(tv, idx, anim)
เปลี่ยน tab ด้วยโค้ด
...(tv, 1, LV_ANIM_ON)
3.2 Tab Bar Position Constants
LV_DIR_TOP
Tab bar ด้านบน (default)
480 x (320 - tab_size)
LV_DIR_BOTTOM
Tab bar ด้านล่าง
480 x (320 - tab_size)
LV_DIR_LEFT
Tab bar ด้านซ้าย
(480 - tab_size) x 320
LV_DIR_RIGHT
Tab bar ด้านขวา
(480 - tab_size) x 320
3.3 Critical Pattern - ปิด Scrolling
3.4 Simulation Functions (PC Simulator)
4. โค้ดตัวอย่าง
4.1 Global Variables
4.2 Simulation Helpers
4.3 Timer Callback - อัพเดทข้อมูลทุก Tab
4.4 สร้าง IMU Tab Content
4.5 สร้าง ADC Tab Content
4.6 Main Function
5. องค์ความรู้และเทคนิค
5.1 Tab Bar Sizing - ขนาดของ Tab Bar
5.2 Tab Content Parent - ข้อควรระวัง
5.3 Tab Button Styling - ปรับแต่งปุ่ม Tab
5.4 Programmatic Tab Switching
5.5 Performance Tip - อัพเดทเฉพาะ Tab ที่ Active
6. แบบฝึกหัด
Exercise 1: เพิ่ม Tab ที่ 3 - System Status
โจทย์: เพิ่ม tab "System" ที่แสดงข้อมูล System Status:
Uptime: เวลาตั้งแต่เริ่มต้น (วินาที) อัพเดททุก 1 วินาที
Memory Usage: แสดงเป็น Bar (จำลอง 40-70%)
CPU Load: แสดงเป็น Arc gauge (จำลอง 20-80%)
การประยุกต์ใช้งานจริง:
ระบบ Monitoring ในโรงงาน ต้องมีหน้า System Health เสมอ
ใช้ตรวจสอบว่า Embedded Device ทำงานปกติหรือไม่
Hint:
ใช้
static uint32_t uptime_secนับเวลาใน timer callbackถ้า timer ทำงานทุก 100ms → นับ 10 ครั้ง = 1 วินาที
ใช้
lv_label_set_text_fmt()แสดง uptime
Exercise 2: Auto-Rotating Tabs
โจทย์: สร้างระบบ Auto-Rotate ที่เปลี่ยน tab ทุก 5 วินาทีอัตโนมัติ:
เปลี่ยน tab ไปข้างหน้าทีละ tab
เมื่อถึง tab สุดท้าย ย้อนกลับ tab แรก
แสดงตัวนับถอยหลัง "Next tab in: 3s" ที่มุมล่างขวา
เมื่อผู้ใช้กดเลือก tab เอง ให้ reset ตัวนับถอยหลัง
การประยุกต์ใช้งานจริง:
Digital Signage ในห้องควบคุมโรงงาน
Kiosk Mode ใน Dashboard ที่ไม่มีคนดูแลตลอดเวลา
หน้าจอ Overview สำหรับผู้บริหารดูภาพรวม
Hint:
ใช้
lv_tabview_set_active(tv, next_idx, LV_ANIM_ON)นับ counter ใน timer callback:
static uint32_t auto_counterReset counter เมื่อ
auto_counter >= 50(50 x 100ms = 5s)
Exercise 3: Tab Content with Color Theme
โจทย์: ปรับแต่งแต่ละ tab ให้มี color theme แตกต่างกัน:
IMU Tab: พื้นหลังสีน้ำเงินเข้ม (#16213E) ตัวอักษรสีขาว
ADC Tab: พื้นหลังสีเขียวเข้ม (#1A3C34) ตัวอักษรสีขาว
System Tab: พื้นหลังสีม่วงเข้ม (#2D1B3D) ตัวอักษรสีขาว
Hint:
ใช้
lv_obj_set_style_bg_color(tab, lv_color_hex(0x16213E), 0)Label สีขาว:
lv_obj_set_style_text_color(label, lv_color_hex(0xFFFFFF), 0)
7. References
Last updated
Was this helpful?