Chào các bạn! Trong bài viết này tôi sẽ hướng dẫn các bạn sử dụng mô-đun ESP8266 như một web server để điều khiển một led đơn, module này cho phép kết nối WiFi và có thể hoạt động như một web server nhỏ. Chúng ta sẽ kết nối ESP8266 với mạng wifi cục bộ và có thể điều khiển đèn LED thông qua mạng cục bộ này. Nếu bạn muốn điều khiển đèn LED thông qua internet, bạn có thể sử dụng DDNS và Port Forwarding.
Web Server là gì và nó hoạt động như thế nào?
Máy chủ Web (Web Server) là nơi lưu trữ, xử lý và cung cấp các trang web cho các Web client. Web client không là gì ngoài một trình duyệt web được cài đặt trên máy tính hoặc điện thoại di động của chúng ta. Giao tiếp giữa máy khách (client) và máy chủ (server) diễn ra thông qua một giao thức đặc biệt gọi là giao thức truyền siêu văn bản (HTTP – Hypertext Transfer Protocol).
Trong giao thức này, máy khách bắt đầu giao tiếp bằng cách đưa ra yêu cầu một trang web cụ thể bằng HTTP và máy chủ phản hồi với nội dung của trang web đó hoặc thông báo lỗi nếu không thể thực hiện (Lỗi 404). Các trang được cung cấp bởi một máy chủ chủ yếu là các tài liệu HTML.
Tất cả các trang web được lưu trữ trên một số máy chủ web, chủ yếu là hệ điều hành dựa trên Linux được sử dụng trên web server. Bất kỳ máy tính nào cũng có thể được chuyển đổi thành web server, miễn là nó được kết nối với mạng.
Các chế độ hoạt động của ESP8266
Một trong những tính năng tuyệt vời nhất mà ESP8266 cung cấp là nó không chỉ kết nối với mạng WiFi hiện có và hoạt động như một Web Server, mà còn có thể thiết lập một mạng riêng, cho phép các thiết bị khác kết nối trực tiếp với nó và truy cập các trang web. Điều này là có thể bởi vì ESP8266 có thể hoạt động ở ba chế độ khác nhau: Station mode, Soft Access Point mode và cả hai cùng một lúc. Điều này cung cấp khả năng xây dựng các mạng dạng lưới (mesh network).
Station (STA) Mode
ESP8266 kết nối với mạng WiFi hiện có (được tạo bởi bộ định tuyến không dây của bạn) được gọi là Trạm (STA – Station).
Trong chế độ STA, ESP8266 lấy IP từ bộ định tuyến không dây được kết nối. Với địa chỉ IP này, nó có thể thiết lập một web server và phân phối các trang web cho tất cả các thiết bị được kết nối trong mạng WiFi hiện có.
Soft Access Point (AP) Mode
ESP8266 tạo ra mạng WiFi của riêng mình và hoạt động như một trung tâm (Giống như bộ định tuyến WiFi) cho một hoặc nhiều trạm được gọi là điểm truy cập (AP – Access Point). Không giống như bộ định tuyến WiFi, nó không có giao diện với mạng có dây. Vì vậy, chế độ hoạt động như vậy được gọi là điểm truy cập mềm (Soft Access Point). Ngoài ra số lượng trạm tối đa có thể kết nối với nó được giới hạn là năm.
Trong chế độ AP, ESP8266 tạo ra một mạng WiFi mới và đặt SSID (Tên của mạng) và địa chỉ IP cho nó. Với địa chỉ IP này, nó có thể phân phối các trang web đến tất cả các thiết bị được kết nối trong mạng riêng của mình.
Chuẩn bị
Phần cứng
STT | Tên linh kiện | Số lượng |
1 | ESP8266 | 1 |
2 | Điện trở 470Ω | 1 |
3 | LED | 1 |
4 | Cáp USB | 1 |
5 | Breadboard và dây cắm | 1 |
Phần mềm:
Đấu dây – Kết nối đèn LED với ESP8266 NodeMCU
Bây giờ chúng ta đã biết những điều cơ bản về cách thức hoạt động của web server và các chế độ mà ESP8266 có thể tạo ra một web server, đã đến lúc kết nối một đèn LED với ESP8266 NodeMCU mà chúng ta muốn điều khiển qua WiFi.
Bạn tiến hành kết nối đèn LED với GPIO D0 với điện trở giới hạn dòng điện 470Ω. Khi làm xong, bạn sẽ có một mạch điện tử trông giống như hình bên dưới.
Chương trình
#include <ESP8266WiFi.h>
const char* ssid = “ten-wifi”;
const char* password = “password-wifi”;
int LED = 16; // LED kết nối với chân D0
WiFiServer server(80);
void setup()
{
// Khởi động Serial Monitor
Serial.begin(115200);
delay(10);
// Khai báo chân điều khiển LED
pinMode(LED, OUTPUT);
digitalWrite(LED, LOW);
// Kết nối tới mạng Wifi
Serial.print(“Dang ket noi den mang…”);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(“.”);
}
Serial.println(“Da ket noi WiFi”);
// Khởi động Server
server.begin();
Serial.println(“Server da khoi dong”);
Serial.print(“Dia chi IP cua mang: “); // In địa chỉ IP trên Serial Monitor
Serial.println(WiFi.localIP());
Serial.print(“Copy va dan URL nay vao trinh duyet: http://”);
Serial.print(WiFi.localIP());
Serial.println(“/”);
}
void loop()
{
// Kiểm tra nếu có client kết nối
WiFiClient client = server.available();
if (!client)
{
return;
}
// Đợi client gửi dữ liệu
Serial.println(“Co client moi”);
while (!client.available())
{
delay(1);
}
// Đọc yêu cầu từ client
String request = client.readStringUntil(‘\r’);
Serial.println(request);
client.flush();
int value = LOW;
// Kiểm tra yêu cầu là gì
if (request.indexOf(“/LED=ON”) != -1)
{
digitalWrite(LED, HIGH); // Bật đèn LED
value = HIGH;
}
if (request.indexOf(“/LED=OFF”) != -1)
{
digitalWrite(LED, LOW); // Tắt đèn LED
value = LOW;
}
/*——————Tạo trang HTML———————*/
client.println(“HTTP/1.1 200 OK”);
client.println(“Content-Type: text/html”);
client.println(“”);
client.println(“<!DOCTYPE HTML>”);
client.println(“<html>”);
client.print(“TRANG THAI CUA DEN LED: “);
if (value == HIGH)
{
client.print(“SANG”);
}
else
{
client.print(“TAT”);
}
client.println(“<br><br>”);
client.println(“<a href=\”/LED=ON\”\”><button>BAT</button></a>”);
client.println(“<a href=\”/LED=OFF\”\”><button>TAT</button></a><br />”);
client.println(“</html>”);
delay(1);
Serial.println(“Ngat ket noi client”);
Serial.println(“”);
}
Giải thích chương trình
Chương trình bắt đầu bằng cách thêm thư viện ESP8266Wifi. Thư viện này cung cấp các phương thức WiFi cụ thể của ESP8266 mà chúng ta đang gọi để kết nối với mạng.
#include <ESP8266WiFi.h>
Nhập tên của ssid và mật khẩu, tức là, tên và mật khẩu WiFi của bạn.
const char* ssid = “ten-wifi”;
const char* password = “password-wifi”;
Set D0 làm chân ngõ ra. Khởi động server, khởi tạo giao tiếp nối tiếp với tốc độ baud 115200.
int LED = 16;
WiFiServer server(80);
void setup() {
Serial.begin(115200);
pinMode(LED, OUTPUT);
digitalWrite(LED, LOW);
Kết nối thực sự với WiFi được khởi tạo bằng cách gọi.
Serial.print(“Dang ket noi den mang… “);
WiFi.begin(ssid, password);
Quá trình kết nối có thể mất vài giây. Vòng lặp While () kiểm tra kết nối mô-đun ESP8266 với WiFi. Nếu nó được kết nối với WiFi thì trên Serial Monitor sẽ hiển thị thông báo “Da ket noi WiFi” và web server sẽ khởi động, ngược lại thì các dấu chấm (….) sẽ hiển thị trên Serial Monitor.
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(“.”);
}
Serial.println(“Da ket noi WiFi”);
server.begin();
Serial.println(“Server da khoi dong”);
Chương trình sẽ in địa chỉ IP của mô-đun ESP8266. Địa chỉ IP này được cung cấp bởi server DHCP chạy trên bộ định tuyến WiFi. Để truy cập nó, chúng ta cần kết nối hệ thống của chúng ta với cùng một mạng WiFi (hệ thống của chúng ta sẽ nhận một địa chỉ IP khác từ máy chủ DHCP của bộ định tuyến) và chúng ta cần nhập địa chỉ IP của ESP8266 vào trong trình duyệt của hệ thống chúng ta.
Serial.print(“Dia chi IP cua mang: “);
Serial.println(WiFi.localIP());
Serial.print(“Copy va dan URL nay vao trinh duyet: https://”);
Serial.print(WiFi.localIP()); Serial.println(“/”);
}
Chờ đợi và kiểm tra để một client được kết nối.
Lưu ý: Client chính là trình duyệt. Khi chúng ta truy cập địa chỉ IP của ESP8266 trong trình duyệt thì chính là gửi yêu cầu đến web server lắng nghe trên cổng TCP 80.
void loop()
{
WiFiClient client = server.available();
if (!client)
{
return;
}
Serial.println(“Waiting for new client”);
while(!client.available())
{
delay(1);
}
String request = client.readStringUntil(‘\r’);
Serial.println(request);
client.flush();
Tiếp theo, chúng ta sẽ điều khiển đèn LED và cung cấp phản hồi (trang HTML) dựa trên yêu cầu được cung cấp bởi trình duyệt.
int value = LOW;
if (request.indexOf(“/LED=ON”) != -1)
{
digitalWrite(LED, HIGH); value = HIGH;
}
if (request.indexOf(“/LED=OFF”) != -1)
{
digitalWrite(LED, LOW); value = LOW;
}
Viết code html để tạo một trang web với trạng thái BẬT và TẮT.
client.println(“HTTP/1.1 200 OK”);
client.println(“Content-Type: text/html”);
client.println(“”);
client.println(“<!DOCTYPE HTML>”);
client.println(“<html>”);
client.print(“TRANG THAI CUA DEN LED: “);
if(value == HIGH)
{
client.print(“SANG”);
}
else
{
client.print(“TAT”);
}
client.println(“<br><br>”);
client.println(“<a href=\”/LED=ON\”\”><button>BAT</button></a>”);
client.println(“<a href=\”/LED=OFF\”\”><button>TAT</button></a><br />”);
client.println(“</html>”);
delay(1);
Serial.println(“Ngat ket noi client”);
Serial.println(“”);
}
Các bước thực hiện
Dự án này được thiết kế để điều khiển một đèn LED sử dụng ESP8266, được lập trình như một web server. Chúng ta cần địa chỉ IP của thiết bị để truy cập nội dung html mà chúng ta đang lập trình.
- Viết chương trình trên trong Arduino IDE, thay thế tên và mật khẩu WiFi của bạn.
- Lưu chương trình (Save)
- Biên dịch chương trình (Compile)
- Upload chương trình (Upload)
- Mở Serial Monitor với tốc độ baud là 115200.
- Nhấn nút reset trên ESP8266, sau đó mô-đun này hiển thị địa chỉ IP của ESP8266.
- Copy địa chỉ IP đang hiển thị trên Serial Monitor và dán nó vào trình duyệt của bạn (được kết nối với cùng một mạng WiFi).
- Nhấp vào nút nhấn BAT và TAT để gửi lệnh điều khiển đèn LED sáng hoặc tắt đến ESP8266.
Sau đó, đèn LED được kết nối ở chân D0 của ESP8266 sẽ được điều khiển dựa trên lệnh đã cho.
Kết luận
Bây giờ thị bạn có thể điều khiển một đèn LED sáng hoặc tắt bằng cách sử dụng mô-đun ESP8266 đóng vai trò như một web server.
Để điều khiển các thiết bị gia dụng bằng webpge này, bạn chỉ cần thay thế đèn LED bằng rơ-le và bạn sẽ có thể điều khiển mọi thiết bị điện trong nhà của mình qua mạng Wifi.