2026-08-28 22:17:18 +07:00
2026-08-28 22:17:18 +07:00

WiFiSense

Firmware ESP32-S3 phát hiện sự hiện diện/chuyển động của người trong phòng bằng phân tích tín hiệu WiFi và xử lý tín hiệu thống kê. Không cần cảm biến bổ sung — chỉ cần WiFi.

English version: README-en.md

Tổng quan

Dự án sử dụng ESP32-S3 liên tục theo dõi cường độ tín hiệu WiFi (RSSI) và phát hiện những nhiễu động đo được do chuyển động của con người gây ra. Khi phát hiện chuyển động, ngõ ra LED đã cấu hình sẽ được kích hoạt theo thời gian thực.

Phù hợp cho: tự động hóa nhà ở, phát hiện có người trong phòng, kích hoạt đèn thông minh và tiết kiệm năng lượng.


Cơ sở vật lý

Nguyên lý nền tảng

Cơ thể người chứa khoảng 60% nước. Nước dẫn điện và hấp thụ mạnh bức xạ điện từ tại 2,4 GHz (tần số WiFi):

  • Hệ số hấp thụ của nước ở 2,4 GHz: ~0,15 dB/cm
  • Bề rộng thân người điển hình: ~20 cm
  • Suy hao tín hiệu do cơ thể người: 515 dB, tùy vị trí

Khi bạn di chuyển giữa router và ESP32-S3:

  1. Tín hiệu mạnh hơn khi có ít vật cản hơn.
  2. Tín hiệu yếu đi khi cơ thể chặn đường truyền thẳng.
  3. Tín hiệu dao động do bị tán xạ và phản xạ.

Chính biến động RSSI động này là tín hiệu mà firmware phát hiện.

Vì sao phương sai quan trọng

Nhiễu tĩnh (tường, nội thất) ảnh hưởng RSSI một cách ổn định. Ngược lại, chuyển động của người tạo ra thay đổi nhanh và khó dự đoán:

  • Môi trường yên tĩnh: độ lệch chuẩn RSSI = 0,20,5 dBm (nhiễu ngẫu nhiên)
  • Người đứng yên: độ lệch chuẩn = 0,81,5 dBm (hơi thở, cử động nhỏ)
  • Người đi lại: độ lệch chuẩn = 2,55,0 dBm (biến động mạnh)

Firmware đo độ lệch chuẩn của 40 lần đọc RSSI gần nhất để phát hiện bất thường.


Các thuật toán phát hiện

Firmware kết hợp 6 hệ thống phát hiện độc lập:

1. Bộ lọc Kalman

Giảm nhiễu đo lường nhưng vẫn giữ các cạnh tín hiệu (các thay đổi quan trọng).

filtered_value = estimate + gain × (measurement - estimate)
  • Kalman gain: 0,15 (cân bằng độ nhạy và độ ổn định)
  • Tác dụng: loại bỏ 6070% nhiễu ngẫu nhiên mà ít gây trễ

2. Làm mượt hàm mũ

Lớp lọc thứ hai để tính đường nền rất mượt.

smooth = 0.15 × new_reading + 0.85 × previous_smooth

3. Phân tích phương sai cửa sổ trượt

Phát hiện bất thường bằng cách phân tích hành vi tín hiệu theo thời gian.

variance = √(Σ(reading - mean)² / N)
  • Kích thước cửa sổ: 40 mẫu, tương đương khoảng 1,4 giây dữ liệu thời gian thực
  • Ngưỡng chuyển động chậm: độ lệch chuẩn 1,8 dBm
  • Ngưỡng chuyển động nhanh: độ lệch chuẩn 3,5 dBm

4. Phát hiện Z-score (bất thường thống kê)

Xác định các lần đọc lệch khỏi chuẩn thống kê.

z_score = |current_reading - mean| / standard_deviation
  • Ngưỡng bất thường: Z > 2,5 (độ tin cậy thống kê 99,4%)
  • Tác dụng: hạn chế dương tính giả do các đột biến ngẫu nhiên

5. Phát hiện đỉnh

Bắt các chuyển tiếp tín hiệu đột ngột khi bạn bắt đầu di chuyển vào phòng.

peak = max(Δ_current - Δ_previous)

Thuật toán kiểm tra liệu bản thân tốc độ thay đổi có biến động đột ngột hay không.

6. Tốc độ thay đổi

Định lượng mức độ thay đổi nhanh của tín hiệu.

rate = mean(recent_5_samples) - mean(old_5_samples)

Chuyển động nhanh thường tạo tốc độ thay đổi lớn hơn.


Logic phát hiện (đa tiêu chí)

Firmware kích hoạt phát hiện khi:

