Hướng phát triển đề tài

Một phần của tài liệu thi công hệ thống điều khiển các thiết bị trong toà nhà qua mạng internet (Trang 56 - 76)

Do thời gian thực hiện đề tài có hạn và lượng kiến thức cá nhân là nhất định nên đề tài thực hiện xong chỉ đáp ứng được một phần nhỏ của một hệ thống hoàn chỉnh. Vì vậy, để đề tài này thêm phong phú hơn, mang nhiều tính thực tế hơn nữa, có khả năng ứng dụng cao hơn thì em đề xuất đưa thêm vào những yêu cầu như sau:

 Tích hợp thêm tính năng điều khiển các thiết bị bằng tin nhắn SMS.

 Giao tiếp phần cứng của các module chuyển sang bằng sóng vô tuyến để các module có thể tách rời nhằm dễ dàng cho việc lắp đặt, chỉnh sửa.

 Sử dụng thêm nhiều loại cảm biến khác, chẳng hạn như cảm biến độ ẩm không khí để đo độ ẩm không khí, hệ thống báo cháy tự động,… để ứng dụng vào đề tài.  Thêm khối bàn phím, thời gian thực để người dùng có thể trực tiếp chỉ định lại các

thông số của hệ thống sao cho phù hợp và có thể hẹn giờ để tắt/bật thiết bị theo ý muốn.

Hy vọng với những hướng phát triển nêu trên cùng với những ý tưởng, góp ý khác của các thầy cô giáo, các bạn đọc sẽ phát triển hơn nữa đề tài này, khắc phục những hạn chế, tồn tại của đề tài, làm cho đề tài trở nên phong phú hơn, mang tính ứng dụng cao hơn vào trong thực tế cuộc sống, phục vụ cho những lợi ích trong tương lai.

SVTH: NGUYỄN HỮU HẬU LỚP: L12CQVT02-N

PHỤ LỤC A: CÀI ĐẶT ARDUINO IDE VÀ CÀI ĐẶT DRIVER

A.1. Cài đặt chương trình Arduino IDE

Truy cập vào trang web http://arduino.cc/en/Main/Software và tải về chương trình Arduino IDE phù hợp với hệ điều hành của máy mình bao gồm Windown, Mac OS hay Linux. Đối với Windown có bản cài đặt (.exe) và bản Zip, đối với Zip thì chỉ cần giải nén và chạy chương trình không cần cài đặt.

Sau khi cài đặt xong thì giao diện chương trình như sau:

SVTH: NGUYỄN HỮU HẬU LỚP: L12CQVT02-N

A.2. Cài đặt Driver

Sử dụng cáp USB kết nối Arduino với máy tính, lúc này sẽ thấy đèn led power của board sáng. Máy tính nhận dạng thiết bị và sẽ thông báo:

“Device driver software was not successfully installed”

Bây giờ click vào Start Menu chọn Control Panel kế đến chúng ta chọn System and Security, click System và sau đó chọn Device Manager.

Chúng ta sẽ thấy cảnh báo màu vàng thiếu driver trên Arduino. Click chuột phải trên icon Arduino Mega 2560 sau đó chọn “Update Driver Software”

Hình A.2: Update Driver

Chọn “Browse my computer for driver software”.

Hình A.3: Chế độ update

SVTH: NGUYỄN HỮU HẬU LỚP: L12CQVT02-N

Hình A.4: Driver Arduino board

Click “Next” Windown tự động cài đặt driver, qua trình cài đặt driver hoàn tất.

SVTH: NGUYỄN HỮU HẬU LỚP: L12CQVT02-N

PHỤ LỤC B: MÃ CHƯƠNG TRÌNH ĐIỀU KHIỂN

//CHƯƠNG TRÌNH #include <Ethernet.h> #include <SPI.h> #include <EEPROM.h> #include <OneWire.h> #include <DallasTemperature.h> #define ONE_WIRE_BUS 2 #define TEMPERATURE_PRECISION 10 //CẤU HÌNH byte ip[] = { 192, 168, 1, 76 }; byte gateway[] = { 192, 168, 1, 254 }; byte subnet[] = { 255, 255, 255, 0 };

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; EthernetServer server = EthernetServer(80);

OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire);

DeviceAddress sensorDev_1= { 0x28, 0xA4, 0x0E, 0x75, 0x04, 0x00, 0x00, 0x8B }; DeviceAddress sensorDev_2= { 0x28, 0x49, 0xAC, 0x74, 0x04, 0x00, 0x00, 0xD7 }; DeviceAddress sensorDev_3= { 0x28, 0x68, 0x9F, 0x77, 0x04, 0x00, 0x00, 0x14 }; //BIẾN

int outputNum = 15;

boolean outputConversed = false; int onAllPins = false; (adsbygoogle = window.adsbygoogle || []).push({});

boolean outputStatus[15]; int outputAddress[15] = { 22, 24, 26, 28, 30, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41 }; String idC[15] = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E" }; String buttonLabel[15] = {

SVTH: NGUYỄN HỮU HẬU LỚP: L12CQVT02-N

"1. Đèn cửa chính", "2. Đèn sảnh lớn", "3. Quạt sảnh", "4. Đèn lối đi", "5. Đèn cầu thang", "1. Đèn cửa trước", "2. Đèn phòng A", "3. Đèn phòng B", "4. Tivi phòng B", "5. Đèn cầu thang", "1. Đèn cửa trước", "2. Đèn phòng C", "3. Tivi phòng C", "4. Đèn phòng D", "5. Đèn cầu thang"

};

String onAll = ""; String offAll = ""; boolean reading = false;

unsigned long timeConnectedAt; boolean writeToEeprom = false; int outp = 0;

float temp1 = 0.0; float temp2 = 0.0; float temp3 = 0.0; String readString; boolean login = false; //CHẠY 1 LẦN void setup() {

Serial.begin(9600); readEepromValues();

boolean currentState = false;

for (int var = 0; var < outputNum; var ++) { pinMode(outputAddress[var], OUTPUT); if (outputConversed == true) { if (outputStatus[var] == 0) { currentState = true; } else { currentState = false; } digitalWrite(outputAddress[var], currentState); } else { if (outputStatus[var] == 0) { currentState = false; } else { currentState = true; }

SVTH: NGUYỄN HỮU HẬU LỚP: L12CQVT02-N digitalWrite(outputAddress[var], currentState); }

}

Ethernet.begin(mac, ip, gateway, subnet); server.begin();

sensors.begin();

if (!sensors.getAddress(sensorDev_1, 0)) Serial.println("Không tìm được địa chỉ cho sensor 1");

if (!sensors.getAddress(sensorDev_2, 1)) Serial.println("Không tìm được địa chỉ cho sensor 2");

if (!sensors.getAddress(sensorDev_3, 2)) Serial.println("Không tìm được địa chỉ cho sensor 3"); sensors.setResolution(sensorDev_1, TEMPERATURE_PRECISION); sensors.setResolution(sensorDev_2, TEMPERATURE_PRECISION); sensors.setResolution(sensorDev_3, TEMPERATURE_PRECISION); } //LẶP void loop() { sensors.requestTemperatures(); printTemperature1(sensorDev_1); printTemperature2(sensorDev_2); printTemperature3(sensorDev_3); checkClient(); } //checkClient Function void checkClient() {

EthernetClient client = server.available(); if (client) {

boolean currentLineIsBlank = true; boolean sentHeader = false;

boolean login = false; while (client.connected()) { if (client.available()) { char c = client.read(); readString.concat(c);

SVTH: NGUYỄN HỮU HẬU LỚP: L12CQVT02-N if (c == '*') { printHtmlHeader(client); printLogin(client); printHtmlFooter(client); break; } if (!sentHeader) { printHtmlHeader(client); printHtmlTitle(client); sentHeader = true; } if (reading && c == ' ') { reading = false; login = false; } if (c == '?') { reading = true; } if (login == false) { if (readString.indexOf("ten=huuhau&matkhau=huuhau") > 0) { login = true; } }

if (login && reading) { if (c == 'H') { outp = 1; } if (c == 'L') { outp = 0; } switch (c) { case '0':

triggerPin(outputAddress[0], client, outp); break;

case '1':

triggerPin(outputAddress[1], client, outp); break;

SVTH: NGUYỄN HỮU HẬU LỚP: L12CQVT02-N case '2':

triggerPin(outputAddress[2], client, outp); break;

case '3':

triggerPin(outputAddress[3], client, outp); break;

case '4': (adsbygoogle = window.adsbygoogle || []).push({});

triggerPin(outputAddress[4], client, outp); break;

case '5':

triggerPin(outputAddress[5], client, outp); break;

case '6':

triggerPin(outputAddress[6], client, outp); break;

case '7':

triggerPin(outputAddress[7], client, outp); break;

case '8':

triggerPin(outputAddress[8], client, outp); break;

case '9':

triggerPin(outputAddress[9], client, outp); break;

case 'A':

triggerPin(outputAddress[10], client, outp); break;

case 'B':

triggerPin(outputAddress[11], client, outp); break;

case 'C':

triggerPin(outputAddress[12], client, outp); break;

case 'D':

triggerPin(outputAddress[13], client, outp); break;

SVTH: NGUYỄN HỮU HẬU LỚP: L12CQVT02-N triggerPin(outputAddress[14], client, outp); break; case 'thoat': login = false; readString = ""; break; } } if (c == '\n' && currentLineIsBlank) { if (login == false) { printLogin(client); printHtmlFooter(client); }

triggerPin(7676, client, outp); break; } } } printHtmlFooter(client); } else { if (millis() > (timeConnectedAt + 60000)) { if (writeToEeprom == true) { writeEepromValues(); } } } } //triggerPin Function

void triggerPin(int pin, EthernetClient client, int outp) { if (pin != 7676) { if (outp == 1) { if (outputConversed == false) { digitalWrite(pin, HIGH); } else { digitalWrite(pin, LOW); }

SVTH: NGUYỄN HỮU HẬU LỚP: L12CQVT02-N } if (outp == 0) { if (outputConversed == false) { digitalWrite(pin, LOW); } else { digitalWrite(pin, HIGH); } } } } //printHtmlButtons Function

void printHtmlButtons(EthernetClient client) { client.println("");

client.println("<form>");

client.println("<table border=\"0\" align=\"center\">"); client.print("<tr>\n");

client.print("<td></td>"); client.print("<td></td>");

client.print("<td><h4 style=\"margin: 0 0 0 -5.9em;color: #0181eb;\">"); client.print("TOÀ NHÀ"); client.print("</h4></td>\n"); client.print("<td></td>"); client.print("</tr>"); int countF = 1; float ArrTemper[4] = { 0.1, temp1, temp2, temp3 };

for (int var = 0; var < outputNum; var++) { onAll += "H";

onAll += idC[var]; offAll += "L"; offAll += idC[var]; (adsbygoogle = window.adsbygoogle || []).push({});

if (var == 0 || var == 5 || var == 10) { client.print("<tr class=\"floor\">\n"); client.print("<td><h4>");

SVTH: NGUYỄN HỮU HẬU LỚP: L12CQVT02-N client.print(countF); client.print("</h4></td>\n"); client.print("<td></td>"); client.print("<td></td>"); client.print("<td>"); client.print("<h4 class=\"temper\">"); client.print("Nhiệt độ: "); client.print(ArrTemper[countF]); client.print(" &deg;C</h4></td>\n"); client.print("</tr>"); countF += 1; } client.print("<tr>\n"); client.print("<td><h4>"); client.print(buttonLabel[var]); client.print("</h4></td>\n"); client.print("<td>");

client.print("<input type=\"button\" value=\"ON "); client.print("\" onClick=\"parent.location='/?H"); client.print(idC[var]);

client.print("'\"></td>\n"); if (outputStatus[var] == true) { if (outputConversed == false) {

client.print(" <td><div class='blue-circle'><div class='glare'></div></div></td>\n");

} else {

client.print(" <td><div class='grey-circle'><div class='glare'></div></div></td>\n");

} } else {

if (outputConversed == false) {

client.print(" <td><div class='grey-circle'><div class='glare'></div></div></td>\n");

} else {

client.print(" <td><div class='blue-circle'><div class='glare'></div></div></td>\n");

SVTH: NGUYỄN HỮU HẬU LỚP: L12CQVT02-N }

client.print(" <td><input type=\"button\" value=\"OFF"); client.print("\" onClick=\"parent.location='/?L");

client.print(idC[var]); client.print("'\"></td>\n"); client.print("</tr>\n");

if (var == 4 || var == 9 || var == 14) { if (onAllPins == true) {

client.print("<tr>\n<td></td>\n");

client.print("<td><input class=\"all\" type=\"button\" value=\"ON All "); client.print("\" onClick=\"parent.location='/?");

client.print(onAll);

client.print("'\"></td>\n"); client.print("<td></td>\n");

client.print("<td><input class=\"all\" type=\"button\" value=\"OFF All"); client.print("\" onClick=\"parent.location='/?"); client.print(offAll); client.print("'\"></td>\n</tr>\n"); } onAll = ""; offAll = ""; } } client.println("</table>");

client.print("<h3 align=\"center\"><input type=button onClick=\"location.href='/?thoat'\" value='Thoát'></h3>"); client.println("</form>");

}

//readOutputStatuses Function void readOutputStatuses() {

for (int var = 0; var < outputNum; var ++) {

outputStatus[var] = digitalRead(outputAddress[var]); }

}

