Chào mừng các bạn đến với một dự án thú vị khác, trong dự án này chúng ta sẽ xây dựng hệ thống nhà thông minh đơn giản dựa trên công nghệ IoT để điều khiển các thiết bị điện sử dụng mô-đun Wi-Fi NodeMCU ESP8266. Thông qua hệ thống này bạn có thể điều khiển các thiết bị điện trong nhà của mình bằng điện thoại qua một ứng dụng Android từ mọi nơi trên thế giới. Vâng, ước mơ của bạn là làm sao có thể điều khiển tắt/mở các thiết bị trong nhà của mình như đèn, quạt, tivi, …bằng cách sử dụng lệnh thoại sẽ trở thành hiện thực một khi bạn hoàn tất dự án thú vị này.
Chúng ta cùng bắt đầu thực hiện các bạn nhé!
Chuẩn bị linh kiện
STT | Linh kiện | Số lượng |
1 | NodeMCU ESP8266 -12E | 1 |
2 | Module Relay 4 kênh | 1 |
3 | LED | 4 |
4 | Điện trở 220Ω | 4 |
5 | Breadboard | 1 |
6 | Dây cắm Breadboard |
Sơ đồ khối
NodeMCU được giao tiếp với rơ-le 4 kênh bằng cách sử dụng các chân GPIO của NodeMCU. Các chân ngõ ra của NodeMCU được kết nối với 4 ngõ vào của rơ-le. NodeMCU được kết nối với Wifi cục bộ và có khả năng nhận tín hiệu qua Internet.
Ứng dụng điều khiển thiết bị được thiết kế và cài đặt trên thiết bị Android. Để điều khiển các ngõ vào/ngõ ra của NodeMCU, địa chỉ IP của NodeMCU được nhập vào ô Nhập địa chỉ IP của ứng dụng Android.
Sau khi thiết lập này hoàn tất, bạn có thể sử dụng ứng dụng Android để điều khiển các thiết bị trong nhà của mình ở bất kỳ nơi nào trên thế giới. Điện thoại Android của bạn hoạt động như một điều khiển từ xa và NodeMCU như một bộ thu và tín hiệu được truyền qua Internet.
Sơ đồ kết nối
Chúng ta sẽ sử dụng mô-đun rơ-le 4 kênh để điều khiển 4 tắt/mở 4 thiết bị điện trong nhà.
Kết nối các chân ngõ vào của rơ-le với NodeMCU như sau:
NodeMCU GPIO 13 – Relay Input 1
NodeMCU GPIO 15 – Relay Input 2
NodeMCU GPIO 3 – Relay Input 3
NodeMCU GPIO 1 – Relay Input 4
Thiết kế app cho điện thoại Android dùng App Inventor
Giao diện thiết kế
Các thành phần chính của Screen1 (xem hình trên)
- Nhập địa chỉ IP
- TextBox có tên gọi là “IP_address”
- 8 nút MỞ / TẮT, các nút này được sử dụng để điều khiển rơ-le:
- Relay_1_ON
- Relay_2_OFF
- v.v..
- 2 nút MỞ / TẮT cho tất cả các thiết bị:
- All_Devices_ON
- All_Devices_OFF
- Nút nhận giọng nói
- Voice_Input
- Các thành phần không nhìn thấy được:
- web1
- SpeachRecognizer1
- TextToSpeach1
- Các thành phần khác:
- Text Box:
- Speach_To_Text
- Nhãn:
- Comm_Status
- Text Box:
Giao diện lập trình
Chúng ta phải tạo các khối tab cho 10 nút. Tất cả theo cùng một cấu trúc như hình bên dưới.
Các khối 2 nút này (MỞ – TẮT) được thiết kế để khi bạn “bấm” vào một trong các nút này thì một thiết bị điện tương ứng sẽ được MỞ hoặc TẮT.
Ví dụ: khi bạn nhấp vào nút Relay_1_ON, ba hành động sẽ được thực hiện:
- Một lệnh được gửi theo định dạng: http: / * ip_address / r1on
- Một “tín hiệu echo” có cùng định dạng được thực hiện do “call Web1.Get”
- Ứng dụng sẽ đọc “tin nhắn” âm thanh trong trường hợp nhận được lệnh “turn on relay 1”
Các khối bên dưới cho thấy chương trình để nhận dạng giọng nói của ứng dụng:
Lưu ý rằng đối với bất kỳ lệnh thoại nào, lệnh được gửi sẽ luôn ở dạng chữ thường. Điều này sẽ tạo điều kiện thuận lợi cho việc giải mã lệnh thoại bằng NodeMCU.
Ví dụ: Nếu bạn muốn “kích hoạt” rơ-le 1, một từ hoặc câu phải được gửi để được nhận dạng bởi chương trình NodeMCU.
if (command == “turn on relay 1” || command == “relay 1 on”)
digitalWrite(relay1,LOW);
Vì vậy, khi tôi nói “turn on relay 1” hoặc “relay 1 on”, ứng dụng sẽ gửi: http: / 10.0.1.3/r1on và NodeMCU set chân tương ứng xuống mức thấp, kích hoạt rơ-le 1.
Nếu xảy ra lỗi, khối ở trên sẽ ghi các chi tiết trong dòng cuối cùng của ứng dụng (Comm_Status). Bạn sẽ chỉ nhìn thấy nó nếu khi tạo ứng dụng bằng tùy chọn Responsive.
Giao diện ứng dụng
Chương trình
#include <ESP8266WiFi.h>
WiFiClient client;
WiFiServer server(80);
const char* ssid = “ten-wifi”;
const char* password = “password-wifi”;
String command = “”; // Lệnh nhận được từ thiết bị Android
// Kết nối rơ-le với NodeMCU
int relay1 = 13;
int relay2 = 15;
int relay3 = 3;
int relay4 = 1;
void setup()
{
Serial.begin(115200);
pinMode(relay1, OUTPUT);
pinMode(relay2, OUTPUT);
pinMode(relay3, OUTPUT);
pinMode(relay4, OUTPUT);
digitalWrite(relay1, HIGH);
digitalWrite(relay2, HIGH);
digitalWrite(relay3, HIGH);
digitalWrite(relay4, HIGH);
connectWiFi();
server.begin();
}
void loop()
{
client = server.available();
if (!client) return;
command = checkClient ();
if (command == “r1on” || command == “turn on relay 1” || command == “relay 1 on”) digitalWrite(relay1, 0);
else if (command == “r1off” || command == “turn off relay 1” || command == “relay 1 off”) digitalWrite(relay1, 1);
else if (command == “r2on” || command == “turn on relay 2” || command == “relay 2 on”) digitalWrite(relay2, 0);
else if (command == “r2off” || command == “turn off relay 2” || command == “relay 2 off”) digitalWrite(relay2, 1);
else if (command == “r3on” || command == “turn on relay 3” || command == “relay 3 on”) digitalWrite(relay3, 0);
else if (command == “r3off” || command == “turn off relay 3” || command == “relay 3 off”) digitalWrite(relay3, 1);
else if (command == “r4on” || command == “turn on relay 4” || command == “relay 4 on”) digitalWrite(relay4, 0);
else if (command == “r4off” || command == “turn off relay 4” || command == “relay 4 off”) digitalWrite(relay4, 1);
else if (command == “allon” || command == “Turn on all devices” || command == “all on”)
{
digitalWrite(relay1, LOW);
digitalWrite(relay2, LOW);
digitalWrite(relay3, LOW);
digitalWrite(relay4, LOW);
}
else if (command == “alloff” || command == “Turn off all devices” || command == “all off”)
{
digitalWrite(relay1, HIGH);
digitalWrite(relay2, HIGH);
digitalWrite(relay3, HIGH);
digitalWrite(relay4, HIGH);
}
sendBackEcho(command); // gửi lệnh echo trở lại thiết bị Android
command = “”;
}
/* Kết nối WiFi */
void connectWiFi()
{
Serial.println(“Dang ket noi den WIFI”);
WiFi.begin(ssid, password);
while ((!(WiFi.status() == WL_CONNECTED)))
{
delay(300);
Serial.print(“..”);
}
Serial.println(“”);
Serial.println(“Da ket noi WiFi”);
Serial.println(“IP cuc bo cua NodeMCU la: “);
Serial.print((WiFi.localIP()));
}
/* kiểm tra lệnh nhận được từ thiết bị Android */
String checkClient (void)
{
while (!client.available()) delay(1);
String request = client.readStringUntil(‘\r’);
request.remove(0, 5);
request.remove(request.length() – 9, 9);
return request;
}
/* gửi lệnh echo trở lại thiết bị Android */
void sendBackEcho(String echo)
{
client.println(“HTTP/1.1 200 OK “);
client.println(“Content-Type: text/html”);
client.println(“”);
client.println(“<!DOCTYPE HTML>”);
client.println(“<html>”);
client.println(echo);
client.println(“</html>”);
client.stop();
delay(1);
}
Kết luận
Dự án này thật thú vị phải không các bạn? Tuy nhiên, các dự án IoT đòi hỏi các bạn cần có những kiến thức và kỹ năng nhất định thì mới có thể thực hiện được dự án nhà thông minh này. Nếu bạn có gặp khó khăn gì thì đừng ngại để lại bình luận bên dưới nhé.
Tôi hy vọng thông qua những dự án này, mọi người sẽ học hỏi nhiều kiến thức hữu ích và cảm nhận được những điều thú vị trong lĩnh vực điện tử và IoT!