4. Kết cấu của đề tài: đề tài này gồm 4 chương
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 như chưa giải quyết được một số hạn chế, xin đề nghị một số vấn đề như sau:
- Cần khắc phục tình trạng dữ liệu gửi lên Smartphone cho chính xác và nhanh.
- Khoảng cách điều khiển giữa Smartphone còn hạn chế, tầm điêu khiển của Bluetooth lớp 2 đạt hơn 10m.
Tiếp tục nghiên cứu và phát triển đề tài để hệ thống có thể: - Thiết kế hệ thống Camera quan sát
- Thiêt kế giao diện 3D hay thự tế trên Smartphone.
- Đưa hệ thống lên Internet để giám sát và điều khiển ở mọi mơi có mạng
Nhờ có điều khiển từ xa, con người tiết kiệm được thời gian và quá trình đi lại với điều kiện thi công của đề tài rất khả thi, giá thành thấp, phù hợp với điều kiện thực tại của nước nhà. Song đề tài mang tính tiện ích rất cao được ứng dụng từ dân dụng, các thiết bị trong nhà….đến công nghiệp như nhà máy, kho xưởng, hệ thống, khách sạn…. và đặc biệt là những ài trương khắc nghiệt, nguy hiểm, nơi cao áp.
Ngoài ra, trong công tác giảng dạy, hệ thống trở thành một mô hình thực tế dùng giảng dạy thể hiện sự ứng dụng của mạng thông tin.
Hơn nữa về tính khả thi trong tương lai, đề tài mang tính kích thích thúc đẩy sự phát triển của ngành Điện Tử, Viễn Thông của Việt Nam.
Với những đặc điểm và tính năng trên, đề tài có khả năng triển khai ứng dụng rộng rãi trong thực tế và mang tính hiện đại, thực tiễn cao.
TÀI LIỆU THAM KHẢO Tiếng việt:
[1] Huỳnh Minh Phú, Tự học Arduino cho người mới bắt đầu, 2015
[2] Thái Nhật Minh, Luận văn ngôi nhà thông minh, Đại học Công nghệ TP. Hồ Chí
Minh, 2006
Các Website tham khảo:
[1] Arduino.cc [2] http://maniacbug.github.io/RF24Network/index.html [3] www.keil.com/dd/docs/datashts/nordic/nrf24le1_ds_v1_1.pdf [4] http://www.tec.reutlingen-university.de/uploads/media/DatenblattHC-05_BT-Modul.pdf [5] http://pdf.datasheetarchive.com/indexerfiles/Datasheets-SL4/DSASL0073624.pdf [6] hocavr.com [7] Instructables.com