GPIO Dashboard

Lab 5: GPIO Dashboard

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

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

GPIO Dashboard เป็น Lab สุดท้ายของ Part 1 Section I ที่รวมทุก widget เข้าด้วยกัน:

  • Industrial HMI: ในโรงงานจริง operator ต้องเห็นและควบคุม I/O หลายตัวจากหน้าจอเดียว

  • Factory Floor Monitoring: แสดงสถานะ Motor, Valve, Sensor, Alarm พร้อมกัน

  • Multi-Widget Integration: รวม Label + Button + Switch + LED ที่เรียนมาทั้งหมด

  • Layout Management: จัดวาง widget หลายตัวให้เป็นระเบียบด้วย Container, Flex, Grid

  • Data Structure Design: ใช้ struct array จัดการข้อมูลหลาย channel อย่างมีระบบ

  • Scalable Architecture: ออกแบบ code ที่เพิ่ม/ลด channel ได้ง่าย

ใน Embedded System จริง dashboard คือหน้าจอที่ใช้งานบ่อยที่สุด เพราะ operator ต้องเห็นภาพรวมทั้งหมดจากที่เดียว

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

  1. Container Widget: สร้าง container สำหรับจัดกลุ่ม widgets

  2. Flex Layout: จัดวาง widget ด้วย lv_obj_set_flex_flow(), lv_obj_set_flex_align()

  3. Grid Positioning: คำนวณตำแหน่ง widgets แบบ 2D grid

  4. Struct Array Pattern: ใช้ typedef struct + array จัดการหลาย items

  5. User Data Pattern: ส่ง context ไปยัง callback ด้วย user_data

  6. Batch Operations: ควบคุมทุก GPIO พร้อมกันด้วยปุ่ม All ON / All OFF

  7. Color Theming: ใช้ color constants จัดธีม dark/light

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

สร้าง Dashboard ที่มี 4 GPIO channels (LED + Switch) ใน Container แบบ grid พร้อมปุ่ม All ON / All OFF สำหรับ batch control


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

2.1 Dashboard Architecture

2.2 Data Structure Design

2.3 Grid Positioning Calculation

2.4 Program Flowchart


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

3.1 Container Functions

Function
Description
Parameters

lv_obj_create(parent)

สร้าง Container (Base Object)

parent

lv_obj_set_size(obj, w, h)

กำหนดขนาด

obj, width, height

lv_obj_set_pos(obj, x, y)

กำหนดตำแหน่ง absolute ภายใน parent

obj, x, y

lv_obj_clear_flag(obj, flag)

ลบ flag (เช่น disable scroll)

obj, flag

lv_obj_invalidate(obj)

Force redraw

obj

3.2 Flex Layout Functions

Function
Description
Parameters

lv_obj_set_flex_flow(obj, flow)

ตั้ง flex direction

obj, LV_FLEX_FLOW_*

lv_obj_set_flex_align(obj, main, cross, track)

ตั้ง alignment

obj, 3x LV_FLEX_ALIGN_*

lv_obj_set_flex_grow(obj, grow)

ยืดขยายอัตโนมัติ

obj, grow factor (0-1)

3.3 Alignment Functions

Function
Description
Parameters

lv_obj_align(obj, align, x, y)

จัดตำแหน่งเทียบ parent

obj, LV_ALIGN_*, x_ofs, y_ofs

lv_obj_align_to(obj, ref, align, x, y)

จัดตำแหน่งเทียบ object อื่น

obj, ref_obj, align, x_ofs, y_ofs

3.4 Important Flags & Style

3.5 State Management Functions

Function
Description

lv_obj_add_state(obj, state)

เพิ่ม state (เช่น ON)

lv_obj_clear_state(obj, state)

ลบ state (เช่น OFF)

lv_obj_has_state(obj, state)

ตรวจสอบ state (true/false)


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

4.1 Complete Code - part1_ex5_gpio_dashboard()

จากไฟล์ part1_examples.c:

4.2 Code Breakdown

Part A: User Data Pattern

Part B: Grid Position Calculation

Part C: Relative Alignment (align_to)

Part D: Batch Update with Invalidate


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

5.1 Container Styling Pattern

5.2 Flex Layout สำหรับ Dashboard

5.3 Programmatic State Change + Event

5.4 Color Theming Best Practices

5.5 Scalable Design Pattern


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

Exercise 1: 2-Column Sensor Dashboard (Intermediate)

สร้าง Dashboard แบบ 2 คอลัมน์:

  • ซ้าย: Sensor Readings (4 ค่า) พร้อม LED สีตามระดับ

  • ขวา: Controls (4 switches) สำหรับเปิด/ปิดอุปกรณ์

Requirements:

  • คอลัมน์ซ้าย: Temperature, Humidity, Pressure, Light (ค่าจำลอง)

  • คอลัมน์ขวา: Motor, Fan, Pump, Alarm (switch + LED)

  • มีปุ่ม "Emergency Stop" (สีแดง) ปิดทุก output ทันที

  • แสดง Active outputs: "2/4 Running"

Expected Output:

Hints:

  • ใช้ 2 container วางเคียงกัน (ซ้าย sensor, ขวา control)

  • Sensor LED ใช้ lv_led_set_brightness() แสดงระดับค่า

  • Emergency Stop ใช้ loop เหมือน All OFF


Exercise 2: Tabbed Dashboard with TabView (Advanced)

สร้าง Dashboard แบบ TabView มี 3 tabs:

  • Tab 1 "Inputs": แสดงสถานะ Digital Input 4 ช่อง (LED + label)

  • Tab 2 "Outputs": ควบคุม Digital Output 4 ช่อง (Switch + LED)

  • Tab 3 "Settings": ปรับ Refresh Rate (Slider) + Auto-mode switch

Requirements:

  • Tab 1: Input LEDs อัพเดทค่าสุ่มทุก 1 วินาที (ใช้ lv_timer_create())

  • Tab 2: Output switches ควบคุม LED + แสดงสถานะ

  • Tab 3: Slider ปรับ refresh rate (100ms - 2000ms) + Auto switch

Expected Output:

Hints:

  • lv_tabview_create(parent) สร้าง TabView

  • lv_tabview_add_tab(tv, "name") เพิ่ม tab (ได้ container กลับมา)

  • lv_timer_create(timer_cb, period_ms, user_data) สร้าง periodic timer

  • Tab 3 slider callback เปลี่ยน timer period

ต่อไป Part II (Advance HMI Display) จะเป็นการนำสิ่งที่เรียนมาควบคุม Hardware จริง!


8. References


Previous Lab: Lab 4: Switch Toggle Next: Week 3 Part II - Hardware Integration

Last updated

Was this helpful?