--------------------------------------------------------------------------------------------- https://www.youtube.com/watch?v=wj5sQc-bunA --------------------------------------------------------------------------------------------- Đồ án môn học của sinh viên trường đại học Tiền Giang Đồ án thể hiện chi tiết cách thức điều khiển mức âm lượng của bộ khuếch đại thông qua bluetooth bao gồm: mạch điều khiển, mạch khuếch đại, lập trình Android trên Eclip SDK Kết quả của đề tài có thử nghiệm kiểm tra và đánh giá. Mã nguồn của chương trình trên Vi điều khiển, trên Android được thể hiện chi tiết ở phần phụ lục.
LỜI CẢM ƠN Lời nói chúng em xin chân thành cảm ơn gửi lời chúc sức khỏe đến Quý Thầy Cô trường Đại học Tiền Giang, Quý Thầy Cô Khoa Kỹ thuật Công Nghiệp Quý Thầy Cô môn Điện - Điện Tử không ngại khó khăn tận tâm với nghề để truyền đạt kiến thức quý báu cho chúng em suốt khoảng thời gian chúng em học Trường Với kiến thức quý báu tảng vững giúp cho chúng em đường lập nghiệp sau Đồng thời chúng em gửi lời cảm ơn thân mến đến tập thể sinh viên lớp Cao đẳng Điện - Điện tử 13 chúng em trao đổi, học tập giải khó khăn suốt trình thực đề tài Chúng em xin trân trọng gửi đến thầy Hoàng Hữu Duy lời cảm ơn chân thành lòng biết ơn sâu sắc Chúng em mong nhận lời nhận xét tận tình đóng góp ý kiến q báu thầy Hồng Hữu Duy, Q Thầy Cơ Trường Đại học Tiền Giang Quý Thầy Cô Khoa Kỹ Thuật Công Nghiệp để đề tài chúng em tốt Chúng em xin chân thành cảm ơn! Tiền Giang, ngày….tháng….năm 2015 Sinh viên thực Trương Minh Trí Nguyễn Thanh Phúc LỜI NÓI ĐẦU Hiện kỹ thuật vi điều khiển trở nên quen thuộc ngành kỹ thuật dân dụng Các vi điều khiển có khả xử lý nhiều hoạt động phức tạp mà cần chip vi mạch nhỏ, thay mạch điều khiển lớn phức tạp mạch điện gọn nhẹ, dễ dàng thao tác sử dụng Vi điều khiển khơng góp phần vào kỹ thuật điều khiển mà góp phần to lớn vào việc phát triển thơng tin Chính lý trên, việc tìm hiểu, khảo sát vi điều khiển điều mà sinh viên ngành điện mà đặc biệt chuyên ngành kỹ thuật điện – điện tử phải quan tâm Các điều khiển sử dụng vi điều khiển đơn giản để vận hành sử dụng lại điều phức tạp Phần cơng việc xử lý phụ thuộc vào người, chương trình hay phần mềm Nếu khơng có tham gia người hệ thống vi điều khiển vật vơ tri Do nói đến vi điều khiển giống máy tính bao gồm phần phần cứng phần mềm Mặc dù vi điều khiển bước dài để tiếp cận với kỹ thuật việc có sớm chiều Để tìm hiểu vi điều khiển cách khoa học mang lại hiệu cao cho công việc sau nhóm em đến định “Thiết kế mạch hiển thị mức âm LCD sử dụng PIC16F877A với điều khiển từ xa qua điện thoại hệ điều hành android” nhằm đáp ứng nhu cầu học hỏi, tìm hiểu thân giúp cho bạn sinh viên dễ tiếp cận hiểu sâu vi điều khiển PIC MỤC LỤC A MỞ ĐẦU 1 Lý chọn đề tài .2 Mục tiêu nhiệm vụ nghiên cứu Khách thể đối tượng nghiên cứu Phạm vi nghiên cứu giới hạn đề tài .2 Phương pháp nghiên cứu Cấu trúc đề tài B NỘI DUNG .4 CHƯƠNG TỔNG QUAN VÀ CƠ SỞ LÝ THUYẾT .5 1.1 Vi điều khiển PIC16F877A 1.1.1 Giới thiệu họ vi điều khiển PIC .5 1.1.2 Cấu trúc phần cứng PIC16F877A 1.1.2.1 Sơ đồ chân 1.1.2.2 Một số đặc điểm vi điều khiển PIC16F877A 1.1.2.3 Các cổng xuất, nhập .8 1.1.3 ADC 1.2 LCD 11 1.2.1 Sơ lược LCD 11 1.2.2 Sơ đồ chân LCD 12 1.3 TDA 2030A 14 1.4 Điều khiển từ xa Bluetooth 15 1.4.1 Khái niệm 15 1.4.2 Ứng dụng 16 1.4.3 Sơ đồ chân 16 1.4.4 Các chế độ hoạt động 16 1.4.5 Tập lệnh AT 17 1.5 EEPROM 24C04 18 1.6 Phần mềm lập trình CCS .21 1.6.1 Giới thiệu CCS C 21 1.6.2 Chỉ thị tiền xử lý 21 1.6.3 Các hàm Delay 22 1.6.4 Các hàm vào CCS C 22 1.6.5 Thư viện hàm LCD CCS 23 -3- 1.6.5.1 Khai báo .23 1.6.5.2 Các lệnh ý nghĩa 23 1.6.6 Hàm Printf () 23 1.6.7 Các hàm giao tiếp EEFROM 24C04 24 CHƯƠNG 2.THIẾT KẾ GIAO DIỆN VÀ LẬP TRÌNH ĐIỀU KHIỂN CHO THIẾT BỊ ANDROID 26 2.1 Tổng quan phần mềm lập trình ứng dụng Android 26 2.1.1 Lịch sử phát triển Eclipse 26 2.1.2 Các bước tạo mơi trường lập trình Android 26 2.1.3 Android Virtual Device (AVD) 26 2.2 Cấu trúc bên ứng dụng 27 2.2.1 Tập tin Activity_main.xml 28 2.2.2 Tập tin MainActivity.java 28 2.2.3 Thư mục Package Explorer 29 2.3 Các đối tượng ứng dụng 30 2.3.1 Layout 30 2.3.2 TextView .32 2.3.3 EditText 32 2.3.4 Button 33 2.4 Các thành phần vòng đời ứng dụng .33 2.4.1 Applications 33 2.4.2 Activity .33 2.4.3 Vòng đời ứng dụng .33 2.5 Các hàm lệnh Java Android 35 2.6 Thiết kế giao diện điều khiển 35 2.6.1 Khai báo giao diện 35 2.6.2 Canh chỉnh giao diện người dùng .36 2.6.3 Cài đặt ứng dụng lên thiết bị Android 37 2.6.4 Thuật toán 38 2.6.4.1 Lưu đồ giải thuật 38 2.6.4.2 Giải thích thuật tốn 39 CHƯƠNG THIẾT KẾ MẠCH HIỂN THỊ MỨC ÂM THANH TRÊN LCD SỬ DỤNG PIC16F877A VỚI ĐIỀU KHIỂN TỪ XA QUA ĐIỆN THOẠI HỆ ĐIỀU HÀNH ANDROID .40 3.1 Sơ đồ khối mạch 40 -4- 3.2 Chức khối .40 3.2.1 Khối nguồn 40 3.2.2 Khối khuếch đại 41 3.2.2.1 Định nghĩa mạch khuếch đại 41 3.2.2.2 Tầng khuếch đại công suất 42 3.2.2.3 Mạch khuếch đại sử dụng sản phẩm 44 3.2.2.4 Nguồn âm 45 3.2.2.5 Loa .46 3.2.3 Khối vi điều khiển 46 3.2.4 Khối hiển thị .47 3.2.5 Khối Bluetooth 48 3.2.6 Khối điều chuyển đổi mức âm lượng 49 3.3 Sơ đồ nguyên lý hoạt động toàn mạch 51 3.3.1 Sơ đồ mạch nguyên lý 51 3.3.2 Nguyên lý hoạt động mạch 52 3.4 Thi cơng hồn thành sản phẩm .52 3.5 Nhận xét hoạt động sản phẩm .53 CHƯƠNG XÂY DỰNG CHƯƠNG TRÌNH CHO PIC16F877A 54 4.1 Lưu đồ thuật toán 54 4.2 Giải thích lưu đồ thuật tốn 54 KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 56 TÀI LIỆU THAM KHẢO 57 -5- DANH MỤC BẢNG Bảng 1.1 Bảng tóm tắt đặc điểm vi điều khiển PIC 16F877A Bảng 1.2 Thể ý nghĩa chân LCD 12 Bảng 1.3 Mã lệnh điều khiển hoạt động LCD 13 Bảng 1.4 Bảng thông số tối đa TDA2030A 14 Bảng 1.5 Bảng thông số nhiệt TDA2030A 15 Bảng 1.6 Tên chức chân EEPROM 24C04 18 Bảng 1.7 Các bit thiết lập EEPROM 24C04 .20 Bảng 1.8 Các hàm thư viện LCD CCS 23 Bảng 1.9 Mã định dạng liệu hàm printf() 23 Bảng 1.10 Tên chức hàm giao tiếp EEFROM 24C04 24 Bảng 2.1 Các hàm lệnh Java Android 35 Bảng 2.2 Khai báo thuộc tính đối tượng Imagebutton nút nhấn loa trái 36 Bảng 2.3 Khai báo thuộc tính đối tượng Imagebutton với nút nhấn lại 36 Bảng 2.4 Khai báo thuộc tính cho đối tượng LinearLayout 36 Bảng 3.1 Giá trị điện trở khối chuyển đổi mức âm lượng 50 Bảng 3.2 Bảng biểu thể hiển mức điện áp từng mức âm lượng 53 -6- DANH MỤC HÌNH Hình 1.1 Sơ đồ chân PIC 16F877A .5 Hình 1.2 Sơ đồ khối chuyển đổi ADC 10 Hình 1.3 Các cách lưu kết chuyển đổi ADC .11 Hình 1.4 Hình dáng thực tế LCD 16x2 .12 Hình 1.5 Sơ đồ chân LCD 16x2 12 Hình 1.6 Hình ảnh thực tế TDA2030A .14 Hình 1.7 Vị trí chân TDA 2030A 15 Hình 1.8 Sơ đồ chân Bluetooth HC-05 .16 Hình 1.9 Module Bluetooth HC-05 16 Hình 1.10 Sơ đồ chân EEPROM 24C04 .18 Hình 1.11 Các bước ghi liệu vào 24C04 19 Hình 1.12 Các bước đọc liệu từ 24C04 20 Hình 2.1 Giao diện máy ảo sau khởi động 27 Hình 2.2 Cấu trúc ứng dụng 27 Hình 2.3 Phần Graphical Layout .28 Hình 2.4 Phần MainActivity dùng để lập trình cho ứng dụng 29 Hình 2.5 Phần Package Explorer 29 Hình 2.6 Cấu trúc bên AndroidManifest.xml 30 Hình 2.7 Ví dụ FrameLayout 31 Hình 2.8 Ví dụ LinearLayout 31 Hình 2.9 Ví dụ RelativeLayout 32 Hình 2.10 Vòng đời ứng dụng .34 Hình 2.11 Giao diện người dùng .37 Hình 2.12 Biểu tượng chương trình điều khiển thiết bị Android 37 Hình 2.13 Lưu đồ giải thuật 38 Hình 3.1 Sơ đồ khối tồn mạch 40 Hình 3.2 Mạch nguồn ni .41 Hình 3.3 Sơ đồ tổng quát mạch khuếch đại 42 Hình 3.4 Mơ tả việc phân loại mạch khuếch đại công suất 44 Hình 3.5 Dạng sóng dòng điện chế độ khuếch đại .44 Hình 3.6 Mạch khuếch đại dùng TDA2030A 45 Hình 3.7 Các thiết bị nguồn âm 45 Hình 3.8 Dây nối tín hiệu âm 45 -7- Hình 3.9 Jack hoa sen .45 Hình 3.10 Loa 46 Hình 3.11 Khối vi điều khiển 46 Hình 3.12 Khối hiển thị 47 Hình 3.13 Sơ đồ kết nối vi điều khiển với LCD 48 Hình 3.14 Khối Bluetooth 49 Hình 3.15 Điều chỉnh điện áp biến trở 49 Hình 3.16 Điều chỉnh âm lượng khơng dùng biến trở .49 Hình 3.17 Khối điều chỉnh mức âm lượng 51 Hình 3.18 Sơ đồ mạch nguyên lý 51 Hình 3.19 Mạch in 52 Hình 3.20 Sản phẩm thực tế 53 Hình 4.1 Lưu đồ thuật toán vi điều khiển 54 -8- A MỞ ĐẦU Lý chọn đề tài Ngày nay, phát triển mạnh mẽ khoa học công nghệ, sống người có thay đổi ngày tốt hơn, mang lại tiện lợi tối ưu phục vụ cơng cơng nghiệp hố, đại hố đất nước Góp phần vào phát triển tích hợp mạch điện – điện tử Trong vi xử lý – vi điều khiển có vai trò quan trọng Vi xử lý – vi điều khiển đời làm nên cách mạng lĩnh vực đời sống đại từ máy giặt, điện thoại… đến máy thu hình, máy ảnh, loa, máy khuếch đại âm thanh, Những thành tựu biến tưởng chừng khơng thể thành Với nhu cầu giải trí mặt tinh thần ngày cao người thúc đẩy hệ thống vui chơi, giải trí máy thu hình, điện thoại di động, máy tính xách tay, hệ thống chiếu phim, âm thanh, hình ảnh ngày phát triển Mỗi người, giới trẻ điều muốn có hệ thống âm cho riêng với chi phí thấp Dựa vào nhu cầu này, nhóm định “Thiết kế mạch hiển thị mức âm LCD sử dụng PIC16F877A với điều khiển từ xa qua điện thoại hệ điều hành android” Mục tiêu nhiệm vụ nghiên cứu Mục đích đề tài thiết kế mạch hiển thị mức âm LCD sử dụng PIC16F877A điều khiển từ xa hệ điều hành android thơng qua sóng bluetooth Để đạt mục đích này, nhiệm vụ sau phải thực hiện: - Nghiên cứu sử dụng phần mềm lập trình CCS - Nghiên cứu vi điều khiển PIC16F877A lập lệnh có liên quan CCS - Nghiên cứu sử dụng LCD 16x2 - Nghiên cứu mạch khuếch đại âm sử dụng TDA2030A - Nghiên cứu hệ thống Android điều khiển sóng bluetooth sử dụng module Bluetooth HC-05 - Nghiên cứu số linh kiện IC74LS06, IC74HC238, eeprom 24C04 - Nghiên cứu chế hoạt động ADC PIC16F877A - Mô mạch Proteus - Xây dựng chương trình cho vi điều khiển PIC16F877A - Thiết kế thi công phần cứng Khách thể đối tượng nghiên cứu - Đối tượng nghiên cứu: Mạch hiển thị mức âm LCD sử dụng PIC16F877A điều khiển từ xa hệ điều hành android thơng qua sóng bluetooth - Khách thể nghiên cứu: Vi điều khiển PIC16F877A, TDA2030A, IC74LS06, IC74HC238, eeprom 24C04, module Bluetooth HC-05, LCD Phạm vi nghiên cứu giới hạn đề tài - Phạm vi đề tài: 10 TÀI LIỆU THAM KHẢO [1] Lê Văn Doanh - Nguyễn Thế Công - Trần Văn Thịnh, Điện Tử Công Suất, NXB Khoa Học Kỹ Thuật, 2004 [2] Nguyễn Hữu Phước, Kỹ thuật điện 1,2, NXB Đại học Quốc gia TP HCM, 2003 [3] Nguyễn Viết Nguyên, Giáo trình Linh kiện điện tử ứng dụng, NXB Giáo dục, 2003 [4] CCS C for PIC16F877A, Picvietnam.com [5] Th.S Trương Thị Ngọc Phượng, “Lập trình Android”, Nhà xuất Thời Đại, 2012 [6] Các trang Web: http://WWW.PICVIETNAM.NET http://www.doc.edu.vn http://codientu.org http://electronics-lad.com http://www.android.com 69 PHỤ LỤC Chương trình PIC16F877A #include #FUSES XT,NOWDT,PUT,NOPROTECT,NOBROWNOUT,NOLVP #use i2c(MASTER, sda=PIN_C5, scl=PIN_C4) #use delay(crystal=12000000) #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8) #define LCD_ENABLE_PIN PIN_C0 #define LCD_RS_PIN #define LCD_RW_PIN PIN_C2 PIN_C1 #define LCD_DATA4 PIN_B3 #define LCD_DATA5 PIN_B2 #define LCD_DATA6 PIN_B1 #define LCD_DATA7 PIN_B0 #include unSigned int8 MUC_LEFT; unSigned int8 MUC_RIGHT; unSigned int8 CHON; unSigned int8 CHON_TAM; unSigned int8 MUC_LEFT_TAM; unSigned int8 MUC_RIGHT_TAM; unSigned CHAR NOI_DUNG_BLUETOOTH; //unSigned int8 MA_DIEU_KHIEN_LEFT_1[11]= {0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x01, 0x02, 0x00}; //unSigned int8 MA_DIEU_KHIEN_LEFT_2[11]= {0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x02, 0x00}; //unSigned int8 MA_DIEU_KHIEN_RIGHT_1[11]={0x80, 0x90, 0xA0, 0xB0, 0xC0, 0xD0, 0xE0, 0xF0, 0x10, 0x20, 0x00}; //unSigned int8 MA_DIEU_KHIEN_RIGHT_2[11]={0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x04, 0x08, 0x00}; unSigned int8 MA_DIEU_KHIEN_LEFT_1[11]= {0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0, 0xE0, 0xE0, 0xE0}; unSigned int8 MA_DIEU_KHIEN_LEFT_2[11]= {0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x02, 0x00}; unSigned int8 MA_DIEU_KHIEN_RIGHT_1[11]={0x0B, 0x03, 0x0D, 0x05, 0x09, 0x01, 0x07, 0x0F, 0x0E, 0x0E, 0x0E}; unSigned int8 MA_DIEU_KHIEN_RIGHT_2[11]={0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x08, 0x04, 0x00}; #INT_RDA void Receive_isr(){ NOI_DUNG_BLUETOOTH = getc(); if(NOI_DUNG_BLUETOOTH == 0x42){CHON = 0;} if(NOI_DUNG_BLUETOOTH == 0x41){CHON = 1;} -70- if(CHON == 1){ if(NOI_DUNG_BLUETOOTH == 0x44){ if(MUC_LEFT != 0){MUC_LEFT = MUC_LEFT - 1;} } if(NOI_DUNG_BLUETOOTH == 0x43){ if(MUC_LEFT != 10){MUC_LEFT = MUC_LEFT + 1;} } } if(CHON == 0){ if(NOI_DUNG_BLUETOOTH == 0x44){ if(MUC_RIGHT != 0){MUC_RIGHT = MUC_RIGHT - 1;} } if(NOI_DUNG_BLUETOOTH == 0x43){ if(MUC_RIGHT != 10){MUC_RIGHT = MUC_RIGHT + 1;} } } } #INT_RB void NGAT_TIN_HIEU_REMOTE(){ if(input(PIN_B4) == 1){CHON = 0;} if(input(PIN_B5) == 1){CHON = 1;} if(CHON == 1){ if(input(PIN_B6) == 1){ if(MUC_LEFT != 0){MUC_LEFT = MUC_LEFT - 1;} } if(input(PIN_B7) == 1){ if(MUC_LEFT != 10){MUC_LEFT = MUC_LEFT + 1;} } } if(CHON == 0){ if(input(PIN_B6) == 1){ if(MUC_RIGHT != 0){MUC_RIGHT = MUC_RIGHT - 1;} } if(input(PIN_B7) == 1){ if(MUC_RIGHT != 10){MUC_RIGHT = MUC_RIGHT + 1;} } } } void HIEN_THI(){ -71- if(CHON == 1){ lcd_gotoxy(1,1); delay_ms(1); lcd_putc(" LOA TRAI "); delay_ms(1); lcd_gotoxy(1,2); delay_ms(1); if(MUC_LEFT != 10){ printf(LCD_PUTC, "MUC AM LUONG: 0%u",MUC_LEFT); printf("MUC AM LUONG LOA TRAI: 0%u\r\n",MUC_LEFT); }else{ printf(LCD_PUTC, "MUC AM LUONG: %u",MUC_LEFT); printf("MUC AM LUONG LOA TRAI: %u\r\n",MUC_LEFT); } } if(CHON == 0){ lcd_gotoxy(1,1); delay_ms(1); lcd_putc(" LOA PHAI "); delay_ms(1); lcd_gotoxy(1,2); delay_ms(1); if(MUC_RIGHT != 10){ printf(LCD_PUTC, "MUC AM LUONG: 0%u",MUC_RIGHT); printf("MUC AM LUONG LOA PHAI: 0%u\r\n",MUC_RIGHT); }else{ printf(LCD_PUTC, "MUC AM LUONG: %u",MUC_RIGHT); printf("MUC AM LUONG LOA PHAI: %u\r\n",MUC_RIGHT); } } } void main(){ enable_interrupts(INT_RB); enable_interrupts(int_rda); enable_interrupts(GLOBAL); i2c_start(); i2c_write(0xa0); i2c_write(0x00); i2c_start(); i2c_write(0xa1); MUC_RIGHT = i2c_read(0x00); -72- i2c_start(); i2c_write(0xa0); i2c_write(0x01); i2c_start(); i2c_write(0xa1); MUC_LEFT = i2c_read(0x01); i2c_stop(); if((MUC_LEFT >10)|(MUC_RIGHT >10)){ MUC_LEFT = 5; MUC_RIGHT = 5; } CHON = 0; CHON_TAM = 3; MUC_RIGHT_TAM = 11; MUC_LEFT_TAM = 11; lcd_init(); while(TRUE){ if((CHON != CHON_TAM)|(MUC_RIGHT != MUC_RIGHT_TAM)|(MUC_LEFT != MUC_LEFT_TAM)) { CHON_TAM = CHON; MUC_RIGHT_TAM = MUC_RIGHT; MUC_LEFT_TAM = MUC_LEFT; disable_interrupts(GLOBAL); HIEN_THI(); if(CHON == 0){ i2c_start(); i2c_write(0xa0); i2c_write(0x00); i2c_write(MUC_RIGHT); i2c_stop(); } if(CHON == 1){ i2c_start(); i2c_write(0xa0); i2c_write(0x01); i2c_write(MUC_LEFT); i2c_stop(); } enable_interrupts(GLOBAL); output_D (MA_DIEU_KHIEN_LEFT_1[MUC_LEFT]|MA_DIEU_KHIEN_RIGHT_1[MUC_RIGHT]); output_A (MA_DIEU_KHIEN_LEFT_2[MUC_LEFT]|MA_DIEU_KHIEN_RIGHT_2[MUC_RIGHT]); } } -73- } PHỤ LỤC Chương trình android package com.example.volume_bluetooth; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.lang.reflect.Method; import java.util.Set; import java.util.Timer; import java.util.TimerTask; import java.util.UUID; import android.app.Activity; import android.app.AlertDialog; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothSocket; import android.content.BroadcastReceiver; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import com.example.bluetooth_control.R; public class MainActivity extends Activity { AlertDialog.Builder THONG_BAO_1; AlertDialog BANG_THONG_BAO_1; AlertDialog.Builder THONG_BAO_2; AlertDialog BANG_THONG_BAO_2; AlertDialog.Builder THONG_BAO_3; AlertDialog BANG_THONG_BAO_3; AlertDialog.Builder THONG_BAO_4; AlertDialog BANG_THONG_BAO_4; Button NUT_LOA_TRAI; -74- Button NUT_LOA_PHAI; Button NUT_VOLUME_UP; Button NUT_VOLUME_DOWN; TextView HIEN_THI_THONG_TIN; Set DANH_SACH_THIET_BI_DA_PAIR = null; BluetoothDevice THIET_BI_DIEU_KHIEN = null; BluetoothAdapter RANG_XANH = null; OutputStream CONG_NGO_RA = null; InputStream CONG_NGO_VAO = null; InputStreamReader reader; String DU_LIEU_GUI; String DU_LIEU_NHAN; Timer timer; TimerTask doThis; int CHO_PHEP; private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); BluetoothSocket CONG_KET_NOI_BLUETOOTH = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); timer = new Timer(); THONG_BAO_1 = new AlertDialog.Builder(MainActivity.this); THONG_BAO_1.setTitle("Thơng báo"); THONG_BAO_1.setMessage("Dò tìm thiết bị"); BANG_THONG_BAO_1 = THONG_BAO_1.create(); BANG_THONG_BAO_1.setCanceledOnTouchOutside(false); BANG_THONG_BAO_1.setCancelable(false); NUT_LOA_TRAI = (Button) findViewById(R.id.button1); NUT_LOA_PHAI = (Button) findViewById(R.id.button2); NUT_VOLUME_UP = (Button) findViewById(R.id.button3); NUT_VOLUME_DOWN = (Button) findViewById(R.id.button4); HIEN_THI_THONG_TIN = (TextView) findViewById(R.id.textView1); RANG_XANH = BluetoothAdapter.getDefaultAdapter(); if(RANG_XANH != null){ IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED); intentFilter.addAction(BluetoothDevice.ACTION_FOUND); intentFilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED); intentFilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); intentFilter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED); -75- registerReceiver(mReceiver, intentFilter); if(!RANG_XANH.isEnabled()){ THONG_BAO_4(); }else{ RANG_XANH.startDiscovery(); } }else{ THONG_BAO_2("Thiết bị không hỗ trợ bluetooth"); } HIEN_THI_THONG_TIN.setText(" Đang dò tìm thiết bị "); } @Override protected void onStart() { // TODO Auto-generated method stub super.onStart(); CHO_PHEP = 1; } @Override protected void onStop() { // TODO Auto-generated method stub super.onStop(); unregisterReceiver(mReceiver); CHO_PHEP = 0; } protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); RANG_XANH.disable(); } @Override protected void onRestart() { // TODO Auto-generated method stub super.onRestart(); IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED); intentFilter.addAction(BluetoothDevice.ACTION_FOUND); intentFilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED); intentFilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); intentFilter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED); registerReceiver(mReceiver, intentFilter); if(!RANG_XANH.isEnabled()){ -76- THONG_BAO_3("MAT KET NOI"); } } private final BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent){ final String action = intent.getAction(); if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) {// theo doi on off final int TRANG_THAI_BLUETOOTH = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR); if(TRANG_THAI_BLUETOOTH == BluetoothAdapter.STATE_ON){ RANG_XANH.startDiscovery (); } } if (BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(action)) { final int state BluetoothDevice.ERROR); final int prevState BluetoothDevice.ERROR); = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, = intent.getIntExtra(BluetoothDevice.EXTRA_PREVIOUS_BOND_STATE, if (state == BluetoothDevice.BOND_BONDED && prevState == BluetoothDevice.BOND_BONDING) { Thread t1=new Thread(new TAO_KET_NOI()); t1.start(); } else if (state == BluetoothDevice.BOND_NONE && prevState == BluetoothDevice.BOND_BONDED){ } } if (BluetoothDevice.ACTION_FOUND.equals(action)){// theo doi tim vung ket noi BluetoothDevice intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); THIET_BI_TIM_THAY Toast.makeText(getApplicationContext(),THIET_BI_TIM_THAY.getName(),Toast.LENGTH_LONG).show(); if(THIET_BI_TIM_THAY.getAddress().equals("98:D3:32:10:47:25")){ THIET_BI_DIEU_KHIEN = THIET_BI_TIM_THAY; RANG_XANH.cancelDiscovery(); if(THIET_BI_DIEU_KHIEN.getBondState()!= BluetoothDevice.BOND_BONDED){ try {// tao pair Method m = THIET_BI_DIEU_KHIEN.getClass().getMethod("createBond", (Class[]) null); m.invoke(THIET_BI_DIEU_KHIEN, (Object[]) null); } catch (Exception e) { e.getMessage(); } }else{ -77- = Thread t1=new Thread(new TAO_KET_NOI()); t1.start(); } BANG_THONG_BAO_1.dismiss(); } } if(BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(action)){ BANG_THONG_BAO_1.show(); THIET_BI_DIEU_KHIEN = null; } if(BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)){ if(THIET_BI_DIEU_KHIEN == null){ BANG_THONG_BAO_1.dismiss(); THONG_BAO_2("Khơng tìm thấy thiết bị"); //unregisterReceiver(mReceiver); } } }//run };//broadcast public class TAO_KET_NOI implements Runnable { @Override public void run() { try { CHO_PHEP = 0; CONG_KET_NOI_BLUETOOTH THIET_BI_DIEU_KHIEN.createRfcommSocketToServiceRecord(MY_UUID); = CONG_KET_NOI_BLUETOOTH.connect(); CONG_NGO_RA = CONG_KET_NOI_BLUETOOTH.getOutputStream(); CONG_NGO_VAO = CONG_KET_NOI_BLUETOOTH.getInputStream(); runOnUiThread(new Runnable() { public void run() { HIEN_THI_THONG_TIN.setText(" THIET_BI_DIEU_KHIEN.getName()); Kết } }); CHO_PHEP = 1; DOC_DU_LIEU(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); CHO_PHEP = 0; runOnUiThread(new Runnable() { -78- nối thành công: " + public void run() { HIEN_THI_THONG_TIN.setText(" THIET_BI_DIEU_KHIEN.getName()); Kết nối không THONG_BAO_3("Kết nối không thành công"); } }); } } }; public class GUI_DU_LIEU implements Runnable { @Override public void run() { // TODO Auto-generated method stub try { CONG_NGO_RA.write(DU_LIEU_GUI.getBytes()); CONG_NGO_RA.flush(); //CONG_NGO_RA.close(); } catch (IOException e1) { // TODO Auto-generated catch block runOnUiThread(new Runnable() { public void run() { HIEN_THI_THONG_TIN.setText("Mất kết nối"); THONG_BAO_3("Mất kết nối"); CHO_PHEP = 0; } }); e1.printStackTrace(); } } } public void DOC_DU_LIEU(){ doThis = new TimerTask(){ public void run() { // TODO Auto-generated method stub int SO_BYTE = 0; if(CHO_PHEP == 1){ if(!RANG_XANH.isEnabled()){ runOnUiThread(new Runnable() { public void run() { HIEN_THI_THONG_TIN.setText("Mất kết nối"); THONG_BAO_3("Mất kết nối"); -79- thành công: " + CHO_PHEP = 0; } }); } try { SO_BYTE = CONG_NGO_VAO.available(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } if(SO_BYTE > 0){ byte[] GOI_DU_LIEU = new byte[SO_BYTE]; try { CONG_NGO_VAO.read(GOI_DU_LIEU); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { DU_LIEU_NHAN = new String(GOI_DU_LIEU, "UTF-8"); runOnUiThread(new Runnable() { public void run() { HIEN_THI_THONG_TIN.setText(" THIET_BI_DIEU_KHIEN.getName()+ ": " + DU_LIEU_NHAN); } }); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } }; timer.scheduleAtFixedRate(doThis, 100, 100); } public void CLICK_LOA_TRAI(View v) { DU_LIEU_GUI = "A"; Thread t1=new Thread(new GUI_DU_LIEU()); t1.start(); } -80- " + public void CLICK_LOA_PHAI(View v) { DU_LIEU_GUI = "B"; Thread t1=new Thread(new GUI_DU_LIEU()); t1.start(); } public void CLICK_VOLUME_CONG(View v) { DU_LIEU_GUI = "C"; Thread t1=new Thread(new GUI_DU_LIEU()); t1.start(); } public void CLICK_VOLUME_TRU(View v) { DU_LIEU_GUI = "D"; Thread t1=new Thread(new GUI_DU_LIEU()); t1.start(); } public void THONG_BAO_2(String NOI_DUNG) { THONG_BAO_2 = new AlertDialog.Builder(MainActivity.this); THONG_BAO_2.setTitle("Thơng báo"); THONG_BAO_2.setMessage(NOI_DUNG); THONG_BAO_2.setPositiveButton("THỐT", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { finish(); android.os.Process.killProcess(android.os.Process.myPid()); System.exit(1); } }); BANG_THONG_BAO_2 = THONG_BAO_2.create(); BANG_THONG_BAO_2.setCanceledOnTouchOutside(false); BANG_THONG_BAO_2.setCancelable(false); BANG_THONG_BAO_2.show(); } public void THONG_BAO_3(String NOI_DUNG) { THONG_BAO_3 = new AlertDialog.Builder(MainActivity.this); THONG_BAO_3.setTitle("Thông báo"); THONG_BAO_3.setMessage(NOI_DUNG); THONG_BAO_3.setPositiveButton("THỬ LẠI", new DialogInterface.OnClickListener() { @Override -81- public void onClick(DialogInterface dialog, int which) { dialog.cancel(); runOnUiThread(new Runnable() { public void run() { if(!RANG_XANH.isEnabled()){ THONG_BAO_4(); HIEN_THI_THONG_TIN.setText(" Đang dò tìm thiết bị "); }else{ RANG_XANH.startDiscovery(); } } }); } }); THONG_BAO_3.setNegativeButton("THOÁT", new DialogInterface.OnClickListener(){ @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub finish(); android.os.Process.killProcess(android.os.Process.myPid()); System.exit(1); } }); BANG_THONG_BAO_3 = THONG_BAO_3.create(); BANG_THONG_BAO_3.setCanceledOnTouchOutside(false); BANG_THONG_BAO_3.setCancelable(false); BANG_THONG_BAO_3.show(); } public void THONG_BAO_4() { THONG_BAO_4 = new AlertDialog.Builder(MainActivity.this); THONG_BAO_4.setTitle("Thơng báo"); THONG_BAO_4.setMessage("Bạn có muốn bật Bluetooth"); THONG_BAO_4.setPositiveButton("CHO PHÉP", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.cancel(); RANG_XANH.enable(); } -82- }); THONG_BAO_4.setNegativeButton("BỎ QUA", new DialogInterface.OnClickListener(){ @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub dialog.cancel(); THONG_BAO_2("Bluetooth không bật"); } }); BANG_THONG_BAO_4 = THONG_BAO_4.create(); BANG_THONG_BAO_4.setCanceledOnTouchOutside(false); BANG_THONG_BAO_4.setCancelable(false); BANG_THONG_BAO_4.show(); } } -83-