Giao tiếp giữa Arduino và LCD 16x2 rất đơn giản bởi vì Arduino IDE đã có sẵn thư viện cho LCD là LiquidCrystal.h, công việc của chúng ta là hiểu và biết cách sử dụng thư viện này mà thôi
- Code chương trình :
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // thiet lap chan cho LCD void setup() {
lcd.begin(16, 2); // thiet lap loai LCD su dung la 16 cot va 2 dong }
void loop() { introduce(); basicPrintDemo(); displayOnOffDemo(); setCursorDemo();
scrollLeftDemo(); scrollRightDemo(); cursorDemo(); createGlyphDemo(); }
voidintroduce(){ lcd.clear(); lcd.setCursor(0,0); lcd.print("HVHANG KHONGVN");
lcd.setCursor(1,1); lcd.print("HDSD ARDUINO"); delay (1000); for(intx=0; x <3; x++) { lcd.noDisplay();//tat hien thi delay(300); lcd.display(); //bat hien thi delay(300);
} }
voidbasicPrintDemo() { lcd.clear(); //xoa man hinh lcd.print("HVHANG KHONG"); delay(1000);
}
voiddisplayOnOffDemo() { lcd.clear();
lcd.print("BAT/TAT MAN HINH");
for(intx=0; x <3; x++) { lcd.noDisplay(); delay(500); lcd.display();
delay(500); }
}
lcd.clear();
lcd.setCursor(5,0); //thiet lap con tro vi tri cot5 hang 0 lcd.print("5,0"); delay(500);
lcd.setCursor(10,1);//thiet lap con tro cot 10 hang thu1 lcd.print("10,1"); delay(500);
lcd.setCursor(3,1); //thiet lap con tro vi tri cot 3 hang1 lcd.print("3,1"); delay(500); } voidscrollLeftDemo() { lcd.clear(); lcd.print("ScrollLeftDemo"); delay(500); lcd.clear();
lcd.setCursor(7,0); lcd.print("Beginning"); lcd.setCursor(9,1); lcd.print("Arduino"); delay(500);
for(intx=0; x<16; x++) {
lcd.scrollDisplayLeft(); //cuon man hinh sang trai delay(250); }
}
voidscrollRightDemo() { lcd.clear(); lcd.print("ScrollRight"); lcd.setCursor(0,1); lcd.print("Demo"); delay(500);
lcd.clear(); lcd.print("Beginning"); lcd.setCursor(0,1); lcd.print("Arduino"); delay(500);
for(intx=0; x<16; x++) {
lcd.scrollDisplayRight();//cuon mang hinh sang phai delay(250); }
}
lcd.clear();
lcd.cursor(); // bat con tro lcd.print("CursorOn"); delay(1000); lcd.clear();
lcd.noCursor(); //tat con tro lcd.print("CursorOff"); delay(1000); lcd.clear();
lcd.cursor();
lcd.blink();// nhap nhay con tro lcd.print("CursorBlink On"); delay(1000); lcd.noCursor();
lcd.noBlink(); //tat nhap nhay con tro }
voidcreateGlyphDemo() { lcd.clear();
byte char1[8]= {//tạo chữ “ô”
B01110, B10001, B00000, B01110, B10001, B10001, B01110, B00000
};
byte char2[8]= {//tạo chữ “ơ”
B01110, B00001, B00010, B01110, B10001, B10001, B01110, B00000 };lcd.createChar(0,char1);//tạo ký tự tuỳ chỉnh 0
lcd.createChar(1,char2); //tạo ký tự tuỳ chỉnh 1 for(intx=0; x<5; x++) {
lcd.setCursor(8,0);
lcd.write(byte(0)); // in chữ “ô”ra màn hình delay(1000); lcd.setCursor(8,0);
lcd.write(byte(1)); //in chữ “ơ” ra màn hình delay(1000); }
}
Đầu tiên chúng ta khai báo thư viện mà chúng ta sẽ sử dụng để điều khiển LCD. Như đã nói ở trên chúng ta sẽ sử dụng thư viện có tên là
LiquidCrystal.h. Có rất nhiều thư viện và code mẫu cho những loại LCD khác,
bạn có thể truy cập vào trang web h t t p: // www .ar d u i n o . c c / p l a y g r ou n d / C o d e / L CD đ ể tải về sử dụng.
Để khai báo thư viện cho LCD hay bất cứ thư viện nào khác ta dùng câu lệnh
#include <tenthuvien.h>
Trong trường hợp này ta khai báo là:
#include <LiquidCrystal.h>
Tiếp theo tạo một đổi tượng và gán chân cho nó bằng câu lệnh:
LiquidCrystalObject(RS, E, D4, D5, D6, D7);
Như vậy trong đoạn code trên tôi đã khai báo một đối tượng có tên là lcd (các bạn có thể thay thế lcd bằng những từ khác mà các bạn muốn) và chân 12của Arduino nối với chân RS, chân 11 nối với E và các chân 5 đến chân 2 lần lượt nốivới D4 đến D7 trên LCD 16x2.
LiquidCrystallcd(12,11,5,4,3, 2);
Trong hàm setup() chúng ta cần khai báo loại LCD mà chúng ta sử dụng. Vì trong thư viện LiquidCrystal.h hỗ trợ rất nhiều loại LCD chẳng hạn như16x2,16x4,20x2,20x4, GLCD….Ở đây chúng ta sử dụng 16x2 thì ta khai báo.
lcd.begin(16,2);
Trong loop() chúng ta có 8 chương trình con, và tôi sẽ giải thích từng chương trình
Chương trình con thứ 1: introduce(). Đây là chương trình giới thiệu.
Chương trình con thứ 2: basicPrintDemo()
Trong chương trình con này chúng ta sẽ điều khiển sao cho LCD hiển thị dòng chữ mà ta mong muốn.
Đầu tiên chúng ta xoá tất cả màn hình bằng câu lệnh:
Chúng ta cần lưu ý đối tượng lcd: nếu như ban đầu chúng ta khai báo đổi tượng là
LCD16x2 thì chúng ta phải viết câu lệnh là LCD16x2.clear().
Để hiển thị một dòng ký tự bất kỳ lên màn hình thì ta dùng câu lệnh
print() cụ thể trong trường hợp này là:
lcd.print("HVHANG KHONG");
Các ký tự bên trong ngoặc kép sẽ được hiển thị lên màn hình, nếu tổng các ký tự lớn hơn16, thì các ký tự từ thứ 17 trở đi sẽ không được hiển thị lên màn hình.
Chương trình con thứ3: displayOnOffDemo()
Trong chương trình con này hướng dẫn cho chúng ta các câu lệnh chức năng bật và tắt màn hình. Ta cần quan tâm tới 2 câu lệnh sau:
lcd.nodisplay(); Câu lệnh này có chức năng tắt màn hình hiển thị . lcd.display(); Câu lệnh này cho phép hiển thị màn hình.
Chương trình con thứ 4: setCursorDemo()
Chương trình con này hướng dẫn chúng ta các câu lệnh dịch chuyển vị trí con trỏ theo ý muốn, các câu lệnh cần quan tâm đó là: lcd.setCursor(5,0);
lcd.print("5,0");
Dịch con trỏ đến cột thứ 5 hàng thứ 0. Sau đó xuất ra màn hình LCD“5,0” từ cột thứ 5 hàng 0 trở đi.
lcd.setCursor(10,1);//thietlapcontrocot10hangthu1 lcd.print("10,1"); Dịch con trỏ đến vị trí cột 10 hàng thứ 1. Xuất ra màn hình"10,1"
Tương tự như vậy đối với 2 câu lệnh cuối là:
lcd.setCursor(3,1); //thiet lap control vi tri cot 3 hang 1
Chương trình con thứ 5: scrollLeftDemo()
Chương trình con này sẽ dịch các ký tự đang hiển thị trên màn hình sang bên trái. Các câu lệnh trong chương trình con này không khó, chúng ta chỉ quan tâm tới các câu lệnh sau:
for(intx=0; x<16; x++) {
lcd.scrollDisplayLeft(); //cuonmanhinhsangtrai delay(250); }
Trong vòng lặp chúng ta có câu lệnh: lcd.scrollDisplayLeft();
Mỗi lần chương trình thực hiện câu lệnh này sẽ dịch tất cả các ký tự đang hiển thị trên màn hình sang bên trái 1 cột. Chúng ta có vòng lặp 16 lần như vậy các ký tự sẽ được dịch hết về bên trái.
Khi vòng lặp thực hiện được16 lần thì màn hình sẽ trống hoàn toàn.
Chương trình con thứ 6: scrollRightDemo()
Hoàn toàn tương tự như scrollLeftDemo() chương trình con này sẽ thực hiện dịch phải các ký tự trên màn hình.
Câu lệnh cần quan tâm là: lcd.scrollDisplayRight();
Chương trình con thứ 7: cursorDemo()
Ở phần này chúng ta sẽ tìm hiểu các câu lệnh điều khiển con trỏ bật, tắt và nhấp nháy.
lcd.cursor(): câu lệnh này cho phép chúng ta bật con trỏ. lcd.noCursor(): tắtcontrỏ
lcd.blink(): nhấp nháy con trỏ
Chương trình con thứ 8: createGlyphDemo()
Bây giờ chúng ta sẽ tìm hiều cách tự tạo ra một ký tự không thuộc hệ thống mã ASCII, chẳng hạn như các chữ cái có dấu trong hệ thống chữ cái tiếng việt như ă,â,ô,ơ….
- Đối với LCD 16x2 cứ mỗi ký tự trong một ô sẽ được tạo thành từ 5x8 ô nhỏ( 5 cột,8 dòng)
Để tạo một ký tự thì chúng ta dùng một mảng gồm 8 phần tử, mỗi phần tử là 1byte, nhưng chỉ sử dụng 5 bit thấp của 1 byte để biểu diễn ký tự đó.
byte happy[8]= {//tạo chữ “ô”
B01110, B10001, B00000, B01110, 10001, B10001, B01110, B00000
bytesad[8]=tạo chữ “ơ”
B01110, B00001, B00010, B01110, B10001, B10001, B01110, B00000
Sau khi đã tạo được ký tự mong muốn ta sử dụng câu lệnh: lcd.createchar(num,data);
Trong đó:
+ num: là các chữ số từ 0 đến 7.
+ data: là các mảng chứa ký tự của chúng ta. Câu lệnh này sẽ gán ký tự ta đã tạo vào một chữ số. lcd.createChar(0, happy); lcd.createChar(1, sad); - Để hiển thị một ký tự ra màn hình, ta dùng câu lệnh lcd.write(data). Hiển thị chữ “ô” ra màn hình LCD. lcd.write(byte(0)); Hiển thị chữ “ơ” ra màn hình LCD lcd.write(byte(1));
Chương 4
ARDUINO VỚI ĐIỀU KHIỂN KHÔNG DÂY DÙNG SÓNG BLUETOOTH CHO THIẾT BỊ ĐIỆN TRONG NHÀ 4.1 Đặt vấn đề
Trong thời đại công nghiệp hóa, hiện đại hóa thì kỹ thuật ngày càng hiện đại nên nhu cầu về thông tin giải trí, nhu cầu điều khiển các thiết bị từ xa ngày càng cao. Vì vậy công nghệ không dây đã ra đời và phát triển mạnh mẽ tạo rất nhiều thuận lợi cho con người trong đời sống hiện nay
Trong những năm gần đây công nghệ truyền dữ liệu không dây đang có những bước phát triển mạnh mẽ, góp công lớn trong việc phát triển các hệ thống điều khiển, giám sát từ xa đặc biệt là các hệ thống thông minh. Hiện nay có khá nhiều công nghệ không dây truyền nhận dữ liệu RF,Wifi, Bletooth, SMS,…
Trong đó Bletooth là một trong những công nghệ phát triển từ lâu luôn được cải tiến để năng cao tốc độ, khoảng cách và sự bảo mật.
Bluetooth là một đặc tả công nghiệp cho truyền thông không dây tầm gần giữa các thiết bị điện tử. Công nghệ này hỗ trợ việc truyền dữ liệu qua các khoảng cách ngắn giữa các thiết bị di động và cố định tạo nên các m,ạng cá nhân không dây.
Bluetooth có thể đạt được tốc độ truyền lên tới 1Mb/s. Bluetooth hỗ trợ tốc độ truyền tải dữ liệu lên tới 720kbp/s trong phạm vi 10m – 100m. Khác vói kết nối hồng ngoại (IrDA), kết nối Bluetooth là vô hướng và sử dụng giải tần 2.4 Ghz.
*Các thiết bị điện trong nhà
Trong cuộc sống hiện đại ngày nay thì trong mỗi gia đình có rất nhiều thiết
bị giúp cuộc sống con người thoải mái và tạo ra chất lượng cuộc sống ngày càng tốt hơn như tủ lạnh, điều hòa, bóng đèn, máy giặt…. Một số thiết bị nó cần hoạt động một cách ổn định không có sự ON/OFF liên tục như tủ lạnh nó sẽ gây ra tình trạng dòng điện khởi động lớn dẫn đến nhanh hỏng thiết bị. Nhưng nay công nghệ inverter phát triển nó được tích hợp trong tủ lạnh, điều hòa,.. giúp cho thiết bị giảm bớt tích trạng sốc khi khởi động giúp thiết bị có tuổi thọ được lâu hơn. Bóng đèn điện cũng được tích hợp các cảm biến ánh sáng để điều chỉnh độ sáng tăng lên trong môi trường thiếu ánh sáng hay giảm độ sáng trong môi trường thừa ánh sáng. Nhóm đề tài qua nghiên cứu và tìm hiểu có thể điều khiển
qua sóng bluetooth nên đã tìm được một module có thể thu nhận và phát sóng bluetooth đưa vào vi điều khiển để điều chỉnh độ sáng thông qua các thanh analogwrite trong phần mềm trên điện thoại smartphone đó là Module
Bluetooth HC05
4.2 Module Bluetooth HC05
Do các board Arduino có khả năng tích hợp và hỗ trỡ cao để truyền dữ liệu không dây dùng sóng bluetooth người ta dùng module bluetooth HC05.
Hình 4.1: Hình ảnh về Module Bluetooth HC 05
4.2.1 Đặc điểm kỹ thuật
+ Chuẩn Bluetooth: V2.0 và ERD
+ Điện áp hoạt động 3,3 – 5VDC, 30mA + Kích thước: 28mm x 15mm x 2,35mm + Tần số: 2,4Ghz
+ Tốc độ: 2,1 Mbs(Max)/160kbps
+ Tốc độ baudrate mặc định 9600bit/1s, 8 bit dữ liệu, 1 bit stop. Hỗ trợ tốc độ 9600, 19200, 38400….
+ Nhiệt độ làm việc: -20 - 75 + Độ nhạy : -80dBm
+ Module có 2 chế độ làm việc: kết nối tự động hoặc theo lệnh bằng cách thay đổi trạng thái ở chân 34(key).
+Đáp ứng theo lệnh: khi làm việc ở chế độ này chúng ta có thể gửi các lệnh AT để giao tiếp và cài đặt module.
4.2.2 Nguyên lý hoạt động
HC-05 có hai chế độ hoạt động là Command Mode và Data Mode. Ở chế độ Command Mode ta có thể giao tiếp với module thông qua cổng serial trên module bằng tập lệnh AT quen thuộc. Ở chế độ Data Mode module có thể truyền nhận dữ liệu tới module bluetooth khác. Chân KEY dùng để chuyển đổi qua lại giữa hai chế độ này.
Có hai cách để bạn có thể chuyển module hoạt động trong chế độ Data Mode:
- Nếu đưa chân này lên mức logic cao trước khi cấp nguồn module sẽ đưa vào chế độ Command Mode với baudrate mặc định 38400. Chế độ này khá hữu ích khi bạn không biết baudrate trong module được thiết lập ở tốc độ bao nhiêu. Khi chuyển sang chế độ này đèn led trên module sẽ nháy chậm (khoảng 2s) và ngược lại khi chân KEY nối với mức logic thấp trước khi cấp nguồn module sẽ hoạt động chế độ Data Mode.
- Nếu module đang hoạt động ở chế Data Mode để có thể đưa module vào hoạt động ở chế độ Command Mode bạn đưa chân KEY lên mức cao. Lúc này module sẽ vào chế độ Command Mode nhưng với tốc độ Baud Rate được bạn thiết lập lần cuối cùng. Vì thế bạn phải biết baudrate hiện tại của thiết bị để có thể tương tác được với nó. Chú ý nếu module của bạn chưa thiết lập lại lần nào thì mặc định của nó như sau:
- Baudrate 9600, data 8 bits, stop bits 1, parity : none, handshake: none - Passkey: 1234
- Device Name: HC-05
Ở chế độ Data Mode HC-05 có thể hoạt động như một master hoặc slave tùy vào việc bạn cấu hình (riêng HC-06 bạn chỉ có thể cấu hình ở chế độ SLAVE)
- Ở chế độ SLAVE: bạn cần thiết lập kết nối từ smartphone, laptop, usb bluetooth để dò tìm module sau đó pair với mã PIN là 1234. Sau khi pair thành công, bạn đã có 1 cổng serial từ xa hoạt động ở baud rate 9600.
- Ở chế độ MASTER: module sẽ tự động dò tìm thiết bị bluetooth khác (1 module bluetooth HC-06, usb bluetooth, bluetooth của laptop...) và tiến hành chủ động mà không cần thiết lập gì từ máy tính hoặc smartphone.
Module bluetooth HC05 được điều khiển bằng tập lệnh AT để thực hiện các tác vụ mong muốn. Để bluetooth module chuyển từ chế độ thông thường qua điều khiển bằng AT, ta có 2 cách như sau:
+ Cấp nguồn cho module bluetooth (Vcc và Gnd) đồng thời cấp mức điện áp cao (=Vcc) cho chân KEY của module bluetooth. Khi đó giao tiếp bằng tập lệnh AT với module bằng cổng Serial (Tx và Rx) với baud rate là 38400.
+ Cấp nguồn cho module bluetooth trước, sau đó cấp mức điện áp cao cho chân KEY của module bluetooth. Lúc này bạn có thể giao tiếp với module bằng tập lệnh AT với baud rate là 9600.
4.3 Phần mềm Ardudroid
Phần mềm ArduDroid là một công cụ đơn giản để giúp chúng ta kiểm soát Arduino Uno từ điện thoại Android của bạn thông qua Bluetooth model nối tiếp HC-05. Chú ý: module Bluetooth khác có thể hoặc không thể làm việc. ArduDroid thực hiện các chức năng sau:
- Pin kỹ thuật số và PWM điều khiển Arduino Uno. - Gửi văn bản lệnh để Arduino Uno.
- Nhận / Gửi dữ liệu từ Arduino Uno qua Bluetooth nối tiếp bằng cách sử dụng Bluetooth HC05 bao giờ phổ biến trên mô-đun nối tiếp.
Hình 4.2: Cửa sổ phần mềm điều khiển trên Smartphone
Khi khởi động phần mềm thì trên hộp thoại của ứng dụng sẽ thông báo cho người dùng bật/không bật Bluetooth. Nếu chọn Yes thì Bluetooth được bật lên còn chọn No thì sóng bluetooth trên điện thoại sẽ không được kích hoạt
Khi sóng bluetooth được kích hoạt, phần mềm sẽ tự động tìm kiếm thiết bị.
Lúc này trên hộp thoại sẽ xuất hiện các địa chỉ của các thiết bị kết nối gần nhất. Chúng ta chọn thiết bị HC – 05, tiếp theo chúng tự động kết nối. Khi thành công trên màn hình smartphone sẽ xuất hiện dòng thông báo đã kết nối.
Giao diện ứng dụng sẽ ở trạng thái chờ, nếu có sự kiện nào được chọn ví dụ như gửi đi một kí tự (nút ấn button) hoặc 1 byte dữ liệu (nếu điều chỉnh độ sáng đèn) sẽ được nhận bởi thiết bị kết nối với phần mềm.
Việc cài đặt phần mềm rất đơn giản, chúng ta chỉ cần vào ứng dụng CH PLAY trên hệ điều hành Android của smartphone và nhập vào ô tìm kiếm phần mềm ArduDroid, sau đó ta sẽ tiến hành tải về và cài đặt.
thông qua vi điều khiển và thiết bị thu phát để điều khiển các thiết bị trong nhà.
4.4 Thuật toán chương trình trên Vi điều khiển
sai
đúng
Giải thích lưu đồ thuật toán chương trình trên Vi điều khiển: Thiết lập các thông số ban đầu, cài đặt tốc độ baud là 9600.
Kiểm tra liên tục có kí tự hoặc byte nào được nhận. Nếu có, tùy vào ký tự nhận được chương trình chính sẽ gọi đến chương trình con điều khiển. Tương tự nếu nhận được byte dữ liệu chương trình chính sẽ gọi đến chương trình ON/OFF thiết bị và khi bật bóng đèn sáng lên sẽ điều chỉnh độ sáng bóng đèn phù hợp với mục đích sử dụng của người dùng.
start Setup() Serial.begin(9600); Serial.available() > 0 00 90
Gửi byte dữ liệu tiếp theo Điều khiển thiết bị
ON/OFF thiết bị Điều khiển bóng đèn
4.3.1 Chương trình con điều khiển đóng ngắt thiết bị
.
Hình 4.3: Lưu đồ chương trình ON/OFF của thiết bị
Giải thích lưu đồ
Dùng câu lệnh switch, case kiểm tra các kí tự từ ứng dụng android gửi đến, ứng với mỗi kí tự sẽ được gán sự kiện mức cao hoặc mức thấp của các chân I/O. Cuối cùng là thoát chương trình con
4.3.2 Chương trình con điều chỉnh độ sáng đèn
Hình 4.4: Lưu đồ chương trình con điều chỉnh độ sáng đèn
Giải thích lưu đồ chương trình con điều chỉnh độ sáng đèn:
Kiểm tra nếu giá trị pIndex đã tăng từ 0 đến 2 chưa nếu chưa thì quay