SVTH: NGUYỄN HỮU HẬU LỚP: L12CQVT02-N void readEepromValues() {

for (int adr = 0; adr < outputNum; adr++) { outputStatus[adr] = EEPROM.read(adr); }

} (adsbygoogle = window.adsbygoogle || []).push({});

//writeEepromValues Function void writeEepromValues() {

for (int adr = 0; adr < outputNum; adr++) { EEPROM.write(adr, outputStatus[adr]); }

}

void printTemperature1(DeviceAddress deviceAddress) { temp1 = sensors.getTempC(deviceAddress);

}

void printTemperature2(DeviceAddress deviceAddress) { temp2 = sensors.getTempC(deviceAddress);

}

void printTemperature3(DeviceAddress deviceAddress) { temp3 = sensors.getTempC(deviceAddress);

}

//htmlHeader Function

void printHtmlHeader(EthernetClient client) { timeConnectedAt = millis(); writeToEeprom = true; client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println("Connnection: close"); client.println("<!DOCTYPE HTML>"); client.println("<html>"); client.println("<head>");

client.println("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf- 8\">");

SVTH: NGUYỄN HỮU HẬU LỚP: L12CQVT02-N

client.println("<meta name=\"description\" content=\"Điều khiển thiết bị từ xa qua mạng Ethernet\"/>");

client.println("<link href=\"http://nguyenhuuhau.com/hn-icon.png\" rel=\"icon\">"); client.println("<meta http-equiv=\"refresh\" content=\"15; url=/\">");

client.println("<meta name=\"apple-mobile-web-app-capable\" content=\"yes\">"); client.println("<meta name=\"apple-mobile-web-app-status-bar-style\"

content=\"default\">");

client.println("<meta name=\"viewport\" content=\"width=device-width, user- scalable=no\">");

client.println("<style type=\"text/css\">"); client.println("body {");

client.println(" margin: 0;");

client.println(" font-family: helvetica, sans-serif;"); client.println(" background-color: #fff;");

client.println(" background-image:");

client.println(" -webkit-gradient(linear, right bottom, left top,"); client.println(" color-stop(.75, transparent),");

client.println(" color-stop(.75, rgba(0,0,0,.15)) );"); client.println(" -webkit-background-size: 1em;"); client.println(" }");

client.println("h1,h2,h3,h4 {");

client.println(" font-weight: bold;"); client.println(" }");

client.println(".wrapper {");

client.println(" min-height: 100%;"); client.println(" overflow: auto;"); client.println(" }");

client.println(".header {");

client.println(" color: #FFFF00;"); (adsbygoogle = window.adsbygoogle || []).push({});

client.println(" background-color: #336702;");

client.println(" -webkit-box-shadow: inset 0 5px 21px 2px rgba(0,0,0,0.72);"); client.println(" -moz-box-shadow: inset 0 5px 21px 2px rgba(0,0,0,0.72);"); client.println(" box-shadow: inset 0 5px 21px 2px rgba(0,0,0,0.72);"); client.println(" padding: 0 .9em;");

client.println(" }");

client.println(".header h1 {");

SVTH: NGUYỄN HỮU HẬU LỚP: L12CQVT02-N client.println(" line-height: 2.2em;");

client.println(" margin: 0;"); client.println(" }");

client.println(".content {");

client.println(" margin: .9em;"); client.println(" }");

client.println(".info {");

client.println(" margin: 0 auto;"); client.println(" color: #D34836;"); client.println(" }");

client.println(".info h2 {");

client.println(" line-height: .5;");

client.println(" text-shadow: #fff 0 .1em 0;"); client.println(" }");

client.println(".content h3 {"); client.println(" line-height: 1.5;");

client.println(" text-shadow: #fff 0 .1em 0;"); client.println(" margin: .2em;");

client.println(" }");

client.println(".content .floor h4.temper {"); client.println(" margin: 0 0 0 -5.65em;"); client.println(" }");

client.println(" .all {");

client.println(" margin: .5em 0 0 -7.08em;"); client.println(" padding: .3em 1.4em;"); client.println(" }");

client.println(".content h4 {");

client.println(" font-size: 1.4em;"); client.println(" line-height: 1;"); client.println(" margin: .4em;"); client.println(" }");

client.println(".content .floor {"); client.println(" height: 2.5em;");

client.println(" vertical-align: bottom;"); client.println(" color: #0181eb;");

client.println(" }");

SVTH: NGUYỄN HỮU HẬU LỚP: L12CQVT02-N client.println(" margin: 0 .4em;");

client.println(" }");

client.println(".content table {");

client.println(" background-color: #fff;"); client.println(" border-radius: .5em;");

client.println(" border: solid .1em #a9a9a9;"); client.println(" padding: 1em;");

client.println(" -webkit-box-shadow: inset 0 0 15px 0 rgba(192,192,192,1);"); client.println(" -moz-box-shadow: inset 0 0 15px 0 rgba(192,192,192,1);"); client.println(" box-shadow: inset 0 0 15px 0 rgba(192,192,192,1);"); client.println(" }"); (adsbygoogle = window.adsbygoogle || []).push({});

client.println(".blue-circle {");

client.println(" background: radial-gradient(circle farthest-side at center center, #FFFFFF 0%, #0181EB 100%);");

client.println(" box-shadow: #0181EB 0 0 1.5em;"); client.println(" }");

client.println(".grey-circle {");

client.println(" background: radial-gradient(circle farthest-side at center center, #FFFFFF 0%, #708090 100%);");

client.println(" box-shadow: #708090 0 0 1.5em;"); client.println(" }");

client.println(".grey-circle, .blue-circle {"); client.println(" display: block;");

client.println(" height: 2em;"); client.println(" width: 2em;");

client.println(" -moz-border-radius: 1.1em;"); client.println(" -webkit-border-radius: 1.1em;"); client.println(" -khtml-border-radius: 1.1em;"); client.println(" border-radius: 1.1em;");

client.println(" margin: 0 .3em;"); client.println(" }");

client.println(" .glare {");

client.println(" position: relative;"); client.println(" top: .7em;");

client.println(" left: .7em;"); client.println(" margin: 0;"); client.println(" height: .6em;");

SVTH: NGUYỄN HỮU HẬU LỚP: L12CQVT02-N client.println(" width: .6em;");

client.println(" background-color: rgba(255, 255, 255, 0.5);"); client.println(" }");

client.println(" a, a:hover, a:active {"); client.println(" color:#0181eb;");

client.println(" text-decoration: none;"); client.println(" }");

client.println(" input {");

client.println(" background: #c6c6c6;"); client.println(" border: none;");

client.println(" color: #fff;");

client.println(" -webkit-border-radius: .3em;"); client.println(" -moz-border-radius: .3em;"); client.println(" -khtml-border-radius: .3em;"); client.println(" border-radius: .3em;");

client.println(" padding: .3em 1.05em;"); client.println(" font-size: 1.1em;"); client.println(" font-weight: bold;"); client.println(" }");

client.println(" input:hover {");

client.println(" background: #0181eb;"); client.println(" }");

client.println("</style>"); client.println("</head>"); client.println("<body>");

client.println("<div class=\"wrapper\">"); client.println(" <div class=\"header\">"); client.println(" <h1>Đồ án tốt nghiệp</h1>");

client.println(" <h1>ĐIỀU KHIỂN THIẾT BỊ TRONG TOÀ NHÀ</h1>"); client.println(" </div>");

}

