Lưu đồ thuật toán hệ thống điều khiển chính

Một phần của tài liệu đồ án tốt nghiêp thiết kế ngôi nhà thông minh (Trang 53)

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

Một phần của tài liệu đồ án tốt nghiêp thiết kế ngôi nhà thông minh (Trang 53)

w