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? - จะได้เรียนรู้อะไร
Chart Widget: สร้าง line chart ด้วย
lv_chart_create()Data Series: เพิ่ม series หลายเส้นด้วย
lv_chart_add_series()Auto-Scrolling: ข้อมูลเลื่อนอัตโนมัติ (ring buffer) ด้วย
lv_chart_set_next_value()Point Count: กำหนดจำนวนจุดแสดงผล (50-100 จุดที่แนะนำ)
Chart Styling: ปรับ line width, ซ่อน data points, grid lines
How? - จะทำอย่างไร
สร้าง Chart widget กำหนด type เป็น
LV_CHART_TYPE_LINEเพิ่ม 3 series สำหรับ Accelerometer X, Y, Z
ใช้ timer อัพเดทข้อมูลทุก 100ms
จำลอง sine wave + noise เป็น accelerometer data
แสดง 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
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
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
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
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
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()ทุกรอบ updateReset y_min/y_max ทุก N samples เพื่อให้ range ลดลงได้
7. References
Last updated
Was this helpful?