//htmlFooter Function

void printHtmlFooter(EthernetClient client) { onAll = ""; (adsbygoogle = window.adsbygoogle || []).push({});

SVTH: NGUYỄN HỮU HẬU LỚP: L12CQVT02-N client.println("\n<h3 align=\"center\"><a href=\"http://nguyenhuuhau.com/\">http://nguyenhuuhau.com</a> <br> Tháng 9 - 2014"); client.println("</h3></div>\n</div>\n</body>\n</html>"); client.stop(); delay(2); } //printHtmlTitle Function

void printHtmlTitle(EthernetClient client) { client.println("<div class=\"info\">");

client.println("<h2>HVCN Bưu chính Viễn thông</h2>"); client.println("<h2>Nguyễn Hữu Hậu&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;L12CQVT02-N</h2>"); client.println("</div>"); client.println("<div class=\"content\">"); client.println(); } //printLogin Function

void printLogin(EthernetClient client) { client.println("<div class=\"content\">");

client.println("<h2 align=\"center\">Xin chào...</h2>");

client.println("<h2 align=\"center\">Vui lòng nhập tên và mật khẩu:</h2>"); client.println("</div>");

client.print("<form action='192.168.1.76/'>"); client.println("<div class=\"content\">");

client.print("<h2 align=\"center\"><input name='ten' value='' placeholder='Tên đăng nhập'></h2>");

client.print("<h2 align=\"center\"><input type='Password' name='matkhau' value='' placeholder='Mật khẩu'></h2>");

client.print("</div>");

client.print("<h2 align=\"center\"><input type='submit' value=' Đăng nhập '></h2>"); client.print("</form>");

client.println("</head></center>"); }

