- vừa được xem lúc

WiFi trên ESP32 (Arduino IDE)

0 0 3

Người đăng: Nguyễn Đặng Triều

Theo Viblo Asia

🌏 Refrence

📋 Mục lục

Dưới đây là nội dung mà bài viết này sẽ đề cập tới, nếu chưa có nội dung mà bạn mong muốn hãy bình luận bên dưới.

  • Tìm hiểu về các mode WiFi
  • Quét mạng WiFi
  • Kết nối mạng WiFi
  • Đo cường độ tín hiệu WiFi kết nối
  • Địa chỉ IP của ESP32
  • Ngắt kết nối WiFi
  • Kết nối lại WiFi
  • Hostname của ESP32

1. ESP32 WiFi Modes

ESP32 có thể hoạt động ở các mode sau: Wi-Fi Station, Access Point hoặc cả 2 mode này. Để thiết lập WiFi mode, hãy dùng WiFi.mode().

  • WiFi.mode(WIFI_STA): Đóng vai trò client, kết nối với Access Point.
  • WiFi.mode(WIFI_AP): Đóng vai trò Access Point, các client khác hay ESP32 ở mode Wifi station có thể kết nối.
  • WiFi.mode(WIFI_AP_STA): Ở cả 2 mode.

Wi-Fi Station

Ở mode này, esp32 có thể kết nối với các mạng khác như router. Trong trường hợp này, router sẽ gán một địa chỉ IP duy nhất cho esp32 của ban. Và cũng có thể giao tiếp với các esp32 khác trong cùng một mạng nhờ vào địa chỉ IP của từng thiết bị. image.png

Access Point

  • Ở mode này, esp32 sẽ làm trung tâm kết nối của các thiết bị, ví dụ như điện thoại, laptop, esp khác (mode staion),...
  • esp32 sẽ tạo một mạng WiFi của riêng nó. Điều này rất có lợi nếu bạn muốn tạo một mạng WiFi nội bộ giữa các thiết bị esp32 giao tiếp với nhau. image.png

2. Quét mạng WiFi.

  • ESP32 có thể quét các mạng WiFi trong phạm vi của nó, hãy sử dụng hàm WiFi.scanNetworks().
  • Việc làm này rất hữu ích khi ta muốn kết nối với một WiFi nào đó, cần phải kiểm tra được là WiFi đó có nằm trong phạm vi quét được của ESP32 hay không.
  • image.png

Code mẫu

#include "WiFi.h" void setup() { Serial.begin(115200); // Set WiFi to station mode and disconnect from an AP if it was previously connected WiFi.mode(WIFI_STA); WiFi.disconnect(); delay(100); Serial.println("Setup done");
} void loop() { Serial.println("scan start"); // WiFi.scanNetworks will return the number of networks found int n = WiFi.scanNetworks(); Serial.println("scan done"); if (n == 0) { Serial.println("no networks found"); } else { Serial.print(n); Serial.println(" networks found"); for (int i = 0; i < n; ++i) { // Print SSID and RSSI for each network found Serial.print(i + 1); Serial.print(": "); Serial.print(WiFi.SSID(i)); Serial.print(" ("); Serial.print(WiFi.RSSI(i)); Serial.print(")"); Serial.println((WiFi.encryptionType(i) == WIFI_AUTH_OPEN)?" ":"*"); delay(10); } } Serial.println(""); // Wait a bit before scanning again delay(5000);
}

3. Kết nối mạng WiFi

Để có thể kết nối với một mạng WiFi, cần phải biết SSIDpassword của WiFI đó. Ngoài ra cần phải kiểm tra thử mạng đó có nằm trong phạm vi kết nối của ESP32 hay không.

Định nghĩa

const char* ssid = "tên wifi";
const char* password = "mật khẩu của wifi"

Tạo một hàm khởi tạo initWiFi() để chạy trong setup()

void initWiFi() { WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); Serial.print("Connecting to WiFi .."); while (WiFi.status() != WL_CONNECTED) { Serial.print('.'); delay(1000); } Serial.println(WiFi.localIP());
}

