Dự án cửa tự động ESP32 IoT – Garage Door

Cửa Garage khá nặng và việc đóng mở khá bất tiện. Do đó, chúng ta sẽ làm hệ thống cửa tự động ESP32 này, cho phép kết nối cửa Garage với IoT và điều khiển chúng chỉ bằng 1 click đơn giản trên điện thoại. Thật thú vị phải không? IoTZone sẽ hướng dẫn bạn cách dùng ESP32 và Arduino IDE để làm dự án này.

Chuẩn bị

  • Mạch ESP32
  • 2 x động cơ Servo SG90
  • Breadboard
  • Nguồn cấp điện
  • Dây Jumper

ESP32 là một mạch vi điều khiển rất mạnh mẽ, có hỗ trợ WiFi và chi phí khá thấp. Nếu chưa có thiết bị này, bạn có thể mua ESP32 tại đây.

2 động cơ Servo dùng để phục vụ cơ cấu nâng cửa Garage, chúng quay từ 0 đến 190 độ.

Chúng ta cần nguồn điện 5V để phục vụ hệ thống này, bạn có thể sử dụng sạc dự phòng hoặc Adapter 5V.

Sơ đồ kết nối

Vì không sử dụng cảm biến nào khác mà chỉ dùng Servo nên dự án cửa tự động ESP32 này khá đơn giản, bạn chỉ cần kết nối 2 Servo với mạch ESP32 như sơ đồ sau:

Sơ đồ kết nối cửa tự động ESP32 IoT

Tổng kết:

Servo 1ESP32
Chân VCC (màu đỏ)Chân VIN
Chân GND (màu nâu)Chân GND
Chân PLC (màu vàng)Chân D13
Servo 2ESP32
Chân VCCChân VIN
Chân GNDChân GND
Chân PLCChân D14

Chúng ta sẽ dùng dây Jumper và breaboard để hoàn thành sơ đồ kết nối cho dự án ESP32 IoT trên. Ngoài ra, mô hình cửa Garage sẽ được xây dựng bằng các bìa giấy Carton đơn giản để mình họa:

Sơ đồ kết nối cửa tự động ESP32 IoT
Sơ đồ kết nối cửa tự động ESP32 IoT

Cách lập trình cửa tự động ESP32

Để lập trình dự án cửa tự động ESP32, bạn cần tập trung vào 2 việc:

  • Điều khiển Servo bằng ESP32
  • Xây dựng Web Server để điều khiển qua Internet

Ở cuối bài viết mình có để đoạn code hoàn chỉnh, nếu không cần hiểu ý nghĩa của từng đoạn code thì bạn có thể kéo trực tiếp xuống phía dưới để xem xét nhé!

Còn đây là phần hướng dẫn lập trình chi tiết:

Khai báo thư viện cần dùng:

  • ESP32Servo: Dùng để điều khiển Servo
  • WiFi.h: Kích hoạt tính năng WiFi trong thiết bị
#include <ESP32Servo.h> 
#include <WiFi.h>

Tạo các biến để điều khiển Servo và tạo hằng số để lưu thông tin truy cập mạng WiFi. Lưu ý bạn cần đổi tên và mật khẩu WiFi thành WiFi của mình nhé

Servo servo1;
Servo servo2;
const char* ssid = "xyz"; // Tên WiFi của bạn
const char* password = "xxxxxxxx"; // Mật khẩu WiFi của bạn
int pos = 0;
WiFiServer server(80); // Tạo Web Server ở cổng 80
String header; // Stores the HTTP request
String doorstate = "off"; // Represents the current state of the door

Gán các chân cho động cơ Servo và tạo kết nối với WiFi, sau đó in ra trạng thái kết nối WiFi cho dự án ESP32 IoT và địa chỉ IP cục bộ trên Serial Monitor:

