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.

ESP32 Access point điều khiển ESP32

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.

Đặt ESP32 làm Access Point
Đặt ESP32 làm Access Point

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):

Kết nối phần cứng và cấu hình ESP32 thành Access Point

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:

In địa chỉ IP của ESP32 ra Serial Monitor

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):

Kết nối với ESP32 Access Point
Kết nối với ESP32 Access Point bằng điện thoại

Sau đó, bạn tiến hành nhập mật khẩu (nếu có) mà bạn đã cài trước đó:

Nhập mật khẩu WiFi để kết nối với ESP32 Access Point
Nhập mật khẩu WiFi để kết nối với ESP32 Access Point

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:

Kết nối Access Point và mở Web Server
Kết nối Access Point và mở Web Server

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:

Kết nối với ESP32 Access Point qua laptop
Kết nối với ESP32 Access Point qua laptop

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é!

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *