ADC Display

Lab 8: Hardware ADC Display

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

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

ADC (Analog-to-Digital Converter) เป็นสะพานเชื่อมระหว่างโลก Analog กับ Digital:

  • Sensor Reading: พื้นฐานสำหรับอ่านค่า Sensor ทุกชนิด (อุณหภูมิ, แรงดัน, แสง)

  • Real-time Visualization: แสดงค่าที่เปลี่ยนแปลงอย่างต่อเนื่องบน LVGL

  • Data Conversion: แปลง Raw ADC -> Percentage -> Voltage

  • Industrial Monitoring: พื้นฐาน SCADA, Process Monitoring, Quality Control

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

  1. Sensor Init: ต้องเรียก aic_sensors_init() ก่อนอ่านค่า ADC

  2. ADC Read: aic_adc_read() คืนค่า 0-4095 (12-bit)

  3. Value Mapping: แปลง Raw -> Percentage -> Voltage

  4. Read-only Widgets: ใช้ Slider/Bar แสดงค่าโดยไม่ให้ user ปรับ

  5. Timer-based Polling: อัพเดทค่า ADC แบบ Real-time ทุก 100ms

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

  1. Initialize sensors ด้วย aic_sensors_init()

  2. สร้าง LVGL widgets: Bar, Label สำหรับแสดงค่า

  3. สร้าง LVGL Timer poll ทุก 100ms

  4. ใน timer callback อ่าน ADC แล้วอัพเดท UI


2. หลักการทำงาน (Technical Principles)

2.1 ADC Architecture on PSoC Edge E84

2.2 ADC Value Conversion

2.3 Polling Architecture

2.4 UI Layout


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

3.1 Sensor/ADC Hardware API (aic-eec.h)

Function
Returns
Description

aic_sensors_init()

void

Initialize sensor subsystem (ต้องเรียกก่อน)

aic_adc_read()

uint16_t

อ่านค่า Raw ADC (0-4095)

3.2 Value Conversion (ทำเองในโค้ด)

3.3 LVGL Functions ที่ใช้ในบทนี้

Function
Description

lv_bar_create(parent)

สร้าง Bar widget

lv_bar_set_range(bar, min, max)

กำหนดช่วงค่า Bar

lv_bar_set_value(bar, value, anim)

ตั้งค่า Bar

lv_slider_create(parent)

สร้าง Slider widget

lv_slider_set_range(slider, min, max)

กำหนดช่วงค่า Slider

lv_slider_set_value(slider, value, anim)

ตั้งค่า Slider

lv_obj_remove_flag(obj, LV_OBJ_FLAG_CLICKABLE)

ทำให้ Slider เป็น read-only

lv_label_set_text_fmt(lbl, fmt, ...)

แสดงข้อความแบบ format

lv_timer_create(cb, period, data)

สร้าง periodic timer

3.4 ทำ Slider เป็น Read-only


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

4.1 Minimal Example: ADC to Label

4.2 Full Example: ADC with Bar + Voltage Display

4.3 อธิบายโค้ดทีละขั้นตอน

ขั้นตอน
โค้ด
คำอธิบาย

1

aic_sensors_init()

Initialize sensor subsystem (ห้ามลืม!)

2

lv_bar_create() + lv_slider_create()

สร้าง widgets แสดงค่า

3

lv_obj_remove_flag(slider, LV_OBJ_FLAG_CLICKABLE)

ทำ Slider เป็น read-only

4

lv_timer_create(adc_poll_cb, 100, NULL)

Poll ADC ทุก 100ms

5

aic_adc_read()

อ่านค่า Raw 0-4095

6

raw * 100 / 4095

แปลงเป็น Percentage

7

raw * 3.3f / 4095.0f

แปลงเป็น Voltage

8

lv_bar_set_value() + lv_label_set_text_fmt()

อัพเดท UI


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

5.1 Pattern: ADC Polling with Smoothing

5.2 Pattern: Read-only Widget

5.3 Pattern: Value Conversion

5.4 สิ่งที่ต้องระวัง

หัวข้อ
รายละเอียด

aic_sensors_init()

ต้องเรียกก่อน aic_adc_read() เสมอ ไม่งั้น return 0

Integer Overflow

raw * 100 อาจ overflow ถ้า raw เป็น uint16_t; ใช้ (uint32_t)raw * 100

Float Format

ใช้ %.2f สำหรับ 2 ทศนิยม; ใช้ %.1f สำหรับ 1 ทศนิยม

ADC Noise

ค่า ADC อาจกระเพื่อมเล็กน้อย; ใช้ Moving Average Filter

Timer Period

100ms เหมาะสำหรับ ADC; เร็วกว่านี้ไม่จำเป็นเพราะ pot หมุนช้า

Animation

ใช้ LV_ANIM_ON ให้ Bar เคลื่อนไหวนุ่มนวล

5.5 Application ในอุตสาหกรรม

  • Process Monitoring: อ่านค่า Pressure Sensor แสดง Bar graph

  • Quality Control: วัดค่า Dimension sensor แสดง Pass/Fail

  • HVAC System: อ่าน Temperature sensor แสดง Gauge

  • Water Treatment: วัดค่า pH, Turbidity แสดง Dashboard


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

แบบฝึกหัดที่ 1: Precision Voltage Display

โจทย์: สร้างหน้าจอ Voltmeter ที่แสดงค่าแรงดันจาก Potentiometer

ข้อกำหนด:

  • แสดงค่า Voltage เป็นตัวเลขใหญ่ (font 24) แบบ 2 ทศนิยม: "1.65 V"

  • แสดง Raw ADC value: "Raw: 2048 / 4095"

  • แสดง Bar graph แบบเปลี่ยนสี:

    • 0.0V - 1.0V: สีเขียว (Safe)

    • 1.0V - 2.5V: สีเหลือง (Warning)

    • 2.5V - 3.3V: สีแดง (Danger)

  • แสดง Min/Max ที่เคยอ่านได้ (เช่น "Min: 0.12V Max: 3.28V")

  • มีปุ่ม "Reset Min/Max" สำหรับ clear ค่า

Hints:

  • ใช้ static float min_v = 3.3f, max_v = 0.0f; เก็บ min/max

  • เปลี่ยนสี Bar: lv_obj_set_style_bg_color(bar, color, LV_PART_INDICATOR)

  • เปรียบเทียบ voltage กับ threshold ใน timer callback

แบบฝึกหัดที่ 2: ADC Threshold Alarm System

โจทย์: สร้างระบบ Alarm ที่ trigger เมื่อค่า ADC เกิน threshold

ข้อกำหนด:

  • มี Slider สำหรับตั้ง Threshold (0-100%)

  • แสดง Bar graph ค่า ADC ปัจจุบัน

  • เมื่อ ADC > Threshold:

    • พื้นหลัง Container เปลี่ยนเป็นสีแดง

    • Label แสดง "ALARM!" สีแดงกะพริบ

    • Hardware LED (Red) ติด

  • เมื่อ ADC <= Threshold:

    • พื้นหลังกลับปกติ

    • Label แสดง "Normal" สีเขียว

    • Hardware LED (Red) ดับ

  • แสดง Threshold value: "Threshold: 75%"

  • แสดง Current value: "Current: 80%"

Hints:

  • ใช้ aic_gpio_led_set(AIC_LED_RED, true/false) ควบคุม LED

  • กะพริบ Label: สลับ lv_obj_add_flag(lbl, LV_OBJ_FLAG_HIDDEN) / remove_flag ใน timer


7. References


Last updated

Was this helpful?