SVTH: NGUYỄN HỮU HẬU LỚP: L12CQVT02-N

TỪ VIẾT TẮT

Viết tắt Tiếng Anh Nghĩa

CSS Cascading Style Sheets Ngôn ngữ phong cách để mô tả cái nhìn và định dạng.

HTML HyperText Markup Language Ngôn ngữ đánh dấu siêu văn bản. HTTP HyperText Transfer Protocol Giao thức truyền tải siêu văn bản. ICSP In Circuit Serial

Programming

Phương pháp trực tiếp lập trình AVR, các Parallax Propeller và vi điều khiển PIC.

IDE Integrated Development Environment

Môi trường phát triển tích hợp.

IP Internet Protocol Giao thức Internet. LAN Local Area Network Mạng máy tính cục bộ.

MAC Media Access Control Kiểm soát truy cập phương tiện truyền thông.

PWM Pulse-width modulation Điều chế độ rộng xung.

SPI Serial Peripheral Interface Giao diện ngoại vi nối tiếp là chuẩn đồng bộ nối tiếp để truyền dữ liệu. TCP Transmission Control

Protocol

Giao thức điều khiển truyền thông.

UARTs Universal asynchronous receiver/transmitter

Phổ quát không đồng bộ thu/phát.

UDP User Datagram Protocol Thiết lập kết nối không chắc chắn để truyền tải dữ liệu. (adsbygoogle = window.adsbygoogle || []).push({});

URL Uniform Resource Locator Định vị tài nguyên thống nhất. WWW World Wide Web Mạng lưới toàn cầu.

SVTH: NGUYỄN HỮU HẬU LỚP: L12CQVT02-N

TÀI LIỆU THAM KHẢO

[1] John Boxall, Arduino Workshop: A Hands - On Introduction with 65 Projects, No Starch Press, 2013

[2] Alan G. Smith, Introduction to Arduino, CreateSpace Independent Publishing

Platform, 2011

[3] Brian Evans, Beginning Arduino Programming, Apress, 2011 [4] Massimo Banzi, Getting Started with Arduino, Maker Media, 2011 [5] Trang Web tham khảo:

 http://arduino.cc/en/Reference/HomePage

Một phần của tài liệu thi công hệ thống điều khiển các thiết bị trong toà nhà qua mạng internet (Trang 56 - 76)