void setup() {
  servo1.attach(15); // Attach servo to GPIO pin 15
  servo2.attach(13); // Attach servo to GPIO pin 13
  Serial.begin(115200); // Begin serial communication for debugging
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
  delay(500);
  }
  Serial.println(""); // Empty line for spacing
  Serial.println("WiFi connected."); // Print connection status
  server.begin(); // Begin the server
  Serial.println("IP address: ");2
  Serial.println(WiFi.localIP()); // Display the local IP address
}

Trong vòng lặp, chúng ta cho hệ thống luôn ở chế độ nhận lệnh từ Web Server IoT và kiểm tra xem có dữ liệu nào được gửi tới không.

Nếu có, chúng sẽ nạp dữ liệu từ IP cục bộ và lưu vào biến, chúng được sử dụng để điều khiển Servo hoạt động.

Sau khi nhận được lệnh, chúng ta cần phải lưu ý rằng, chúng ta có 2 động cơ Servo phải quay đồng thời ở 1 góc khác nhau vì chúng ngược chiều nhau. Để làm được điều đó, chúng ta dùng vòng lặp While để cả 2 Servo lần lượt di chuyển đến vị trí mình muốn:

void loop() {
  WiFiClient client = server.available(); // Check for incoming clients
  if (client) {
  String currentLine = "";
  while (client.connected()) {
  if (client.available()) {
  char c = client.read(); // Read incoming data from the client
  header += c; // Store the incoming data
  if (c == '\n') {
  if (currentLine.length() == 0) {
  client.println("HTTP/1.1 200 OK");
  client.println("Content-type:text/html");
  client.println("Connection: close");
  client.println();
  if (header.indexOf("GET /door/on") >= 0) {
  doorstate = "on";
  while (pos < 100) {
  servo1.write(pos);
  servo2.write(180 - pos);
  pos++;
  delay(10);
  }
  } else if (header.indexOf("GET /door/off") >= 0) {
  doorstate = "off";
  while (pos > 0) {
  servo1.write(pos);
  servo2.write(180 - pos);
  pos--;
  delay(10);
  }
  }

Bên dưới đây là đoạn code để xây dựng Web Server dựa trên HTML. IoTZone đã thiết kế sẵn các nút và tiêu đề, bạn có thể thay đổi để phù hợp với dự án cửa tự động ESP32 IoT riêng của bạn.

Nói ngắn gọn, đây là 1 giao diện trang Web để chúng ta điều khiển cửa tự động ESP32 chỉ bằng 1 cú click:

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:,\">");
  client.println("<style>html { font-family: Times New Roman; display: inline-block; margin: 0px auto; text-align: center;}");
  client.println(".button { background-color: #195B6A; border: none; border-radius: 50%; color: white; padding: 16px 40px;");
  client.println("text-decoration: none; font-size: 30px; margin: 2px; cursor: pointer;}");
  client.println(".button2 {background-color: #77878A;}</style></head>");
  client.println("<body><h1>IoT Based Garage Door</h1>");
  if (doorstate == "off") {
  client.println("<p><a href=\"/door/on\"><button class=\"button\">Open</button></a></p>");
  } else {
  client.println("<p><a href=\"/door/off\"><button class=\"button button2\">Close</button></a></p>");
  }
  client.println("</body></html>");
  client.println();
  break;
  } else {
  currentLine = ""; // Clear the current line
  }
  } else if (c != '\r') {
  currentLine += c; // Add non-newline characters to the current line
  }
  }
  }
   header = ""; // Clear the header variable
   client.stop(); // Close the connection with the client
  }
}

Demo dự án ESP32 IoT cửa tự động

Sau khi nạp đoạn code trên vào ESP32 (nhớ chỉnh lại thông tin mạng WiFi), mình tiến hành làm mô hình cửa Garage cho nó từ các tấm carton nhiều màu sắc.

Cuối cùng, chúng ta gắn động cơ Servo vào của Garage bằng súng bắn keo:

Làm mô hình cửa tự động esp32

Cố định breadboard trên bức tường bên của mô hình và cố định các sợi dây kết nối:

Làm mô hình cửa tự động esp32

