4. Kết cấu của đề tài: đề tài này gồm 4 chương
2.3 Bộ phận an ninh
Bộ phận này đảm bảo cho ngôi nhà góp phần nào vào việc hạn chế sự xâm nhập từ bên ngoài,
2.3.1 Khối hiển thị
Sử dụng LCD16x2 kết nối I2C để hiển thị giờ và ô nhập mật khẩu để mở cửa
• Tổng quan về LCD
LCD là màn hình tinh thể lỏng nhỏ dùng để hiển thị các dòng chữ số trong bảng mã ASCII. LCD được chia sẵn thành từng ô, và ứng với mỗi ô là 1 ký tự trong bảng mã ASCII. LCD có 2 cái giao tiếp là I2C và song song. LCD được điều khiển bơi chip HD44780U. HD44780U là bộ điều khiển cho LCD dạng ma trận điểm, có 2 mode giao tiếp là 4bit và 8bit chứa sẵn 208 ký tự font 5x8 và 32 ký tữ font 5x10
Hình 2.21: LCD 16x2
DH44780U có 3 loại bộ nhớ, đó là bộ nhớ RAM chứa bộ font tạo ra các symbol tuỳ chọn CGRAM, dữ liệu cần hiển thị DDRAM(Display Data RAM), và bộ nhớ ROM chứa bộ font tạo ra kí tự CGROM( Character Generator ROM)
CGRAM: vùng nhớ chứa các symbol do người dụng tự chọn, các symbol thường được định nghĩa trước và được gọi khi cần thiết
CGROM: là vùng nhớ cố định chứa định nghĩa font cho ký tự. mỗi địa chỉ font là mỗi định nghĩa ký tự trong bảng mã ASCII, CGROM và DDRAM được phối hợp hiển thị trong LCD. Để hiển thị một hay nhiều ký tự nào đó lên LCD thì chip điều khiển sẽ đọc giá trị từ CGROM theo bảng mã ASCII và hiển thị dựa trên DDRAM
DDRAM: là bộ nhớ tạm chứa các ký tự cần hiển thị lên LCD, bô nhớ này gồm 80 ô và được chia làm 2 hàng, mỗi ô có độ rộng 8 bit
RS (chân số 3): chân lựa chọ thanh ghi( Select Register), dùng để chọn một trong 2 thanh ghi để làm việc. Nếu RS=0 thanh ghi IR được chọ, RS =1 thanh ghi DR được chọn. IR là thanh ghi chứa mã lệnh cho LCD, DR là thanh ghi hiển thị mã ASCII len LCD
R/W (chân số 4): chân lựa chọn việc đọc ghi. R/W=0 ghi dữ liệu vào LCD, R/W=1 đọc dữ liệu từ LCD
EN (chân số 5): cho LCD hoạt động kết nối với vi điều khiển
Các chân D0-D7 chân tín hiệu, tùy theo chế độ hoạt động 4bit hay 8bit ma nối chân D0- D7
Kết nối LCD với vi điều khiển qua chuẩn I2C
2.3.2 Cảm biến cửa từ:
Khi có sự tác động làm cửa mở ra. Làm cho từ trường của nam châm không còn tác động đến tiếp điểm từ của cảm biến nữa nên xảy ra việc thây đổi trạng thái, và đọc giá trị này để vi xử lý điều khiển hoặc báo động
Hình 2.22: cảm biến cửa
Cảm biến cửa Vi điều khiển
1 Tín hiệu Chân tín hiệu số
2 GND Mass
Bảng 2.11: Nối cảm biến cửa với vi điều khiển 2.3.3 Cảm biến khí Gas
Đề tài này sử dụng loại cảm biến khí Gas MQ2, MQ2 là cảm biến khí, dùng để phát hiện các khí có thể gây cháy. Nó được cấu tạo từ chất bán dẫn SnO2. Chất này có độ nhạy cảm thấp với không khí sạch. Nhưng khi trong môi trường có chất ngây cháy, độ dẫn của nó thay đổi ngay
Khi môi trường sạch điện áp đầu ra của cảm biến thấp, giá trị điện áp đầu ra càng tăng khi nồng độ khí gây cháy xung quang MQ2 càng cao.
MQ2 hoạt động rất tốt trong môi trường khí hóa lỏng LPG, H2, và các chất khí gây cháy khác. Nó được sử dụng rộng rãi trong công nghiệp và dân dụng do mạch đơn giản và chi phí thấp
Hình 2.23:Sơ đồ kết nối cảm biến MQ2
Trong mạch có 2 chân đầu ra là Aout và Dout. Trong đó:
- Aout: điện áp ra tương tự. Nó chạy từ 0.3à4.5V, phụ thuộc vào nồng độ khí xung quang MQ2.
- Dout: điện áp ra số, giá trị 0,1 phụ thuộc vào điện áp tham chiếu và nồng độ khí mà MQ2 đo được.
Việc có chân ra số Dout rất tiện cho ta mắc các ứng dụng đơn giản, không cần đến vi điều khiển. Khi đó ta chỉ cần chỉnh giá trị biến trở tới giá trị nồng độ ta muốn cảnh báo. Khi nồng độ MQ2 đo được thấp hơn mức cho phép thì Dout = 1. Đèn Led tắt. Khi nồng độ khí đo được lớn hơn nồng khí cho phép, Dout =0, đèn led sáng.
- Một điều khó khăn khi làm việc với MQ2 là chúng ta khó có thể quy từ điện áp Aout về giá trị nồng độ ppm. Rồi từ đó hiển thị và cảnh báo theo ppm. Do giá trị điện áp trả về từng loại khí khác nhau, lại bị ảnh hưởng nhiệt độ, độ ẩm nữa.
Ví dụ: Đầu tiên đo trạng thái không khí sạch, giá trị thu được Vout1 Cho khí ga từ bật lửa rò rỉ ra. Ta thấy giá trị Aout tăng lên. Khi đạt khoảng cách khí ga từ bật lửa hợp lý rồi tương ứng với nồng độ khí bắt đầu nguy hiểm, ta ghi lại giá trị Vout2. Ta chọn giá trị Vout2 là giá trị ngưỡng cảnh báo. Nếu giá trị đo được lớn hơn ta sẽ cảnh báo Chỉnh chân biến trở để điện áp đo tại chân 3 của L358 = Vout2.
CHƯƠNG 3: THIẾT KẾ VÀ THI CÔNG HỆ THỐNG 3.1 Hệ thống điều khiển chính
3.1.1 Lưu đồ thuật toán hệ thống điều khiển chính
Lưu đồ 3.1: Lưu đồ thuật toán hệ thống điều khiển chính 3.1.2 Giải thích lưu đồ
Bắt đầu với việc kiểm tra các trạng thái thiêt bị từ hệ thống chính và các hệ thống khu vực 1,2 và hiển thị lên Smartphone, giao diện được thiết kế săn trên nền Android, thao tác đễ dàng. Từ đó người dùng có thể điều khiển các thiết bị thông qua các thao tác này khi chọn chế độ điều khiển,
Khi chọn điều khiển ở phòng khách ( tương ứng với hệ thống trung tâm) thì ta chỉ cần bấm nút ON hoặc OFF để điều khiển đèn, hay có thể xem nhiệt độ của phòng là bao nhiêu để điều chỉnh nhiệt độ cho phù hợp.
Smartphone kết nối với hệ thống chính qua Module Bluetooth HC-05, mỗi khi nhấn nút thì mỗi nút nhất sẽ mang một mã riêng để gửi đến hệ thống chính, và mỗi mã này được
vi điều khiển lọc ra để gửi đến các hệ thống khu vực tương ứng với mỗi mã, nhằm điêu khiển các thiết bị khác trong toàn hệ thống
Các trạng thái thiết bị được đọc trên các tín hiệu vào ra của thiết bị được kết nối với vi điều khiển nhằm phân tích là chuyển đổi thành một dạng mã để truyền dữ liệu xuyên suốt hệ thống, hệ thống chính được phân loại gửi dữ liệu đến các hệ thống phụ thông qua các địa chỉ được định nghĩa trong hệ thống băng cách lập trình và phân chia địa chỉ sao cho hệ thống chính gửi cho các hệ thống phụ và mỗi hệ thống phụ gửi duy nhất địa chỉ cho hệ thống chính
Nút số 1 và số 2 tương ứng cho kết nối không dây khu vực 1 và 2, chụ thể là phòng ngủ và phòng bếp, nút 3 và 4 là nơi nhận tín hiệu gửi lên từ khu vực 1 và 2
Lưu đồ thuật toán bên trong hệ thống
Luu đồ 3.2: Lưu đồ thuật toán hệ thống điều khiển chính
Khi nhận tín hiệu từ Smartphone nếu là chế độ tự động thì sẽ kích hoạt cảm biến và điều khiển thiết bị dựa tren điều kiện thời tiết, không gian và thời gian, ảnh hưởng môi trường xung quanh, Nếu có người vào phòng nhưng ánh sáng kém thì đè sẽ tự bật, và nhiệt độ dưới 30 độ thì sẽ kích hoạt quạt chạy
Khi có tín hiệu tùy chọn từ Smartphone thì vi điều khiển sẽ nhận lệnh điều khiển từn g thiết bị bên trong phòng
Tùy theo trạng thái mà gửi lên điện thoại để tránh tình trạng k chọn lọc dữ liệu gửi lên liên tục gây tình trạng xử lý các tín hiệu chậm, vì vậy khi có sự thay đổi thì sẽ gửi sự thay đổi đó lên cho người điều khiển theo dõi
3.1.4 Thi công mạch
Hình 3.2: Mạch lớp BOTTOM
Lưu đồ 3.3: Lưu đồ hệ thống điều khiển khu vực 3.2.2 Giải thích lưu đồ
Cũng tương tự như hệ thống điều khiển trung tâm, nhưng hệ thống này điều khiển và gửi dữ liệu qua bộ phận thu-phát NRF24L01, cũng sẽ nhậ tín hiệu lựa chọn chế độ, và điều khiển qua smartphone nhưng phải thông qua bộ điều khiển chính
Bộ phận này hoạt động độc lập nhưng sẽ có sự thay đổi khi có tín hiệu điều khiển
Các tín hiệu gửi lên hệ thống chính được gồm thành một chuỗi, chính vì vậy truớc khi gửi ta chuyển các biến này thành một mãng gồm nhiều thành phần, để việc đọc giá trị trên hê thông chính một các dễ dàng, ví du: ta có các đèn led và cảm biến, thì khai báo biến như sau
“Int led[4]; và int cambien[3];” cách khai báo này giúp ta định nghĩa được các giá trị gửi lên, ta co 4 led thì sẽ khai báo led[0]=led1,led[1]=led2… tương tự với cảm biến, và khi hệ thống chính đọc giá trị thì ta chỉ việc khai báo biến như trên đối với các giá trị được gán, và sẽ lọc giá trị dễ dàng, nhận biết dễ dàng
Ở nút 1 là nhận tín hiệu điều khiển được gửi từ hệ thống chính, và nút 3 là gửi lên hệ thống chính
3.2.4 Thi công mạch
3.3 Thiết kế phần mềm trên smartphone3.3.1 Tạo giao diện 3.3.1 Tạo giao diện
Hình 3.5: Tạo giao diện trên MIT App Inventor
Sau khi tạo được giao diện vào Tab Blocks để lập trình cho chương trình
3.3.2 Lập trình bằng khối
Hình 3.4: Tạo kết nối Bluetooth
Hai BeforePicking là hàm để cho điện thoại tìm các kết nối Bluetooh và hàm AfterPicking là hàm cho kết quả kết nối với Bluetooth sau khi chọn
Tạo các nút trên phần mềm khi bấm vào sẽ gửi một chuỗi ký tự tương ứng từng nút về vi điều khiển ví dụ:
Ví dụ này là khi nhấn nút mở trong phòng khách và gửi chuỗi “onkhach1” về cho vi điều khiển
Hàm Clock là hàm timer là cho tín hiệu sẽ nhận hay gửi trong khoảng thời gian định sẵn, và hàm ReceiveTextnumberOfBytes là hàm nhận một chuỗi dữ liệu từ vi điều khiển gửi lên, đay là một chuỗi nên ta phải tách từng chuỗi riêng ứng với từngv vị trí trên các thiết bị bằng hàm sau”
Hàm này giúp ta nhận giá trị được cắt bởi điểm start và điểm and, ta lấy ví dụ: khi Smartphone đọc giá trị từ vi điều khiển thì sẽ nhận một dãy chuỗi tương ứng với thiết bị như 3 led sang thì sẽ nhận được chuỗi “ led1on led2on led3on”, và như thế ta phải lọc từng giá trị led1on, led2on, led3on, 1 cách riêng lẻ để cho người điều khiển đọc được trạng thái đó,
Hàm này lọc giá trị có chứa “led on” thì lưu trạng thái và thiết lập điều kiện cho nó
3.4 Sản phẩm và mô hình
3.4.1 Bộ phận điều khiển trung tâm
Hinh 3.5: Mạch điều khiển trung tâm 3.4.2 Bộ điều khiển cho các khu vực
Hình 3.6: Mạch điều khiển khu vực 3.4.3 Mô hình nhà thông minh
CHƯƠNG 4: VIẾT CHƯƠNG TRÌNH 4.1 Giới thiệu phần mềm Arduino IDE
Hình 4.1: Giao diện Arduino IDE
Arduino hỗ trợ nhiều thư viện, giúp việc lập trình đễ dàng hơn. Ví dụ, muốn Arduino kết nối hay điều khiển qua Ethernet, thì ta có thể lập trình cho nó bằng phương pháp biên dịch tương tự như các dòng vi điều khiển họ AVR nhưng điều này sẽ phức tạp do cấu trúc có nhiều dòng lệnh, các chương trình con hay các biến các hàm để phục vụ cho muc đích kết nối với Ethernet, và với phương pháp lập trình trên Arduino thì dễ dàng hơn vì cấu trúc câu lệnh đơn giản hơn vì có thư viện sẵn cho kết nối Ethernet. Hay cụ thể hơn nếu điều khiển 1 led nhấp nháy thì trong hàm void loop ()
{//nhập lệnh
digitalWrite(“pin trên arduino”,HIGH); delay(1000); //thời gian sáng là 1s
{pinMode(“pin trên arduino kết nối với Led”,OUT);}
Cụ thể hơn khi viết một chương trình trên Arduino chú ý đến phần Tool trên thanh công cụ, chọn Board và Port cho phù hợp để nạp code, phần code này sao khi biên dịch sẽ chuyển sang dạng hex và nạp được cho các dòng vi điều khiển đã nạp bootloader
4.2 Cách khai báo biến, kiểu dữ liệu, khởi tạo một chương trình
Khai báo biến trong Arduino cũng như khai báo khi viết chương trình cho AVR nhưng nó sẽ gọn hơn nhờ được hỗ trợ bởi các thư viện có sẵn,
Chúng ta có các kiểu dữ liệu như int, float, Usigned int, hay String, char.. tương tự như trong C, để thiết lập ngỏ ra/ ngỏ vào thì chỉ cần khai báo ở hàm void setup(), các giá trị khơi tạo ở đây giúp cho vi điều khiển định nghĩa được các kết nối với các thiết bị, hay điều khiển nó,
Để vi điều khiển thự thi chương trình thì xác đinh ở hàm void loop() hàm này tạo vòng lặp vô hạn cho vi điều khiển hoạt động, có thể viết trên void setup() đê thực thi nó
4.3 Lập trình với một số thiết bị đơn giản và thông dụng
4.3.1 Điều khiển thời gian thực
(Như trong bài báo cáo có nói đến IC thời gian thức DS1307 phần này hướng dẫn kết nối và lập trình cơ bản)
Phần code cơ bản để giao tiếp với IC thời gian thực DS1307
#include <Wire.h> /// Thư viện hỗ trợ kết nối I2C trên vi điều khiển Atmega328p #include "RTClib.h" //Thư viện dành cho IC DS1307
RTC_Millis rtc; //biến khởi tạo thời gian thực với “rtc” có thể thay thế bằng tên mà người lập trình thấy phù hợp
void setup () { //chương trình khởi tạo ban đầu cho việc kết nối
Serial.begin(57600); // Giao tiếp với máy tính qua chuẩn UART bằng Serial Monitor trên Arduino IDE với tốc độ Baud 57600 (nếu kết nối hiển thị bằng LCD thì khai báo LCD hay Led 7 đoạn thì khai báo thông qua thư viện hỗ trợ),Chú ý: Serial.begin(“tốc độ”) có thể có hoặc không có thì mạch vẫn chạy
rtc.begin(DateTime(F(__DATE__), F(__TIME__)));// khai báo chuẩn ngày và giờ }
void loop () {
DateTime now = rtc.now(); //lấy thời gian thực, ta có thể khai báo “now”, “future” tùy theo cách sử dụng
Serial.print(now.year(), DEC); //lấy giá trị năm Serial.print('/');
Serial.print(now.month(), DEC); //lấy giá trị tháng Serial.print('/');
Serial.print(now.day(), DEC); //lấy giá trị ngày Serial.print(' ');
Serial.print(now.hour(), DEC); //lấy giá trị giờ Serial.print(':');
Serial.print(now.minute(), DEC); //lấy giá trị phút Serial.print(':');
Serial.print(now.second(), DEC); //lấy giá trị giây Serial.println();
}
4.3.2 Điều khiển kết nối LCD 16x2
Hình 4.3: Kết nối với LCD
LCD sử dụng thư viện “LiquidCrystal” hỗ trợ kết nối và hiển thị trên LCD Phần code giao tiếp:
#include <LiquidCrystal.h> //gọi thư viện hỗ trợ LCD
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);// khai báo biến kết nối, các chân 12,11,5,4,3,2 trên board Arduino tương ứng với RS,E,D4,D5,D6,D7 trên LCD
void setup() {
lcd.begin(16, 2); //biến khởi tạo cho lcd, với “(16,2)” là khai báo dạng LCD 16x2, nếu sử dụng LCD 20x4 thì khai báo lcd.begin(20x4);
lcd.print("hello, world!"); //in ra LCD } void loop() { lcd.noBlink(); //đèn hình nền của LCD delay(3000); lcd.blink(); delay(3000); }
4.3.3 Điều khiển kết nối cảm biến nhiệt độ (ví dụ LM35)
Hình 4.4: Kết nối cảm biến nhiệt độ LM35
Để lập trình ta nối cảm biến nhiệt độ LM35 qua chân Analog của Arduino cảm biến
LM35 hoạt động bằng cách cho ra một giá trị hiệu điện thế nhất định tại chân Vout (chân giữa) ứng với mỗi mức nhiệt độ.
Code ví dụ:
int sensorPin = A0;// chân analog kết nối tới cảm biến LM35 void setup() {
Serial.begin(9600); //Khởi động Serial ở mức baudrate 9600
// Không cần phải pinMode cho các chân analog trước khi dùng nó }
void loop() {
//đọc giá trị từ cảm biến LM35
int reading = analogRead(sensorPin);
//tính ra giá trị hiệu điện thế (đơn vị Volt) từ giá trị cảm biến float voltage = reading * 5.0 / 1024.0;
// ở trên mình đã giới thiệu, cứ mỗi 10mV = 1 độ C.