Home Ứng dụng IoT - Internet of Things Điều khiển LED qua Web Server với ESP8266

Điều khiển LED qua Web Server với ESP8266

0
Điều khiển LED qua Web Server với ESP8266

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

Web Server

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

Station (STA) Mode

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.

Soft Access Point (AP) Mode

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

STTTên linh kiệnSố lượng
1ESP82661
2Điện trở 470Ω1
3LED1
4Cáp USB1
5Breadboard và dây cắm1

Phần mềm:

Arduino IDE

Đấ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.
Serial Monitor
  • 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.

Điều khiển LED qua WiFi

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.

LEAVE A REPLY

Please enter your comment!
Please enter your name here