Để biết được trạng thái kết nối WiFi như nào ?, dùng WiFi.status(). Hàm này sẽ trả về những thông tin sau.

  • WL_IDLE_STATUS: Idle ngay sau khi gọi WiFi.begin() nhưng chưa kết nối.
  • WL_NO_SSID_AVAIL: Không tìm thấy SSID yêu cầu (tên sai, ngoài phạm vi, ...).
  • WL_SCAN_COMPLETED: Quét mạng Wi-Fi (WiFi.scanNetworks()) đã hoàn tất.
  • WL_CONNECTED: Kết nối thành công.
  • WL_CONNECT_FAILED: Kết nối thất bại sau nhiều lần thử.
  • WL_CONNECTION_LOST: Mất kết nối giữa chừng (Router bị tắt, mạng yếu, ....)
  • WL_DISCONNECTED: Ngắt kết nối khỏi Wi-Fi (do gọi WiFi.disconnect() hoặc bị ngắt từ phía router).

4. Đo cường độ kết nối WiFi

  • Để đo cường độ kết nối Wifi, ta chỉ cần gọi WiFi.RSSI() sau khi kết nối.
  • Đơn vị: dBM (số âm). Giá trị tham khảo từ bảng sau: image.png

Ví dụ

#include <WiFi.h> // Replace with your network credentials (STATION)
const char* ssid = "tên wifi";
const char* password = "mật khẩu wifi"; void initWiFi() { WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); Serial.print("Connecting to WiFi .."); while (WiFi.status() != WL_CONNECTED) { Serial.print('.'); delay(1000); } Serial.println(WiFi.localIP());
} void setup() { Serial.begin(115200); initWiFi(); Serial.print("RRSI: "); Serial.println(WiFi.RSSI());
} void loop() { // put your main code here, to run repeatedly:
}

5. ESP32 IP Address

Lấy ESP32 IP Address

  • Khi đặt ESP32 ở chế độ Wifi station, nó hoạt động giống như một thiết bị client (laptop, điện thoại,....) kết nối vào mạng Wifi.
  • Router sẽ gán một địa chỉ IP duy nhất cho mạch ESP32 kết nối. Dùng hàm WiFi.localIP() để lấy giá trị địa chỉ này.
  • IP này chỉ dùng trong mạng LAN nội bộ (local network), không phải IP công cộng trên Internet.
Serial.println(WiFi.localIP());

Đặt địa chỉ IP tĩnh

Thay vì nhận một địa chỉ IP ngẫu nhiên, ta có thể đặt một địa chỉ IP mong muốn cho ESP32 bằng hàm WiFi.config()

6. Ngắt kết nối Wifi network

Để ngắt kết nối với mạng Wifi đã kết nối trước đó, sử dụng hàm WiFi.disconnect().

7. Kết nối lại với Wifi network

Để kết nối lại mạng Wifi sau khi bị ngắt, ta sẽ sử dụng hàm WiFi.reconnect() để cố gắng kết nối lại với điểm truy cập trước đó.

WiFi.reconnect()

Hoặc,

WiFi.disconnect();
WiFi.begin(ssid, password);

8. ESP32 kết nối nhiều WiFi

  • ESP32 cho phép ta kết nối nhiều mạng WiFi (SSID/password). ESP32 sẽ kết nối với mạng có tín hiệu RSSI mạnh nhất. Nếu bị mất kết nối thì nó sẽ kết nối với mạng mạnh nhì có trong danh sách
  • Thêm #include "WiFiMulti.h.

9. ESP32 Hostname

  • Mỗi ESP32 khi kết nối vào mạng thì sẽ được nhận diện bằng địa chỉ IP + Hostname, (Hostname ở đây có nghĩa là tên của chính thiết bị ESP32 đó).
  • Để có thể đặt tên theo ý muốn, hãy sử dụng hàm WiFi.setHostname(tên esp32); trước khi gọi WiFi.begin();

Code mẫu

#include <WiFi.h> // Replace with your network credentials
const char* ssid = "tên wifi";
const char* password = "mật khẩu wifi";
// Change the hostname
const char* hostname = "esp32-node-temperature"; // đây là tên mới của thiết bị ESP32 void initWiFi() { WiFi.mode(WIFI_STA); WiFi.config(INADDR_NONE, INADDR_NONE, INADDR_NONE, INADDR_NONE); WiFi.setHostname(hostname); WiFi.begin(ssid, password); Serial.print("Connecting to WiFi..."); while (WiFi.status() != WL_CONNECTED) { Serial.print('.'); delay(1000); } Serial.print("\nESP32 IP Address: "); Serial.println(WiFi.localIP()); Serial.print("ESP32 HostName: "); Serial.println(WiFi.getHostname()); Serial.print("RRSI: "); Serial.println(WiFi.RSSI());
} void setup() { Serial.begin(115200); initWiFi();
} void loop() { // put your main code here, to run repeatedly:
}

Bình luận