Chart Timeseries

Lab 3: Chart Widget (Time-Series Data)


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

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

  • Trend Analysis: Chart แสดงแนวโน้มข้อมูลตามเวลา ทำให้เห็นรูปแบบที่ตัวเลขอย่างเดียวมองไม่เห็น

  • Multi-Sensor: เปรียบเทียบข้อมูลจากหลาย sensor พร้อมกันบนกราฟเดียว

  • Real-time Monitoring: ดู sensor data แบบ live scrolling เหมือน oscilloscope

  • Industry Standard: Line chart เป็น visualization ที่ใช้มากที่สุดใน SCADA, DCS, และ IoT Dashboard

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

  1. Chart Widget: สร้าง line chart ด้วย lv_chart_create()

  2. Data Series: เพิ่ม series หลายเส้นด้วย lv_chart_add_series()

  3. Auto-Scrolling: ข้อมูลเลื่อนอัตโนมัติ (ring buffer) ด้วย lv_chart_set_next_value()

  4. Point Count: กำหนดจำนวนจุดแสดงผล (50-100 จุดที่แนะนำ)

  5. Chart Styling: ปรับ line width, ซ่อน data points, grid lines

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

  1. สร้าง Chart widget กำหนด type เป็น LV_CHART_TYPE_LINE

  2. เพิ่ม 3 series สำหรับ Accelerometer X, Y, Z

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

  4. จำลอง sine wave + noise เป็น accelerometer data

  5. แสดง labels บอกค่าปัจจุบันของแต่ละ axis


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

2.1 Chart Data Flow (Ring Buffer)

2.2 Multiple Series Display

2.3 Sensor Data Scaling


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

3.1 Chart Creation & Type

Function
Parameters
Description

lv_chart_create(parent)

parent: lv_obj_t*

สร้าง chart widget

lv_chart_set_type(chart, type)

type: lv_chart_type_t

LINE, BAR, SCATTER

lv_chart_set_point_count(chart, cnt)

cnt: uint32_t

จำนวนจุดที่แสดง (แนะนำ 50-100)

lv_chart_set_range(chart, axis, min, max)

axis: LV_CHART_AXIS_PRIMARY_Y

กำหนดช่วง Y-axis

3.2 Data Series

Function
Parameters
Description

lv_chart_add_series(chart, color, axis)

color, axis

เพิ่ม data series ใหม่

lv_chart_set_next_value(chart, ser, val)

ser, val: int32_t

เพิ่มจุดใหม่ (auto-scroll)

lv_chart_set_all_value(chart, ser, val)

ser, val: int32_t

ตั้งทุกจุดเป็นค่าเดียวกัน

lv_chart_refresh(chart)

-

บังคับ redraw chart

3.3 Chart Styling

Function
Description

lv_obj_set_style_line_width(chart, px, LV_PART_ITEMS)

ความหนาเส้น

lv_obj_set_style_size(chart, 0, 0, LV_PART_INDICATOR)

ซ่อน data point dots

lv_chart_set_div_line_count(chart, h, v)

จำนวนเส้น grid (h=แนวนอน, v=แนวตั้ง)

lv_obj_set_style_line_color(chart, color, LV_PART_MAIN)

สีเส้น grid

lv_obj_set_style_line_opa(chart, opa, LV_PART_MAIN)

ความโปร่งใสของ grid

3.4 Chart Axis

Function
Description

lv_chart_set_range(chart, LV_CHART_AXIS_PRIMARY_Y, min, max)

กำหนดช่วง Y ซ้าย

lv_chart_set_range(chart, LV_CHART_AXIS_SECONDARY_Y, min, max)

กำหนดช่วง Y ขวา

lv_chart_set_axis_tick(chart, axis, major_len, minor_len, major_cnt, minor_cnt, draw_labels)

ตั้ง tick marks


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

4.1 Step 1: Global Variables

4.2 Step 2: Simulated Accelerometer Data

4.3 Step 3: Timer Callback

4.4 Step 4: Main Function - สร้าง Chart UI

4.5 UI Layout


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

5.1 Point Count Guidelines

Application
Points
Update Rate
Notes

Temperature

50-100

1-5 sec

ช้า, ดูแนวโน้ม

Accelerometer

80-150

50-100ms

กลาง, ดู vibration

Audio Waveform

200-500

10-20ms

เร็ว, ดูรูปคลื่น

Power Meter

60-120

1 sec

กลาง, ดู load pattern

สำคัญ: point_count ยิ่งมาก ยิ่งใช้ RAM มาก แต่ละ series ใช้ point_count * sizeof(lv_coord_t) bytes

5.2 Float to Int Conversion Pattern

5.3 ซ่อน Data Points (Clean Lines)

5.4 Y-Range Auto vs Fixed

5.5 Pause/Resume Chart

5.6 Performance Optimization


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

Exercise 1: Dual-Axis Environmental Chart (Temperature + Humidity)

สร้าง Chart แสดง Temperature และ Humidity พร้อม Legend:

Requirements:

  • Chart แบบ LINE แสดง 2 series

  • Temperature (Primary Y-axis): range 0-50 degC, สีแดง

  • Humidity (Secondary Y-axis): range 0-100%, สีฟ้า

  • Point count: 60 จุด (แสดง 1 นาทีที่ 1 จุด/วินาที)

  • Legend box แสดงสีและชื่อ series

  • Labels แสดงค่าปัจจุบันของ Temp และ Humidity

  • Timer จำลองค่าที่เปลี่ยนแปลง (ทุก 1 วินาที)

Hints:

  • ใช้ LV_CHART_AXIS_PRIMARY_Y สำหรับ Temp, LV_CHART_AXIS_SECONDARY_Y สำหรับ Humidity

  • สร้าง legend ด้วย container + label + color rectangle


Exercise 2: Chart with Auto-Scaling Y-Axis and Grid Lines

สร้าง Chart ที่ Y-axis ปรับ range อัตโนมัติตามข้อมูล:

Requirements:

  • Chart แสดง 1 series (Vibration data)

  • Auto-scaling: Y-axis ปรับ min/max ตามข้อมูลจริง + 10% margin

  • Grid lines: 5 แนวนอน, 10 แนวตั้ง

  • Y-axis labels แสดง min/max value ปัจจุบัน

  • Point count: 100 จุด

  • Timer จำลอง vibration data (sine + random amplitude)

  • เพิ่ม Pause/Resume button

Hints:

  • ติดตาม y_min, y_max ใน timer callback

  • ใช้ lv_chart_set_range() ทุกรอบ update

  • Reset y_min/y_max ทุก N samples เพื่อให้ range ลดลงได้


7. References


Last updated

Was this helpful?