ESP32 Trung bình

ESP32 Web Server: bật tắt LED bằng điện thoại

Biến ESP32 thành một máy chủ web nhỏ trong mạng WiFi nhà bạn. Mở trình duyệt trên điện thoại, bấm nút, LED bật tắt theo.

09.10.202610 phút đọc

ESP32 có thể tự chạy một máy chủ web. Khi điện thoại và ESP32 cùng vào một mạng WiFi, bạn gõ địa chỉ IP của bo vào trình duyệt là điều khiển được. Không cần internet, không cần dịch vụ bên ngoài.

Linh kiện cần có

Linh kiệnSố lượngGiá tham khảo
Bo ESP32 DevKit V11~90.000đ
LED 5mm1~1.000đ
Điện trở 220Ω1~500đ
Breadboard và dây cắm1 bộ~40.000đ

Giá tham khảo ở các cửa hàng linh kiện tại Việt Nam, tháng 10/2026. Giá thay đổi theo thời điểm và nơi bán.

Sơ đồ nối dây

Chân linh kiệnNối vào
LED chân dài (+)GPIO 26 qua điện trở 220Ω
LED chân ngắn (−)GND

Rút nguồn trước khi cắm dây. Kiểm tra lại toàn bộ sơ đồ rồi mới cắm USB.

Các bước thực hiện

Bước 1. Nối mạch

Cắm LED lên breadboard, chân dài nối qua điện trở 220Ω về GPIO 26, chân ngắn về GND. Luôn có điện trở, nối thẳng LED vào chân GPIO sẽ làm hỏng cả LED lẫn chân vi điều khiển.

Bước 2. Sửa tên và mật khẩu WiFi

Trong code bên dưới, thay TEN_WIFI và MAT_KHAU bằng thông tin mạng nhà bạn. Lưu ý ESP32 chỉ bắt được WiFi băng tần 2.4GHz, không vào được mạng 5GHz.

Bước 3. Nạp và lấy địa chỉ IP

Nạp chương trình, mở Serial Monitor ở 115200. Sau vài giây bo sẽ in ra dòng địa chỉ IP, ví dụ 192.168.1.24.

Bước 4. Mở trên điện thoại

Điện thoại vào cùng mạng WiFi, mở trình duyệt và gõ đúng địa chỉ IP đó. Trang điều khiển hiện ra với hai nút BẬT và TẮT.

Mã nguồn

web_server_led.ino
#include <WiFi.h>

const char* ssid     = "TEN_WIFI";
const char* password = "MAT_KHAU";

const int LED = 26;
WiFiServer server(80);

void setup() {
  Serial.begin(115200);
  pinMode(LED, OUTPUT);
  digitalWrite(LED, LOW);

  Serial.print("Dang ket noi WiFi");
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println();
  Serial.print("Dia chi IP: ");
  Serial.println(WiFi.localIP());
  server.begin();
}

void loop() {
  WiFiClient client = server.available();
  if (!client) return;

  String dong = client.readStringUntil('\r');
  client.flush();

  if (dong.indexOf("GET /bat") >= 0) digitalWrite(LED, HIGH);
  if (dong.indexOf("GET /tat") >= 0) digitalWrite(LED, LOW);

  client.println("HTTP/1.1 200 OK");
  client.println("Content-Type: text/html; charset=utf-8");
  client.println("Connection: close");
  client.println();
  client.println("<!doctype html><meta name='viewport' content='width=device-width'>");
  client.println("<h1>Dieu khien LED</h1>");
  client.print("<p>Trang thai: ");
  client.print(digitalRead(LED) ? "DANG BAT" : "DANG TAT");
  client.println("</p>");
  client.println("<p><a href='/bat'>BAT</a> &nbsp; <a href='/tat'>TAT</a></p>");
  client.stop();
}

Giải thích code

ESP32 mở cổng 80 và chờ. Mỗi lần trình duyệt gọi tới, bo đọc dòng đầu của yêu cầu để biết người dùng bấm vào đường dẫn nào: /bat thì kéo chân LED lên mức cao, /tat thì hạ xuống mức thấp. Sau đó bo gửi lại một trang HTML đơn giản.

Địa chỉ IP do router cấp nên có thể đổi sau khi mất điện. Muốn cố định, vào trang quản lý router đặt IP tĩnh theo địa chỉ MAC của ESP32.

Lỗi thường gặp

  • Kẹt ở dòng chấm chấm, không kết nối đượcSai mật khẩu, hoặc mạng đang là 5GHz. Tách riêng một mạng 2.4GHz trong cài đặt router.
  • Mở IP mà trình duyệt báo không truy cập đượcĐiện thoại đang dùng 4G hoặc khác mạng WiFi với ESP32.
  • Trang hiện nhưng bấm nút không ănKiểm tra lại LED cắm đúng chiều, chân dài là cực dương.