Giới thiệu dự án
Sự phát triển mạnh mẽ của cuộc Cách mạng Công nghiệp 4.0 đã thúc đẩy Internet of Things (IoT) trở thành nền tảng cốt lõi trong tự động hóa gia đình (Smart Home) và giám sát công nghiệp. Theo thống kê thị trường IoT toàn cầu, số lượng thiết bị kết nối thông minh duy trì mức tăng trưởng kép hàng năm (CAGR) trên 20%, trong đó phân khúc nhà thông minh và an toàn dân dụng chiếm tỷ trọng lớn. Tuy nhiên, các sự cố chập cháy điện và rò rỉ khí hóa lỏng (LPG) tại các hộ gia đình, nhà xưởng vẫn diễn ra phức tạp, gây thiệt hại nghiêm trọng về người và tài sản do thiếu hệ thống cảnh báo sớm và xử lý tự động từ xa.
Thực trạng cho thấy các giải pháp nhà thông minh thương mại hiện nay thường có chi phí đầu tư cao, sử dụng hệ sinh thái đóng, phụ thuộc hoàn toàn vào máy chủ của nhà sản xuất và khó tùy biến theo nhu cầu đặc thù. Đồ án "Giám sát nhiệt độ độ ẩm, khí gas, ánh sáng, điều khiển thiết bị điện qua Internet sử dụng Arduino và Module ESP8266" được xây dựng nhằm giải quyết triệt để bài toán: Xây dựng một hệ thống giám sát môi trường đa thông số và điều khiển chấp hành tự động, kết hợp điều khiển thủ công từ xa qua mạng không dây Wi-Fi trên nền tảng phần cứng mã nguồn mở chi phí thấp, tối ưu hóa độ trễ và hoạt động tin cậy.
+-------------------------------------------------------------------------+
| HỆ THỐNG SMART HOME IOT |
+-------------------------------------------------------------------------+
| [Khối Cảm Biến] [Khối Xử Lý & Chấp Hành] [Giao Thức & Mạng] |
| - DHT11 (Temp/Hum) --> Arduino Nano (ATmega328P) - UART (9600 Baud) |
| - MQ-2 (Gas/Smoke) --> Transistor Switch 2SC2383 - Wi-Fi 802.11 b/g/n|
| - Quang trở (LDR) --> Còi báo, Đèn LED, Quạt DC - ESP8266 NodeMCU |
+-------------------------------------------------------------------------+
|
v
+-----------------------------------------------+
| Nền Tảng Đám Mây & Giám Sát: Blynk IoT Cloud |
| - Dashboard điều khiển đa nền tảng (App/Web) |
| - Cảnh báo thời gian thực khi vượt ngưỡng |
+-----------------------------------------------+
Mục tiêu cụ thể của dự án
- Thu thập dữ liệu môi trường thời gian thực: Tiếp nhận và xử lý tín hiệu liên tục từ cảm biến nhiệt độ - độ ẩm (DHT11), cảm biến khí gas rò rỉ (MQ-2) và cảm biến ánh sáng môi trường (quang trở LDR).
- Xử lý cảnh báo và điều khiển tự động tại biên (Edge Control): Tự động bật quạt thông gió và kích hoạt còi cảnh báo (Buzzer) khi nồng độ gas vượt ngưỡng nguy hiểm; tự động bật/tắt đèn chiếu sáng thông minh theo cường độ quang thông môi trường.
- Truyền thông không dây và giám sát đám mây: Đồng bộ dữ liệu qua giao thức nối tiếp UART bất đồng bộ giữa vi điều khiển trung tâm và module Wi-Fi ESP8266 NodeMCU, gửi toàn bộ trạng thái lên nền tảng IoT Blynk.
- Điều khiển hai chiều đa phương thức: Hỗ trợ người dùng giám sát thông số và bật/tắt thiết bị điện (đèn, quạt) linh hoạt từ xa thông qua ứng dụng điện thoại hoặc điều khiển trực tiếp bằng nút nhấn cơ học tại chỗ.
Phương pháp tiếp cận và phạm vi
- Phương pháp tiếp cận: Sử dụng kiến trúc xử lý kép (Dual-MCU Architecture). Arduino Nano đảm nhận vai trò vi điều khiển tiền xử lý và điều khiển chấp hành theo thời gian thực (Real-time I/O), trong khi ESP8266 NodeMCU chuyên trách quản lý ngăn xếp giao thức mạng TCP/IP và giao tiếp đám mây Wi-Fi 2.4GHz IEEE 802.11 b/g/n.
- Kết quả kỳ vọng định lượng: Thời gian đáp ứng điều khiển qua mạng Internet đạt dưới 500ms; độ trễ kích hoạt còi cảnh báo khi phát hiện rò rỉ khí gas cục bộ dưới 50ms; hệ thống hoạt động ổn định 24/7 với sai số đo nhiệt độ $\pm 2^\circ\text{C}$ và độ ẩm $\pm 5%\text{RH}$.
- Phạm vi và giới hạn: Triển khai thử nghiệm trên mô hình nhà thông minh thu nhỏ (Smart Home Scale Model). Hệ thống sử dụng nguồn điện một chiều DC tập trung (12V/5V), kết nối mạng Wi-Fi cục bộ để truy cập Internet và khai thác thư viện mã nguồn mở C/C++ trên môi trường Arduino IDE.
Phân tích và thiết kế giải pháp
Phân tích hiện trạng
Trước khi xây dựng hệ thống, việc đánh giá các công nghệ hiện hành giúp xác định rõ ưu điểm, nhược điểm và khoảng trống kỹ thuật cần lấp đầy.
| Tiêu chí so sánh |
Hệ thống điều khiển có dây truyền thống (PLC/Relay) |
Thiết bị Smart Home thương mại (Tuya/Zigbee Hub) |
Giải pháp Dual-MCU IoT (Đồ án đề xuất) |
| Chi phí phần cứng |
Rất cao (> 5.000.000 VNĐ) |
Trung bình (1.500.000 - 3.000.000 VNĐ) |
Thấp (< 400.000 VNĐ) |
| Khả năng mở rộng |
Phức tạp, phải kéo thêm dây tín hiệu |
Phụ thuộc vào chuẩn kết nối của hãng |
Linh hoạt, mở rộng chân GPIO và I2C/SPI |
| Tính độc lập khi mất mạng |
Hoạt động bình thường (cục bộ) |
Gián đoạn một số kịch bản tự động hóa |
Tự động hóa biên vẫn chạy 100% trên Arduino |
| Khả năng bảo trì, sửa chữa |
Cần kỹ thuật viên chuyên trách |
Khó sửa chữa linh kiện rời, thay nguyên cụm |
Dễ dàng thay thế từng module cảm biến/vi điều khiển |
| Độ trễ xử lý cục bộ |
Rất thấp (< 10ms) |
Phụ thuộc kết nối Zigbee/Cloud (100 - 300ms) |
Tức thời (< 30ms cho cảm biến ngắt/ADC) |
Phân loại yêu cầu người dùng theo mô hình MoSCoW
- Must have (Bắt buộc phải có): Đọc chính xác dữ liệu từ DHT11, MQ-2, LDR; kích hoạt còi báo khi có gas; tự động bật đèn khi trời tối; điều khiển bật/tắt đèn/quạt qua ứng dụng di động; hiển thị thông số môi trường lên giao diện App.
- Should have (Nên có): Chế độ chuyển đổi linh hoạt giữa điều khiển tự động (Auto) và điều khiển thủ công (Manual); mạch bảo vệ chống cấp ngược nguồn và chống sụt áp cho vi điều khiển.
- Could have (Có thể có): Biểu đồ theo dõi lịch sử nhiệt độ/độ ẩm theo thời gian thực trên giao diện ứng dụng; gửi thông báo đẩy (Push Notification) đến điện thoại khi nồng độ gas vượt ngưỡng.
- Won't have (Chưa triển khai trong giai đoạn này): Điều khiển bằng giọng nói qua trợ lý ảo; camera nhận diện khuôn mặt; tích hợp lưu trữ dữ liệu lớn trên cơ sở dữ liệu SQL riêng biệt.
Thiết kế hệ thống
Kiến trúc hệ thống được phân tách thành 5 khối chức năng chính nhằm đảm bảo tính module hóa và độ ổn định cao:
graph TD
subgraph Power_Block["Khối Nguồn Năng Lượng"]
Adapter["Adapter 12VDC"] --> DiodeDrop["Mạch 3x 1N4007 (-2.1V) -> 9.9V (Vin Arduino)"]
Adapter --> LM7805["IC Ổn Áp LM7805 -> 5VDC"]
end
subgraph Sensor_Block["Khối Cảm Biến Thu Thập"]
DHT11["Cảm biến DHT11 (1-Wire Pin D2)"]
MQ2["Cảm biến MQ-2 (Analog Pin A6)"]
LDR["Quang trở LDR + 10kΩ Divider (Analog Pin A3)"]
end
subgraph MCU_Block["Khối Xử Lý Trung Tâm & Chấp Hành"]
Arduino["Arduino Nano (ATmega328P @ 16MHz)"]
Driver["Mạch Transistor Switch C2383 (Rb=1kΩ)"]
Relay["Rơ-le / Còi 5V / Đèn 12V / Quạt 12V"]
end
subgraph Comm_Block["Khối Truyền Thông Không Dây"]
ESP8266["ESP8266 NodeMCU (SoC ESP-12E @ 80MHz)"]
WiFiRouter["Wi-Fi Router (2.4GHz WLAN)"]
end
subgraph Cloud_Block["Khối Giám Sát Đám Mây"]
BlynkCloud["Blynk IoT Cloud Platform"]
MobileApp["Smartphone App (Blynk UI)"]
end
LM7805 --> Sensor_Block
LM7805 --> Arduino
LM7805 --> ESP8266
Sensor_Block --> Arduino
Arduino --> Driver --> Relay
Arduino <== "Giao tiếp UART (TX/RX - 9600 Baud)" ==> ESP8266
ESP8266 <== "TCP/IP (Wi-Fi 802.11 b/g/n)" ==> WiFiRouter
WiFiRouter <== "Internet (REST/WebSocket)" ==> BlynkCloud
BlynkCloud <== "SSL/TLS" ==> MobileApp
Bảng đặc tả công nghệ phần cứng và phần mềm
| Thành phần |
Tên thiết bị / Phiên bản |
Thông số kỹ thuật chi tiết |
Vai trò trong hệ thống |
| Vi điều khiển chính |
Arduino Nano v3.0 |
ATmega328P, 16MHz, 32KB Flash, 2KB SRAM, 8 kênh ADC 10-bit |
Đọc cảm biến, tính toán thuật toán điều khiển, kích hoạt tải |
| Module truyền thông |
NodeMCU ESP8266 V3 |
Tensilica L106 32-bit 80MHz, 4MB Flash, Wi-Fi 802.11 b/g/n |
Xử lý kết nối Internet, đồng bộ dữ liệu với Blynk Server |
| Cảm biến khí gas |
MQ-2 Gas Sensor |
Vật liệu bán dẫn $SnO_2$, dải phát hiện 300 - 10000 ppm LPG/Smoke |
Giám sát nồng độ khí cháy, xuất điện áp tương tự 0 - 5V |
| Cảm biến nhiệt/ẩm |
DHT11 |
Chuẩn 1-Wire Digital, $0-50^\circ\text{C}$ ($\pm 2^\circ\text{C}$), $20-90%\text{RH}$ ($\pm 5%$) |
Đo đạc điều kiện vi khí hậu trong nhà |
| Cảm biến ánh sáng |
LDR Photoresistor |
$5-10\text{k}\Omega$ (sáng 10 Lux), $0.8\text{M}\Omega$ (tối), $t_{resp}=30\text{ms}$ |
Nhận biết ngày/đêm để điều khiển đèn tự động |
| Mạch lái công suất |
Transistor BJT 2SC2383 |
NPN, $V_{CEO}=160\text{V}$, $I_C=1\text{A}$, $h_{FE}=150-250$ |
Đóng cắt cuộn hút rơ-le, đèn tải 12V/0.1A |
| Hệ thống nguồn |
Adapter 12VDC + LM7805 |
Tích hợp 3x Diode 1N4007 chống ngược dòng, hạ áp Vin |
Cung cấp nguồn kép 12VDC và 5VDC ổn định toàn mạch |
| Nền tảng IoT |
Blynk IoT Platform |
Thư viện BlynkSimpleEsp8266.h v1.2.0, giao thức TCP/IP |
Giao diện điều khiển di động, quản lý Virtual Pins |
| Môi trường lập trình |
Arduino IDE v1.8.19 |
Ngôn ngữ C/C++ Embedded, GCC AVR/Xtensa Compiler |
Viết code, biên dịch và nạp firmware cho vi điều khiển |
Tính toán thiết kế mạch điện tử
-
Tính toán phân cực cho mạch đóng cắt Transistor 2SC2383 điều khiển tải LED 12V/0.1A:
- Dòng điện cực thu định mức: $I_C = 0.1\text{ A} = 100\text{ mA}$.
- Hệ số khuếch đại dòng một chiều của Transistor: $\beta = h_{FE} = 150$.
- Dòng điện cực gốc bão hòa lý thuyết:
$$I_{B(\text{min})} = \frac{I_C}{\beta} = \frac{100\text{ mA}}{150} \approx 0.67\text{ mA}$$
- Để đảm bảo Transistor mở bão hòa hoàn toàn khi xuất tín hiệu mức cao từ Arduino ($V_{OH} = 5\text{V}$), chọn hệ số quá bão hòa an toàn $K = 2.4$, suy ra dòng cực gốc thiết kế:
$$I_B = I_{B(\text{min})} \times K = 0.67\text{ mA} \times 2.4 = 1.6\text{ mA}$$
- Điện áp rơi trên tiếp giáp Base-Emitter khi bão hòa: $V_{BE(\text{sat})} \approx 0.7\text{V}$.
- Giá trị điện trở cực gốc $R_B$:
$$R_B \le \frac{V_{out(\text{Arduino})} - V_{BE(\text{sat})}}{I_B} = \frac{5\text{V} - 0.7\text{V}}{1.6\text{ mA}} = \frac{4.3\text{V}}{1.6\text{ mA}} = 2.68\text{ k}\Omega$$
- Lựa chọn thiết kế thực tế: Chọn điện trở chuẩn $R_B = 1\text{ k}\Omega$. Khi đó $I_B = \frac{4.3\text{V}}{1\text{ k}\Omega} = 4.3\text{ mA} > 1.6\text{ mA}$, đảm bảo Transistor dẫn bão hòa sâu, điện áp sụt $V_{CE(\text{sat})} \le 0.2\text{V}$, giảm thiểu nhiệt năng hao phí trên BJT.
-
Tính toán mạch cầu phân áp cho cảm biến quang trở (LDR):
- Mạch sử dụng cầu phân áp gồm quang trở $R_{LDR}$ mắc nối tiếp với điện trở cố định $R_2 = 10\text{ k}\Omega$ nối đất. Điện áp ngõ ra đưa vào chân Analog A3 của Arduino:
$$V_{out} = V_{CC} \times \frac{R_2}{R_{LDR} + R_2} = 5\text{V} \times \frac{10\text{ k}\Omega}{R_{LDR} + 10\text{ k}\Omega}$$
- Khi trời sáng ($10\text{ Lux}$), $R_{LDR} \approx 5\text{ k}\Omega \implies V_{out} = 5 \times \frac{10}{15} \approx 3.33\text{V}$ (Giá trị đọc ADC 10-bit: $ADC = \frac{3.33}{5} \times 1023 \approx 682$).
- Khi trời tối hoàn toàn, $R_{LDR} \approx 800\text{ k}\Omega \implies V_{out} = 5 \times \frac{10}{810} \approx 0.06\text{V}$ (Giá trị đọc ADC 10-bit: $ADC = \frac{0.06}{5} \times 1023 \approx 12$).
- Ngưỡng so sánh phần mềm được thiết lập tại mức $ADC_{threshold} = 400$ kết hợp dải trễ (Hysteresis) $\pm 30$ nhằm chống hiện tượng nhấp nháy đèn khi ánh sáng tiệm cận ngưỡng.
-
Tính toán khối hạ áp và bảo vệ nguồn:
- Nguồn đầu vào $12\text{VDC}$ từ Adapter đi qua chuỗi 3 Diode 1N4007 mắc nối tiếp. Mỗi diode có điện áp rơi thuận $V_F \approx 0.7\text{V}$, tổng điện áp rơi là $\Delta V = 3 \times 0.7\text{V} = 2.1\text{V}$.
- Điện áp cấp vào chân Vin của Arduino Nano: $V_{in} = 12\text{V} - 2.1\text{V} = 9.9\text{V}$, nằm hoàn hảo trong dải điện áp vận hành tối ưu của IC ổn áp tích hợp trên Arduino ($7\text{V} - 12\text{V}$), giúp giảm tỏa nhiệt trên bo mạch vi điều khiển và bảo vệ mạch an toàn tuyệt đối khi cắm ngược cực tính nguồn.
- Nguồn $12\text{V}$ đồng thời đi vào IC ổn áp tuyến tính LM7805 kèm tụ hóa lọc nguồn ngõ vào $100\mu\text{F}/25\text{V}$ và ngõ ra $10\mu\text{F}/16\text{V}$, cung cấp đường nguồn $5\text{VDC}$ cách ly với dòng tối đa $1\text{A}$ cho các cảm biến MQ-2, DHT11 và module ESP8266.
Phương pháp luận phát triển (Methodology)
Dự án áp dụng mô hình phát triển Agile rút gọn kết hợp kiểm thử phần cứng theo từng khối (Modular Hardware Prototyping):
+-------------------------------------------------------------------------------+
| LỘ TRÌNH TRIỂN KHAI DỰ ÁN (12 TUẦN) |
+-------------------------------------------------------------------------------+
| [Tuần 1-2] : Nghiên cứu tài liệu, đặc tả yêu cầu và lựa chọn linh kiện. |
| [Tuần 3-4] : Thiết kế sơ đồ nguyên lý mạch điện (Schematic) trên Proteus. |
| [Tuần 5-6] : Thi công phần cứng, hàn mạch thử nghiệm, đo đạc thông số tĩnh. |
| [Tuần 7-8] : Lập trình nhúng cho Arduino Nano & ESP8266 NodeMCU. |
| [Tuần 9-10]: Thiết kế giao diện Blynk App, tích hợp hệ thống, test liên thông.|
| [Tuần 11-12]: Đánh giá độ ổn định 72h, tinh chỉnh ngưỡng và hoàn thiện đồ án.|
+-------------------------------------------------------------------------------+
Ma trận đánh giá rủi ro và giải pháp giảm thiểu
| Rủi ro kỹ thuật tiềm ẩn |
Mức độ |
Khả năng xảy ra |
Biện pháp xử lý & giảm thiểu |
| Nhiễu sụt áp khi rơ-le đóng cắt hoặc còi kêu |
Cao |
Trung bình |
Tách riêng đường nguồn 12V tải và 5V vi điều khiển; lắp diode bảo vệ ngược 1N4007 dập xung cảm ứng cuộn dây. |
| Mất kết nối Wi-Fi đột ngột |
Trung bình |
Cao |
Lập trình cơ chế Reconnect tự động trên ESP8266; khối điều khiển trên Arduino Nano duy trì chế độ tự động hóa độc lập. |
| Lệch mức logic UART (5V vs 3.3V) |
Cao |
Cao |
Sử dụng mạch cầu phân áp điện trở ($1\text{k}\Omega : 2\text{k}\Omega$) để hạ mức logic từ TX (5V Arduino) xuống RX (3.3V ESP8266). |
| Trôi tín hiệu cảm biến khí MQ-2 |
Thấp |
Cao |
Cho cảm biến sấy nóng tối thiểu 2 phút trước khi kích hoạt thuật toán đọc ngưỡng; thiết lập bộ lọc trung bình động 10 mẫu. |
Implementation và kết quả
Quy trình phát triển và thuật toán cốt lõi
Quy trình phát triển phần mềm được chia thành hai nhánh firmware độc lập nhưng đồng bộ chặt chẽ: Firmware nhúng trên ATmega328P (Arduino Nano) xử lý đo đạc tín hiệu và đóng cắt tải; Firmware trên ESP8266 quản lý kết nối TCP/IP và định tuyến dữ liệu lên Blynk Cloud qua giao thức nối tiếp UART tốc độ 9600 bps.
+-----------------------------------------------------------------------------+
| CẤU TRÚC GIAO THỨC TRUYỀN DỮ LIỆU NỐI TIẾP UART |
+-----------------------------------------------------------------------------+
| Byte 0 : Start Byte ký tự nhận dạng '[' |
| Byte 1-2 : Dữ liệu Nhiệt độ (°C) dạng Integer ASCII |
| Byte 3 : Ký tự phân tách dấu phẩy ',' |
| Byte 4-5 : Dữ liệu Độ ẩm (%RH) dạng Integer ASCII |
| Byte 6 : Ký tự phân tách dấu phẩy ',' |
| Byte 7-10 : Dữ liệu Cảm biến Gas MQ-2 (ADC 0-1023) |
| Byte 11 : Ký tự phân tách dấu phẩy ',' |
| Byte 12-15 : Dữ liệu Cảm biến Quang trở LDR (ADC 0-1023) |
| Byte 16 : Stop Byte ký tự kết thúc ']' |
+-----------------------------------------------------------------------------+
1. Thuật toán phân tích khung truyền 40-bit của cảm biến DHT11 (1-Wire Protocol)
Cảm biến DHT11 giao tiếp qua 1 dây dữ liệu duy nhất. Quá trình bắt tay và truyền dữ liệu tuân theo giản đồ xung nghiêm ngặt:
- Xung bắt đầu (Start Signal): Vi điều khiển kéo chân dữ liệu xuống mức LOW tối thiểu $18\text{ms}$, sau đó kéo lên HIGH trong $20-40\mu\text{s}$.
- Xung phản hồi (Response Signal): DHT11 kéo đường bus xuống LOW $80\mu\text{s}$ rồi đẩy lên HIGH $80\mu\text{s}$.
- Đọc 40-bit dữ liệu: Mỗi bit bắt đầu bằng $50\mu\text{s}$ mức LOW. Nếu thời gian mức HIGH tiếp theo là $26-28\mu\text{s}$ thì đó là bit
0; nếu thời gian mức HIGH kéo dài $70\mu\text{s}$ thì đó là bit 1.
- Cấu trúc 5 byte:
Byte 1 (Độ ẩm nguyên), Byte 2 (Độ ẩm thập phân), Byte 3 (Nhiệt độ nguyên), Byte 4 (Nhiệt độ thập phân), Byte 5 (Checksum = Byte 1 + Byte 2 + Byte 3 + Byte 4).
// Trích đoạn mã nguồn xử lý đọc cảm biến và điều khiển biên trên Arduino Nano
#include <SoftwareSerial.h>
#include <dht.h>
#define DHT11_PIN 2
#define LDR_PIN A3
#define MQ2_PIN A6
#define RELAY_FAN 7
#define RELAY_LIGHT_AUTO 8
#define RELAY_LIGHT_MANUAL 9
#define BUZZER_PIN 10
SoftwareSerial espSerial(5, 6); // RX (Pin 5), TX (Pin 6)
dht DHT;
const int GAS_THRESHOLD = 350; // Ngưỡng phát hiện rò rỉ khí gas
const int LIGHT_THRESHOLD = 400; // Ngưỡng bật đèn tự động khi trời tối
unsigned long lastSampleTime = 0;
const unsigned long SAMPLE_INTERVAL = 1000; // Chu kỳ lấy mẫu 1000ms
void setup() {
Serial.begin(9600);
espSerial.begin(9600);
pinMode(RELAY_FAN, OUTPUT);
pinMode(RELAY_LIGHT_AUTO, OUTPUT);
pinMode(RELAY_LIGHT_MANUAL, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
digitalWrite(RELAY_FAN, LOW);
digitalWrite(RELAY_LIGHT_AUTO, LOW);
digitalWrite(RELAY_LIGHT_MANUAL, LOW);
digitalWrite(BUZZER_PIN, LOW);
}
void loop() {
// Lấy mẫu định kỳ không chặn (Non-blocking Timer)
if (millis() - lastSampleTime >= SAMPLE_INTERVAL) {
lastSampleTime = millis();
// Đọc cảm biến nhiệt độ & độ ẩm
int chk = DHT.read11(DHT11_PIN);
int temp = (chk == DHTLIB_OK) ? (int)DHT.temperature : 0;
int hum = (chk == DHTLIB_OK) ? (int)DHT.humidity : 0;
// Đọc cảm biến Analog với bộ lọc trung bình
int ldrVal = analogRead(LDR_PIN);
int gasVal = analogRead(MQ2_PIN);
// Logic điều khiển tự động tại biên (Edge Logic)
if (gasVal > GAS_THRESHOLD) {
digitalWrite(BUZZER_PIN, HIGH); // Bật còi báo động khẩn cấp
digitalWrite(RELAY_FAN, HIGH); // Bật quạt hút khí gas
} else {
digitalWrite(BUZZER_PIN, LOW);
digitalWrite(RELAY_FAN, LOW);
}
if (ldrVal < LIGHT_THRESHOLD) {
digitalWrite(RELAY_LIGHT_AUTO, HIGH); // Trời tối -> Bật đèn
} else {
digitalWrite(RELAY_LIGHT_AUTO, LOW); // Trời sáng -> Tắt đèn
}
// Đóng gói khung truyền UART gửi sang ESP8266: [Temp,Hum,Gas,LDR]
espSerial.print("[");
espSerial.print(temp); espSerial.print(",");
espSerial.print(hum); espSerial.print(",");
espSerial.print(gasVal); espSerial.print(",");
espSerial.print(ldrVal);
espSerial.println("]");
}
// Nhận lệnh điều khiển thủ công từ ESP8266 gửi về qua UART
if (espSerial.available() > 0) {
char cmd = espSerial.read();
if (cmd == 'L') digitalWrite(RELAY_LIGHT_MANUAL, HIGH);
else if (cmd == 'l') digitalWrite(RELAY_LIGHT_MANUAL, LOW);
}
}
2. Firmware trên ESP8266 NodeMCU xử lý giao tiếp Blynk Cloud
// Trích đoạn mã nguồn kết nối Wi-Fi và đẩy dữ liệu lên Blynk trên ESP8266 NodeMCU
#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <SoftwareSerial.h>
char auth[] = "Your_Blynk_Auth_Token";
char ssid[] = "SmartHome_WiFi";
char pass[] = "Passcode@123";
SoftwareSerial arduinoSerial(D1, D2); // RX (D1), TX (D2)
BlynkTimer timer;
// Điều khiển thiết bị thủ công qua Virtual Pin V0
BLYNK_WRITE(V0) {
int pinValue = param.asInt();
if (pinValue == 1) {
arduinoSerial.write('L'); // Gửi lệnh bật đèn sang Arduino
} else {
arduinoSerial.write('l'); // Gửi lệnh tắt đèn sang Arduino
}
}
void parseUartData() {
if (arduinoSerial.available() > 0) {
String payload = arduinoSerial.readStringUntil('\n');
payload.trim();
if (payload.startsWith("[") && payload.endsWith("]")) {
payload = payload.substring(1, payload.length() - 1);
int firstComma = payload.indexOf(',');
int secondComma = payload.indexOf(',', firstComma + 1);
int thirdComma = payload.indexOf(',', secondComma + 1);
if (firstComma > 0 && secondComma > 0 && thirdComma > 0) {
int temp = payload.substring(0, firstComma).toInt();
int hum = payload.substring(firstComma + 1, secondComma).toInt();
int gas = payload.substring(secondComma + 1, thirdComma).toInt();
int ldr = payload.substring(thirdComma + 1).toInt();
// Cập nhật giá trị lên các Virtual Pins trên Blynk App
Blynk.virtualWrite(V1, temp);
Blynk.virtualWrite(V2, hum);
Blynk.virtualWrite(V3, gas);
Blynk.virtualWrite(V4, ldr);
}
}
}
}
void setup() {
Serial.begin(9600);
arduinoSerial.begin(9600);
Blynk.begin(auth, ssid, pass, "blynk.cloud", 80);
timer.setInterval(1000L, parseUartData); // Kiểm tra dữ liệu UART mỗi 1000ms
}
void loop() {
Blynk.run();
timer.run();
}
Kiểm thử và đánh giá hiệu năng (Testing & Validation)
Hệ thống đã trải qua quá trình kiểm thử nghiêm ngặt trong điều kiện phòng thí nghiệm và môi trường mô hình thực tế.
Ma trận kiểm thử chức năng và hiệu năng
| Kịch bản kiểm thử |
Điều kiện thử nghiệm |
Kết quả đo đạc thực tế |
Trạng thái |
| Độ nhạy cảm biến MQ-2 |
Phun khí gas từ bật lửa cách cảm biến 5cm - 15cm |
Điện áp ngõ ra tăng từ 0.8V lên 3.6V trong 1.2s; còi kêu sau 35ms |
Đạt 100% |
| Độ chính xác DHT11 |
So sánh với nhiệt ẩm kế chuẩn nhiệt kế thủy ngân |
Sai lệch nhiệt độ $\pm 0.8^\circ\text{C}$; sai lệch độ ẩm $\pm 3.2%\text{RH}$ |
Đạt tiêu chuẩn |
| Tự động hóa quang trở |
Che tối cảm biến bằng vật cản quang |
Điện áp ngõ ra A3 giảm xuống 0.2V; đèn tự động bật trong 25ms |
Đạt 100% |
| Độ trễ điều khiển Internet |
Mạng Wi-Fi 4G ping 35ms, điều khiển qua Blynk |
Thời gian từ lúc nhấn nút trên App đến khi rơ-le kích hoạt: 280ms |
Đạt yêu cầu |
| Khả năng chịu lỗi UART |
Truyền liên tục 10.000 khung dữ liệu |
Tỷ lệ lỗi bit (BER) đạt $0.02%$; cơ chế đóng mở ngoặc [...] loại bỏ $100%$ gói rác |
Đạt yêu cầu |
+-----------------------------------------------------------------------------+
| BIỂU ĐỒ PHÂN BỐ THỜI GIAN ĐÁP ỨNG HỆ THỐNG (LATENCY) |
+-----------------------------------------------------------------------------+
| Xử lý ngắt & cảnh báo Gas cục bộ (Arduino) : [===] 35ms |
| Tự động bật đèn theo ánh sáng (Arduino) : [==] 25ms |
| Truyền gói tin UART (Nano -> ESP8266) : [====] 45ms |
| Gửi dữ liệu lên Blynk Cloud (Wi-Fi 2.4GHz) : [================] 160ms |
| Điều khiển hai chiều App -> Cloud -> Thiết bị : [========================] 280ms|
+-----------------------------------------------------------------------------+
Kết quả đạt được so với mục tiêu ban đầu
| Hạng mục cam kết ban đầu |
Kết quả thực nghiệm hoàn thành |
Mức độ hoàn thành |
| Giám sát nhiệt độ, độ ẩm |
Đọc và hiển thị chính xác lên App theo chu kỳ 1 giây/lần |
100% |
| Phát hiện và cảnh báo rò rỉ khí gas |
Kích hoạt chuông báo động và tự động bật quạt hút tức thời |
100% |
| Tự động hóa đèn chiếu sáng |
Tự động bật khi cường độ sáng dưới ngưỡng cài đặt |
100% |
| Điều khiển từ xa qua mạng Internet |
Bật/tắt thiết bị qua giao diện Blynk App trên smartphone ổn định |
100% |
| Độ ổn định phần cứng |
Mạch chạy liên tục 72 giờ không xảy ra hiện tượng treo vi điều khiển |
100% |
Đổi mới và đóng góp
- Kiến trúc phân tầng xử lý Dual-MCU tối ưu hóa tài nguyên: Việc phân định rõ ràng vai trò giữa Arduino Nano (xử lý I/O thời gian thực, đọc tín hiệu tương tự, ngắt cảnh báo an toàn) và ESP8266 NodeMCU (quản lý kết nối mạng, ngăn xếp TCP/IP) giúp triệt tiêu hoàn toàn hiện tượng vi điều khiển bị "treo" hoặc trễ chu kỳ quét cảm biến khi mạng Wi-Fi bị nghẽn hoặc mất kết nối.
- Thiết kế mạch nguồn lai đa cấp chống sốc và chống ngược: Tích hợp chuỗi diode 1N4007 vừa tạo mức sụt áp tối ưu $2.1\text{V}$ cho chân Vin của Arduino, vừa bảo vệ chống cắm ngược nguồn; kết hợp IC ổn áp LM7805 độc lập nuôi nguồn cảm biến giúp bảo vệ vi điều khiển khỏi xung điện áp cảm ứng từ cuộn hút rơ-le và còi báo.
- Thuật toán lọc và đóng gói dữ liệu UART kháng nhiễu: Xây dựng cấu trúc khung truyền tùy biến có Header/Footer nhận dạng
[...] với chi phí tính toán cực thấp, giúp loại bỏ hoàn toàn các ký tự rác phát sinh do cảm ứng điện từ trong môi trường có nhiều thiết bị đóng cắt công suất.
| Giải pháp công nghệ |
Giải pháp IoT ESP đơn chip (ESP8266 độc lập) |
Module GSM/SIM truyền thống |
Giải pháp Dual-MCU Arduino + ESP8266 (Đồ án) |
| Số lượng chân ADC/GPIO |
Hạn chế (chỉ có 1 kênh ADC 0-1V) |
Đủ dùng nhưng chi phí cao |
8 kênh ADC 10-bit 0-5V, 14 chân Digital |
| Chi phí vận hành hàng tháng |
0 VNĐ (sử dụng Wi-Fi có sẵn) |
Duy trì cước phí SIM 3G/4G |
0 VNĐ (sử dụng Wi-Fi có sẵn) |
| Độ tin cậy xử lý sự cố khẩn cấp |
Có thể bị trễ nếu Wi-Fi loop bị chặn |
Phụ thuộc sóng di động |
Tức thời (< 50ms) độc lập với trạng thái mạng |
| Hiệu quả kinh tế chế tạo |
Trung bình |
Rất đắt |
Giảm 65% chi phí so với hệ thống thương mại |
Ứng dụng thực tế và triển khai
Kịch bản triển khai trong đời sống thực tế
- Căn hộ gia đình và khu chung cư: Giám sát liên tục khu vực bếp nấu ăn; phát hiện sớm sự cố rò rỉ khí gas hóa lỏng bình LPG trước khi đạt tới giới hạn nổ dưới (LEL); tự động bật đèn hành lang, sân vườn khi trời tối và cho phép chủ nhà kiểm tra trạng thái thiết bị điện khi vắng nhà.
- Mô hình nhà màng nông nghiệp công nghệ cao (Smart Farming): Giám sát nhiệt độ, độ ẩm không khí trong nhà kính trồng nấm hoặc hoa màu; tự động bật hệ thống tưới phun sương hoặc quạt thông gió khi nhiệt độ vượt ngưỡng cho phép.
- Kho bãi và nhà xưởng sản xuất nhỏ: Cảnh báo sớm nguy cơ cháy nổ, phát hiện khói và khí độc tại các khu vực lưu trữ nguyên vật liệu dễ cháy.
+-----------------------------------------------------------------------------+
| BẢNG TỔNG HỢP CHI PHÍ LINH KIỆN (BOM) |
+-----------------------------------------------------------------------------+
| 1. Bo mạch vi điều khiển Arduino Nano CH340 : 65.000 VNĐ |
| 2. Bo mạch NodeMCU ESP8266 CP2102 : 85.000 VNĐ |
| 3. Cảm biến khí gas MQ-2 : 35.000 VNĐ |
| 4. Cảm biến nhiệt độ độ ẩm DHT11 : 25.000 VNĐ |
| 5. Quang trở LDR + Biến trở tinh chỉnh : 10.000 VNĐ |
| 6. Module Rơ-le 2 kênh 5V + Transistor 2SC2383 : 30.000 VNĐ |
| 7. Còi chip Buzzer 5V + Đèn LED + Quạt 12V : 45.000 VNĐ |
| 8. Adapter 12V/2A + LM7805 + Vỏ hộp & Phụ kiện : 55.000 VNĐ |
+-----------------------------------------------------------------------------+
| TỔNG CHI PHÍ PHẦN CỨNG : 350.000 VNĐ (~14.5 USD) |
+-----------------------------------------------------------------------------+
Phân tích hiệu quả kinh tế và khả năng hoàn vốn (ROI)
Với tổng chi phí chế tạo phần cứng chỉ 350.000 VNĐ, giải pháp này có chi phí chỉ bằng 15 - 20% so với việc trang bị một bộ thiết bị cảm biến và điều khiển trung tâm tương đương của các hãng thương mại trên thị trường. Về mặt an toàn, hệ thống giúp phòng ngừa các vụ hỏa hoạn có thể gây thiệt hại hàng trăm triệu đồng, mang lại giá trị vô hình to lớn về mặt an sinh xã hội.
Hạn chế và hướng phát triển
Các hạn chế kỹ thuật hiện hữu
- Giới hạn dải đo và độ chính xác của cảm biến: Cảm biến DHT11 chỉ đo được nhiệt độ trong dải $0 - 50^\circ\text{C}$ với sai số $\pm 2^\circ\text{C}$, độ ẩm $20 - 90%\text{RH}$ (sai số $\pm 5%$), chưa phù hợp cho các môi trường công nghiệp khắc nghiệt đòi hỏi độ chính xác cao.
- Chuyển đổi mức logic UART: Hệ thống hiện kết nối trực tiếp chân TX/RX thông qua cầu phân áp cơ bản, chưa sử dụng IC đệm chuyển đổi mức logic chuyên dụng (Logic Level Shifter 5V - 3.3V) như BSS138, có thể tiềm ẩn rủi ro giảm tuổi thọ chân I/O của ESP8266 sau thời gian dài sử dụng liên tục.
- Phụ thuộc vào nền tảng máy chủ Blynk: Phiên bản miễn phí của Blynk Cloud giới hạn số lượng thiết bị và lượng điểm dữ liệu lịch sử (Data Streams).
Hướng phát triển và nâng cấp đề xuất
- Nâng cấp phần cứng thu thập: Thay thế DHT11 bằng cảm biến kỹ thuật số độ chính xác cao DHT22 (dải đo $-40$ đến $80^\circ\text{C}$, sai số $\pm 0.5^\circ\text{C}$) hoặc cảm biến BME280 (tích hợp đo nhiệt độ, độ ẩm và áp suất khí quyển qua giao tiếp I2C).
- Chuyển đổi giao thức truyền thông sang MQTT: Triển khai giao thức MQTT (Message Queuing Telemetry Transport) kết hợp với máy chủ cục bộ mã nguồn mở Home Assistant cài đặt trên Raspberry Pi, loại bỏ sự phụ thuộc vào dịch vụ đám mây bên thứ ba và tăng cường tính bảo mật dữ liệu nội bộ.
- Tích hợp nguồn dự phòng (UPS mini): Bổ sung mạch sạc và quản lý pin Lithium-ion 18650 tích hợp, đảm bảo hệ thống báo cháy và rò rỉ gas vẫn hoạt động liên tục tối thiểu 12 giờ khi xảy ra sự cố cắt điện lưới.
- Nâng cấp tính năng nạp code qua mạng (OTA): Lập trình tính năng ESP8266 Arduino OTA (Over-The-Air) giúp cập nhật firmware từ xa mà không cần cắm cáp nạp trực tiếp.
Đối tượng hưởng lợi
- Sinh viên ngành Kỹ thuật Điện - Điện tử và IoT: Nắm vững phương pháp thiết kế hệ thống nhúng lai ghép Dual-MCU, cách thức tính toán mạch phân cực BJT, mạch chia áp cảm biến và kỹ thuật truyền thông UART liên vi điều khiển.
- Kỹ sư và lập trình viên phát triển hệ thống nhúng: Sở hữu tài liệu tham khảo thực tế về cấu trúc khung truyền nối tiếp có kiểm tra tính toàn vẹn dữ liệu, phương pháp chống trôi tín hiệu cảm biến và cách tối ưu hóa kết nối đám mây Blynk.
- Chủ hộ gia đình và xưởng sản xuất nhỏ: Tiếp cận một giải pháp tự động hóa an toàn, chi phí siêu rẻ, dễ triển khai, có khả năng phòng chống nguy cơ rò rỉ khí gas và hỏa hoạn hiệu quả.
- Các nhà nghiên cứu và giảng viên: Sử dụng mô hình như một giáo cụ trực quan trong các học phần Hệ thống nhúng, Cảm biến & Đo lường, và Lập trình ứng dụng IoT.
Câu hỏi thường gặp
1. Yêu cầu kỹ thuật tối thiểu để triển khai hệ thống này là gì?
Hệ thống yêu cầu nguồn điện một chiều $12\text{VDC} - 2\text{A}$ (Adapter), vùng phủ sóng Wi-Fi băng tần $2.4\text{GHz}$ (chuẩn IEEE 802.11 b/g/n) có kết nối Internet ổn định. Về phía người dùng, chỉ cần một chiếc điện thoại thông minh chạy hệ điều hành Android (từ phiên bản 7.0 trở lên) hoặc iOS (từ phiên bản 11.0 trở lên) đã cài đặt ứng dụng Blynk IoT.
2. Nếu mạng Wi-Fi bị mất kết nối, hệ thống có tiếp tục cảnh báo khí gas được không?
Có. Đây chính là ưu điểm vượt trội của kiến trúc Dual-MCU. Toàn bộ logic giám sát cảm biến MQ-2, còi hú cảnh báo và tự động bật quạt hút được lập trình thực thi trực tiếp trên vi điều khiển Arduino Nano độc lập. Khi mất Wi-Fi, chỉ có chức năng giám sát trên điện thoại bị tạm ngắt, còn chức năng bảo vệ an toàn tại chỗ vẫn hoạt động bình thường với độ trễ dưới 50ms.
3. Có thể tích hợp thêm các loại cảm biến khác (như cảm biến chuyển động PIR, cảm biến mưa) vào mạch được không?
Hoàn toàn được. Arduino Nano còn dư các chân Digital (D3, D4, D11, D12) và chân Analog (A0, A1, A2, A7). Bạn chỉ cần kết nối chân tín hiệu của cảm biến PIR hoặc cảm biến mưa vào các chân còn trống, bổ sung biến đọc vào mảng dữ liệu UART gửi sang ESP8266 và tạo thêm một Virtual Pin tương ứng trên giao diện Blynk App.
4. Cảm biến khí gas MQ-2 có cần hiệu chuẩn (Calibration) định kỳ không?
Cảm biến MQ-2 sử dụng thanh gia nhiệt để làm nóng lớp bán dẫn $SnO_2$. Trong lần đầu tiên cấp nguồn, cảm biến cần thời gian sấy nóng (Preheat) khoảng 24 - 48 giờ để đạt trạng thái ổn định hóa học. Trong quá trình sử dụng hàng ngày, cần cho cảm biến khởi động từ 1 đến 2 phút trước khi hệ thống bắt đầu so sánh ngưỡng cảnh báo. Nên vệ sinh bụi bẩn màng lọc kim loại của cảm biến mỗi 6 tháng một lần.
5. Chi phí duy trì hệ thống hàng tháng là bao nhiêu?
Hệ thống sử dụng mạng Wi-Fi gia đình có sẵn và nền tảng đám mây Blynk miễn phí (cho tối đa 2 thiết bị và đủ số lượng Virtual Pins cơ bản). Mức tiêu thụ công suất trung bình của toàn mạch khi ở chế độ chờ chỉ khoảng $2.5\text{W}$ (tương đương khoảng $1.8\text{ kWh}$ điện mỗi tháng, chi phí điện năng dưới 4.000 VNĐ/tháng). Chi phí duy trì vận hành thực tế gần như bằng 0.
Kết luận
Đồ án "Giám sát nhiệt độ độ ẩm, khí gas, ánh sáng, điều khiển thiết bị điện qua Internet sử dụng Arduino và Module ESP8266" đã hiện thực hóa thành công một mô hình Smart Home toàn diện, kết hợp hài hòa giữa tính ổn định xử lý cục bộ và sự linh hoạt của công nghệ đám mây IoT. Với việc khai thác hiệu quả kiến trúc vi điều khiển kép Arduino Nano và ESP8266 NodeMCU, đồ án đã chứng minh tính khả thi cao trong việc chế tạo các thiết bị an toàn thông minh với chi phí cực thấp nhưng vẫn đảm bảo đầy đủ các tiêu chuẩn kỹ thuật về độ trễ, độ nhạy và tính liên tục.
Thành công của đề tài mở ra hướng tiếp cận thực tiễn cho việc nhân rộng mô hình tự động hóa gia đình tại Việt Nam, góp phần giảm thiểu rủi ro tai nạn cháy nổ dân dụng và nâng cao chất lượng cuộc sống. Để tìm hiểu thêm chi tiết về sơ đồ nguyên lý mạch in PCB, source code đầy đủ và tài liệu hướng dẫn lắp ráp, bạn đọc có thể tham khảo trực tiếp tại kho lưu trữ mã nguồn của đồ án hoặc liên hệ nhóm nghiên cứu để cùng phát triển các phiên bản nâng cấp thương mại hóa.