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? - จะได้เรียนรู้อะไร

  1. TabView Widget: สร้าง multi-tab interface ด้วย lv_tabview_create()

  2. Tab Content Management: แต่ละ tab มี widgets ของตัวเอง แยกจัดการอิสระ

  3. Tab Bar Styling: ปรับแต่ง tab bar, ปุ่ม tab, สีพื้นหลัง

  4. Tab Switching: ควบคุมการเปลี่ยน tab ทั้งด้วยการกด และ programmatic

  5. Scroll Control: ปิด scrolling ที่ไม่ต้องการบน content area

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

  1. สร้าง TabView กับ tab bar ด้านบน (80px)

  2. เพิ่ม Tab 1: IMU data - แสดง accelerometer X/Y/Z ด้วย Line Chart

  3. เพิ่ม Tab 2: ADC data - แสดงค่า ADC ด้วย Bar + Label แสดงแรงดัน

  4. ใช้ timer callback อัพเดทข้อมูลทุก tab ทุก 100ms

  5. ปรับแต่ง 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

Function
Description
ตัวอย่าง

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

Direction
Description
Content Size (480x320 screen)

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_counter

  • Reset 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?