Professional Documents
Culture Documents
(123doc) - Thiet-Ke-Nha-Thong-Minh-Su-Dung-Arduino-Co-Code
(123doc) - Thiet-Ke-Nha-Thong-Minh-Su-Dung-Arduino-Co-Code
(123doc) - Thiet-Ke-Nha-Thong-Minh-Su-Dung-Arduino-Co-Code
Smart home là một trong những đề tài được phát triển sâu rộng trong cách mạng
công nghiệp 4.0, đây được coi như là một xu hướng của tương lai.
Những yếu tố chính của kỹ thuật số trong cách mạng công nghiệp 4.0 là trí tuệ
nhân tạo (AI); vạn vật kết nối – Internet of things (IoT) và dữ liệu lớn (Big Data).
Trong cơn lốc cuộc cách mạng công nghệ 4.0 trên toàn thế giới, thì sự ra đời của
nhà thông minh (Smart home) là điều tất yếu và xu hướng trên toàn thế giới. Nhà
thông minh được hiểu theo nghĩa đơn giản là sự kết hợp tất cả các thiết bị trong nhà
thông qua kết nối Internet không dây và được điều khiển trực tiếp, gián tiếp qua các
thiết bị thông minh như: điện thoại, máy tính bảng v.v… hoặc bằng giọng nói, tự
động cài đặt theo các hoạt cảnh khác nhau v.v…
Hình 1-3. IOT có thể kết nối mọi thiết bị với nhau
Những tác nhân ngăn cản sự phát triển của Internet of Things:
- Chưa có một ngôn ngữ chung:
Ở mức cơ bản nhất, Internet là một mạng dùng để nối thiết bị này với thiết bị
khác. Nếu chỉ riêng có kết nối không thôi thì không có gì đảm bảo rằng các thiết bị
biết cách nói chuyện nói nhau.
- Hàng rào subnetwork:
Lấy ví dụ như xe ô tô chẳng hạn. Một chiếc Ford Focus có thể giao tiếp cực kì
tốt đến các dịch vụ và trung tâm dữ liệu của Ford khi gửi dữ liệu lên mạng. Nếu một
bộ phận nào đó cần thay thế, hệ thống trên xe sẽ thông báo về Ford, từ đó hãng tiếp
tục thông báo đến người dùng. Nhưng trong trường hợp chúng ta muốn tạo ra một
hệ thống cảnh báo kẹt xe thì mọi chuyện rắc rối hơn nhiều bởi xe Ford được thiết
lập chỉ để nói chuyện với server của Ford, không phải với server của Honda, Audi,
Mercedes hay BMW. Lý do cho việc giao tiếp thất bại? Chúng ta thiếu đi một ngôn
ngữ chung. Và để thiết lập cho các hệ thống này nói chuyện được với nhau thì rất
tốn kém, đắt tiền.
Một số trong những vấn đề nói trên chỉ đơn giản là vấn đề về kiến trúc mạng, về
kết nối mà các thiết bị sẽ liên lạc với nhau (Wifi, Bluetooth, NFC,...). Những thứ
này thì tương đối dễ khắc phục với công nghệ không dây ngày nay. Còn với các vấn
đề về giao thức thì phức tạp hơn rất nhiều, nó chính là vật cản lớn và trực tiếp trên
con đường phát triển của Internet of Things.
- Có quá nhiều "ngôn ngữ địa phương":
- Tiền và chi phí:
Sử dụng Arduino để lập trình, xây dựng hệ thống nhà thông minh, kết hợp với
IOT để giám sát, điều khiển hệ thống.
Dựng mô hình nhà thông minh và thiết lập giao diện dễ tiếp cận với người sử
dụng
CHƯƠNG 2. CƠ SỞ LÝ THUYẾT
Hình 2-2. Kết nối PIR với Arduino trong ứng dụng phát hiện chuyển động
Thông số kỹ thuật:
- Khối lượng : 9g
- Kích thước: 22.2×11.8.32 mm
- Momen xoắn: 1.8kg/cm
- Tốc độ hoạt động: 60 độ trong 0.1 giây
- Điện áp hoạt động: 4.8V(~5V)
- Nhiệt độ hoạt động: 0 ºC – 55 ºC
- Kết nối dây màu đỏ với 5V, dây màu nâu với mass, dây màu cam với chân
phát xung của vi điều khiển.
- Ở chân xung cấp một xung từ 1ms-2ms theo để điều khiển góc quay theo ý
muốn.
Node-RED được xây dựng dựa trên nền tảng Node.js, nó được xem như một
web server mà ta có thể cấu hình tùy chỉnh các chức năng gọi là “flow” từ bất kỳ
trình duyệt nào trên máy tính. Mỗi ứng dụng Node-RED bao gồm các node có thể
liên kết được với nhau với các dạng là input, output và operation.
Hình 2-8. Ví dụ về sự tương tác của các tab trong Node Red
Với Node-RED ta có thể hình dung cách tương tác và giao tiếp với các thiết bị
một cách tổng quan như sau. Nếu dùng Raspberry hay OrangePi thì thiết bị này sẽ
đóng vai trò là Server, còn lại sẽ là client như hình:
Hình 2-10. Kết nối Node Red sử dụng trực tiếp qua máy tính
Để có thể sử dụng được phần mềm Node Red, trước tiên máy tính của ta cần
phải có ứng dụng NodeJS. NodeJS là một mã nguồn được xây dựng dựa trên nền
tảng Javascript V8 Engine, nó được sử dụng để xây dựng các ứng dụng web như các
trang video clip, các forum và đặc biệt là trang mạng xã hội phạm vi hẹp. NodeJS
có thể chạy trên nhiều nền tảng hệ điều hành khác nhau từ Window cho tới Linux,
OS X nên đó cũng là một lợi thế. Nó cung cấp các thư viện phong phú ở dạng
Javascript Module khác nhau giúp đơn giản hóa việc lập trình và giảm thời gian ở
mức thấp nhất.
Để cài đặt node red, ta bấm vào nút Start trên thanh Menu của màn hình, sau đó
chọn Run và đánh vào mục tìm cụm từ “cmd”, sau đó nhấn Enter.
Tại đây, ta gõ tiếp lệnh “npm install -g –unsafe-perm node-red” ngay tại vị trí
con trỏ chuột trên Node Red.
Chương trình sẽ được tự động cài đặt vào máy tính:
Hình 2-15. Hoàn thành thiết lập server Local cho máy tính
Sau khi đã hoàn thành thiết lập server Local, ta mở trình duyệt internet thường
dùng lên, ở đây ta sử dụng trình duyệt Google Chrome, ta copy địa chỉ
“http://127.0.0.1:1880/” được đánh dấu đỏ ở hình trên vào phần tìm kiếm của
Chrome và bấm Enter.
Hình 2-16. Giao diện lập trình cơ bản của Node Red
Vậy là ta đã hoàn thành cài đặt thiết lập chương trình Node Red sử dụng máy
tính làm server truyền tải thông tin. Tại đây ta bắt đầu lập trình cho hệ thống nhà
thông minh theo thiết kế ban đầu, sử dụng các tab ở cột bên trái và kéo thả chúng
vào giữa màn hình, viết code cho từng khối để chúng có thể hoạt động và liên kết
với nhau.
2.3.4 Cài đặt các ứng dụng cần thiết cho Node Red:
Để sử dụng têem nhiều chế độ, ứng dụng khác của Node Red, ta cần tiến hành
cài đặt thêm các thư viện ứng dụng khác ngoài những ứng dụng dã có sẵn trên Node
Red.
- Node Red Dashboard:
Tại cửa sổ cmd.exe, ta tắt chương trình Node Red bằng tổ hợp phím Cntrl+C.
Ta đánh dòng lệnh “npm i Node-red-dashboard” và bấm Enter.
Thư viện dashboard sẽ được tự động cài đặt 1 cách nhanh chóng.
Hình 2-17. Cài đặt thư viện Dashboard cho Node Red
Hình 2-18. Cài đặt thư viện SerialPort cho Node Red
Hình 2-19. Địa chỉ của file settings.js trong máy tính
Để khởi động quyền admin cho Node Red, ta cần điều chỉnh một số nội dung
bên trong file settings.js này.
Ta mở file bằng chương trình Wordpad hoặc Notepad, sau đó copy đoạn code
sau và paste xuống dưới cùng:
adminAuth: {
type: "credentials",
users: [{
username: "admin",
password:
"$2a$08$zZWtXTja0fB1pzD4sHCMyOCMYz2Z6dNbM6tl8sJogENOMcxWV9D
N.",
permissions: "*"
}]
},
Đây là thông tin đăng nhập cơ bản của Node Red, ta cần phải đổi lại mật khẩu để
có thể sử dụng được chương trình, cách đổi mật khẩu như sau:
B1: Mở lại chương trình cmd.exe (không khởi động Node Red)
B2: Cài đặt để máy tính có thể mã hóa mật khẩu mà ta mong muốn thành một
chuổi ký tự mà Node Red có thể hiểu được bằng cách nhập dòng lệnh “node-red-
admin hash-pw”, chương trình sẽ hiển thị ra dòng chữ Password để ta nhập mật
khẩu mới, sau khi nhập, ta bấm Enter.
Hình 2-20. Mã hóa mật khẩu để sử dụng cho chương trình Node Red
B3: Copy dòng mật khẩu vừa được mã hóa và dán đè lên dòng mật khẩu trong
file Settings,js.
Hình 2-21. Chỉnh sửa thông tin đăng nhập trong file settings.js
B4: Save file settings.js, khởi động lại Node Red, và chương trình sẽ yêu cầu ta
nhập thông tin để đăng nhập.
Hình 2-22. Màn hình đăng nhập vào giao diện lập trình của Node Red
2.3.5 Lập trình cho hệ thống nhà thông minh trên Node Red:
Ta tiến hành lập trình cho hệ thống trên giao diện kéo thả của Node Red tại địa
chỉ localhost:1880.
Thiết kế, lập trình mộ hệ thống trên Node Red rất đơn giản, ta chỉ cần kéo thả
các tab phía bên trái chương trình vào khu vực chính giữa, sau đó kết nối các tab lại
theo chức năng, lưu đồ giải thuật của hệ thống.
Hình 2-23. Lập trình cho hệ thống nhà thông minh trên Node Red
Sau khi đã hoàn thành phần viết code cho Node Red, ta bấm vào nút Deploy ở
phía trên góc phải màn hình của giao diên viết code cho Node Red, nếu chương
trình báo lỗi, ta tìm chỗ sai và sửa lại code cho thật chính xác, khi chương trình
Deploy thành công, ta truy cập tiếp vào địa chỉ “http://127.0.0.1:1880/ui” để truy
cập vào giao diện hoạt động chính.
Nhấn nút điều khiển trên màn hình điện thoại (android hoặc IOS), điện thoại sẽ
truyền tín hiệu tới module Arduino Uno R3 để điều khiển các thiết bị với chức năng
đã được gán cho trên màn hình điện thoại:
- Tắt/ mở các đèn LED.
- Đóng/mở cửa theo yêu cầu.
- Các cảm biến kích hoạt theo tín hiệu về nồng độ khí gas và chuyển động.
Hình 3-27. Lưu đồ giải thuật điều khiển, giám sát nhà thông minh
3.4 Thiết kế hệ thống nút bấm sử dụng chân Analog của Arduino:
Để sử dụng 1 cách tiết kiệm số chân của board Arduino UNO R3, ta có thể sử
dụng duy nhất 1 chân analog của Arduino cho tất cả các nút bấm thay vì phải sử
dụng riêng 1 chân digital cho từng nút bấm. Trong đề tài này, ta sử dụng 4 nút bấm,
được kết nối theo sơ đồ sau:
[1] qweqwe
[2] qwqeeqwe
PHỤ LỤC
#include <VarSpeedServo.h>
VarSpeedServo myservo1;
VarSpeedServo myservo2;
VarSpeedServo myservo3;
VarSpeedServo myservo4;
void setup() {
//Thiết lập cho đèn
pinMode(relay1, OUTPUT);
pinMode(relay2, OUTPUT);
pinMode(relay3, OUTPUT);
pinMode(relay4, OUTPUT);
digitalWrite(relay1,1);
digitalWrite(relay2,1);
digitalWrite(relay3,1);
digitalWrite(relay4,1);
pinMode(Button_analogPin, INPUT);
//Thiết lập cho động cơ Servo
myservo1.attach(3);
myservo2.attach(5);
myservo3.attach(6);
myservo4.attach(9);
//Cảm biến
pinMode(inputPin, INPUT);
Serial.begin(9600);
}
void loop() {
if(Serial.available())
{
inbyte = Serial.read();
}
nhannutbam();
mocua();
inbyte = 0;
int gas = analogRead(A1);
Serial.print("gas,");
Serial.println(gas);
delay(1000);
//Đèn 1
if(inbyte == 'A' || (val < 90 &&!d1))
{
digitalWrite(relay1,0);
delay(500); //chờ buông tay.
relay1,0;
d1 = true;
Serial.println("A");
}
else if(inbyte == 'a' || (val < 90 && d1))
{
digitalWrite(relay1,1);
delay(500); //chờ buông tay.
relay1,1;
d1 = false;
Serial.println("a");
}
//Đèn 2
relay3,1;
d3 = false;
Serial.println("c");
}
//Đèn 4
if(inbyte == 'D' || (val > 400 && val < 800 &&!d4))
{
digitalWrite(relay4,0);
delay(500); //chờ buông tay.
relay4,0;
d4 = true;
Serial.println("D");
}
else if(inbyte == 'd' || (val > 400 && val < 800 && d4))
{
digitalWrite(relay4,1);
delay(500); //chờ buông tay.
relay4,1;
d4 = false;
Serial.println("d");
}
}
//Phần mở cửa
void mocua() {
int LEF = 0;
int RIG = 70;
int SPEED1 = 40;
//servo 1
if(inbyte == 'E')
{
myservo1.write(RIG, SPEED1);
myservo1.wait();
}
if(inbyte == 'e')
{
myservo1.write(LEF, SPEED1);
myservo1.wait();
}
//servo 2 & 3
if(inbyte == 'F')
{
myservo2.write(LEF, SPEED1);
myservo3.write(RIG, SPEED1);
myservo2.wait();
myservo3.wait();
}
if(inbyte == 'f')
{
myservo2.write(RIG, SPEED1);
myservo3.write(LEF, SPEED1);
myservo2.wait();
myservo3.wait();
}
//servo 4
if(inbyte == 'G')
{
myservo4.write(LEF, SPEED1);
myservo4.wait();
}
if(inbyte == 'g')
{
myservo4.write(RIG, SPEED1);
myservo4.wait();
}
}
void pir()
{
chuyendong = digitalRead(inputPin); // đọc giá trị đầu vào.
delay(1000);
if (chuyendong == HIGH) // nếu giá trị ở mức cao.(1)
{
Serial.println("Z");
delay(3000);
}
else
{
Serial.println("z");
delay(1000);
}
}