motion = (variance > 1.8) OR (Z-score > 2.5 AND peak > 2.0)

Diễn giải: chuyển động được phát hiện nếu độ lệch chuẩn tín hiệu cao, hoặc có bất thường thống kê đồng thời có chuyển tiếp tín hiệu sắc nét.

Sau khi có chuyển động, điều kiện phải duy trì 3 chu kỳ liên tiếp thì LED mới bật. Đây là cổng bền vững để loại bỏ dương tính giả.


Dữ liệu đầu ra thời gian thực

Serial Plotter (đồ thị)

Mở Tools > Serial Plotter trong Arduino IDE để xem:

  • Raw: cường độ WiFi trực tiếp
  • Kalman: tín hiệu đã giảm nhiễu
  • Smooth: đường nền đã làm mượt
  • Baseline: mức tín hiệu kỳ vọng hiện tại
  • Variance: độ lệch chuẩn, chỉ báo chuyển động
  • ZScore: độ lệch thống kê

Serial Monitor (văn bản)

Ví dụ dữ liệu thời gian thực:

[WALKING] Conf:75% | Quality:92% | Rate:2.5 | Total:14
[CALM] Conf:20% | Quality:88% | Rate:0.3 | Total:14
  • Intensity: CALM → SLOW → WALKING → FAST → SPRINT
  • Confidence: độ chắc chắn phát hiện, 0100%
  • Quality: điểm ổn định tín hiệu, 0100%
  • Rate: tốc độ tín hiệu thay đổi
  • Total: tổng số lần phát hiện trong phiên

Lắp đặt vật lý (rất quan trọng với độ chính xác)

Cấu hình tối ưu

                Router (WiFi AP)
                    |
                  [3-5m]
                    |
          [Người đi qua tại đây]
                    |
                 [ESP32-S3]

Quy tắc đặt thiết bị:

  1. Khoảng cách: 35 m giữa router và ESP32-S3.
  2. Tầm nhìn: người nên đi qua gần vị trí giữa hai thiết bị.
  3. Vị trí router: đặt anten thẳng đứng để có vùng phủ gần đẳng hướng.
  4. Tránh: lò vi sóng, điện thoại không dây và các thiết bị 2,4 GHz khác.

Đánh giá thực tế

  • Lắp đặt tốt: độ chính xác phát hiện 8592%.
  • Lắp đặt kém: 6075%.
  • Kém nhất: đặt sát router hoặc bị chắn đường truyền thẳng có thể làm hệ thống không hiệu quả.

Độ chính xác và giới hạn

Hoạt động tốt với

  • Nhận biết trạng thái có người trong phòng.
  • Phát hiện chuyển động: đi bộ, chạy, cử chỉ lớn.
  • Phản hồi thời gian thực: độ trễ khoảng 35 ms.
  • Chống báo động giả: cổng bền vững 3 chu kỳ và xác thực đa tiêu chí.

⚠️ Giới hạn do đặc tính vật lý

Tình huống Vấn đề
Chuyển động rất chậm (đang ngủ) Có thể không phát hiện dao động mức hô hấp
Nhiều người Tín hiệu bị trung bình; chỉ nhận biết “có người”, không đếm người
Vật thể kim loại lớn Phản xạ có thể gây dương tính giả
WiFi ở xa Biến động tín hiệu yếu khó phân biệt với nhiễu
Tường kim loại Tán xạ tín hiệu làm giảm độ tin cậy

Không thể thực hiện chỉ với WiFi

  • Phân biệt chính xác đứng hay ngồi.
  • Xác định đó là ai.
  • Định vị chính xác hơn mức “có/không có người trong phòng”.
  • Đạt độ chính xác trên 95% (giới hạn vật lý thực tế khoảng 90%).

Để vượt 90% độ chính xác, có thể cân nhắc:

  • Nhiều ESP32-S3 để tam giác hóa.
  • Phân loại bằng học máy.
  • Cảm biến kết hợp: WiFi + PIR.
  • WiFi 5 GHz (nhạy hơn nhưng tầm ngắn hơn).

Hướng dẫn cài đặt

Phần cứng cần có

  • Bo phát triển ESP32-S3
  • Cáp USB để nạp firmware
  • Mạng WiFi 2,4 GHz
  • LED nối vào LED_PIN đã cấu hình trong WiFiSense.ino (GPIO2 chỉ là mặc định; hãy kiểm tra chân LED của board)

