Basic Motion Detection

Lab 3: ตรวจจับการเคลื่อนไหว

วัตถุประสงค์

  • เพิ่มฟังก์ชัน detect_motion() ที่ใช้ threshold

  • เพิ่มการแจ้งเตือนเมื่อตรวจจับการเคลื่อนไหว

3.1 Concept: Motion Detection

หลักการ:

  • เมื่อนิ่ง: Magnitude ≈ 1g (9.81 m/s²)

  • เมื่อเคลื่อนไหว: Magnitude เบี่ยงเบนจาก 1g

ใช้ Threshold:

  • threshold = 0.3g (ประมาณ 3 m/s²)

  • ถ้า |magnitude - 1g| > threshold → Motion Detected!

3.2 เพิ่มโค้ดใน sensor_hub_daq_task.c

/* เพิ่ม Macro */
#define MOTION_THRESHOLD_G      (0.3f)   /* 0.3g threshold */
#define MOTION_THRESHOLD_MPS2   (MOTION_THRESHOLD_G * GRAVITY_EARTH)

/* เพิ่ม Motion State enum */
typedef enum {
    MOTION_STATIONARY = 0,
    MOTION_LIGHT,
    MOTION_MODERATE,
    MOTION_INTENSE
} motion_state_t;

/*******************************************************************************
 * Function Name: detect_motion
 *******************************************************************************
 * Summary:
 *   ตรวจจับระดับการเคลื่อนไหวจาก acceleration magnitude
 *
 * Parameters:
 *   magnitude: ขนาดของ acceleration (m/s²)
 *
 * Return:
 *   motion_state_t: ระดับการเคลื่อนไหว
 *
 * Thresholds:
 *   - STATIONARY: deviation < 0.1g
 *   - LIGHT:      deviation < 0.3g
 *   - MODERATE:   deviation < 0.6g
 *   - INTENSE:    deviation >= 0.6g
 ******************************************************************************/
static motion_state_t detect_motion(float magnitude)
{
    /* คำนวณค่าเบี่ยงเบนจาก 1g */
    float deviation = fabsf(magnitude - GRAVITY_EARTH);

    if (deviation < 0.1f * GRAVITY_EARTH)
    {
        return MOTION_STATIONARY;
    }
    else if (deviation < 0.3f * GRAVITY_EARTH)
    {
        return MOTION_LIGHT;
    }
    else if (deviation < 0.6f * GRAVITY_EARTH)
    {
        return MOTION_MODERATE;
    }
    else
    {
        return MOTION_INTENSE;
    }
}

/*******************************************************************************
 * Function Name: get_motion_string
 *******************************************************************************
 * Summary:
 *   แปลง motion state เป็น string สำหรับแสดงผล
 ******************************************************************************/
static const char* get_motion_string(motion_state_t state)
{
    switch (state)
    {
        case MOTION_STATIONARY: return "STATIONARY  ";
        case MOTION_LIGHT:      return "LIGHT MOTION";
        case MOTION_MODERATE:   return "MODERATE    ";
        case MOTION_INTENSE:    return "INTENSE!    ";
        default:                return "UNKNOWN     ";
    }
}

3.3 เพิ่มการเรียกใช้ใน Main Loop

3.4 Output ที่คาดหวัง


จบ Session 2 | ต่อไป: Session 3: LVGL Display

Last updated

Was this helpful?