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?