Bây giờ, hệ thống cửa tự động ESP32 của bạn đã sẵn sàng hoạt động! Hãy cấp nguồn điện cho nó nhé!

Làm mô hình cửa tự động esp32

Cách điều khiển cửa tự động ESP32 qua Web Server trên Smartphone:

  1. Đảm bảo điện thoại của bạn được kết nối cùng 1 mạng (bạn cũng có thể dùng điểm phát sóng của Smartphone để kết nối).
  2. Khi thiết bị đã kết nối với Internet, trên Serial Monitor hiển thị địa chỉ IP.
  3. Bạn nhập địa chỉ IP trên vào thanh tìm kiếm của trình duyệt Internet trên điện thoại, trang Web sẽ hiển thị.
  4. Bạn click vào nút trên trang Web để điều khiển cửa từ xa qua Internet

Chương trình đầy đủ

Dưới đây là đoạn code đầy đủ cho dự án cửa tự động ESP32 này:

#include <ESP32Servo.h>
#include <WiFi.h>
Servo servo1;
Servo servo2;
const char* ssid = "0000";
const char* password = "12345678";
int pos = 0;
WiFiServer server(80);     // Set port to 80
String header;             // Stores the HTTP request
String doorstate = "off";  // state of door
void setup() {
  servo1.attach(15);
  servo2.attach(13);
  Serial.begin(115200);
  // Set the pinmode of the pins to which the LEDs are connected and turn them low to prevent flunctuations
  //connect to access point
  WiFi.begin(ssid, password);
  Serial.print("Connecting to ");
  Serial.println(ssid);
  while (WiFi.status() != WL_CONNECTED) {
  delay(500);
  Serial.print(".");
  }
  // Print local IP address and start web server
  Serial.println("");
  Serial.println("WiFi connected.");
  server.begin();
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());  // this will display the Ip address of the Pi which should be entered into your browser
}
void loop() {
WiFiClient client = server.available();  // Listen for incoming clients
 if (client) {                   // If a new client connects,
 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) {
 client.println("HTTP/1.1 200 OK");
 client.println("Content-type:text/html");
 client.println("Connection: close");
 client.println();
 if (header.indexOf("GET /door/on") >= 0) {
 Serial.println("Door Open");
 doorstate = "on";
 while (pos < 100) {
 Serial.println(pos);
 servo1.write(pos);
 servo2.write(180 - pos);
 pos++;
 delay(10);
}
} else if (header.indexOf("GET /door/off") >= 0) {
  Serial.println("Door Close");
  doorstate = "off";
  while (pos > 0) {
  servo1.write(pos);
  servo2.write(180 - pos);
  Serial.println(pos);
  pos--;
  delay(10);
 }
 }
 // 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
 client.println("<style>html { font-family: Times New Roman; display: inline-block; margin: 0px auto; text-align: center;}");
 client.println(".button { background-color: #195B6A; border: none; border-radius: 50%; color: white; padding: 16px 40px;");
 client.println("text-decoration: none; font-size: 30px; margin: 2px; cursor: pointer;}");
 client.println(".button2 {background-color: #77878A;}</style></head>");
 client.println("<body><h1>IoT Based Garage Door</h1>");
 if (doorstate == "off") {
 client.println("<p><a href=\"/door/on\"><button class=\"button\">Open</button></a></p>");
 } else {
 client.println("<p><a href=\"/door/off\"><button class=\"button button2\">Close</button></a></p>");
 }
 client.println("</body></html>

Lời kết

Bạn đã thực hiện thành công dự án cửa tự động ESP32 IoT trên chưa? Hãy chia sẻ cùng IoTZone biết nhé.

IoTZone có cung cấp sẵn các mạch EPS32 cùng với nhiều bài hướng dẫn khác thú vị về chủ đề này trên Website, bạn đừng bỏ lỡ.

IoTZone – Chuyên cung cấp thiết bị điện tử & tài liệu cho Makers

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 *