4. Kết cấu của đề tài: đề tài này gồm 4 chương
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.
float temp = voltage * 100.0; Serial.println(temp);
delay(1000);//đợi 1 giây cho lần đọc tiếp theo }
4.3.4 Giao tiếp với Ethernet Shield
Hình 4.5: Kết nối giữa Ethernet Shield W5100 với Arduino Uno
Ethernet Shield W5100 hỗ trợ chuẩn kết nối SPI, và chân SS mặc định là 10 trên board Ethernet Shield W5100
#include <SPI.h>//Khai báo thư viện chuẩn giao tiếp SPI
#include <Ethernet.h>//Khai báo thư viên hỗ trợ cho Ethernet Shield byte mac[] = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //địa chỉ MAC cho thiết bị IPAddress ip(192,168,1,177); //cấp địa chỉ cho thiết bị kêt nối
EthernetServer server(80);//Port kết nối đến Server void setup() {
Serial.begin(9600); }
Ethernet.begin(mac, ip); //Khai báo khởi tạo Ethernet với thông số địa chỉ mac và IP server.begin(); //Khởi tạo thiết bị là Server
Serial.print("server is at ");
Serial.println(Ethernet.localIP()); //xem địa chỉ của thiết bị }
void loop() {
EthernetClient client = server.available();// khi có tín hiệu tự WebClient đến Server thì bắt đầu chương trình
if (client) {
Serial.println("new client"); boolean currentLineIsBlank = true;
while (client.connected()) { //tạo vòng lặp kết nối với Server if (client.available()) {
char c = client.read(); //đọc chuỗi từ Client gửi về Serial.write(c);
if (c == '\n' && currentLineIsBlank) {
client.println("HTTP/1.1 200 OK"); //tạo một trang web đơn giản bằng ngôn ngữ HTML và nhúng vào vi điều khiển, đây là trang WebServer
client.println("Connection: close"); // the connection will be closed after completion of the response
client.println("Refresh: 5"); // refresh the page automatically every 5 sec client.println(); client.println("<!DOCTYPE HTML>"); client.println("<html>"); client.println("</html>"); break; delay(1); client.stop(); Serial.println("client disconnected"); } }
4.3.5 Giao tiếp với Bluetooth HC-05
Giao tiếp với HC-05 có 2 dạng là kết nối trực tiếp với chân Tx và Rx của chuẩn UART, hoặc kết nối cũng là chuẩn UART nhưng được khai báo bằng phần mềm, cách viết của cả 2 điều như nhau, chỉ khác việc khai báo
Hình 4.6: Kết nối với Bluetooth bằng cách khởi tạo giao tiếp bằng phần mềm
Khai báo thư viên SoftwareSerial có thế nối nhiều thiest bị qua nhiều chân hỗ trợ Code mẫu:
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX của Bluetooth HC-05 void setup()
{ mySerial.begin(4800);// Khai báo tốc độ Baud và khởi tạo kết nối mySerial.println("Hello, world?");//gửi chuỗi ký tự lên Bluetooth HC-05 }
void loop(){
if (mySerial.available())//nếu có tín hiệu từ Bluetooth HC-05
mySerial.write(mySerial.read()); //đọc giá trị được gửi từ Bluetooth }
4.3.6 Giao tiếp NRF24L01
NRF24L01 được thiết kế để giúp việc điều khiển các kết nối không dây đễ dàng có thể điều khiển xa 1km, ít bị trùng kênh do phân rỏ các kênh trong cấu hình phần mềm, mỗi kênh ứng với một khoảng tần số nhất định
Kết nối với NRF24L01
Hình 4.7 Kết nối NRF24L01
NRF24L01 có thể vừa là thiết bị thu, vừa là thiết bị phát, có thể sử dụng lên 1 vi điều khiển, chọn ra thiết bị chủ
#include <RF24Network.h> #include <RF24.h>
#include <SPI.h>
RF24 radio(9,10); //Cấu hình chân kết nối Arduino với chân CE và CSN tương ứng chân số 9 nối với CE và chân số 10 nối với CSN
// Network uses that radio
RF24Network network(radio); //Khai báo biến khỏi tạo sóng radio // Address of our node
const uint16_t this_node = 0;//Khai báo địa chỉ cho thiết bị của NRF24L01 // Address of the other node
const uint16_t other_node = 1;//Khai báo địa chỉ két nối với thiết bị của NRF24L01 struct payload_t // hàm gửi mãu dữ liệu
{
unsigned long ms; unsigned long counter; };
void setup(void) {
Serial.begin(57600);// két nối Serial Monitor
Serial.println("RF24Network/examples/helloworld_rx/"); SPI.begin();//Tương tự phần 4.3.4
radio.begin(); //Thủ tục cho két nối NRF24L01
network.begin(/*channel*/ 90, /*node address*/ this_node); //Khai báo kênh kết nối và địa chỉ của thiết bị
}
void loop(void) {
while ( network.available() )//khi co tín hiệu báo hiệu gửi thì sẽ kích hoạt quá trình nhận
{
RF24NetworkHeader header; //đọc chuỗi đc gửi payload_t payload;
network.read(header,&payload,sizeof(payload)); //Xuất giá trị chuỗi nhận được
Serial.print("Received packet #"); Serial.print(payload.counter); Serial.print(" at "); Serial.println(payload.ms); } }
PHẦN B: KẾT LUẬN 1. Kết luận.
Đề tài thiết kế “HỆ THỐNG ĐIỆN TỬ TỰ ĐÔNG CHO NGÔI NHÀ THÔNG
MINH ” được thực hiện với kết quả như sau:
- Mô hình ngôi nhà với việc điều khiển từ xa như một hệ thống mạng trong nhà. Mạch sử dụng vi điều khiển Atmega328p hoạt động tốt
- Mạch điều khiển và xử lý trung tâm hoạt động ổn định.
Chương trình điều khiển có thể được điều chỉnh dễ dàng, thuận tiện.
Tín hiệu truyền nhận qua RF ổn định nhờ có phân kênh, phân điểm rỏ ràng Hệ thống điều khiển từ xa bằng điện thoại Smartphone có nhiều tính năng như:
Có thể điều khiển được được thiết bị ở bất kì nơi nào trong nhà nếu nơi đó có mạng điện thoại.
Có thể điều khiển và xem biết được trạng thái của hệ thống thiết bị. Hệ thống thiết kế giao diện dễ nhìn, dễ điều khiển
2. Phát triển.
Do thời gian làm đề tài hạn chế, nên còn nhiều khía cạnh tôi chưa khảo sát được cũng