Cài đặt phần mềm

  1. Cài Arduino IDE nếu chưa có

  2. Thêm hỗ trợ board ESP32

    • Mở Arduino IDE > Preferences.

    • Thêm URL sau vào Additional Board Manager URLs:

      https://espressif.github.io/arduino-esp32/package_esp32_index.json
      
    • Vào Tools > Board > Board Manager.

    • Tìm esp32 và cài esp32 by Espressif Systems.

  3. Thư viện cần thiết

    • WiFi.h được cung cấp sẵn cùng ESP32 board support.
    • Không cần thư viện bên ngoài. ✓
  4. Cấu hình board

    Tools > Board: ESP32S3 Dev Module
    Tools > USB CDC On Boot: Enabled
    Tools > Flash Size: default
    Tools > Baud Rate: 115200
    
  5. Cập nhật thông tin WiFi

    • Mở WiFiSense.ino.

    • Tìm các dòng:

      const char* ssid = "YOUR_SSID";
      const char* password = "YOUR_PASSWORD";
      
    • Thay bằng tên WiFi và mật khẩu của bạn.

  6. Nạp firmware cho ESP32-S3

    • Kết nối ESP32-S3 bằng USB.
    • Chọn đúng cổng tại Tools > Port.
    • Nhấn Upload.
    • Chờ thông báo build/nạp thành công.
  7. Xem dữ liệu thời gian thực

    • Mở Tools > Serial Monitor, đặt tốc độ 115200.

    • Hoặc mở Tools > Serial Plotter để xem đồ thị.

    • Bạn sẽ thấy ví dụ như:

      [CALM] Conf:15% | Quality:89% | Rate:0.2 | Total:0
      

Hiệu chỉnh và tinh chỉnh

Nếu bỏ sót chuyển động

Hạ các ngưỡng để tăng độ nhạy. Trong firmware hiện tại, chỉnh các hằng số sau:

constexpr float SLOW_MOVEMENT_THRESHOLD = 1.5f;  // mặc định 1.8
constexpr float FAST_MOVEMENT_THRESHOLD = 3.0f;  // mặc định 3.5
constexpr float Z_SCORE_THRESHOLD = 2.2f;        // mặc định 2.5

Nếu có nhiều báo động giả

Tăng yêu cầu bền vững:

constexpr uint8_t PERSISTENCE_REQUIRED = 5;  // mặc định 3

Hoặc tăng ngưỡng phương sai:

constexpr float SLOW_MOVEMENT_THRESHOLD = 2.0f;  // mặc định 1.8

Điều chỉnh tốc độ phát hiện

Giảm khoảng cách giữa các mẫu:

constexpr uint16_t SAMPLE_INTERVAL_MS = 25;  // mặc định 35 ms

Học môi trường

Firmware tự điều chỉnh đường nền theo phòng:

constexpr float ADAPTIVE_ALPHA = 0.008f;

Hãy cho thiết bị hoạt động trong phòng yên tĩnh vài phút để đường nền thích nghi ổn định hơn.


Cách sử dụng

Hiệu chuẩn ban đầu ⚠️ QUAN TRỌNG

Thiết bị cần một giai đoạn hiệu chuẩn trong phòng trống trước khi phát hiện chuyển động chính xác. Firmware hiện tại thu 200 mẫu, mất khoảng 6 giây; nếu môi trường nhiễu, hãy để phòng trống lâu hơn:

  1. Cấp nguồn ESP32-S3 trong phòng cần giám sát.
  2. Để phòng trống, không có người di chuyển.
  3. Đợi firmware kết nối WiFi và hoàn tất hiệu chuẩn RSSI.
  4. Serial Monitor sẽ hiển thị đường nền; phương sai trong môi trường yên tĩnh thường thấp (<1,0 dBm).
  5. Sau đó, kiểm tra bằng cách đi qua vùng giữa router và ESP32-S3.

Vì sao cần hiệu chuẩn?

  • Mỗi phòng có đặc tính WiFi khác nhau (tường, nội thất, khoảng cách tới router).
  • Thuật toán đường nền thích nghi cần điều kiện bình thường làm tham chiếu.
  • Nếu không có tham chiếu, hệ thống khó phân biệt nhiễu phòng với chuyển động người.

Vận hành cơ bản

  1. Cấp nguồn ESP32-S3.
  2. Chờ kết nối WiFi.
  3. Giữ phòng yên tĩnh trong giai đoạn hiệu chuẩn.
  4. Mở Serial Monitor hoặc Serial Plotter.
  5. LED sẽ bật khi phát hiện chuyển động.
  6. Serial hiển thị điểm tin cậy và cường độ chuyển động.

Theo dõi hiệu năng

Quan sát Serial Plotter:

  • Variance: nên vượt 1,8 khi có chuyển động.
  • ZScore: có thể vượt 2,5 trong lúc di chuyển.
  • Confidence: thường trên 50% khi có chuyển động rõ rệt.

Khắc phục sự cố

