Bài viết
Rèm cửa tự động điều khiển qua WiFi với ESP32
🪟
Rèm cửa thông minh bán sẵn thường yêu cầu thay cả bộ ray rèm, giá không hề rẻ. Với một động cơ bước, dây curoa GT2 và ESP32, bạn có thể lắp thêm một bộ kéo rèm tự động vào ray rèm hiện có — mở rèm buổi sáng theo ánh sáng tự nhiên, đóng rèm buổi tối theo lịch, hoặc điều khiển trực tiếp qua điện thoại khi đang nằm trên giường.
Nguyên lý hoạt động
- Động cơ bước (stepper motor) gắn với một bánh răng nhỏ kéo dây curoa nối với móc rèm — khi động cơ quay, dây curoa di chuyển kéo rèm theo hướng mở hoặc đóng.
- ESP32 điều khiển động cơ bước qua driver (A4988 hoặc TMC2209), biết chính xác rèm đang ở vị trí nào nhờ đếm số bước đã quay kể từ điểm mốc “đóng hoàn toàn” hoặc “mở hoàn toàn” (xác định ban đầu bằng công tắc hành trình hoặc bằng cách canh chỉnh thủ công).
- ESP32 chạy một web server nhỏ nhận lệnh mở/đóng/mở một phần (%) từ ứng dụng hoặc trình duyệt trên điện thoại, đồng thời hỗ trợ lịch trình theo giờ (ví dụ mở lúc 6:30 sáng, đóng lúc 21:00 tối) qua đồng bộ NTP.
- Tùy chọn thêm cảm biến ánh sáng (LDR) để tự mở rèm khi trời đủ sáng thay vì theo giờ cố định, thích ứng tốt hơn với thay đổi mùa.
Linh kiện
- ESP32 (có WiFi để chạy web server và đồng bộ NTP)
- Động cơ bước NEMA17 (đủ lực kéo rèm cỡ vừa) và driver A4988 hoặc TMC2209
- Dây curoa GT2 và bánh răng (pulley) phù hợp, hoặc bộ kit kéo rèm DIY bán sẵn dùng chung động cơ bước
- Cảm biến quang trở (LDR) tùy chọn để tự động theo ánh sáng
- Nguồn 12V cấp cho driver động cơ, và bộ hạ áp 5V/3.3V riêng cho ESP32
- Giá đỡ/khung gắn động cơ vào đầu ray rèm hiện có
Code mẫu
#include <WiFi.h>
#include <WebServer.h>
#include <AccelStepper.h>
const char* WIFI_SSID = "ten-wifi";
const char* WIFI_PASS = "mat-khau-wifi";
#define STEP_PIN 26
#define DIR_PIN 27
#define LDR_PIN 34
AccelStepper stepper(AccelStepper::DRIVER, STEP_PIN, DIR_PIN);
WebServer server(80);
const long STEPS_FULLY_CLOSED = 0;
const long STEPS_FULLY_OPEN = 8000; // hieu chinh theo do dai ray rem thuc te
long currentTarget = STEPS_FULLY_CLOSED;
void moveTo(int percentOpen) {
percentOpen = constrain(percentOpen, 0, 100);
currentTarget = map(percentOpen, 0, 100, STEPS_FULLY_CLOSED, STEPS_FULLY_OPEN);
stepper.moveTo(currentTarget);
}
void handleOpen() { moveTo(100); server.send(200, "text/plain", "Dang mo rem"); }
void handleClose() { moveTo(0); server.send(200, "text/plain", "Dang dong rem"); }
void handleSetPercent() {
if (server.hasArg("value")) {
moveTo(server.arg("value").toInt());
}
server.send(200, "text/plain", "OK");
}
void setup() {
Serial.begin(115200);
WiFi.begin(WIFI_SSID, WIFI_PASS);
while (WiFi.status() != WL_CONNECTED) delay(500);
Serial.println(WiFi.localIP());
stepper.setMaxSpeed(1000);
stepper.setAcceleration(500);
server.on("/open", handleOpen);
server.on("/close", handleClose);
server.on("/set", handleSetPercent); // vi du: /set?value=50
server.begin();
}
void loop() {
server.handleClient();
stepper.run();
// Tu dong mo rem khi troi sang neu can LDR (bo comment de kich hoat)
// int light = analogRead(LDR_PIN);
// if (light > 2500 && currentTarget != STEPS_FULLY_OPEN) moveTo(100);
}
Những lỗi thường gặp
- Không có công tắc hành trình hoặc điểm mốc ban đầu khiến vị trí “đóng hoàn toàn”/“mở hoàn toàn” bị lệch dần sau nhiều lần chạy do trượt bước (step skipping) — nên thêm công tắc giới hạn ở một đầu ray để hiệu chỉnh lại mốc mỗi khi rèm chạm biên.
- Chọn động cơ bước quá yếu so với trọng lượng rèm khiến động cơ bị trượt bước giữa chừng, làm sai lệch vị trí đã tính — chọn NEMA17 có mô-men đủ lớn, hoặc giảm tốc bằng bánh răng nếu cần thêm lực kéo.
- Không giới hạn dòng điện driver (current limit) đúng cách trên A4988/TMC2209 khiến động cơ quá nóng hoặc yếu lực — luôn chỉnh biến trở dòng theo thông số động cơ trước khi chạy thử tải nặng.
- Web server không có xác thực cho phép bất kỳ ai trong mạng LAN điều khiển rèm — nên thêm xác thực cơ bản hoặc giới hạn truy cập nếu mạng WiFi không hoàn toàn tin cậy.
Mở rộng
Kết hợp với dự án cảm biến hiện diện Bluetooth để tự động đóng rèm khi cả nhà đi vắng (tiết kiệm năng lượng làm mát), thêm điều khiển bằng giọng nói qua Home Assistant, hoặc lắp thêm cảm biến nhiệt độ ngoài trời để tự đóng rèm chống nắng gắt buổi trưa hè.
Thẻ:#esp32#home-automation#stepper-motor
Bình luận