Cách đặt ESP32 Access Point – Điểm truy cập AP cho Web Server
ESP32 có thể tạo mạng WIFi riêng và hoạt động như một trạm WiFi (tương tự như Router WiFi), một điểm truy cập (Access Point) hoặc cả 2.
Trong hướng dẫn này, IoTZone sẽ hướng dẫn bạn cách cấu hình ESP32 làm một điểm truy cập AP, dựa trên phần mềm Arduino IDE.
Tổng quan
Trong đa số các bài hướng dẫn khác, mình đã hướng dẫn bạn cách kết nối ESP32 với bộ định tuyến không dây (xem hướng dẫn tại Cách tạo ESP32 Web Server với Arduino IDE). Với cách này, chúng ta có thể kết nối với ESP32 thông qua mạng cục bộ (local network).
Lúc này, bộ định tuyến giống một điểm truy cập (Access Point) còn ESP32 là một trạm. Chúng ta có thể kết nối với bộ định tuyến để điều khiển ESP32 hoạt động theo ý muốn.
Tuy nhiên, khi bạn đặt ESP32 làm điểm truy cập Access Point (điểm phát sóng), bạn có thể kết nối với mạch ESP32 bằng bất kỳ thiết bị nào thông qua mạng WiFi, mà không cần đến bộ định tuyến nữa.
Hiểu đơn giản, lúc đó chúng ta đã tạo ra một mạng WiFi riêng. Tất cả các thiết bị trạm WiFi gần đó đều có thể kết nối với nó, ví dụ như Smart Phone hoặc laptop.
Trong bài hướng dẫn này, mình sẽ hướng dẫn bạn cách đặt ESP32 làm Access Point trong các dự án Web Server của bạn. Qua đó, bạn không cần phải kết nối với các bộ định tuyến khi điều khiển ESP32.
Bởi vì ESP32 không kết nối xa hơn tới các mạng không giây (tương tự như bộ định tuyến), nên chúng ta còn có thể gọi nó là soft-AP (điểm truy cập hỗ trợ phần mềm), hay còn gọi là bộ định tuyến ảo. SoftAP sử dụng phần mềm để kích hoạt máy tính.
Cài đặt ESP32 trong Arduino IDE
Đầu tiên bạn cần cài đặt tiện ích ESP32 trong Arduino IDE theo hướng dẫn sau: Cách lập trình ESP32 bằng Arduino IDE (Windows, Linux, Mac OS X)
Lập trình đặt ESP32 Access Point (AP)
Trong hướng dẫn này, mình sẽ sửa đổi một chút code ở bài ESP32 Web Server trước đó, để cấu hình ESP32 thành điểm truy cập.
Đây là đoạn code dùng để đặt ESP32 làm điểm truy cập:
if (client) { // If a new client connects, Serial.println("New Client."); // print a message out in the serial port String currentLine = ""; // make a String to hold incoming data from the client while (client.connected()) { // loop while the client's connected if (client.available()) { // if there's bytes to read from the client, char c = client.read(); // read a byte, then Serial.write(c); // print it out the serial monitor header += c; if (c == '\n') { // if the byte is a newline character // if the current line is blank, you got two newline characters in a row. // that's the end of the client HTTP request, so send a response: if (currentLine.length() == 0) { // HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK) // and a content-type so the client knows what's coming, then a blank line: client.println("HTTP/1.1 200 OK"); client.println("Content-type:text/html"); client.println("Connection: close"); client.println(); // turns the GPIOs on and off if (header.indexOf("GET /26/on") >= 0) { Serial.println("GPIO 26 on"); output26State = "on"; digitalWrite(output26, HIGH); } else if (header.indexOf("GET /26/off") >= 0) { Serial.println("GPIO 26 off"); output26State = "off"; digitalWrite(output26, LOW); } else if (header.indexOf("GET /27/on") >= 0) { Serial.println("GPIO 27 on"); output27State = "on"; digitalWrite(output27, HIGH); } else if (header.indexOf("GET /27/off") >= 0) { Serial.println("GPIO 27 off"); output27State = "off"; digitalWrite(output27, LOW); } // Display the HTML web page client.println("<!DOCTYPE html><html>"); client.println("<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">"); client.println("<link rel=\"icon\" href=\"data:,\">"); // CSS to style the on/off buttons // Feel free to change the background-color and font-size attributes to fit your preferences client.println("<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}"); client.println(".button { background-color: #4CAF50; border: none; color: white; padding: 16px 40px;"); client.println("text-decoration: none; font-size: 30px; margin: 2px; cursor: pointer;}"); client.println(".button2 {background-color: #555555;}</style></head>"); // Web Page Heading client.println("<body><h1>ESP32 Web Server</h1>"); // Display current state, and ON/OFF buttons for GPIO 26 client.println("<p>GPIO 26 - State " + output26State + "</p>"); // If the output26State is off, it displays the ON button if (output26State=="off") { client.println("<p><a href=\"/26/on\"><button class=\"button\">ON</button></a></p>"); } else { client.println("<p><a href=\"/26/off\"><button class=\"button button2\">OFF</button></a></p>"); } // Display current state, and ON/OFF buttons for GPIO 27 client.println("<p>GPIO 27 - State " + output27State + "</p>"); // If the output27State is off, it displays the ON button if (output27State=="off") { client.println("<p><a href=\"/27/on\"><button class=\"button\">ON</button></a></p>"); } else { client.println("<p><a href=\"/27/off\"><button class=\"button button2\">OFF</button></a></p>"); } client.println("</body></html>"); // The HTTP response ends with another blank line client.println(); // Break out of the while loop break; } else { // if you got a newline, then clear currentLine currentLine = ""; } } else if (c != '\r') { // if you got anything else but a carriage return character, currentLine += c; // add it to the end of the currentLine } } } // Clear the header variable header = ""; // Close the connection client.stop(); Serial.println("Client disconnected."); Serial.println(""); } }
Khai báo thông tin SSID và mật khẩu
Bạn cần khai báo tên SSID và mật khẩu để truy cập vào ESP32. Trong ví dụ này, mình đặt tên SSID ESP32 thành ESP32-Access-Point, bạn có thể thay đổi tên này thành bất kỳ tên nào mình thích. Tương tự với mật khẩu, bạn không nhất thiết phải dùng 123456789 mà có thể dùng bất kỳ mật khẩu nào khác.
// You can customize the SSID name and change the password const char* ssid = "ESP32-Access-Point"; const char* password = "123456789";
Đặt ESP32 làm Access Point
Câu lệnh sau giúp đặt ESP32 làm điểm truy cập Access Point:
WiFi.softAP(ssid, password);
Dưới đây là một số tham số tùy chọn khác để bạn chuyển tới softAP:
- SSID: Tối đa 63 ký tự
- password: tối thiểu 8 ký tự, bạn có thể đặt là NULL nếu không muốn đặt mật khẩu cho WiFi
- channel: Số kênh WiFi (nằm từ 1 đến 13)
- SSID_hidden: 0 = hiển thị SSID, 1 = ẩn SSID
- Max_connection: Cài đặt số máy tối đa có thể kết nối vào WiFi
.softAP(const char* ssid, const char* password, int channel, int ssid_hidden, int max_connection)
Tiếp theo, chúng ta sẽ sử dụng softAPIP() để lấy địa chỉ IP của điểm truy cập Access Point và in nó ra Serial Monitor:
IPAddress IP = WiFi.softAPIP(); Serial.print("AP IP address: "); Serial.println(IP);
Đây là các chương trình bạn cần đưa vào sketch Web Server của mình để thiết lập ESP32 thành một điểm truy cập. Để hiểu rõ hơn về cách hoạt động của Web Server, bạn có thể đọc bài viết sau: Hướng dẫn về ESP32 Web Server
Chuẩn bị
Để tiến hành dự án này, bạn cần chuẩn bị các linh kiện điện tử như hình dưới:
- Mạch ESP32
- 2 đèn LED 5mm
- 2 điện trở 330 Ohm
- Breadboard
- Dây Jumer
Kết nối phần cứng
Bạn kết nối 2 đèn LED với mạch ESP32 tại cổng GPIO 26 và GPIO 27 như sau (Lưu ý: Hình dưới đang sử dụng mạch ESP32 DEVKIT DOIT với 26 chân, nếu bạn sử dụng mạch ESP32 khác, bạn nên xem lại sơ đồ chân trước khi kết nối):
Lấy địa chỉ IP ESP32
Upload chương trình vào mạch ESP32 (nhớ chọn đúng mạch và cổng COM nhé), sau đó bạn mở Serial Monitor, chọn tốc độ 115200 và nhấn nút bật ESP32 (Enable).
Màn hình sẽ in ra địa chỉ IP của ESP32 như hình dưới:
Kết nối với ESP32 Access Point
Để ESP32 chạy sketch mới, bạn chỉ cần lấy điện thoại thông minh ra, mở mục WiFi và kết nối với WiFi đã tạo (ở đây là ESP32-Access-Point):
Sau đó, bạn tiến hành nhập mật khẩu (nếu có) mà bạn đã cài trước đó:
Sau đó, mở trình duyệt Web của bạn và nhập địa chỉ IP của ESP32 vào thanh tìm kiếm. Một trang Web Server sẽ xuất hiện như hình dưới:
Tương tự, để kết nối với ESP32 Access Point trên máy tính hoặc laptop, bạn hãy mở mục Network and Internet Settings và chọn kết nối với WiFI ESP32 Access Point và nhập mật khẩu WiFi:
Vậy là đã xong! Chúng ta đã cấu hình ESP32 thành điểm truy cập AP (Access Point) thành công! Bây giờ, để truy cập vào Web Server và điều khiển đèn LED, bạn chỉ cần nhập địa chỉ IP của ESP32 vào trình duyệt và điều khiển bật tắt thôi. Rất đơn giản!
Kết luận
Hướng dẫn ngắn trên đã chia sẻ với bạn cách cấu hình EPS32 thành điểm truy cập Access Point. Lúc này, các thiết bị có khả năng truy cập WiFi có thể kết nối trực tiếp với mạch ESP32 mà không cần phải kết nối thông qua ộ định tuyến (router).
Nếu có thắc mắc gì khác, bạn có thể để lại bình luận bên dưới để thảo luận và được hỗ trợ nhé!