Vấn đề Cách xử lý
LED không sáng Kiểm tra WiFi, LED_PIN, và mức kích hoạt LED_ON_LEVEL trong WiFiSense.ino
LED luôn sáng Tăng PERSISTENCE_REQUIRED hoặc ngưỡng phương sai
Phát hiện chập chờn Đặt ESP32-S3 tại vị trí WiFi tốt hơn, cách router 35 m
Không có Serial output Kiểm tra baud rate 115200 và cáp USB có hỗ trợ dữ liệu
Nhiều báo động giả Giảm ADAPTIVE_ALPHA xuống 0,005 để đường nền học chậm hơn

Thông số hiệu năng

Chỉ số Giá trị
Độ trễ phát hiện 3570 ms
Tỷ lệ dương tính giả <5% khi bố trí tốt
Tỷ lệ phát hiện đúng 8592%
Công suất tiêu thụ ~100 mA khi hoạt động
Thời gian hiệu chuẩn 200 mẫu, khoảng 6 giây; nên để trống lâu hơn nếu nhiễu
Tầm bố trí tối ưu 35 m
Ngưỡng phương sai tối thiểu 1,8 dBm

Chi tiết kỹ thuật

Sử dụng bộ nhớ

ESP32-S3 có bộ nhớ dư dả cho các buffer và biến xử lý của firmware này. Mức sử dụng Flash/SRAM thực tế phụ thuộc phiên bản Arduino-ESP32, cấu hình board và tùy chọn build.

Hiệu năng thuật toán

  • Bộ lọc Kalman: O(1), thời gian hằng.
  • Tính phương sai: O(40), tuyến tính theo cửa sổ ngắn.
  • Tính Z-score: O(40), tuyến tính theo cửa sổ ngắn.
  • Chu kỳ đo: mặc định 35 ms.

Đặc điểm nhiễu

Phép đo RSSI WiFi thường có:

  • Độ lệch chuẩn: ±23 dBm do nhiễu ngẫu nhiên.
  • Trôi tín hiệu: ±5 dBm trong nhiều giờ do thay đổi môi trường.
  • Ngoại lai: khoảng 15% lần đọc có thể là đột biến.

Bộ lọc Kalman và đường nền thích nghi giúp giảm ảnh hưởng của các hiện tượng này.


Tài liệu tham khảo

  1. Đặc tính điện môi của mô người

    • Stogryn, A. (1986). Equations for calculating the dielectric constant of saline water.
    • Độ hấp thụ của nước ở 2,4 GHz: ~0,15 dB/cm.
  2. Truyền sóng WiFi trong môi trường trong nhà

    • Rappaport, T. S. (2002). Wireless Communications: Principles and Practice.
    • Mô hình suy hao không gian tự do với các yếu tố môi trường.
  3. Phát hiện bất thường thống kê

    • Chandola, V., và cộng sự (2009). Anomaly Detection: A Survey.
    • Phương pháp Z-score cho ngoại lai đơn biến.

Hướng phát triển

Chưa triển khai, nhưng có thể thực hiện:

  • Phân loại bằng học máy (người, thú cưng, luồng gió)
  • Nhiều ESP32-S3 để tam giác hóa
  • Tích hợp home automation qua MQTT
  • Ghi log đám mây về trạng thái có người
  • Học máy huấn luyện theo từng phòng
  • Biến thể WiFi 5 GHz (nhạy hơn nhưng khoảng cách ngắn hơn)

Giấy phép

Dự án được cung cấp nguyên trạng cho mục đích học tập và sử dụng cá nhân.


Danh sách kiểm tra nhanh

  • ESP32-S3 đã kết nối và cài driver USB
  • Arduino IDE đã cài ESP32 board support
  • Đã cập nhật thông tin WiFi trong code
  • Firmware đã nạp thành công
  • Serial Monitor có dữ liệu
  • LED phản hồi khi có chuyển động
  • Thiết bị được đặt tối ưu, cách router 35 m
  • Đã để thiết bị hiệu chuẩn trong môi trường yên tĩnh
  • Đã thử đi qua giữa router và ESP32-S3

Cần hỗ trợ? Xem phần khắc phục sự cố trước, sau đó kiểm tra lại vị trí đặt thiết bị — đây là yếu tố quyết định lớn đến độ chính xác.

Chúc bạn phát hiện hiệu quả!

S
Description
Firmware ESP32-S3 phát hiện sự hiện diện/chuyển động của người trong phòng bằng phân tích tín hiệu Wi‑Fi và xử lý tín hiệu thống kê. Không cần cảm biến bổ sung — chỉ cần Wi‑Fi.
https://orangepi.vn
Readme
111 KiB
Languages
C++ 100%