แนวคิด — service ถือ state, UI แค่ observe
wifi_connection_service รันเป็น background task ถือ state machine + ข้อมูลทั้งหมดไว้เอง
หน้า UI ไม่เก็บ state เอง — แค่ lv_timer เรียก get_snapshot() เป็นระยะมาคัดลอกแสดง
เหตุผล: หน้า UI ถูก lv_menu_set_page() สลับออกได้ (บทเรียน 2.4) แต่ service อยู่ยงไม่ว่า UI จะสลับไปไหน
get_snapshot() ล็อก semaphore ก่อน memcpy — ปลอดภัยเพราะ background task ก็ lock ตัวเดียวกันก่อนแก้ state